/*
 *  Copyright (c) 2015 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 VPX_DSP_VARIANCE_H_
#define VPX_DSP_VARIANCE_H_

#include "./vpx_config.h"

#include "vpx/vpx_integer.h"

#ifdef __cplusplus
extern "C" {
#endif

#define FILTER_BITS 7
#define FILTER_WEIGHT 128

typedef unsigned int(*vpx_sad_fn_t)(const uint8_t *a, int a_stride,
                                    const uint8_t *b, int b_stride);

typedef unsigned int(*vpx_sad_avg_fn_t)(const uint8_t *a, int a_stride,
                                        const uint8_t *b, int b_stride,
                                        const uint8_t *second_pred);

typedef void (*vp8_copy32xn_fn_t)(const uint8_t *a, int a_stride,
                                  uint8_t *b, int b_stride, int n);

typedef void (*vpx_sad_multi_fn_t)(const uint8_t *a, int a_stride,
                                   const uint8_t *b, int b_stride,
                                   unsigned int *sad_array);

typedef void (*vpx_sad_multi_d_fn_t)(const uint8_t *a, int a_stride,
                                     const uint8_t *const b_array[],
                                     int b_stride,
                                     unsigned int *sad_array);

typedef unsigned int (*vpx_variance_fn_t)(const uint8_t *a, int a_stride,
                                          const uint8_t *b, int b_stride,
                                          unsigned int *sse);

typedef unsigned int (*vpx_subpixvariance_fn_t)(const uint8_t *a, int a_stride,
                                                int xoffset, int yoffset,
                                                const uint8_t *b, int b_stride,
                                                unsigned int *sse);

typedef unsigned int (*vpx_subp_avg_variance_fn_t)(const uint8_t *a,
                                                   int a_stride,
                                                   int xoffset, int yoffset,
                                                   const uint8_t *b,
                                                   int b_stride,
                                                   unsigned int *sse,
                                                   const uint8_t *second_pred);
#if CONFIG_VP8
typedef struct variance_vtable {
  vpx_sad_fn_t            sdf;
  vpx_variance_fn_t       vf;
  vpx_subpixvariance_fn_t svf;
  vpx_variance_fn_t       svf_halfpix_h;
  vpx_variance_fn_t       svf_halfpix_v;
  vpx_variance_fn_t       svf_halfpix_hv;
  vpx_sad_multi_fn_t      sdx3f;
  vpx_sad_multi_fn_t      sdx8f;
  vpx_sad_multi_d_fn_t    sdx4df;
#if ARCH_X86 || ARCH_X86_64
  vp8_copy32xn_fn_t       copymem;
#endif
} vp8_variance_fn_ptr_t;
#endif  // CONFIG_VP8

#if CONFIG_VP10 && CONFIG_EXT_INTER
typedef unsigned int(*vpx_masked_sad_fn_t)(const uint8_t *src,
                                           int src_stride,
                                           const uint8_t *ref,
                                           int ref_stride,
                                           const uint8_t *msk_ptr,
                                           int msk_stride);
typedef unsigned int (*vpx_masked_variance_fn_t)(const uint8_t *src,
                                                 int src_stride,
                                                 const uint8_t *ref,
                                                 int ref_stride,
                                                 const uint8_t *msk,
                                                 int msk_stride,
                                                 unsigned int *sse);
typedef unsigned int (*vpx_masked_subpixvariance_fn_t)(const uint8_t *src,
                                                       int src_stride,
                                                       int xoffset, int yoffset,
                                                       const uint8_t *ref,
                                                       int ref_stride,
                                                       const uint8_t *msk,
                                                       int msk_stride,
                                                       unsigned int *sse);
#endif  // CONFIG_VP10 && CONFIG_EXT_INTER

#if CONFIG_VP10 && CONFIG_OBMC
typedef unsigned int(*vpx_obmc_sad_fn_t)(const uint8_t *pred,
                                         int pred_stride,
                                         const int32_t *wsrc,
                                         const int32_t *msk);
typedef unsigned int (*vpx_obmc_variance_fn_t)(const uint8_t *pred,
                                               int pred_stride,
                                               const int32_t *wsrc,
                                               const int32_t *msk,
                                               unsigned int *sse);
typedef unsigned int (*vpx_obmc_subpixvariance_fn_t)(const uint8_t *pred,
                                                     int pred_stride,
                                                     int xoffset, int yoffset,
                                                     const int32_t *wsrc,
                                                     const int32_t *msk,
                                                     unsigned int *sse);
#endif  // CONFIG_VP10 && CONFIG_OBMC

#if CONFIG_VP9
typedef struct vp9_variance_vtable {
  vpx_sad_fn_t               sdf;
  vpx_sad_avg_fn_t           sdaf;
  vpx_variance_fn_t          vf;
  vpx_subpixvariance_fn_t    svf;
  vpx_subp_avg_variance_fn_t svaf;
  vpx_sad_multi_fn_t         sdx3f;
  vpx_sad_multi_fn_t         sdx8f;
  vpx_sad_multi_d_fn_t       sdx4df;
} vp9_variance_fn_ptr_t;
#endif  // CONFIG_VP9

#if CONFIG_VP10
typedef struct vp10_variance_vtable {
  vpx_sad_fn_t                   sdf;
  vpx_sad_avg_fn_t               sdaf;
  vpx_variance_fn_t              vf;
  vpx_subpixvariance_fn_t        svf;
  vpx_subp_avg_variance_fn_t     svaf;
  vpx_sad_multi_fn_t             sdx3f;
  vpx_sad_multi_fn_t             sdx8f;
  vpx_sad_multi_d_fn_t           sdx4df;
#if CONFIG_EXT_INTER
  vpx_masked_sad_fn_t            msdf;
  vpx_masked_variance_fn_t       mvf;
  vpx_masked_subpixvariance_fn_t msvf;
#endif  // CONFIG_EXT_INTER
#if CONFIG_OBMC
  vpx_obmc_sad_fn_t              osdf;
  vpx_obmc_variance_fn_t         ovf;
  vpx_obmc_subpixvariance_fn_t   osvf;
#endif  // CONFIG_OBMC
} vp10_variance_fn_ptr_t;
#endif  // CONFIG_VP10

void vpx_highbd_var_filter_block2d_bil_first_pass(
    const uint8_t *src_ptr8,
    uint16_t *output_ptr,
    unsigned int src_pixels_per_line,
    int pixel_step,
    unsigned int output_height,
    unsigned int output_width,
    const uint8_t *filter);

void vpx_highbd_var_filter_block2d_bil_second_pass(
    const uint16_t *src_ptr,
    uint16_t *output_ptr,
    unsigned int src_pixels_per_line,
    unsigned int pixel_step,
    unsigned int output_height,
    unsigned int output_width,
    const uint8_t *filter);

#ifdef __cplusplus
}  // extern "C"
#endif

#endif  // VPX_DSP_VARIANCE_H_
