16fefe538d859300e7febe78271828198c10f1b52fgalligan@chromium.org/*
26fefe538d859300e7febe78271828198c10f1b52fgalligan@chromium.org *  Copyright (c) 2010 The WebM project authors. All Rights Reserved.
36fefe538d859300e7febe78271828198c10f1b52fgalligan@chromium.org *
46fefe538d859300e7febe78271828198c10f1b52fgalligan@chromium.org *  Use of this source code is governed by a BSD-style license
56fefe538d859300e7febe78271828198c10f1b52fgalligan@chromium.org *  that can be found in the LICENSE file in the root of the source
66fefe538d859300e7febe78271828198c10f1b52fgalligan@chromium.org *  tree. An additional intellectual property rights grant can be found
76fefe538d859300e7febe78271828198c10f1b52fgalligan@chromium.org *  in the file PATENTS.  All contributing project authors may
86fefe538d859300e7febe78271828198c10f1b52fgalligan@chromium.org *  be found in the AUTHORS file in the root of the source tree.
96fefe538d859300e7febe78271828198c10f1b52fgalligan@chromium.org */
106fefe538d859300e7febe78271828198c10f1b52fgalligan@chromium.org
11ecee051929d6ced19cf324688774acccc9ad4a0ajohannkoenig@chromium.org#include "./vp9_rtcd.h"
126fefe538d859300e7febe78271828198c10f1b52fgalligan@chromium.org
1310a9a0d835561a7f2300c561c514efcf374554d6fgalligan@chromium.org#include "vpx_ports/mem.h"
14ecee051929d6ced19cf324688774acccc9ad4a0ajohannkoenig@chromium.org#include "vpx/vpx_integer.h"
15ecee051929d6ced19cf324688774acccc9ad4a0ajohannkoenig@chromium.org
16ecee051929d6ced19cf324688774acccc9ad4a0ajohannkoenig@chromium.org#include "vp9/common/vp9_common.h"
17ecee051929d6ced19cf324688774acccc9ad4a0ajohannkoenig@chromium.org#include "vp9/common/vp9_filter.h"
18ecee051929d6ced19cf324688774acccc9ad4a0ajohannkoenig@chromium.org
19ecee051929d6ced19cf324688774acccc9ad4a0ajohannkoenig@chromium.org#include "vp9/encoder/vp9_variance.h"
20ecee051929d6ced19cf324688774acccc9ad4a0ajohannkoenig@chromium.org
21693441efe611de7ca09c00f4e79776f604b689f4joeyparrish@google.comvoid variance(const uint8_t *a, int  a_stride,
22693441efe611de7ca09c00f4e79776f604b689f4joeyparrish@google.com              const uint8_t *b, int  b_stride,
23693441efe611de7ca09c00f4e79776f604b689f4joeyparrish@google.com              int  w, int  h, unsigned int *sse, int *sum) {
24ecee051929d6ced19cf324688774acccc9ad4a0ajohannkoenig@chromium.org  int i, j;
25ecee051929d6ced19cf324688774acccc9ad4a0ajohannkoenig@chromium.org
26ecee051929d6ced19cf324688774acccc9ad4a0ajohannkoenig@chromium.org  *sum = 0;
27ecee051929d6ced19cf324688774acccc9ad4a0ajohannkoenig@chromium.org  *sse = 0;
28ecee051929d6ced19cf324688774acccc9ad4a0ajohannkoenig@chromium.org
29ecee051929d6ced19cf324688774acccc9ad4a0ajohannkoenig@chromium.org  for (i = 0; i < h; i++) {
30ecee051929d6ced19cf324688774acccc9ad4a0ajohannkoenig@chromium.org    for (j = 0; j < w; j++) {
31693441efe611de7ca09c00f4e79776f604b689f4joeyparrish@google.com      const int diff = a[j] - b[j];
32ecee051929d6ced19cf324688774acccc9ad4a0ajohannkoenig@chromium.org      *sum += diff;
33ecee051929d6ced19cf324688774acccc9ad4a0ajohannkoenig@chromium.org      *sse += diff * diff;
34ecee051929d6ced19cf324688774acccc9ad4a0ajohannkoenig@chromium.org    }
35ecee051929d6ced19cf324688774acccc9ad4a0ajohannkoenig@chromium.org
36693441efe611de7ca09c00f4e79776f604b689f4joeyparrish@google.com    a += a_stride;
37693441efe611de7ca09c00f4e79776f604b689f4joeyparrish@google.com    b += b_stride;
38ecee051929d6ced19cf324688774acccc9ad4a0ajohannkoenig@chromium.org  }
39ecee051929d6ced19cf324688774acccc9ad4a0ajohannkoenig@chromium.org}
40ecee051929d6ced19cf324688774acccc9ad4a0ajohannkoenig@chromium.org
41693441efe611de7ca09c00f4e79776f604b689f4joeyparrish@google.com// Applies a 1-D 2-tap bi-linear filter to the source block in either horizontal
42693441efe611de7ca09c00f4e79776f604b689f4joeyparrish@google.com// or vertical direction to produce the filtered output block. Used to implement
43693441efe611de7ca09c00f4e79776f604b689f4joeyparrish@google.com// first-pass of 2-D separable filter.
44693441efe611de7ca09c00f4e79776f604b689f4joeyparrish@google.com//
45693441efe611de7ca09c00f4e79776f604b689f4joeyparrish@google.com// Produces int32_t output to retain precision for next pass. Two filter taps
46693441efe611de7ca09c00f4e79776f604b689f4joeyparrish@google.com// should sum to VP9_FILTER_WEIGHT. pixel_step defines whether the filter is
47693441efe611de7ca09c00f4e79776f604b689f4joeyparrish@google.com// applied horizontally (pixel_step=1) or vertically (pixel_step=stride). It
48693441efe611de7ca09c00f4e79776f604b689f4joeyparrish@google.com// defines the offset required to move from one input to the next.
49ecee051929d6ced19cf324688774acccc9ad4a0ajohannkoenig@chromium.orgstatic void var_filter_block2d_bil_first_pass(const uint8_t *src_ptr,
50ecee051929d6ced19cf324688774acccc9ad4a0ajohannkoenig@chromium.org                                              uint16_t *output_ptr,
51ecee051929d6ced19cf324688774acccc9ad4a0ajohannkoenig@chromium.org                                              unsigned int src_pixels_per_line,
52ecee051929d6ced19cf324688774acccc9ad4a0ajohannkoenig@chromium.org                                              int pixel_step,
53ecee051929d6ced19cf324688774acccc9ad4a0ajohannkoenig@chromium.org                                              unsigned int output_height,
54ecee051929d6ced19cf324688774acccc9ad4a0ajohannkoenig@chromium.org                                              unsigned int output_width,
55ecee051929d6ced19cf324688774acccc9ad4a0ajohannkoenig@chromium.org                                              const int16_t *vp9_filter) {
56ecee051929d6ced19cf324688774acccc9ad4a0ajohannkoenig@chromium.org  unsigned int i, j;
57ecee051929d6ced19cf324688774acccc9ad4a0ajohannkoenig@chromium.org
58ecee051929d6ced19cf324688774acccc9ad4a0ajohannkoenig@chromium.org  for (i = 0; i < output_height; i++) {
59ecee051929d6ced19cf324688774acccc9ad4a0ajohannkoenig@chromium.org    for (j = 0; j < output_width; j++) {
60ecee051929d6ced19cf324688774acccc9ad4a0ajohannkoenig@chromium.org      output_ptr[j] = ROUND_POWER_OF_TWO((int)src_ptr[0] * vp9_filter[0] +
61ecee051929d6ced19cf324688774acccc9ad4a0ajohannkoenig@chromium.org                          (int)src_ptr[pixel_step] * vp9_filter[1],
62ecee051929d6ced19cf324688774acccc9ad4a0ajohannkoenig@chromium.org                          FILTER_BITS);
63ecee051929d6ced19cf324688774acccc9ad4a0ajohannkoenig@chromium.org
64ecee051929d6ced19cf324688774acccc9ad4a0ajohannkoenig@chromium.org      src_ptr++;
65ecee051929d6ced19cf324688774acccc9ad4a0ajohannkoenig@chromium.org    }
66ecee051929d6ced19cf324688774acccc9ad4a0ajohannkoenig@chromium.org
67ecee051929d6ced19cf324688774acccc9ad4a0ajohannkoenig@chromium.org    // Next row...
68ecee051929d6ced19cf324688774acccc9ad4a0ajohannkoenig@chromium.org    src_ptr    += src_pixels_per_line - output_width;
69ecee051929d6ced19cf324688774acccc9ad4a0ajohannkoenig@chromium.org    output_ptr += output_width;
70ecee051929d6ced19cf324688774acccc9ad4a0ajohannkoenig@chromium.org  }
71ecee051929d6ced19cf324688774acccc9ad4a0ajohannkoenig@chromium.org}
72ecee051929d6ced19cf324688774acccc9ad4a0ajohannkoenig@chromium.org
73693441efe611de7ca09c00f4e79776f604b689f4joeyparrish@google.com// Applies a 1-D 2-tap bi-linear filter to the source block in either horizontal
74693441efe611de7ca09c00f4e79776f604b689f4joeyparrish@google.com// or vertical direction to produce the filtered output block. Used to implement
75693441efe611de7ca09c00f4e79776f604b689f4joeyparrish@google.com// second-pass of 2-D separable filter.
76693441efe611de7ca09c00f4e79776f604b689f4joeyparrish@google.com//
77693441efe611de7ca09c00f4e79776f604b689f4joeyparrish@google.com// Requires 32-bit input as produced by filter_block2d_bil_first_pass. Two
78693441efe611de7ca09c00f4e79776f604b689f4joeyparrish@google.com// filter taps should sum to VP9_FILTER_WEIGHT. pixel_step defines whether the
79693441efe611de7ca09c00f4e79776f604b689f4joeyparrish@google.com// filter is applied horizontally (pixel_step=1) or vertically (pixel_step=
80693441efe611de7ca09c00f4e79776f604b689f4joeyparrish@google.com// stride). It defines the offset required to move from one input to the next.
81ecee051929d6ced19cf324688774acccc9ad4a0ajohannkoenig@chromium.orgstatic void var_filter_block2d_bil_second_pass(const uint16_t *src_ptr,
82ecee051929d6ced19cf324688774acccc9ad4a0ajohannkoenig@chromium.org                                               uint8_t *output_ptr,
83ecee051929d6ced19cf324688774acccc9ad4a0ajohannkoenig@chromium.org                                               unsigned int src_pixels_per_line,
84ecee051929d6ced19cf324688774acccc9ad4a0ajohannkoenig@chromium.org                                               unsigned int pixel_step,
85ecee051929d6ced19cf324688774acccc9ad4a0ajohannkoenig@chromium.org                                               unsigned int output_height,
86ecee051929d6ced19cf324688774acccc9ad4a0ajohannkoenig@chromium.org                                               unsigned int output_width,
87ecee051929d6ced19cf324688774acccc9ad4a0ajohannkoenig@chromium.org                                               const int16_t *vp9_filter) {
88ecee051929d6ced19cf324688774acccc9ad4a0ajohannkoenig@chromium.org  unsigned int  i, j;
89ecee051929d6ced19cf324688774acccc9ad4a0ajohannkoenig@chromium.org
90ecee051929d6ced19cf324688774acccc9ad4a0ajohannkoenig@chromium.org  for (i = 0; i < output_height; i++) {
91ecee051929d6ced19cf324688774acccc9ad4a0ajohannkoenig@chromium.org    for (j = 0; j < output_width; j++) {
92ecee051929d6ced19cf324688774acccc9ad4a0ajohannkoenig@chromium.org      output_ptr[j] = ROUND_POWER_OF_TWO((int)src_ptr[0] * vp9_filter[0] +
93ecee051929d6ced19cf324688774acccc9ad4a0ajohannkoenig@chromium.org                          (int)src_ptr[pixel_step] * vp9_filter[1],
94ecee051929d6ced19cf324688774acccc9ad4a0ajohannkoenig@chromium.org                          FILTER_BITS);
95ecee051929d6ced19cf324688774acccc9ad4a0ajohannkoenig@chromium.org      src_ptr++;
96ecee051929d6ced19cf324688774acccc9ad4a0ajohannkoenig@chromium.org    }
97ecee051929d6ced19cf324688774acccc9ad4a0ajohannkoenig@chromium.org
98ecee051929d6ced19cf324688774acccc9ad4a0ajohannkoenig@chromium.org    src_ptr += src_pixels_per_line - output_width;
99ecee051929d6ced19cf324688774acccc9ad4a0ajohannkoenig@chromium.org    output_ptr += output_width;
100ecee051929d6ced19cf324688774acccc9ad4a0ajohannkoenig@chromium.org  }
101ecee051929d6ced19cf324688774acccc9ad4a0ajohannkoenig@chromium.org}
1026fefe538d859300e7febe78271828198c10f1b52fgalligan@chromium.org
103d348b8d765c019ee7250075d663a83db00c65c08tomfinegan@chromium.orgunsigned int vp9_get_mb_ss_c(const int16_t *src_ptr) {
1046fefe538d859300e7febe78271828198c10f1b52fgalligan@chromium.org  unsigned int i, sum = 0;
1056fefe538d859300e7febe78271828198c10f1b52fgalligan@chromium.org
106d95585fb0ec024f6abd96f7b02e0df58019d46afjohannkoenig@chromium.org  for (i = 0; i < 256; ++i) {
107693441efe611de7ca09c00f4e79776f604b689f4joeyparrish@google.com    sum += src_ptr[i] * src_ptr[i];
108d95585fb0ec024f6abd96f7b02e0df58019d46afjohannkoenig@chromium.org  }
1096fefe538d859300e7febe78271828198c10f1b52fgalligan@chromium.org
1106fefe538d859300e7febe78271828198c10f1b52fgalligan@chromium.org  return sum;
1116fefe538d859300e7febe78271828198c10f1b52fgalligan@chromium.org}
1126fefe538d859300e7febe78271828198c10f1b52fgalligan@chromium.org
113693441efe611de7ca09c00f4e79776f604b689f4joeyparrish@google.com#define VAR(W, H) \
114693441efe611de7ca09c00f4e79776f604b689f4joeyparrish@google.comunsigned int vp9_variance##W##x##H##_c(const uint8_t *a, int a_stride, \
115693441efe611de7ca09c00f4e79776f604b689f4joeyparrish@google.com                                       const uint8_t *b, int b_stride, \
116693441efe611de7ca09c00f4e79776f604b689f4joeyparrish@google.com                                       unsigned int *sse) { \
117810cf1767dc8df4783e02ba8a712072f50ddc99efgalligan@chromium.org  int sum; \
118810cf1767dc8df4783e02ba8a712072f50ddc99efgalligan@chromium.org  variance(a, a_stride, b, b_stride, W, H, sse, &sum); \
119810cf1767dc8df4783e02ba8a712072f50ddc99efgalligan@chromium.org  return *sse - (((int64_t)sum * sum) / (W * H)); \
120693441efe611de7ca09c00f4e79776f604b689f4joeyparrish@google.com}
121693441efe611de7ca09c00f4e79776f604b689f4joeyparrish@google.com
122693441efe611de7ca09c00f4e79776f604b689f4joeyparrish@google.com#define SUBPIX_VAR(W, H) \
123693441efe611de7ca09c00f4e79776f604b689f4joeyparrish@google.comunsigned int vp9_sub_pixel_variance##W##x##H##_c( \
124693441efe611de7ca09c00f4e79776f604b689f4joeyparrish@google.com  const uint8_t *src, int  src_stride, \
125693441efe611de7ca09c00f4e79776f604b689f4joeyparrish@google.com  int xoffset, int  yoffset, \
126693441efe611de7ca09c00f4e79776f604b689f4joeyparrish@google.com  const uint8_t *dst, int dst_stride, \
127693441efe611de7ca09c00f4e79776f604b689f4joeyparrish@google.com  unsigned int *sse) { \
128693441efe611de7ca09c00f4e79776f604b689f4joeyparrish@google.com  uint16_t fdata3[(H + 1) * W]; \
129693441efe611de7ca09c00f4e79776f604b689f4joeyparrish@google.com  uint8_t temp2[H * W]; \
130693441efe611de7ca09c00f4e79776f604b689f4joeyparrish@google.com\
131693441efe611de7ca09c00f4e79776f604b689f4joeyparrish@google.com  var_filter_block2d_bil_first_pass(src, fdata3, src_stride, 1, H + 1, W, \
132693441efe611de7ca09c00f4e79776f604b689f4joeyparrish@google.com                                    BILINEAR_FILTERS_2TAP(xoffset)); \
133693441efe611de7ca09c00f4e79776f604b689f4joeyparrish@google.com  var_filter_block2d_bil_second_pass(fdata3, temp2, W, W, H, W, \
134693441efe611de7ca09c00f4e79776f604b689f4joeyparrish@google.com                                     BILINEAR_FILTERS_2TAP(yoffset)); \
135693441efe611de7ca09c00f4e79776f604b689f4joeyparrish@google.com\
136693441efe611de7ca09c00f4e79776f604b689f4joeyparrish@google.com  return vp9_variance##W##x##H##_c(temp2, W, dst, dst_stride, sse); \
137693441efe611de7ca09c00f4e79776f604b689f4joeyparrish@google.com}
138693441efe611de7ca09c00f4e79776f604b689f4joeyparrish@google.com
139693441efe611de7ca09c00f4e79776f604b689f4joeyparrish@google.com#define SUBPIX_AVG_VAR(W, H) \
140693441efe611de7ca09c00f4e79776f604b689f4joeyparrish@google.comunsigned int vp9_sub_pixel_avg_variance##W##x##H##_c( \
141693441efe611de7ca09c00f4e79776f604b689f4joeyparrish@google.com  const uint8_t *src, int  src_stride, \
142693441efe611de7ca09c00f4e79776f604b689f4joeyparrish@google.com  int xoffset, int  yoffset, \
143693441efe611de7ca09c00f4e79776f604b689f4joeyparrish@google.com  const uint8_t *dst, int dst_stride, \
144693441efe611de7ca09c00f4e79776f604b689f4joeyparrish@google.com  unsigned int *sse, \
145693441efe611de7ca09c00f4e79776f604b689f4joeyparrish@google.com  const uint8_t *second_pred) { \
146693441efe611de7ca09c00f4e79776f604b689f4joeyparrish@google.com  uint16_t fdata3[(H + 1) * W]; \
147693441efe611de7ca09c00f4e79776f604b689f4joeyparrish@google.com  uint8_t temp2[H * W]; \
148693441efe611de7ca09c00f4e79776f604b689f4joeyparrish@google.com  DECLARE_ALIGNED_ARRAY(16, uint8_t, temp3, H * W); \
149693441efe611de7ca09c00f4e79776f604b689f4joeyparrish@google.com\
150693441efe611de7ca09c00f4e79776f604b689f4joeyparrish@google.com  var_filter_block2d_bil_first_pass(src, fdata3, src_stride, 1, H + 1, W, \
151693441efe611de7ca09c00f4e79776f604b689f4joeyparrish@google.com                                    BILINEAR_FILTERS_2TAP(xoffset)); \
152693441efe611de7ca09c00f4e79776f604b689f4joeyparrish@google.com  var_filter_block2d_bil_second_pass(fdata3, temp2, W, W, H, W, \
153693441efe611de7ca09c00f4e79776f604b689f4joeyparrish@google.com                                     BILINEAR_FILTERS_2TAP(yoffset)); \
154693441efe611de7ca09c00f4e79776f604b689f4joeyparrish@google.com\
155693441efe611de7ca09c00f4e79776f604b689f4joeyparrish@google.com  vp9_comp_avg_pred(temp3, second_pred, W, H, temp2, W); \
156693441efe611de7ca09c00f4e79776f604b689f4joeyparrish@google.com\
157693441efe611de7ca09c00f4e79776f604b689f4joeyparrish@google.com  return vp9_variance##W##x##H##_c(temp3, W, dst, dst_stride, sse); \
158693441efe611de7ca09c00f4e79776f604b689f4joeyparrish@google.com}
159693441efe611de7ca09c00f4e79776f604b689f4joeyparrish@google.com
16088b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.orgvoid vp9_get16x16var_c(const uint8_t *src_ptr, int source_stride,
16188b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org                       const uint8_t *ref_ptr, int ref_stride,
16288b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org                       unsigned int *sse, int *sum) {
16388b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org  variance(src_ptr, source_stride, ref_ptr, ref_stride, 16, 16, sse, sum);
16488b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org}
16588b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org
16688b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.orgvoid vp9_get8x8var_c(const uint8_t *src_ptr, int source_stride,
16788b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org                     const uint8_t *ref_ptr, int ref_stride,
16888b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org                     unsigned int *sse, int *sum) {
16988b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org  variance(src_ptr, source_stride, ref_ptr, ref_stride, 8, 8, sse, sum);
17088b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org}
17188b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org
172810cf1767dc8df4783e02ba8a712072f50ddc99efgalligan@chromium.orgunsigned int vp9_mse16x16_c(const uint8_t *src, int src_stride,
173810cf1767dc8df4783e02ba8a712072f50ddc99efgalligan@chromium.org                            const uint8_t *ref, int ref_stride,
1746fefe538d859300e7febe78271828198c10f1b52fgalligan@chromium.org                            unsigned int *sse) {
175810cf1767dc8df4783e02ba8a712072f50ddc99efgalligan@chromium.org  int sum;
176810cf1767dc8df4783e02ba8a712072f50ddc99efgalligan@chromium.org  variance(src, src_stride, ref, ref_stride, 16, 16, sse, &sum);
177810cf1767dc8df4783e02ba8a712072f50ddc99efgalligan@chromium.org  return *sse;
1786fefe538d859300e7febe78271828198c10f1b52fgalligan@chromium.org}
1796fefe538d859300e7febe78271828198c10f1b52fgalligan@chromium.org
180810cf1767dc8df4783e02ba8a712072f50ddc99efgalligan@chromium.orgunsigned int vp9_mse16x8_c(const uint8_t *src, int src_stride,
181810cf1767dc8df4783e02ba8a712072f50ddc99efgalligan@chromium.org                           const uint8_t *ref, int ref_stride,
18210a9a0d835561a7f2300c561c514efcf374554d6fgalligan@chromium.org                           unsigned int *sse) {
183810cf1767dc8df4783e02ba8a712072f50ddc99efgalligan@chromium.org  int sum;
184810cf1767dc8df4783e02ba8a712072f50ddc99efgalligan@chromium.org  variance(src, src_stride, ref, ref_stride, 16, 8, sse, &sum);
185810cf1767dc8df4783e02ba8a712072f50ddc99efgalligan@chromium.org  return *sse;
18610a9a0d835561a7f2300c561c514efcf374554d6fgalligan@chromium.org}
18710a9a0d835561a7f2300c561c514efcf374554d6fgalligan@chromium.org
188810cf1767dc8df4783e02ba8a712072f50ddc99efgalligan@chromium.orgunsigned int vp9_mse8x16_c(const uint8_t *src, int src_stride,
189810cf1767dc8df4783e02ba8a712072f50ddc99efgalligan@chromium.org                           const uint8_t *ref, int ref_stride,
19010a9a0d835561a7f2300c561c514efcf374554d6fgalligan@chromium.org                           unsigned int *sse) {
191810cf1767dc8df4783e02ba8a712072f50ddc99efgalligan@chromium.org  int sum;
192810cf1767dc8df4783e02ba8a712072f50ddc99efgalligan@chromium.org  variance(src, src_stride, ref, ref_stride, 8, 16, sse, &sum);
193810cf1767dc8df4783e02ba8a712072f50ddc99efgalligan@chromium.org  return *sse;
19410a9a0d835561a7f2300c561c514efcf374554d6fgalligan@chromium.org}
19510a9a0d835561a7f2300c561c514efcf374554d6fgalligan@chromium.org
196810cf1767dc8df4783e02ba8a712072f50ddc99efgalligan@chromium.orgunsigned int vp9_mse8x8_c(const uint8_t *src, int src_stride,
197810cf1767dc8df4783e02ba8a712072f50ddc99efgalligan@chromium.org                          const uint8_t *ref, int ref_stride,
19810a9a0d835561a7f2300c561c514efcf374554d6fgalligan@chromium.org                          unsigned int *sse) {
199810cf1767dc8df4783e02ba8a712072f50ddc99efgalligan@chromium.org  int sum;
200810cf1767dc8df4783e02ba8a712072f50ddc99efgalligan@chromium.org  variance(src, src_stride, ref, ref_stride, 8, 8, sse, &sum);
201810cf1767dc8df4783e02ba8a712072f50ddc99efgalligan@chromium.org  return *sse;
20210a9a0d835561a7f2300c561c514efcf374554d6fgalligan@chromium.org}
20310a9a0d835561a7f2300c561c514efcf374554d6fgalligan@chromium.org
204693441efe611de7ca09c00f4e79776f604b689f4joeyparrish@google.comVAR(4, 4)
205693441efe611de7ca09c00f4e79776f604b689f4joeyparrish@google.comSUBPIX_VAR(4, 4)
206693441efe611de7ca09c00f4e79776f604b689f4joeyparrish@google.comSUBPIX_AVG_VAR(4, 4)
2076fefe538d859300e7febe78271828198c10f1b52fgalligan@chromium.org
208693441efe611de7ca09c00f4e79776f604b689f4joeyparrish@google.comVAR(4, 8)
209693441efe611de7ca09c00f4e79776f604b689f4joeyparrish@google.comSUBPIX_VAR(4, 8)
210693441efe611de7ca09c00f4e79776f604b689f4joeyparrish@google.comSUBPIX_AVG_VAR(4, 8)
21110a9a0d835561a7f2300c561c514efcf374554d6fgalligan@chromium.org
212693441efe611de7ca09c00f4e79776f604b689f4joeyparrish@google.comVAR(8, 4)
213693441efe611de7ca09c00f4e79776f604b689f4joeyparrish@google.comSUBPIX_VAR(8, 4)
214693441efe611de7ca09c00f4e79776f604b689f4joeyparrish@google.comSUBPIX_AVG_VAR(8, 4)
21510a9a0d835561a7f2300c561c514efcf374554d6fgalligan@chromium.org
216693441efe611de7ca09c00f4e79776f604b689f4joeyparrish@google.comVAR(8, 8)
217693441efe611de7ca09c00f4e79776f604b689f4joeyparrish@google.comSUBPIX_VAR(8, 8)
218693441efe611de7ca09c00f4e79776f604b689f4joeyparrish@google.comSUBPIX_AVG_VAR(8, 8)
219d348b8d765c019ee7250075d663a83db00c65c08tomfinegan@chromium.org
220693441efe611de7ca09c00f4e79776f604b689f4joeyparrish@google.comVAR(8, 16)
221693441efe611de7ca09c00f4e79776f604b689f4joeyparrish@google.comSUBPIX_VAR(8, 16)
222693441efe611de7ca09c00f4e79776f604b689f4joeyparrish@google.comSUBPIX_AVG_VAR(8, 16)
223d348b8d765c019ee7250075d663a83db00c65c08tomfinegan@chromium.org
224693441efe611de7ca09c00f4e79776f604b689f4joeyparrish@google.comVAR(16, 8)
225693441efe611de7ca09c00f4e79776f604b689f4joeyparrish@google.comSUBPIX_VAR(16, 8)
226693441efe611de7ca09c00f4e79776f604b689f4joeyparrish@google.comSUBPIX_AVG_VAR(16, 8)
227d348b8d765c019ee7250075d663a83db00c65c08tomfinegan@chromium.org
228693441efe611de7ca09c00f4e79776f604b689f4joeyparrish@google.comVAR(16, 16)
229693441efe611de7ca09c00f4e79776f604b689f4joeyparrish@google.comSUBPIX_VAR(16, 16)
230693441efe611de7ca09c00f4e79776f604b689f4joeyparrish@google.comSUBPIX_AVG_VAR(16, 16)
231d348b8d765c019ee7250075d663a83db00c65c08tomfinegan@chromium.org
232693441efe611de7ca09c00f4e79776f604b689f4joeyparrish@google.comVAR(16, 32)
233693441efe611de7ca09c00f4e79776f604b689f4joeyparrish@google.comSUBPIX_VAR(16, 32)
234693441efe611de7ca09c00f4e79776f604b689f4joeyparrish@google.comSUBPIX_AVG_VAR(16, 32)
23510a9a0d835561a7f2300c561c514efcf374554d6fgalligan@chromium.org
236693441efe611de7ca09c00f4e79776f604b689f4joeyparrish@google.comVAR(32, 16)
237693441efe611de7ca09c00f4e79776f604b689f4joeyparrish@google.comSUBPIX_VAR(32, 16)
238693441efe611de7ca09c00f4e79776f604b689f4joeyparrish@google.comSUBPIX_AVG_VAR(32, 16)
23910a9a0d835561a7f2300c561c514efcf374554d6fgalligan@chromium.org
240693441efe611de7ca09c00f4e79776f604b689f4joeyparrish@google.comVAR(32, 32)
241693441efe611de7ca09c00f4e79776f604b689f4joeyparrish@google.comSUBPIX_VAR(32, 32)
242693441efe611de7ca09c00f4e79776f604b689f4joeyparrish@google.comSUBPIX_AVG_VAR(32, 32)
2436fefe538d859300e7febe78271828198c10f1b52fgalligan@chromium.org
244693441efe611de7ca09c00f4e79776f604b689f4joeyparrish@google.comVAR(32, 64)
245693441efe611de7ca09c00f4e79776f604b689f4joeyparrish@google.comSUBPIX_VAR(32, 64)
246693441efe611de7ca09c00f4e79776f604b689f4joeyparrish@google.comSUBPIX_AVG_VAR(32, 64)
24710a9a0d835561a7f2300c561c514efcf374554d6fgalligan@chromium.org
248693441efe611de7ca09c00f4e79776f604b689f4joeyparrish@google.comVAR(64, 32)
249693441efe611de7ca09c00f4e79776f604b689f4joeyparrish@google.comSUBPIX_VAR(64, 32)
250693441efe611de7ca09c00f4e79776f604b689f4joeyparrish@google.comSUBPIX_AVG_VAR(64, 32)
25110a9a0d835561a7f2300c561c514efcf374554d6fgalligan@chromium.org
252693441efe611de7ca09c00f4e79776f604b689f4joeyparrish@google.comVAR(64, 64)
253693441efe611de7ca09c00f4e79776f604b689f4joeyparrish@google.comSUBPIX_VAR(64, 64)
254693441efe611de7ca09c00f4e79776f604b689f4joeyparrish@google.comSUBPIX_AVG_VAR(64, 64)
25510a9a0d835561a7f2300c561c514efcf374554d6fgalligan@chromium.org
25693a74791c8e808ea76001ee07693aa2a5fdd3500johannkoenig@chromium.orgvoid vp9_comp_avg_pred(uint8_t *comp_pred, const uint8_t *pred, int width,
25793a74791c8e808ea76001ee07693aa2a5fdd3500johannkoenig@chromium.org                       int height, const uint8_t *ref, int ref_stride) {
25893a74791c8e808ea76001ee07693aa2a5fdd3500johannkoenig@chromium.org  int i, j;
25993a74791c8e808ea76001ee07693aa2a5fdd3500johannkoenig@chromium.org
26093a74791c8e808ea76001ee07693aa2a5fdd3500johannkoenig@chromium.org  for (i = 0; i < height; i++) {
26193a74791c8e808ea76001ee07693aa2a5fdd3500johannkoenig@chromium.org    for (j = 0; j < width; j++) {
262693441efe611de7ca09c00f4e79776f604b689f4joeyparrish@google.com      const int tmp = pred[j] + ref[j];
263693441efe611de7ca09c00f4e79776f604b689f4joeyparrish@google.com      comp_pred[j] = ROUND_POWER_OF_TWO(tmp, 1);
26493a74791c8e808ea76001ee07693aa2a5fdd3500johannkoenig@chromium.org    }
26593a74791c8e808ea76001ee07693aa2a5fdd3500johannkoenig@chromium.org    comp_pred += width;
26693a74791c8e808ea76001ee07693aa2a5fdd3500johannkoenig@chromium.org    pred += width;
26793a74791c8e808ea76001ee07693aa2a5fdd3500johannkoenig@chromium.org    ref += ref_stride;
26893a74791c8e808ea76001ee07693aa2a5fdd3500johannkoenig@chromium.org  }
26993a74791c8e808ea76001ee07693aa2a5fdd3500johannkoenig@chromium.org}
27087997d490ae52aa962a985c95b3cddf7f8832641johannkoenig@chromium.org
27187997d490ae52aa962a985c95b3cddf7f8832641johannkoenig@chromium.org#if CONFIG_VP9_HIGHBITDEPTH
27287997d490ae52aa962a985c95b3cddf7f8832641johannkoenig@chromium.orgvoid high_variance64(const uint8_t *a8, int  a_stride,
27387997d490ae52aa962a985c95b3cddf7f8832641johannkoenig@chromium.org                     const uint8_t *b8, int  b_stride,
27487997d490ae52aa962a985c95b3cddf7f8832641johannkoenig@chromium.org                     int w, int h, uint64_t *sse,
27587997d490ae52aa962a985c95b3cddf7f8832641johannkoenig@chromium.org                     uint64_t *sum) {
27687997d490ae52aa962a985c95b3cddf7f8832641johannkoenig@chromium.org  int i, j;
27787997d490ae52aa962a985c95b3cddf7f8832641johannkoenig@chromium.org
27887997d490ae52aa962a985c95b3cddf7f8832641johannkoenig@chromium.org  uint16_t *a = CONVERT_TO_SHORTPTR(a8);
27987997d490ae52aa962a985c95b3cddf7f8832641johannkoenig@chromium.org  uint16_t *b = CONVERT_TO_SHORTPTR(b8);
28087997d490ae52aa962a985c95b3cddf7f8832641johannkoenig@chromium.org  *sum = 0;
28187997d490ae52aa962a985c95b3cddf7f8832641johannkoenig@chromium.org  *sse = 0;
28287997d490ae52aa962a985c95b3cddf7f8832641johannkoenig@chromium.org
28387997d490ae52aa962a985c95b3cddf7f8832641johannkoenig@chromium.org  for (i = 0; i < h; i++) {
28487997d490ae52aa962a985c95b3cddf7f8832641johannkoenig@chromium.org    for (j = 0; j < w; j++) {
28587997d490ae52aa962a985c95b3cddf7f8832641johannkoenig@chromium.org      const int diff = a[j] - b[j];
28687997d490ae52aa962a985c95b3cddf7f8832641johannkoenig@chromium.org      *sum += diff;
28787997d490ae52aa962a985c95b3cddf7f8832641johannkoenig@chromium.org      *sse += diff * diff;
28887997d490ae52aa962a985c95b3cddf7f8832641johannkoenig@chromium.org    }
28987997d490ae52aa962a985c95b3cddf7f8832641johannkoenig@chromium.org    a += a_stride;
29087997d490ae52aa962a985c95b3cddf7f8832641johannkoenig@chromium.org    b += b_stride;
29187997d490ae52aa962a985c95b3cddf7f8832641johannkoenig@chromium.org  }
29287997d490ae52aa962a985c95b3cddf7f8832641johannkoenig@chromium.org}
29387997d490ae52aa962a985c95b3cddf7f8832641johannkoenig@chromium.org
29487997d490ae52aa962a985c95b3cddf7f8832641johannkoenig@chromium.orgvoid high_variance(const uint8_t *a8, int  a_stride,
29587997d490ae52aa962a985c95b3cddf7f8832641johannkoenig@chromium.org                   const uint8_t *b8, int  b_stride,
29687997d490ae52aa962a985c95b3cddf7f8832641johannkoenig@chromium.org                   int w, int h, unsigned int *sse,
29787997d490ae52aa962a985c95b3cddf7f8832641johannkoenig@chromium.org                   int *sum) {
29887997d490ae52aa962a985c95b3cddf7f8832641johannkoenig@chromium.org  uint64_t sse_long = 0;
29987997d490ae52aa962a985c95b3cddf7f8832641johannkoenig@chromium.org  uint64_t sum_long = 0;
30087997d490ae52aa962a985c95b3cddf7f8832641johannkoenig@chromium.org  high_variance64(a8, a_stride, b8, b_stride, w, h, &sse_long, &sum_long);
30187997d490ae52aa962a985c95b3cddf7f8832641johannkoenig@chromium.org  *sse = sse_long;
30287997d490ae52aa962a985c95b3cddf7f8832641johannkoenig@chromium.org  *sum = sum_long;
30387997d490ae52aa962a985c95b3cddf7f8832641johannkoenig@chromium.org}
30487997d490ae52aa962a985c95b3cddf7f8832641johannkoenig@chromium.org
30587997d490ae52aa962a985c95b3cddf7f8832641johannkoenig@chromium.orgvoid high_10_variance(const uint8_t *a8, int  a_stride,
30687997d490ae52aa962a985c95b3cddf7f8832641johannkoenig@chromium.org                      const uint8_t *b8, int  b_stride,
30787997d490ae52aa962a985c95b3cddf7f8832641johannkoenig@chromium.org                      int w, int h, unsigned int *sse,
30887997d490ae52aa962a985c95b3cddf7f8832641johannkoenig@chromium.org                      int *sum) {
30987997d490ae52aa962a985c95b3cddf7f8832641johannkoenig@chromium.org  uint64_t sse_long = 0;
31087997d490ae52aa962a985c95b3cddf7f8832641johannkoenig@chromium.org  uint64_t sum_long = 0;
31187997d490ae52aa962a985c95b3cddf7f8832641johannkoenig@chromium.org  high_variance64(a8, a_stride, b8, b_stride, w, h, &sse_long, &sum_long);
31287997d490ae52aa962a985c95b3cddf7f8832641johannkoenig@chromium.org  *sum = ROUND_POWER_OF_TWO(sum_long, 2);
31387997d490ae52aa962a985c95b3cddf7f8832641johannkoenig@chromium.org  *sse = ROUND_POWER_OF_TWO(sse_long, 4);
31487997d490ae52aa962a985c95b3cddf7f8832641johannkoenig@chromium.org}
31587997d490ae52aa962a985c95b3cddf7f8832641johannkoenig@chromium.org
31687997d490ae52aa962a985c95b3cddf7f8832641johannkoenig@chromium.orgvoid high_12_variance(const uint8_t *a8, int  a_stride,
31787997d490ae52aa962a985c95b3cddf7f8832641johannkoenig@chromium.org                      const uint8_t *b8, int  b_stride,
31887997d490ae52aa962a985c95b3cddf7f8832641johannkoenig@chromium.org                      int w, int h, unsigned int *sse,
31987997d490ae52aa962a985c95b3cddf7f8832641johannkoenig@chromium.org                      int *sum) {
32087997d490ae52aa962a985c95b3cddf7f8832641johannkoenig@chromium.org  uint64_t sse_long = 0;
32187997d490ae52aa962a985c95b3cddf7f8832641johannkoenig@chromium.org  uint64_t sum_long = 0;
32287997d490ae52aa962a985c95b3cddf7f8832641johannkoenig@chromium.org  high_variance64(a8, a_stride, b8, b_stride, w, h, &sse_long, &sum_long);
32387997d490ae52aa962a985c95b3cddf7f8832641johannkoenig@chromium.org  *sum = ROUND_POWER_OF_TWO(sum_long, 4);
32487997d490ae52aa962a985c95b3cddf7f8832641johannkoenig@chromium.org  *sse = ROUND_POWER_OF_TWO(sse_long, 8);
32587997d490ae52aa962a985c95b3cddf7f8832641johannkoenig@chromium.org}
32687997d490ae52aa962a985c95b3cddf7f8832641johannkoenig@chromium.org
32787997d490ae52aa962a985c95b3cddf7f8832641johannkoenig@chromium.orgstatic void high_var_filter_block2d_bil_first_pass(
32887997d490ae52aa962a985c95b3cddf7f8832641johannkoenig@chromium.org    const uint8_t *src_ptr8,
32987997d490ae52aa962a985c95b3cddf7f8832641johannkoenig@chromium.org    uint16_t *output_ptr,
33087997d490ae52aa962a985c95b3cddf7f8832641johannkoenig@chromium.org    unsigned int src_pixels_per_line,
33187997d490ae52aa962a985c95b3cddf7f8832641johannkoenig@chromium.org    int pixel_step,
33287997d490ae52aa962a985c95b3cddf7f8832641johannkoenig@chromium.org    unsigned int output_height,
33387997d490ae52aa962a985c95b3cddf7f8832641johannkoenig@chromium.org    unsigned int output_width,
33487997d490ae52aa962a985c95b3cddf7f8832641johannkoenig@chromium.org    const int16_t *vp9_filter) {
33587997d490ae52aa962a985c95b3cddf7f8832641johannkoenig@chromium.org  unsigned int i, j;
33687997d490ae52aa962a985c95b3cddf7f8832641johannkoenig@chromium.org  uint16_t *src_ptr = CONVERT_TO_SHORTPTR(src_ptr8);
33787997d490ae52aa962a985c95b3cddf7f8832641johannkoenig@chromium.org  for (i = 0; i < output_height; i++) {
33887997d490ae52aa962a985c95b3cddf7f8832641johannkoenig@chromium.org    for (j = 0; j < output_width; j++) {
33987997d490ae52aa962a985c95b3cddf7f8832641johannkoenig@chromium.org      output_ptr[j] =
34087997d490ae52aa962a985c95b3cddf7f8832641johannkoenig@chromium.org          ROUND_POWER_OF_TWO((int)src_ptr[0] * vp9_filter[0] +
34187997d490ae52aa962a985c95b3cddf7f8832641johannkoenig@chromium.org                             (int)src_ptr[pixel_step] * vp9_filter[1],
34287997d490ae52aa962a985c95b3cddf7f8832641johannkoenig@chromium.org                             FILTER_BITS);
34387997d490ae52aa962a985c95b3cddf7f8832641johannkoenig@chromium.org
34487997d490ae52aa962a985c95b3cddf7f8832641johannkoenig@chromium.org      src_ptr++;
34587997d490ae52aa962a985c95b3cddf7f8832641johannkoenig@chromium.org    }
34687997d490ae52aa962a985c95b3cddf7f8832641johannkoenig@chromium.org
34787997d490ae52aa962a985c95b3cddf7f8832641johannkoenig@chromium.org    // Next row...
34887997d490ae52aa962a985c95b3cddf7f8832641johannkoenig@chromium.org    src_ptr += src_pixels_per_line - output_width;
34987997d490ae52aa962a985c95b3cddf7f8832641johannkoenig@chromium.org    output_ptr += output_width;
35087997d490ae52aa962a985c95b3cddf7f8832641johannkoenig@chromium.org  }
35187997d490ae52aa962a985c95b3cddf7f8832641johannkoenig@chromium.org}
35287997d490ae52aa962a985c95b3cddf7f8832641johannkoenig@chromium.org
35387997d490ae52aa962a985c95b3cddf7f8832641johannkoenig@chromium.orgstatic void high_var_filter_block2d_bil_second_pass(
35487997d490ae52aa962a985c95b3cddf7f8832641johannkoenig@chromium.org    const uint16_t *src_ptr,
35587997d490ae52aa962a985c95b3cddf7f8832641johannkoenig@chromium.org    uint16_t *output_ptr,
35687997d490ae52aa962a985c95b3cddf7f8832641johannkoenig@chromium.org    unsigned int src_pixels_per_line,
35787997d490ae52aa962a985c95b3cddf7f8832641johannkoenig@chromium.org    unsigned int pixel_step,
35887997d490ae52aa962a985c95b3cddf7f8832641johannkoenig@chromium.org    unsigned int output_height,
35987997d490ae52aa962a985c95b3cddf7f8832641johannkoenig@chromium.org    unsigned int output_width,
36087997d490ae52aa962a985c95b3cddf7f8832641johannkoenig@chromium.org    const int16_t *vp9_filter) {
36187997d490ae52aa962a985c95b3cddf7f8832641johannkoenig@chromium.org  unsigned int  i, j;
36287997d490ae52aa962a985c95b3cddf7f8832641johannkoenig@chromium.org
36387997d490ae52aa962a985c95b3cddf7f8832641johannkoenig@chromium.org  for (i = 0; i < output_height; i++) {
36487997d490ae52aa962a985c95b3cddf7f8832641johannkoenig@chromium.org    for (j = 0; j < output_width; j++) {
36587997d490ae52aa962a985c95b3cddf7f8832641johannkoenig@chromium.org      output_ptr[j] =
36687997d490ae52aa962a985c95b3cddf7f8832641johannkoenig@chromium.org          ROUND_POWER_OF_TWO((int)src_ptr[0] * vp9_filter[0] +
36787997d490ae52aa962a985c95b3cddf7f8832641johannkoenig@chromium.org                             (int)src_ptr[pixel_step] * vp9_filter[1],
36887997d490ae52aa962a985c95b3cddf7f8832641johannkoenig@chromium.org                             FILTER_BITS);
36987997d490ae52aa962a985c95b3cddf7f8832641johannkoenig@chromium.org      src_ptr++;
37087997d490ae52aa962a985c95b3cddf7f8832641johannkoenig@chromium.org    }
37187997d490ae52aa962a985c95b3cddf7f8832641johannkoenig@chromium.org
37287997d490ae52aa962a985c95b3cddf7f8832641johannkoenig@chromium.org    src_ptr += src_pixels_per_line - output_width;
37387997d490ae52aa962a985c95b3cddf7f8832641johannkoenig@chromium.org    output_ptr += output_width;
37487997d490ae52aa962a985c95b3cddf7f8832641johannkoenig@chromium.org  }
37587997d490ae52aa962a985c95b3cddf7f8832641johannkoenig@chromium.org}
37687997d490ae52aa962a985c95b3cddf7f8832641johannkoenig@chromium.org
37787997d490ae52aa962a985c95b3cddf7f8832641johannkoenig@chromium.org#define HIGH_VAR(W, H) \
37887997d490ae52aa962a985c95b3cddf7f8832641johannkoenig@chromium.orgunsigned int vp9_high_variance##W##x##H##_c(const uint8_t *a, int a_stride, \
37987997d490ae52aa962a985c95b3cddf7f8832641johannkoenig@chromium.org                                            const uint8_t *b, int b_stride, \
38087997d490ae52aa962a985c95b3cddf7f8832641johannkoenig@chromium.org                                            unsigned int *sse) { \
38187997d490ae52aa962a985c95b3cddf7f8832641johannkoenig@chromium.org  int sum; \
38287997d490ae52aa962a985c95b3cddf7f8832641johannkoenig@chromium.org  high_variance(a, a_stride, b, b_stride, W, H, sse, &sum); \
38387997d490ae52aa962a985c95b3cddf7f8832641johannkoenig@chromium.org  return *sse - (((int64_t)sum * sum) / (W * H)); \
38487997d490ae52aa962a985c95b3cddf7f8832641johannkoenig@chromium.org} \
38587997d490ae52aa962a985c95b3cddf7f8832641johannkoenig@chromium.org\
38687997d490ae52aa962a985c95b3cddf7f8832641johannkoenig@chromium.orgunsigned int vp9_high_10_variance##W##x##H##_c(const uint8_t *a, int a_stride, \
38787997d490ae52aa962a985c95b3cddf7f8832641johannkoenig@chromium.org                                               const uint8_t *b, int b_stride, \
38887997d490ae52aa962a985c95b3cddf7f8832641johannkoenig@chromium.org                                                unsigned int *sse) { \
38987997d490ae52aa962a985c95b3cddf7f8832641johannkoenig@chromium.org  int sum; \
39087997d490ae52aa962a985c95b3cddf7f8832641johannkoenig@chromium.org  high_10_variance(a, a_stride, b, b_stride, W, H, sse, &sum); \
39187997d490ae52aa962a985c95b3cddf7f8832641johannkoenig@chromium.org  return *sse - (((int64_t)sum * sum) / (W * H)); \
39287997d490ae52aa962a985c95b3cddf7f8832641johannkoenig@chromium.org} \
39387997d490ae52aa962a985c95b3cddf7f8832641johannkoenig@chromium.org\
39487997d490ae52aa962a985c95b3cddf7f8832641johannkoenig@chromium.orgunsigned int vp9_high_12_variance##W##x##H##_c(const uint8_t *a, int a_stride, \
39587997d490ae52aa962a985c95b3cddf7f8832641johannkoenig@chromium.org                                               const uint8_t *b, int b_stride, \
39687997d490ae52aa962a985c95b3cddf7f8832641johannkoenig@chromium.org                                               unsigned int *sse) { \
39787997d490ae52aa962a985c95b3cddf7f8832641johannkoenig@chromium.org  int sum; \
39887997d490ae52aa962a985c95b3cddf7f8832641johannkoenig@chromium.org  high_12_variance(a, a_stride, b, b_stride, W, H, sse, &sum); \
39987997d490ae52aa962a985c95b3cddf7f8832641johannkoenig@chromium.org  return *sse - (((int64_t)sum * sum) / (W * H)); \
40087997d490ae52aa962a985c95b3cddf7f8832641johannkoenig@chromium.org}
40187997d490ae52aa962a985c95b3cddf7f8832641johannkoenig@chromium.org
40287997d490ae52aa962a985c95b3cddf7f8832641johannkoenig@chromium.org#define HIGH_SUBPIX_VAR(W, H) \
40387997d490ae52aa962a985c95b3cddf7f8832641johannkoenig@chromium.orgunsigned int vp9_high_sub_pixel_variance##W##x##H##_c( \
40487997d490ae52aa962a985c95b3cddf7f8832641johannkoenig@chromium.org  const uint8_t *src, int  src_stride, \
40587997d490ae52aa962a985c95b3cddf7f8832641johannkoenig@chromium.org  int xoffset, int  yoffset, \
40687997d490ae52aa962a985c95b3cddf7f8832641johannkoenig@chromium.org  const uint8_t *dst, int dst_stride, \
40787997d490ae52aa962a985c95b3cddf7f8832641johannkoenig@chromium.org  unsigned int *sse) { \
40887997d490ae52aa962a985c95b3cddf7f8832641johannkoenig@chromium.org  uint16_t fdata3[(H + 1) * W]; \
40987997d490ae52aa962a985c95b3cddf7f8832641johannkoenig@chromium.org  uint16_t temp2[H * W]; \
41087997d490ae52aa962a985c95b3cddf7f8832641johannkoenig@chromium.org\
41187997d490ae52aa962a985c95b3cddf7f8832641johannkoenig@chromium.org  high_var_filter_block2d_bil_first_pass(src, fdata3, src_stride, 1, H + 1, \
41287997d490ae52aa962a985c95b3cddf7f8832641johannkoenig@chromium.org                                         W, BILINEAR_FILTERS_2TAP(xoffset)); \
41387997d490ae52aa962a985c95b3cddf7f8832641johannkoenig@chromium.org  high_var_filter_block2d_bil_second_pass(fdata3, temp2, W, W, H, W, \
41487997d490ae52aa962a985c95b3cddf7f8832641johannkoenig@chromium.org                                          BILINEAR_FILTERS_2TAP(yoffset)); \
41587997d490ae52aa962a985c95b3cddf7f8832641johannkoenig@chromium.org\
41687997d490ae52aa962a985c95b3cddf7f8832641johannkoenig@chromium.org  return vp9_high_variance##W##x##H##_c(CONVERT_TO_BYTEPTR(temp2), W, dst, \
41787997d490ae52aa962a985c95b3cddf7f8832641johannkoenig@chromium.org                                        dst_stride, sse); \
41887997d490ae52aa962a985c95b3cddf7f8832641johannkoenig@chromium.org} \
41987997d490ae52aa962a985c95b3cddf7f8832641johannkoenig@chromium.org\
42087997d490ae52aa962a985c95b3cddf7f8832641johannkoenig@chromium.orgunsigned int vp9_high_10_sub_pixel_variance##W##x##H##_c( \
42187997d490ae52aa962a985c95b3cddf7f8832641johannkoenig@chromium.org  const uint8_t *src, int  src_stride, \
42287997d490ae52aa962a985c95b3cddf7f8832641johannkoenig@chromium.org  int xoffset, int  yoffset, \
42387997d490ae52aa962a985c95b3cddf7f8832641johannkoenig@chromium.org  const uint8_t *dst, int dst_stride, \
42487997d490ae52aa962a985c95b3cddf7f8832641johannkoenig@chromium.org  unsigned int *sse) { \
42587997d490ae52aa962a985c95b3cddf7f8832641johannkoenig@chromium.org  uint16_t fdata3[(H + 1) * W]; \
42687997d490ae52aa962a985c95b3cddf7f8832641johannkoenig@chromium.org  uint16_t temp2[H * W]; \
42787997d490ae52aa962a985c95b3cddf7f8832641johannkoenig@chromium.org\
42887997d490ae52aa962a985c95b3cddf7f8832641johannkoenig@chromium.org  high_var_filter_block2d_bil_first_pass(src, fdata3, src_stride, 1, H + 1, \
42987997d490ae52aa962a985c95b3cddf7f8832641johannkoenig@chromium.org                                         W, BILINEAR_FILTERS_2TAP(xoffset)); \
43087997d490ae52aa962a985c95b3cddf7f8832641johannkoenig@chromium.org  high_var_filter_block2d_bil_second_pass(fdata3, temp2, W, W, H, W, \
43187997d490ae52aa962a985c95b3cddf7f8832641johannkoenig@chromium.org                                          BILINEAR_FILTERS_2TAP(yoffset)); \
43287997d490ae52aa962a985c95b3cddf7f8832641johannkoenig@chromium.org\
43387997d490ae52aa962a985c95b3cddf7f8832641johannkoenig@chromium.org  return vp9_high_10_variance##W##x##H##_c(CONVERT_TO_BYTEPTR(temp2), W, dst, \
43487997d490ae52aa962a985c95b3cddf7f8832641johannkoenig@chromium.org                                           dst_stride, sse); \
43587997d490ae52aa962a985c95b3cddf7f8832641johannkoenig@chromium.org} \
43687997d490ae52aa962a985c95b3cddf7f8832641johannkoenig@chromium.org\
43787997d490ae52aa962a985c95b3cddf7f8832641johannkoenig@chromium.orgunsigned int vp9_high_12_sub_pixel_variance##W##x##H##_c( \
43887997d490ae52aa962a985c95b3cddf7f8832641johannkoenig@chromium.org  const uint8_t *src, int  src_stride, \
43987997d490ae52aa962a985c95b3cddf7f8832641johannkoenig@chromium.org  int xoffset, int  yoffset, \
44087997d490ae52aa962a985c95b3cddf7f8832641johannkoenig@chromium.org  const uint8_t *dst, int dst_stride, \
44187997d490ae52aa962a985c95b3cddf7f8832641johannkoenig@chromium.org  unsigned int *sse) { \
44287997d490ae52aa962a985c95b3cddf7f8832641johannkoenig@chromium.org  uint16_t fdata3[(H + 1) * W]; \
44387997d490ae52aa962a985c95b3cddf7f8832641johannkoenig@chromium.org  uint16_t temp2[H * W]; \
44487997d490ae52aa962a985c95b3cddf7f8832641johannkoenig@chromium.org\
44587997d490ae52aa962a985c95b3cddf7f8832641johannkoenig@chromium.org  high_var_filter_block2d_bil_first_pass(src, fdata3, src_stride, 1, H + 1, \
44687997d490ae52aa962a985c95b3cddf7f8832641johannkoenig@chromium.org                                         W, BILINEAR_FILTERS_2TAP(xoffset)); \
44787997d490ae52aa962a985c95b3cddf7f8832641johannkoenig@chromium.org  high_var_filter_block2d_bil_second_pass(fdata3, temp2, W, W, H, W, \
44887997d490ae52aa962a985c95b3cddf7f8832641johannkoenig@chromium.org                                          BILINEAR_FILTERS_2TAP(yoffset)); \
44987997d490ae52aa962a985c95b3cddf7f8832641johannkoenig@chromium.org\
45087997d490ae52aa962a985c95b3cddf7f8832641johannkoenig@chromium.org  return vp9_high_12_variance##W##x##H##_c(CONVERT_TO_BYTEPTR(temp2), W, dst, \
45187997d490ae52aa962a985c95b3cddf7f8832641johannkoenig@chromium.org                                           dst_stride, sse); \
45287997d490ae52aa962a985c95b3cddf7f8832641johannkoenig@chromium.org}
45387997d490ae52aa962a985c95b3cddf7f8832641johannkoenig@chromium.org
45487997d490ae52aa962a985c95b3cddf7f8832641johannkoenig@chromium.org#define HIGH_SUBPIX_AVG_VAR(W, H) \
45587997d490ae52aa962a985c95b3cddf7f8832641johannkoenig@chromium.orgunsigned int vp9_high_sub_pixel_avg_variance##W##x##H##_c( \
45687997d490ae52aa962a985c95b3cddf7f8832641johannkoenig@chromium.org  const uint8_t *src, int  src_stride, \
45787997d490ae52aa962a985c95b3cddf7f8832641johannkoenig@chromium.org  int xoffset, int  yoffset, \
45887997d490ae52aa962a985c95b3cddf7f8832641johannkoenig@chromium.org  const uint8_t *dst, int dst_stride, \
45987997d490ae52aa962a985c95b3cddf7f8832641johannkoenig@chromium.org  unsigned int *sse, \
46087997d490ae52aa962a985c95b3cddf7f8832641johannkoenig@chromium.org  const uint8_t *second_pred) { \
46187997d490ae52aa962a985c95b3cddf7f8832641johannkoenig@chromium.org  uint16_t fdata3[(H + 1) * W]; \
46287997d490ae52aa962a985c95b3cddf7f8832641johannkoenig@chromium.org  uint16_t temp2[H * W]; \
46387997d490ae52aa962a985c95b3cddf7f8832641johannkoenig@chromium.org  DECLARE_ALIGNED_ARRAY(16, uint16_t, temp3, H * W); \
46487997d490ae52aa962a985c95b3cddf7f8832641johannkoenig@chromium.org\
46587997d490ae52aa962a985c95b3cddf7f8832641johannkoenig@chromium.org  high_var_filter_block2d_bil_first_pass(src, fdata3, src_stride, 1, H + 1, \
46687997d490ae52aa962a985c95b3cddf7f8832641johannkoenig@chromium.org                                         W, BILINEAR_FILTERS_2TAP(xoffset)); \
46787997d490ae52aa962a985c95b3cddf7f8832641johannkoenig@chromium.org  high_var_filter_block2d_bil_second_pass(fdata3, temp2, W, W, H, W, \
46887997d490ae52aa962a985c95b3cddf7f8832641johannkoenig@chromium.org                                          BILINEAR_FILTERS_2TAP(yoffset)); \
46987997d490ae52aa962a985c95b3cddf7f8832641johannkoenig@chromium.org\
47087997d490ae52aa962a985c95b3cddf7f8832641johannkoenig@chromium.org  vp9_high_comp_avg_pred(temp3, second_pred, W, H, CONVERT_TO_BYTEPTR(temp2), \
47187997d490ae52aa962a985c95b3cddf7f8832641johannkoenig@chromium.org                         W); \
47287997d490ae52aa962a985c95b3cddf7f8832641johannkoenig@chromium.org\
47387997d490ae52aa962a985c95b3cddf7f8832641johannkoenig@chromium.org  return vp9_high_variance##W##x##H##_c(CONVERT_TO_BYTEPTR(temp3), W, dst, \
47487997d490ae52aa962a985c95b3cddf7f8832641johannkoenig@chromium.org                                        dst_stride, sse); \
47587997d490ae52aa962a985c95b3cddf7f8832641johannkoenig@chromium.org} \
47687997d490ae52aa962a985c95b3cddf7f8832641johannkoenig@chromium.org\
47787997d490ae52aa962a985c95b3cddf7f8832641johannkoenig@chromium.orgunsigned int vp9_high_10_sub_pixel_avg_variance##W##x##H##_c( \
47887997d490ae52aa962a985c95b3cddf7f8832641johannkoenig@chromium.org  const uint8_t *src, int  src_stride, \
47987997d490ae52aa962a985c95b3cddf7f8832641johannkoenig@chromium.org  int xoffset, int  yoffset, \
48087997d490ae52aa962a985c95b3cddf7f8832641johannkoenig@chromium.org  const uint8_t *dst, int dst_stride, \
48187997d490ae52aa962a985c95b3cddf7f8832641johannkoenig@chromium.org  unsigned int *sse, \
48287997d490ae52aa962a985c95b3cddf7f8832641johannkoenig@chromium.org  const uint8_t *second_pred) { \
48387997d490ae52aa962a985c95b3cddf7f8832641johannkoenig@chromium.org  uint16_t fdata3[(H + 1) * W]; \
48487997d490ae52aa962a985c95b3cddf7f8832641johannkoenig@chromium.org  uint16_t temp2[H * W]; \
48587997d490ae52aa962a985c95b3cddf7f8832641johannkoenig@chromium.org  DECLARE_ALIGNED_ARRAY(16, uint16_t, temp3, H * W); \
48687997d490ae52aa962a985c95b3cddf7f8832641johannkoenig@chromium.org\
48787997d490ae52aa962a985c95b3cddf7f8832641johannkoenig@chromium.org  high_var_filter_block2d_bil_first_pass(src, fdata3, src_stride, 1, H + 1, \
48887997d490ae52aa962a985c95b3cddf7f8832641johannkoenig@chromium.org                                         W, BILINEAR_FILTERS_2TAP(xoffset)); \
48987997d490ae52aa962a985c95b3cddf7f8832641johannkoenig@chromium.org  high_var_filter_block2d_bil_second_pass(fdata3, temp2, W, W, H, W, \
49087997d490ae52aa962a985c95b3cddf7f8832641johannkoenig@chromium.org                                          BILINEAR_FILTERS_2TAP(yoffset)); \
49187997d490ae52aa962a985c95b3cddf7f8832641johannkoenig@chromium.org\
49287997d490ae52aa962a985c95b3cddf7f8832641johannkoenig@chromium.org  vp9_high_comp_avg_pred(temp3, second_pred, W, H, CONVERT_TO_BYTEPTR(temp2), \
49387997d490ae52aa962a985c95b3cddf7f8832641johannkoenig@chromium.org                         W); \
49487997d490ae52aa962a985c95b3cddf7f8832641johannkoenig@chromium.org\
49587997d490ae52aa962a985c95b3cddf7f8832641johannkoenig@chromium.org  return vp9_high_10_variance##W##x##H##_c(CONVERT_TO_BYTEPTR(temp3), W, dst, \
49687997d490ae52aa962a985c95b3cddf7f8832641johannkoenig@chromium.org                                        dst_stride, sse); \
49787997d490ae52aa962a985c95b3cddf7f8832641johannkoenig@chromium.org} \
49887997d490ae52aa962a985c95b3cddf7f8832641johannkoenig@chromium.org\
49987997d490ae52aa962a985c95b3cddf7f8832641johannkoenig@chromium.orgunsigned int vp9_high_12_sub_pixel_avg_variance##W##x##H##_c( \
50087997d490ae52aa962a985c95b3cddf7f8832641johannkoenig@chromium.org  const uint8_t *src, int  src_stride, \
50187997d490ae52aa962a985c95b3cddf7f8832641johannkoenig@chromium.org  int xoffset, int  yoffset, \
50287997d490ae52aa962a985c95b3cddf7f8832641johannkoenig@chromium.org  const uint8_t *dst, int dst_stride, \
50387997d490ae52aa962a985c95b3cddf7f8832641johannkoenig@chromium.org  unsigned int *sse, \
50487997d490ae52aa962a985c95b3cddf7f8832641johannkoenig@chromium.org  const uint8_t *second_pred) { \
50587997d490ae52aa962a985c95b3cddf7f8832641johannkoenig@chromium.org  uint16_t fdata3[(H + 1) * W]; \
50687997d490ae52aa962a985c95b3cddf7f8832641johannkoenig@chromium.org  uint16_t temp2[H * W]; \
50787997d490ae52aa962a985c95b3cddf7f8832641johannkoenig@chromium.org  DECLARE_ALIGNED_ARRAY(16, uint16_t, temp3, H * W); \
50887997d490ae52aa962a985c95b3cddf7f8832641johannkoenig@chromium.org\
50987997d490ae52aa962a985c95b3cddf7f8832641johannkoenig@chromium.org  high_var_filter_block2d_bil_first_pass(src, fdata3, src_stride, 1, H + 1, \
51087997d490ae52aa962a985c95b3cddf7f8832641johannkoenig@chromium.org                                         W, BILINEAR_FILTERS_2TAP(xoffset)); \
51187997d490ae52aa962a985c95b3cddf7f8832641johannkoenig@chromium.org  high_var_filter_block2d_bil_second_pass(fdata3, temp2, W, W, H, W, \
51287997d490ae52aa962a985c95b3cddf7f8832641johannkoenig@chromium.org                                          BILINEAR_FILTERS_2TAP(yoffset)); \
51387997d490ae52aa962a985c95b3cddf7f8832641johannkoenig@chromium.org\
51487997d490ae52aa962a985c95b3cddf7f8832641johannkoenig@chromium.org  vp9_high_comp_avg_pred(temp3, second_pred, W, H, CONVERT_TO_BYTEPTR(temp2), \
51587997d490ae52aa962a985c95b3cddf7f8832641johannkoenig@chromium.org                         W); \
51687997d490ae52aa962a985c95b3cddf7f8832641johannkoenig@chromium.org\
51787997d490ae52aa962a985c95b3cddf7f8832641johannkoenig@chromium.org  return vp9_high_12_variance##W##x##H##_c(CONVERT_TO_BYTEPTR(temp3), W, dst, \
51887997d490ae52aa962a985c95b3cddf7f8832641johannkoenig@chromium.org                                        dst_stride, sse); \
51987997d490ae52aa962a985c95b3cddf7f8832641johannkoenig@chromium.org}
52087997d490ae52aa962a985c95b3cddf7f8832641johannkoenig@chromium.org
52187997d490ae52aa962a985c95b3cddf7f8832641johannkoenig@chromium.org#define HIGH_GET_VAR(S) \
52287997d490ae52aa962a985c95b3cddf7f8832641johannkoenig@chromium.orgvoid vp9_high_get##S##x##S##var_c(const uint8_t *src, int src_stride, \
52387997d490ae52aa962a985c95b3cddf7f8832641johannkoenig@chromium.org                                  const uint8_t *ref, int ref_stride, \
52487997d490ae52aa962a985c95b3cddf7f8832641johannkoenig@chromium.org                                  unsigned int *sse, int *sum) { \
52587997d490ae52aa962a985c95b3cddf7f8832641johannkoenig@chromium.org  high_variance(src, src_stride, ref, ref_stride, S, S, sse, sum); \
52687997d490ae52aa962a985c95b3cddf7f8832641johannkoenig@chromium.org} \
52787997d490ae52aa962a985c95b3cddf7f8832641johannkoenig@chromium.org\
52887997d490ae52aa962a985c95b3cddf7f8832641johannkoenig@chromium.orgvoid vp9_high_10_get##S##x##S##var_c(const uint8_t *src, int src_stride, \
52987997d490ae52aa962a985c95b3cddf7f8832641johannkoenig@chromium.org                                     const uint8_t *ref, int ref_stride, \
53087997d490ae52aa962a985c95b3cddf7f8832641johannkoenig@chromium.org                                     unsigned int *sse, int *sum) { \
53187997d490ae52aa962a985c95b3cddf7f8832641johannkoenig@chromium.org  high_10_variance(src, src_stride, ref, ref_stride, S, S, sse, sum); \
53287997d490ae52aa962a985c95b3cddf7f8832641johannkoenig@chromium.org} \
53387997d490ae52aa962a985c95b3cddf7f8832641johannkoenig@chromium.org\
53487997d490ae52aa962a985c95b3cddf7f8832641johannkoenig@chromium.orgvoid vp9_high_12_get##S##x##S##var_c(const uint8_t *src, int src_stride, \
53587997d490ae52aa962a985c95b3cddf7f8832641johannkoenig@chromium.org                                     const uint8_t *ref, int ref_stride, \
53687997d490ae52aa962a985c95b3cddf7f8832641johannkoenig@chromium.org                                     unsigned int *sse, int *sum) { \
53787997d490ae52aa962a985c95b3cddf7f8832641johannkoenig@chromium.org  high_12_variance(src, src_stride, ref, ref_stride, S, S, sse, sum); \
53887997d490ae52aa962a985c95b3cddf7f8832641johannkoenig@chromium.org}
53987997d490ae52aa962a985c95b3cddf7f8832641johannkoenig@chromium.org
54087997d490ae52aa962a985c95b3cddf7f8832641johannkoenig@chromium.org#define HIGH_MSE(W, H) \
54187997d490ae52aa962a985c95b3cddf7f8832641johannkoenig@chromium.orgunsigned int vp9_high_mse##W##x##H##_c(const uint8_t *src, int src_stride, \
54287997d490ae52aa962a985c95b3cddf7f8832641johannkoenig@chromium.org                                       const uint8_t *ref, int ref_stride, \
54387997d490ae52aa962a985c95b3cddf7f8832641johannkoenig@chromium.org                                       unsigned int *sse) { \
54487997d490ae52aa962a985c95b3cddf7f8832641johannkoenig@chromium.org  int sum; \
54587997d490ae52aa962a985c95b3cddf7f8832641johannkoenig@chromium.org  high_variance(src, src_stride, ref, ref_stride, W, H, sse, &sum); \
54687997d490ae52aa962a985c95b3cddf7f8832641johannkoenig@chromium.org  return *sse; \
54787997d490ae52aa962a985c95b3cddf7f8832641johannkoenig@chromium.org} \
54887997d490ae52aa962a985c95b3cddf7f8832641johannkoenig@chromium.org\
54987997d490ae52aa962a985c95b3cddf7f8832641johannkoenig@chromium.orgunsigned int vp9_high_10_mse##W##x##H##_c(const uint8_t *src, int src_stride, \
55087997d490ae52aa962a985c95b3cddf7f8832641johannkoenig@chromium.org                                          const uint8_t *ref, int ref_stride, \
55187997d490ae52aa962a985c95b3cddf7f8832641johannkoenig@chromium.org                                          unsigned int *sse) { \
55287997d490ae52aa962a985c95b3cddf7f8832641johannkoenig@chromium.org  int sum; \
55387997d490ae52aa962a985c95b3cddf7f8832641johannkoenig@chromium.org  high_10_variance(src, src_stride, ref, ref_stride, W, H, sse, &sum); \
55487997d490ae52aa962a985c95b3cddf7f8832641johannkoenig@chromium.org  return *sse; \
55587997d490ae52aa962a985c95b3cddf7f8832641johannkoenig@chromium.org} \
55687997d490ae52aa962a985c95b3cddf7f8832641johannkoenig@chromium.org\
55787997d490ae52aa962a985c95b3cddf7f8832641johannkoenig@chromium.orgunsigned int vp9_high_12_mse##W##x##H##_c(const uint8_t *src, int src_stride, \
55887997d490ae52aa962a985c95b3cddf7f8832641johannkoenig@chromium.org                                          const uint8_t *ref, int ref_stride, \
55987997d490ae52aa962a985c95b3cddf7f8832641johannkoenig@chromium.org                                          unsigned int *sse) { \
56087997d490ae52aa962a985c95b3cddf7f8832641johannkoenig@chromium.org  int sum; \
56187997d490ae52aa962a985c95b3cddf7f8832641johannkoenig@chromium.org  high_12_variance(src, src_stride, ref, ref_stride, W, H, sse, &sum); \
56287997d490ae52aa962a985c95b3cddf7f8832641johannkoenig@chromium.org  return *sse; \
56387997d490ae52aa962a985c95b3cddf7f8832641johannkoenig@chromium.org}
56487997d490ae52aa962a985c95b3cddf7f8832641johannkoenig@chromium.org
56587997d490ae52aa962a985c95b3cddf7f8832641johannkoenig@chromium.orgHIGH_GET_VAR(8)
56687997d490ae52aa962a985c95b3cddf7f8832641johannkoenig@chromium.orgHIGH_GET_VAR(16)
56787997d490ae52aa962a985c95b3cddf7f8832641johannkoenig@chromium.org
56887997d490ae52aa962a985c95b3cddf7f8832641johannkoenig@chromium.orgHIGH_MSE(16, 16)
56987997d490ae52aa962a985c95b3cddf7f8832641johannkoenig@chromium.orgHIGH_MSE(16, 8)
57087997d490ae52aa962a985c95b3cddf7f8832641johannkoenig@chromium.orgHIGH_MSE(8, 16)
57187997d490ae52aa962a985c95b3cddf7f8832641johannkoenig@chromium.orgHIGH_MSE(8, 8)
57287997d490ae52aa962a985c95b3cddf7f8832641johannkoenig@chromium.org
57387997d490ae52aa962a985c95b3cddf7f8832641johannkoenig@chromium.orgHIGH_VAR(4, 4)
57487997d490ae52aa962a985c95b3cddf7f8832641johannkoenig@chromium.orgHIGH_SUBPIX_VAR(4, 4)
57587997d490ae52aa962a985c95b3cddf7f8832641johannkoenig@chromium.orgHIGH_SUBPIX_AVG_VAR(4, 4)
57687997d490ae52aa962a985c95b3cddf7f8832641johannkoenig@chromium.org
57787997d490ae52aa962a985c95b3cddf7f8832641johannkoenig@chromium.orgHIGH_VAR(4, 8)
57887997d490ae52aa962a985c95b3cddf7f8832641johannkoenig@chromium.orgHIGH_SUBPIX_VAR(4, 8)
57987997d490ae52aa962a985c95b3cddf7f8832641johannkoenig@chromium.orgHIGH_SUBPIX_AVG_VAR(4, 8)
58087997d490ae52aa962a985c95b3cddf7f8832641johannkoenig@chromium.org
58187997d490ae52aa962a985c95b3cddf7f8832641johannkoenig@chromium.orgHIGH_VAR(8, 4)
58287997d490ae52aa962a985c95b3cddf7f8832641johannkoenig@chromium.orgHIGH_SUBPIX_VAR(8, 4)
58387997d490ae52aa962a985c95b3cddf7f8832641johannkoenig@chromium.orgHIGH_SUBPIX_AVG_VAR(8, 4)
58487997d490ae52aa962a985c95b3cddf7f8832641johannkoenig@chromium.org
58587997d490ae52aa962a985c95b3cddf7f8832641johannkoenig@chromium.orgHIGH_VAR(8, 8)
58687997d490ae52aa962a985c95b3cddf7f8832641johannkoenig@chromium.orgHIGH_SUBPIX_VAR(8, 8)
58787997d490ae52aa962a985c95b3cddf7f8832641johannkoenig@chromium.orgHIGH_SUBPIX_AVG_VAR(8, 8)
58887997d490ae52aa962a985c95b3cddf7f8832641johannkoenig@chromium.org
58987997d490ae52aa962a985c95b3cddf7f8832641johannkoenig@chromium.orgHIGH_VAR(8, 16)
59087997d490ae52aa962a985c95b3cddf7f8832641johannkoenig@chromium.orgHIGH_SUBPIX_VAR(8, 16)
59187997d490ae52aa962a985c95b3cddf7f8832641johannkoenig@chromium.orgHIGH_SUBPIX_AVG_VAR(8, 16)
59287997d490ae52aa962a985c95b3cddf7f8832641johannkoenig@chromium.org
59387997d490ae52aa962a985c95b3cddf7f8832641johannkoenig@chromium.orgHIGH_VAR(16, 8)
59487997d490ae52aa962a985c95b3cddf7f8832641johannkoenig@chromium.orgHIGH_SUBPIX_VAR(16, 8)
59587997d490ae52aa962a985c95b3cddf7f8832641johannkoenig@chromium.orgHIGH_SUBPIX_AVG_VAR(16, 8)
59687997d490ae52aa962a985c95b3cddf7f8832641johannkoenig@chromium.org
59787997d490ae52aa962a985c95b3cddf7f8832641johannkoenig@chromium.orgHIGH_VAR(16, 16)
59887997d490ae52aa962a985c95b3cddf7f8832641johannkoenig@chromium.orgHIGH_SUBPIX_VAR(16, 16)
59987997d490ae52aa962a985c95b3cddf7f8832641johannkoenig@chromium.orgHIGH_SUBPIX_AVG_VAR(16, 16)
60087997d490ae52aa962a985c95b3cddf7f8832641johannkoenig@chromium.org
60187997d490ae52aa962a985c95b3cddf7f8832641johannkoenig@chromium.orgHIGH_VAR(16, 32)
60287997d490ae52aa962a985c95b3cddf7f8832641johannkoenig@chromium.orgHIGH_SUBPIX_VAR(16, 32)
60387997d490ae52aa962a985c95b3cddf7f8832641johannkoenig@chromium.orgHIGH_SUBPIX_AVG_VAR(16, 32)
60487997d490ae52aa962a985c95b3cddf7f8832641johannkoenig@chromium.org
60587997d490ae52aa962a985c95b3cddf7f8832641johannkoenig@chromium.orgHIGH_VAR(32, 16)
60687997d490ae52aa962a985c95b3cddf7f8832641johannkoenig@chromium.orgHIGH_SUBPIX_VAR(32, 16)
60787997d490ae52aa962a985c95b3cddf7f8832641johannkoenig@chromium.orgHIGH_SUBPIX_AVG_VAR(32, 16)
60887997d490ae52aa962a985c95b3cddf7f8832641johannkoenig@chromium.org
60987997d490ae52aa962a985c95b3cddf7f8832641johannkoenig@chromium.orgHIGH_VAR(32, 32)
61087997d490ae52aa962a985c95b3cddf7f8832641johannkoenig@chromium.orgHIGH_SUBPIX_VAR(32, 32)
61187997d490ae52aa962a985c95b3cddf7f8832641johannkoenig@chromium.orgHIGH_SUBPIX_AVG_VAR(32, 32)
61287997d490ae52aa962a985c95b3cddf7f8832641johannkoenig@chromium.org
61387997d490ae52aa962a985c95b3cddf7f8832641johannkoenig@chromium.orgHIGH_VAR(32, 64)
61487997d490ae52aa962a985c95b3cddf7f8832641johannkoenig@chromium.orgHIGH_SUBPIX_VAR(32, 64)
61587997d490ae52aa962a985c95b3cddf7f8832641johannkoenig@chromium.orgHIGH_SUBPIX_AVG_VAR(32, 64)
61687997d490ae52aa962a985c95b3cddf7f8832641johannkoenig@chromium.org
61787997d490ae52aa962a985c95b3cddf7f8832641johannkoenig@chromium.orgHIGH_VAR(64, 32)
61887997d490ae52aa962a985c95b3cddf7f8832641johannkoenig@chromium.orgHIGH_SUBPIX_VAR(64, 32)
61987997d490ae52aa962a985c95b3cddf7f8832641johannkoenig@chromium.orgHIGH_SUBPIX_AVG_VAR(64, 32)
62087997d490ae52aa962a985c95b3cddf7f8832641johannkoenig@chromium.org
62187997d490ae52aa962a985c95b3cddf7f8832641johannkoenig@chromium.orgHIGH_VAR(64, 64)
62287997d490ae52aa962a985c95b3cddf7f8832641johannkoenig@chromium.orgHIGH_SUBPIX_VAR(64, 64)
62387997d490ae52aa962a985c95b3cddf7f8832641johannkoenig@chromium.orgHIGH_SUBPIX_AVG_VAR(64, 64)
62487997d490ae52aa962a985c95b3cddf7f8832641johannkoenig@chromium.org
62587997d490ae52aa962a985c95b3cddf7f8832641johannkoenig@chromium.orgvoid vp9_high_comp_avg_pred(uint16_t *comp_pred, const uint8_t *pred8,
62687997d490ae52aa962a985c95b3cddf7f8832641johannkoenig@chromium.org                            int width, int height, const uint8_t *ref8,
62787997d490ae52aa962a985c95b3cddf7f8832641johannkoenig@chromium.org                            int ref_stride) {
62887997d490ae52aa962a985c95b3cddf7f8832641johannkoenig@chromium.org  int i, j;
62987997d490ae52aa962a985c95b3cddf7f8832641johannkoenig@chromium.org  uint16_t *pred = CONVERT_TO_SHORTPTR(pred8);
63087997d490ae52aa962a985c95b3cddf7f8832641johannkoenig@chromium.org  uint16_t *ref = CONVERT_TO_SHORTPTR(ref8);
63187997d490ae52aa962a985c95b3cddf7f8832641johannkoenig@chromium.org  for (i = 0; i < height; i++) {
63287997d490ae52aa962a985c95b3cddf7f8832641johannkoenig@chromium.org    for (j = 0; j < width; j++) {
63387997d490ae52aa962a985c95b3cddf7f8832641johannkoenig@chromium.org      const int tmp = pred[j] + ref[j];
63487997d490ae52aa962a985c95b3cddf7f8832641johannkoenig@chromium.org      comp_pred[j] = ROUND_POWER_OF_TWO(tmp, 1);
63587997d490ae52aa962a985c95b3cddf7f8832641johannkoenig@chromium.org    }
63687997d490ae52aa962a985c95b3cddf7f8832641johannkoenig@chromium.org    comp_pred += width;
63787997d490ae52aa962a985c95b3cddf7f8832641johannkoenig@chromium.org    pred += width;
63887997d490ae52aa962a985c95b3cddf7f8832641johannkoenig@chromium.org    ref += ref_stride;
63987997d490ae52aa962a985c95b3cddf7f8832641johannkoenig@chromium.org  }
64087997d490ae52aa962a985c95b3cddf7f8832641johannkoenig@chromium.org}
64187997d490ae52aa962a985c95b3cddf7f8832641johannkoenig@chromium.org#endif  // CONFIG_VP9_HIGHBITDEPTH
642