/*
 *  Copyright (c) 2010 The WebM project authors. All Rights Reserved.
 *
 *  Use of this source code is governed by a BSD-style license
 *  that can be found in the LICENSE file in the root of the source
 *  tree. An additional intellectual property rights grant can be found
 *  in the file PATENTS.  All contributing project authors may
 *  be found in the AUTHORS file in the root of the source tree.
 */


#ifndef VARIANCE_H
#define VARIANCE_H

typedef unsigned int(*vp9_sad_fn_t)(const unsigned char *src_ptr,
                                    int source_stride,
                                    const unsigned char *ref_ptr,
                                    int ref_stride,
                                    unsigned int max_sad);

typedef void (*vp9_copy32xn_fn_t)(const unsigned char *src_ptr,
                                  int source_stride,
                                  const unsigned char *ref_ptr,
                                  int ref_stride,
                                  int n);

typedef void (*vp9_sad_multi_fn_t)(const unsigned char *src_ptr,
                                   int source_stride,
                                   const unsigned char *ref_ptr,
                                   int  ref_stride,
                                   unsigned int *sad_array);

typedef void (*vp9_sad_multi1_fn_t)(const unsigned char *src_ptr,
                                    int source_stride,
                                    const unsigned char *ref_ptr,
                                    int  ref_stride,
                                    unsigned short *sad_array);

typedef void (*vp9_sad_multi_d_fn_t)(const unsigned char *src_ptr,
                                     int source_stride,
                                     const unsigned char * const ref_ptr[],
                                     int  ref_stride, unsigned int *sad_array);

typedef unsigned int (*vp9_variance_fn_t)(const unsigned char *src_ptr,
                                          int source_stride,
                                          const unsigned char *ref_ptr,
                                          int ref_stride,
                                          unsigned int *sse);

typedef unsigned int (*vp9_subpixvariance_fn_t)(const unsigned char  *src_ptr,
                                                int source_stride,
                                                int xoffset,
                                                int yoffset,
                                                const unsigned char *ref_ptr,
                                                int Refstride,
                                                unsigned int *sse);

typedef void (*vp9_ssimpf_fn_t)(unsigned char *s, int sp, unsigned char *r,
                                int rp, unsigned long *sum_s,
                                unsigned long *sum_r, unsigned long *sum_sq_s,
                                unsigned long *sum_sq_r,
                                unsigned long *sum_sxr);

typedef unsigned int (*vp9_getmbss_fn_t)(const short *);

typedef unsigned int (*vp9_get16x16prederror_fn_t)(const unsigned char *src_ptr,
                                                   int source_stride,
                                                   const unsigned char *ref_ptr,
                                                   int  ref_stride);

typedef struct variance_vtable {
    vp9_sad_fn_t            sdf;
    vp9_variance_fn_t       vf;
    vp9_subpixvariance_fn_t svf;
    vp9_variance_fn_t       svf_halfpix_h;
    vp9_variance_fn_t       svf_halfpix_v;
    vp9_variance_fn_t       svf_halfpix_hv;
    vp9_sad_multi_fn_t      sdx3f;
    vp9_sad_multi1_fn_t     sdx8f;
    vp9_sad_multi_d_fn_t    sdx4df;
    vp9_copy32xn_fn_t       copymem;
} vp9_variance_fn_ptr_t;

#endif
