xref: /aosp_15_r20/external/libvpx/vpx_dsp/variance.c (revision fb1b10ab9aebc7c7068eedab379b749d7e3900be)
1*fb1b10abSAndroid Build Coastguard Worker /*
2*fb1b10abSAndroid Build Coastguard Worker  *  Copyright (c) 2010 The WebM project authors. All Rights Reserved.
3*fb1b10abSAndroid Build Coastguard Worker  *
4*fb1b10abSAndroid Build Coastguard Worker  *  Use of this source code is governed by a BSD-style license
5*fb1b10abSAndroid Build Coastguard Worker  *  that can be found in the LICENSE file in the root of the source
6*fb1b10abSAndroid Build Coastguard Worker  *  tree. An additional intellectual property rights grant can be found
7*fb1b10abSAndroid Build Coastguard Worker  *  in the file PATENTS.  All contributing project authors may
8*fb1b10abSAndroid Build Coastguard Worker  *  be found in the AUTHORS file in the root of the source tree.
9*fb1b10abSAndroid Build Coastguard Worker  */
10*fb1b10abSAndroid Build Coastguard Worker 
11*fb1b10abSAndroid Build Coastguard Worker #include "./vpx_config.h"
12*fb1b10abSAndroid Build Coastguard Worker #include "./vpx_dsp_rtcd.h"
13*fb1b10abSAndroid Build Coastguard Worker 
14*fb1b10abSAndroid Build Coastguard Worker #include "vpx_ports/mem.h"
15*fb1b10abSAndroid Build Coastguard Worker #include "vpx/vpx_integer.h"
16*fb1b10abSAndroid Build Coastguard Worker 
17*fb1b10abSAndroid Build Coastguard Worker #include "vpx_dsp/variance.h"
18*fb1b10abSAndroid Build Coastguard Worker 
19*fb1b10abSAndroid Build Coastguard Worker static const uint8_t bilinear_filters[8][2] = {
20*fb1b10abSAndroid Build Coastguard Worker   { 128, 0 }, { 112, 16 }, { 96, 32 }, { 80, 48 },
21*fb1b10abSAndroid Build Coastguard Worker   { 64, 64 }, { 48, 80 },  { 32, 96 }, { 16, 112 },
22*fb1b10abSAndroid Build Coastguard Worker };
23*fb1b10abSAndroid Build Coastguard Worker 
vpx_get4x4sse_cs_c(const uint8_t * src_ptr,int src_stride,const uint8_t * ref_ptr,int ref_stride)24*fb1b10abSAndroid Build Coastguard Worker uint32_t vpx_get4x4sse_cs_c(const uint8_t *src_ptr, int src_stride,
25*fb1b10abSAndroid Build Coastguard Worker                             const uint8_t *ref_ptr, int ref_stride) {
26*fb1b10abSAndroid Build Coastguard Worker   int distortion = 0;
27*fb1b10abSAndroid Build Coastguard Worker   int r, c;
28*fb1b10abSAndroid Build Coastguard Worker 
29*fb1b10abSAndroid Build Coastguard Worker   for (r = 0; r < 4; ++r) {
30*fb1b10abSAndroid Build Coastguard Worker     for (c = 0; c < 4; ++c) {
31*fb1b10abSAndroid Build Coastguard Worker       int diff = src_ptr[c] - ref_ptr[c];
32*fb1b10abSAndroid Build Coastguard Worker       distortion += diff * diff;
33*fb1b10abSAndroid Build Coastguard Worker     }
34*fb1b10abSAndroid Build Coastguard Worker 
35*fb1b10abSAndroid Build Coastguard Worker     src_ptr += src_stride;
36*fb1b10abSAndroid Build Coastguard Worker     ref_ptr += ref_stride;
37*fb1b10abSAndroid Build Coastguard Worker   }
38*fb1b10abSAndroid Build Coastguard Worker 
39*fb1b10abSAndroid Build Coastguard Worker   return distortion;
40*fb1b10abSAndroid Build Coastguard Worker }
41*fb1b10abSAndroid Build Coastguard Worker 
vpx_get_mb_ss_c(const int16_t * src_ptr)42*fb1b10abSAndroid Build Coastguard Worker uint32_t vpx_get_mb_ss_c(const int16_t *src_ptr) {
43*fb1b10abSAndroid Build Coastguard Worker   unsigned int i, sum = 0;
44*fb1b10abSAndroid Build Coastguard Worker 
45*fb1b10abSAndroid Build Coastguard Worker   for (i = 0; i < 256; ++i) {
46*fb1b10abSAndroid Build Coastguard Worker     sum += src_ptr[i] * src_ptr[i];
47*fb1b10abSAndroid Build Coastguard Worker   }
48*fb1b10abSAndroid Build Coastguard Worker 
49*fb1b10abSAndroid Build Coastguard Worker   return sum;
50*fb1b10abSAndroid Build Coastguard Worker }
51*fb1b10abSAndroid Build Coastguard Worker 
variance(const uint8_t * src_ptr,int src_stride,const uint8_t * ref_ptr,int ref_stride,int w,int h,uint32_t * sse,int * sum)52*fb1b10abSAndroid Build Coastguard Worker static void variance(const uint8_t *src_ptr, int src_stride,
53*fb1b10abSAndroid Build Coastguard Worker                      const uint8_t *ref_ptr, int ref_stride, int w, int h,
54*fb1b10abSAndroid Build Coastguard Worker                      uint32_t *sse, int *sum) {
55*fb1b10abSAndroid Build Coastguard Worker   int i, j;
56*fb1b10abSAndroid Build Coastguard Worker 
57*fb1b10abSAndroid Build Coastguard Worker   *sum = 0;
58*fb1b10abSAndroid Build Coastguard Worker   *sse = 0;
59*fb1b10abSAndroid Build Coastguard Worker 
60*fb1b10abSAndroid Build Coastguard Worker   for (i = 0; i < h; ++i) {
61*fb1b10abSAndroid Build Coastguard Worker     for (j = 0; j < w; ++j) {
62*fb1b10abSAndroid Build Coastguard Worker       const int diff = src_ptr[j] - ref_ptr[j];
63*fb1b10abSAndroid Build Coastguard Worker       *sum += diff;
64*fb1b10abSAndroid Build Coastguard Worker       *sse += diff * diff;
65*fb1b10abSAndroid Build Coastguard Worker     }
66*fb1b10abSAndroid Build Coastguard Worker 
67*fb1b10abSAndroid Build Coastguard Worker     src_ptr += src_stride;
68*fb1b10abSAndroid Build Coastguard Worker     ref_ptr += ref_stride;
69*fb1b10abSAndroid Build Coastguard Worker   }
70*fb1b10abSAndroid Build Coastguard Worker }
71*fb1b10abSAndroid Build Coastguard Worker 
72*fb1b10abSAndroid Build Coastguard Worker // Applies a 1-D 2-tap bilinear filter to the source block in either horizontal
73*fb1b10abSAndroid Build Coastguard Worker // or vertical direction to produce the filtered output block. Used to implement
74*fb1b10abSAndroid Build Coastguard Worker // the first-pass of 2-D separable filter.
75*fb1b10abSAndroid Build Coastguard Worker //
76*fb1b10abSAndroid Build Coastguard Worker // Produces int16_t output to retain precision for the next pass. Two filter
77*fb1b10abSAndroid Build Coastguard Worker // taps should sum to FILTER_WEIGHT. pixel_step defines whether the filter is
78*fb1b10abSAndroid Build Coastguard Worker // applied horizontally (pixel_step = 1) or vertically (pixel_step = stride).
79*fb1b10abSAndroid Build Coastguard Worker // It defines the offset required to move from one input to the next.
var_filter_block2d_bil_first_pass(const uint8_t * src_ptr,uint16_t * ref_ptr,unsigned int src_pixels_per_line,int pixel_step,unsigned int output_height,unsigned int output_width,const uint8_t * filter)80*fb1b10abSAndroid Build Coastguard Worker static void var_filter_block2d_bil_first_pass(
81*fb1b10abSAndroid Build Coastguard Worker     const uint8_t *src_ptr, uint16_t *ref_ptr, unsigned int src_pixels_per_line,
82*fb1b10abSAndroid Build Coastguard Worker     int pixel_step, unsigned int output_height, unsigned int output_width,
83*fb1b10abSAndroid Build Coastguard Worker     const uint8_t *filter) {
84*fb1b10abSAndroid Build Coastguard Worker   unsigned int i, j;
85*fb1b10abSAndroid Build Coastguard Worker 
86*fb1b10abSAndroid Build Coastguard Worker   for (i = 0; i < output_height; ++i) {
87*fb1b10abSAndroid Build Coastguard Worker     for (j = 0; j < output_width; ++j) {
88*fb1b10abSAndroid Build Coastguard Worker       ref_ptr[j] = ROUND_POWER_OF_TWO(
89*fb1b10abSAndroid Build Coastguard Worker           (int)src_ptr[0] * filter[0] + (int)src_ptr[pixel_step] * filter[1],
90*fb1b10abSAndroid Build Coastguard Worker           FILTER_BITS);
91*fb1b10abSAndroid Build Coastguard Worker 
92*fb1b10abSAndroid Build Coastguard Worker       ++src_ptr;
93*fb1b10abSAndroid Build Coastguard Worker     }
94*fb1b10abSAndroid Build Coastguard Worker 
95*fb1b10abSAndroid Build Coastguard Worker     src_ptr += src_pixels_per_line - output_width;
96*fb1b10abSAndroid Build Coastguard Worker     ref_ptr += output_width;
97*fb1b10abSAndroid Build Coastguard Worker   }
98*fb1b10abSAndroid Build Coastguard Worker }
99*fb1b10abSAndroid Build Coastguard Worker 
100*fb1b10abSAndroid Build Coastguard Worker // Applies a 1-D 2-tap bilinear filter to the source block in either horizontal
101*fb1b10abSAndroid Build Coastguard Worker // or vertical direction to produce the filtered output block. Used to implement
102*fb1b10abSAndroid Build Coastguard Worker // the second-pass of 2-D separable filter.
103*fb1b10abSAndroid Build Coastguard Worker //
104*fb1b10abSAndroid Build Coastguard Worker // Requires 16-bit input as produced by filter_block2d_bil_first_pass. Two
105*fb1b10abSAndroid Build Coastguard Worker // filter taps should sum to FILTER_WEIGHT. pixel_step defines whether the
106*fb1b10abSAndroid Build Coastguard Worker // filter is applied horizontally (pixel_step = 1) or vertically
107*fb1b10abSAndroid Build Coastguard Worker // (pixel_step = stride). It defines the offset required to move from one input
108*fb1b10abSAndroid Build Coastguard Worker // to the next. Output is 8-bit.
var_filter_block2d_bil_second_pass(const uint16_t * src_ptr,uint8_t * ref_ptr,unsigned int src_pixels_per_line,unsigned int pixel_step,unsigned int output_height,unsigned int output_width,const uint8_t * filter)109*fb1b10abSAndroid Build Coastguard Worker static void var_filter_block2d_bil_second_pass(
110*fb1b10abSAndroid Build Coastguard Worker     const uint16_t *src_ptr, uint8_t *ref_ptr, unsigned int src_pixels_per_line,
111*fb1b10abSAndroid Build Coastguard Worker     unsigned int pixel_step, unsigned int output_height,
112*fb1b10abSAndroid Build Coastguard Worker     unsigned int output_width, const uint8_t *filter) {
113*fb1b10abSAndroid Build Coastguard Worker   unsigned int i, j;
114*fb1b10abSAndroid Build Coastguard Worker 
115*fb1b10abSAndroid Build Coastguard Worker   for (i = 0; i < output_height; ++i) {
116*fb1b10abSAndroid Build Coastguard Worker     for (j = 0; j < output_width; ++j) {
117*fb1b10abSAndroid Build Coastguard Worker       ref_ptr[j] = ROUND_POWER_OF_TWO(
118*fb1b10abSAndroid Build Coastguard Worker           (int)src_ptr[0] * filter[0] + (int)src_ptr[pixel_step] * filter[1],
119*fb1b10abSAndroid Build Coastguard Worker           FILTER_BITS);
120*fb1b10abSAndroid Build Coastguard Worker       ++src_ptr;
121*fb1b10abSAndroid Build Coastguard Worker     }
122*fb1b10abSAndroid Build Coastguard Worker 
123*fb1b10abSAndroid Build Coastguard Worker     src_ptr += src_pixels_per_line - output_width;
124*fb1b10abSAndroid Build Coastguard Worker     ref_ptr += output_width;
125*fb1b10abSAndroid Build Coastguard Worker   }
126*fb1b10abSAndroid Build Coastguard Worker }
127*fb1b10abSAndroid Build Coastguard Worker 
128*fb1b10abSAndroid Build Coastguard Worker #define VAR(W, H)                                                            \
129*fb1b10abSAndroid Build Coastguard Worker   uint32_t vpx_variance##W##x##H##_c(const uint8_t *src_ptr, int src_stride, \
130*fb1b10abSAndroid Build Coastguard Worker                                      const uint8_t *ref_ptr, int ref_stride, \
131*fb1b10abSAndroid Build Coastguard Worker                                      uint32_t *sse) {                        \
132*fb1b10abSAndroid Build Coastguard Worker     int sum;                                                                 \
133*fb1b10abSAndroid Build Coastguard Worker     variance(src_ptr, src_stride, ref_ptr, ref_stride, W, H, sse, &sum);     \
134*fb1b10abSAndroid Build Coastguard Worker     return *sse - (uint32_t)(((int64_t)sum * sum) / (W * H));                \
135*fb1b10abSAndroid Build Coastguard Worker   }
136*fb1b10abSAndroid Build Coastguard Worker 
137*fb1b10abSAndroid Build Coastguard Worker #define SUBPIX_VAR(W, H)                                                     \
138*fb1b10abSAndroid Build Coastguard Worker   uint32_t vpx_sub_pixel_variance##W##x##H##_c(                              \
139*fb1b10abSAndroid Build Coastguard Worker       const uint8_t *src_ptr, int src_stride, int x_offset, int y_offset,    \
140*fb1b10abSAndroid Build Coastguard Worker       const uint8_t *ref_ptr, int ref_stride, uint32_t *sse) {               \
141*fb1b10abSAndroid Build Coastguard Worker     uint16_t fdata3[(H + 1) * W];                                            \
142*fb1b10abSAndroid Build Coastguard Worker     uint8_t temp2[H * W];                                                    \
143*fb1b10abSAndroid Build Coastguard Worker                                                                              \
144*fb1b10abSAndroid Build Coastguard Worker     var_filter_block2d_bil_first_pass(src_ptr, fdata3, src_stride, 1, H + 1, \
145*fb1b10abSAndroid Build Coastguard Worker                                       W, bilinear_filters[x_offset]);        \
146*fb1b10abSAndroid Build Coastguard Worker     var_filter_block2d_bil_second_pass(fdata3, temp2, W, W, H, W,            \
147*fb1b10abSAndroid Build Coastguard Worker                                        bilinear_filters[y_offset]);          \
148*fb1b10abSAndroid Build Coastguard Worker                                                                              \
149*fb1b10abSAndroid Build Coastguard Worker     return vpx_variance##W##x##H##_c(temp2, W, ref_ptr, ref_stride, sse);    \
150*fb1b10abSAndroid Build Coastguard Worker   }
151*fb1b10abSAndroid Build Coastguard Worker 
152*fb1b10abSAndroid Build Coastguard Worker #define SUBPIX_AVG_VAR(W, H)                                                 \
153*fb1b10abSAndroid Build Coastguard Worker   uint32_t vpx_sub_pixel_avg_variance##W##x##H##_c(                          \
154*fb1b10abSAndroid Build Coastguard Worker       const uint8_t *src_ptr, int src_stride, int x_offset, int y_offset,    \
155*fb1b10abSAndroid Build Coastguard Worker       const uint8_t *ref_ptr, int ref_stride, uint32_t *sse,                 \
156*fb1b10abSAndroid Build Coastguard Worker       const uint8_t *second_pred) {                                          \
157*fb1b10abSAndroid Build Coastguard Worker     uint16_t fdata3[(H + 1) * W];                                            \
158*fb1b10abSAndroid Build Coastguard Worker     uint8_t temp2[H * W];                                                    \
159*fb1b10abSAndroid Build Coastguard Worker     DECLARE_ALIGNED(32, uint8_t, temp3[H * W]);                              \
160*fb1b10abSAndroid Build Coastguard Worker                                                                              \
161*fb1b10abSAndroid Build Coastguard Worker     var_filter_block2d_bil_first_pass(src_ptr, fdata3, src_stride, 1, H + 1, \
162*fb1b10abSAndroid Build Coastguard Worker                                       W, bilinear_filters[x_offset]);        \
163*fb1b10abSAndroid Build Coastguard Worker     var_filter_block2d_bil_second_pass(fdata3, temp2, W, W, H, W,            \
164*fb1b10abSAndroid Build Coastguard Worker                                        bilinear_filters[y_offset]);          \
165*fb1b10abSAndroid Build Coastguard Worker                                                                              \
166*fb1b10abSAndroid Build Coastguard Worker     vpx_comp_avg_pred_c(temp3, second_pred, W, H, temp2, W);                 \
167*fb1b10abSAndroid Build Coastguard Worker                                                                              \
168*fb1b10abSAndroid Build Coastguard Worker     return vpx_variance##W##x##H##_c(temp3, W, ref_ptr, ref_stride, sse);    \
169*fb1b10abSAndroid Build Coastguard Worker   }
170*fb1b10abSAndroid Build Coastguard Worker 
171*fb1b10abSAndroid Build Coastguard Worker /* Identical to the variance call except it takes an additional parameter, sum,
172*fb1b10abSAndroid Build Coastguard Worker  * and returns that value using pass-by-reference instead of returning
173*fb1b10abSAndroid Build Coastguard Worker  * sse - sum^2 / w*h
174*fb1b10abSAndroid Build Coastguard Worker  */
175*fb1b10abSAndroid Build Coastguard Worker #define GET_VAR(W, H)                                                   \
176*fb1b10abSAndroid Build Coastguard Worker   void vpx_get##W##x##H##var_c(const uint8_t *src_ptr, int src_stride,  \
177*fb1b10abSAndroid Build Coastguard Worker                                const uint8_t *ref_ptr, int ref_stride,  \
178*fb1b10abSAndroid Build Coastguard Worker                                uint32_t *sse, int *sum) {               \
179*fb1b10abSAndroid Build Coastguard Worker     variance(src_ptr, src_stride, ref_ptr, ref_stride, W, H, sse, sum); \
180*fb1b10abSAndroid Build Coastguard Worker   }
181*fb1b10abSAndroid Build Coastguard Worker 
182*fb1b10abSAndroid Build Coastguard Worker /* Identical to the variance call except it does not calculate the
183*fb1b10abSAndroid Build Coastguard Worker  * sse - sum^2 / w*h and returns sse in addition to modifying the passed in
184*fb1b10abSAndroid Build Coastguard Worker  * variable.
185*fb1b10abSAndroid Build Coastguard Worker  */
186*fb1b10abSAndroid Build Coastguard Worker #define MSE(W, H)                                                        \
187*fb1b10abSAndroid Build Coastguard Worker   uint32_t vpx_mse##W##x##H##_c(const uint8_t *src_ptr, int src_stride,  \
188*fb1b10abSAndroid Build Coastguard Worker                                 const uint8_t *ref_ptr, int ref_stride,  \
189*fb1b10abSAndroid Build Coastguard Worker                                 uint32_t *sse) {                         \
190*fb1b10abSAndroid Build Coastguard Worker     int sum;                                                             \
191*fb1b10abSAndroid Build Coastguard Worker     variance(src_ptr, src_stride, ref_ptr, ref_stride, W, H, sse, &sum); \
192*fb1b10abSAndroid Build Coastguard Worker     return *sse;                                                         \
193*fb1b10abSAndroid Build Coastguard Worker   }
194*fb1b10abSAndroid Build Coastguard Worker 
195*fb1b10abSAndroid Build Coastguard Worker /* All three forms of the variance are available in the same sizes. */
196*fb1b10abSAndroid Build Coastguard Worker #define VARIANCES(W, H) \
197*fb1b10abSAndroid Build Coastguard Worker   VAR(W, H)             \
198*fb1b10abSAndroid Build Coastguard Worker   SUBPIX_VAR(W, H)      \
199*fb1b10abSAndroid Build Coastguard Worker   SUBPIX_AVG_VAR(W, H)
200*fb1b10abSAndroid Build Coastguard Worker 
201*fb1b10abSAndroid Build Coastguard Worker VARIANCES(64, 64)
202*fb1b10abSAndroid Build Coastguard Worker VARIANCES(64, 32)
203*fb1b10abSAndroid Build Coastguard Worker VARIANCES(32, 64)
204*fb1b10abSAndroid Build Coastguard Worker VARIANCES(32, 32)
205*fb1b10abSAndroid Build Coastguard Worker VARIANCES(32, 16)
206*fb1b10abSAndroid Build Coastguard Worker VARIANCES(16, 32)
207*fb1b10abSAndroid Build Coastguard Worker VARIANCES(16, 16)
208*fb1b10abSAndroid Build Coastguard Worker VARIANCES(16, 8)
209*fb1b10abSAndroid Build Coastguard Worker VARIANCES(8, 16)
210*fb1b10abSAndroid Build Coastguard Worker VARIANCES(8, 8)
211*fb1b10abSAndroid Build Coastguard Worker VARIANCES(8, 4)
212*fb1b10abSAndroid Build Coastguard Worker VARIANCES(4, 8)
213*fb1b10abSAndroid Build Coastguard Worker VARIANCES(4, 4)
214*fb1b10abSAndroid Build Coastguard Worker 
215*fb1b10abSAndroid Build Coastguard Worker GET_VAR(16, 16)
216*fb1b10abSAndroid Build Coastguard Worker GET_VAR(8, 8)
217*fb1b10abSAndroid Build Coastguard Worker 
218*fb1b10abSAndroid Build Coastguard Worker MSE(16, 16)
219*fb1b10abSAndroid Build Coastguard Worker MSE(16, 8)
220*fb1b10abSAndroid Build Coastguard Worker MSE(8, 16)
221*fb1b10abSAndroid Build Coastguard Worker MSE(8, 8)
222*fb1b10abSAndroid Build Coastguard Worker 
vpx_comp_avg_pred_c(uint8_t * comp_pred,const uint8_t * pred,int width,int height,const uint8_t * ref,int ref_stride)223*fb1b10abSAndroid Build Coastguard Worker void vpx_comp_avg_pred_c(uint8_t *comp_pred, const uint8_t *pred, int width,
224*fb1b10abSAndroid Build Coastguard Worker                          int height, const uint8_t *ref, int ref_stride) {
225*fb1b10abSAndroid Build Coastguard Worker   int i, j;
226*fb1b10abSAndroid Build Coastguard Worker 
227*fb1b10abSAndroid Build Coastguard Worker   for (i = 0; i < height; ++i) {
228*fb1b10abSAndroid Build Coastguard Worker     for (j = 0; j < width; ++j) {
229*fb1b10abSAndroid Build Coastguard Worker       const int tmp = pred[j] + ref[j];
230*fb1b10abSAndroid Build Coastguard Worker       comp_pred[j] = ROUND_POWER_OF_TWO(tmp, 1);
231*fb1b10abSAndroid Build Coastguard Worker     }
232*fb1b10abSAndroid Build Coastguard Worker     comp_pred += width;
233*fb1b10abSAndroid Build Coastguard Worker     pred += width;
234*fb1b10abSAndroid Build Coastguard Worker     ref += ref_stride;
235*fb1b10abSAndroid Build Coastguard Worker   }
236*fb1b10abSAndroid Build Coastguard Worker }
237*fb1b10abSAndroid Build Coastguard Worker 
238*fb1b10abSAndroid Build Coastguard Worker #if CONFIG_VP9_HIGHBITDEPTH
highbd_variance64(const uint8_t * src8_ptr,int src_stride,const uint8_t * ref8_ptr,int ref_stride,int w,int h,uint64_t * sse,int64_t * sum)239*fb1b10abSAndroid Build Coastguard Worker static void highbd_variance64(const uint8_t *src8_ptr, int src_stride,
240*fb1b10abSAndroid Build Coastguard Worker                               const uint8_t *ref8_ptr, int ref_stride, int w,
241*fb1b10abSAndroid Build Coastguard Worker                               int h, uint64_t *sse, int64_t *sum) {
242*fb1b10abSAndroid Build Coastguard Worker   int i, j;
243*fb1b10abSAndroid Build Coastguard Worker 
244*fb1b10abSAndroid Build Coastguard Worker   uint16_t *src_ptr = CONVERT_TO_SHORTPTR(src8_ptr);
245*fb1b10abSAndroid Build Coastguard Worker   uint16_t *ref_ptr = CONVERT_TO_SHORTPTR(ref8_ptr);
246*fb1b10abSAndroid Build Coastguard Worker   *sum = 0;
247*fb1b10abSAndroid Build Coastguard Worker   *sse = 0;
248*fb1b10abSAndroid Build Coastguard Worker 
249*fb1b10abSAndroid Build Coastguard Worker   for (i = 0; i < h; ++i) {
250*fb1b10abSAndroid Build Coastguard Worker     for (j = 0; j < w; ++j) {
251*fb1b10abSAndroid Build Coastguard Worker       const int diff = src_ptr[j] - ref_ptr[j];
252*fb1b10abSAndroid Build Coastguard Worker       *sum += diff;
253*fb1b10abSAndroid Build Coastguard Worker       *sse += diff * diff;
254*fb1b10abSAndroid Build Coastguard Worker     }
255*fb1b10abSAndroid Build Coastguard Worker     src_ptr += src_stride;
256*fb1b10abSAndroid Build Coastguard Worker     ref_ptr += ref_stride;
257*fb1b10abSAndroid Build Coastguard Worker   }
258*fb1b10abSAndroid Build Coastguard Worker }
259*fb1b10abSAndroid Build Coastguard Worker 
highbd_8_variance(const uint8_t * src8_ptr,int src_stride,const uint8_t * ref8_ptr,int ref_stride,int w,int h,uint32_t * sse,int * sum)260*fb1b10abSAndroid Build Coastguard Worker static void highbd_8_variance(const uint8_t *src8_ptr, int src_stride,
261*fb1b10abSAndroid Build Coastguard Worker                               const uint8_t *ref8_ptr, int ref_stride, int w,
262*fb1b10abSAndroid Build Coastguard Worker                               int h, uint32_t *sse, int *sum) {
263*fb1b10abSAndroid Build Coastguard Worker   uint64_t sse_long = 0;
264*fb1b10abSAndroid Build Coastguard Worker   int64_t sum_long = 0;
265*fb1b10abSAndroid Build Coastguard Worker   highbd_variance64(src8_ptr, src_stride, ref8_ptr, ref_stride, w, h, &sse_long,
266*fb1b10abSAndroid Build Coastguard Worker                     &sum_long);
267*fb1b10abSAndroid Build Coastguard Worker   *sse = (uint32_t)sse_long;
268*fb1b10abSAndroid Build Coastguard Worker   *sum = (int)sum_long;
269*fb1b10abSAndroid Build Coastguard Worker }
270*fb1b10abSAndroid Build Coastguard Worker 
highbd_10_variance(const uint8_t * src8_ptr,int src_stride,const uint8_t * ref8_ptr,int ref_stride,int w,int h,uint32_t * sse,int * sum)271*fb1b10abSAndroid Build Coastguard Worker static void highbd_10_variance(const uint8_t *src8_ptr, int src_stride,
272*fb1b10abSAndroid Build Coastguard Worker                                const uint8_t *ref8_ptr, int ref_stride, int w,
273*fb1b10abSAndroid Build Coastguard Worker                                int h, uint32_t *sse, int *sum) {
274*fb1b10abSAndroid Build Coastguard Worker   uint64_t sse_long = 0;
275*fb1b10abSAndroid Build Coastguard Worker   int64_t sum_long = 0;
276*fb1b10abSAndroid Build Coastguard Worker   highbd_variance64(src8_ptr, src_stride, ref8_ptr, ref_stride, w, h, &sse_long,
277*fb1b10abSAndroid Build Coastguard Worker                     &sum_long);
278*fb1b10abSAndroid Build Coastguard Worker   *sse = (uint32_t)ROUND_POWER_OF_TWO(sse_long, 4);
279*fb1b10abSAndroid Build Coastguard Worker   *sum = (int)ROUND_POWER_OF_TWO(sum_long, 2);
280*fb1b10abSAndroid Build Coastguard Worker }
281*fb1b10abSAndroid Build Coastguard Worker 
highbd_12_variance(const uint8_t * src8_ptr,int src_stride,const uint8_t * ref8_ptr,int ref_stride,int w,int h,uint32_t * sse,int * sum)282*fb1b10abSAndroid Build Coastguard Worker static void highbd_12_variance(const uint8_t *src8_ptr, int src_stride,
283*fb1b10abSAndroid Build Coastguard Worker                                const uint8_t *ref8_ptr, int ref_stride, int w,
284*fb1b10abSAndroid Build Coastguard Worker                                int h, uint32_t *sse, int *sum) {
285*fb1b10abSAndroid Build Coastguard Worker   uint64_t sse_long = 0;
286*fb1b10abSAndroid Build Coastguard Worker   int64_t sum_long = 0;
287*fb1b10abSAndroid Build Coastguard Worker   highbd_variance64(src8_ptr, src_stride, ref8_ptr, ref_stride, w, h, &sse_long,
288*fb1b10abSAndroid Build Coastguard Worker                     &sum_long);
289*fb1b10abSAndroid Build Coastguard Worker   *sse = (uint32_t)ROUND_POWER_OF_TWO(sse_long, 8);
290*fb1b10abSAndroid Build Coastguard Worker   *sum = (int)ROUND_POWER_OF_TWO(sum_long, 4);
291*fb1b10abSAndroid Build Coastguard Worker }
292*fb1b10abSAndroid Build Coastguard Worker 
293*fb1b10abSAndroid Build Coastguard Worker #define HIGHBD_VAR(W, H)                                                    \
294*fb1b10abSAndroid Build Coastguard Worker   uint32_t vpx_highbd_8_variance##W##x##H##_c(                              \
295*fb1b10abSAndroid Build Coastguard Worker       const uint8_t *src_ptr, int src_stride, const uint8_t *ref_ptr,       \
296*fb1b10abSAndroid Build Coastguard Worker       int ref_stride, uint32_t *sse) {                                      \
297*fb1b10abSAndroid Build Coastguard Worker     int sum;                                                                \
298*fb1b10abSAndroid Build Coastguard Worker     highbd_8_variance(src_ptr, src_stride, ref_ptr, ref_stride, W, H, sse,  \
299*fb1b10abSAndroid Build Coastguard Worker                       &sum);                                                \
300*fb1b10abSAndroid Build Coastguard Worker     return *sse - (uint32_t)(((int64_t)sum * sum) / (W * H));               \
301*fb1b10abSAndroid Build Coastguard Worker   }                                                                         \
302*fb1b10abSAndroid Build Coastguard Worker                                                                             \
303*fb1b10abSAndroid Build Coastguard Worker   uint32_t vpx_highbd_10_variance##W##x##H##_c(                             \
304*fb1b10abSAndroid Build Coastguard Worker       const uint8_t *src_ptr, int src_stride, const uint8_t *ref_ptr,       \
305*fb1b10abSAndroid Build Coastguard Worker       int ref_stride, uint32_t *sse) {                                      \
306*fb1b10abSAndroid Build Coastguard Worker     int sum;                                                                \
307*fb1b10abSAndroid Build Coastguard Worker     int64_t var;                                                            \
308*fb1b10abSAndroid Build Coastguard Worker     highbd_10_variance(src_ptr, src_stride, ref_ptr, ref_stride, W, H, sse, \
309*fb1b10abSAndroid Build Coastguard Worker                        &sum);                                               \
310*fb1b10abSAndroid Build Coastguard Worker     var = (int64_t)(*sse) - (((int64_t)sum * sum) / (W * H));               \
311*fb1b10abSAndroid Build Coastguard Worker     return (var >= 0) ? (uint32_t)var : 0;                                  \
312*fb1b10abSAndroid Build Coastguard Worker   }                                                                         \
313*fb1b10abSAndroid Build Coastguard Worker                                                                             \
314*fb1b10abSAndroid Build Coastguard Worker   uint32_t vpx_highbd_12_variance##W##x##H##_c(                             \
315*fb1b10abSAndroid Build Coastguard Worker       const uint8_t *src_ptr, int src_stride, const uint8_t *ref_ptr,       \
316*fb1b10abSAndroid Build Coastguard Worker       int ref_stride, uint32_t *sse) {                                      \
317*fb1b10abSAndroid Build Coastguard Worker     int sum;                                                                \
318*fb1b10abSAndroid Build Coastguard Worker     int64_t var;                                                            \
319*fb1b10abSAndroid Build Coastguard Worker     highbd_12_variance(src_ptr, src_stride, ref_ptr, ref_stride, W, H, sse, \
320*fb1b10abSAndroid Build Coastguard Worker                        &sum);                                               \
321*fb1b10abSAndroid Build Coastguard Worker     var = (int64_t)(*sse) - (((int64_t)sum * sum) / (W * H));               \
322*fb1b10abSAndroid Build Coastguard Worker     return (var >= 0) ? (uint32_t)var : 0;                                  \
323*fb1b10abSAndroid Build Coastguard Worker   }
324*fb1b10abSAndroid Build Coastguard Worker 
325*fb1b10abSAndroid Build Coastguard Worker #define HIGHBD_GET_VAR(S)                                                   \
326*fb1b10abSAndroid Build Coastguard Worker   void vpx_highbd_8_get##S##x##S##var_c(                                    \
327*fb1b10abSAndroid Build Coastguard Worker       const uint8_t *src_ptr, int src_stride, const uint8_t *ref_ptr,       \
328*fb1b10abSAndroid Build Coastguard Worker       int ref_stride, uint32_t *sse, int *sum) {                            \
329*fb1b10abSAndroid Build Coastguard Worker     highbd_8_variance(src_ptr, src_stride, ref_ptr, ref_stride, S, S, sse,  \
330*fb1b10abSAndroid Build Coastguard Worker                       sum);                                                 \
331*fb1b10abSAndroid Build Coastguard Worker   }                                                                         \
332*fb1b10abSAndroid Build Coastguard Worker                                                                             \
333*fb1b10abSAndroid Build Coastguard Worker   void vpx_highbd_10_get##S##x##S##var_c(                                   \
334*fb1b10abSAndroid Build Coastguard Worker       const uint8_t *src_ptr, int src_stride, const uint8_t *ref_ptr,       \
335*fb1b10abSAndroid Build Coastguard Worker       int ref_stride, uint32_t *sse, int *sum) {                            \
336*fb1b10abSAndroid Build Coastguard Worker     highbd_10_variance(src_ptr, src_stride, ref_ptr, ref_stride, S, S, sse, \
337*fb1b10abSAndroid Build Coastguard Worker                        sum);                                                \
338*fb1b10abSAndroid Build Coastguard Worker   }                                                                         \
339*fb1b10abSAndroid Build Coastguard Worker                                                                             \
340*fb1b10abSAndroid Build Coastguard Worker   void vpx_highbd_12_get##S##x##S##var_c(                                   \
341*fb1b10abSAndroid Build Coastguard Worker       const uint8_t *src_ptr, int src_stride, const uint8_t *ref_ptr,       \
342*fb1b10abSAndroid Build Coastguard Worker       int ref_stride, uint32_t *sse, int *sum) {                            \
343*fb1b10abSAndroid Build Coastguard Worker     highbd_12_variance(src_ptr, src_stride, ref_ptr, ref_stride, S, S, sse, \
344*fb1b10abSAndroid Build Coastguard Worker                        sum);                                                \
345*fb1b10abSAndroid Build Coastguard Worker   }
346*fb1b10abSAndroid Build Coastguard Worker 
347*fb1b10abSAndroid Build Coastguard Worker #define HIGHBD_MSE(W, H)                                                    \
348*fb1b10abSAndroid Build Coastguard Worker   uint32_t vpx_highbd_8_mse##W##x##H##_c(                                   \
349*fb1b10abSAndroid Build Coastguard Worker       const uint8_t *src_ptr, int src_stride, const uint8_t *ref_ptr,       \
350*fb1b10abSAndroid Build Coastguard Worker       int ref_stride, uint32_t *sse) {                                      \
351*fb1b10abSAndroid Build Coastguard Worker     int sum;                                                                \
352*fb1b10abSAndroid Build Coastguard Worker     highbd_8_variance(src_ptr, src_stride, ref_ptr, ref_stride, W, H, sse,  \
353*fb1b10abSAndroid Build Coastguard Worker                       &sum);                                                \
354*fb1b10abSAndroid Build Coastguard Worker     return *sse;                                                            \
355*fb1b10abSAndroid Build Coastguard Worker   }                                                                         \
356*fb1b10abSAndroid Build Coastguard Worker                                                                             \
357*fb1b10abSAndroid Build Coastguard Worker   uint32_t vpx_highbd_10_mse##W##x##H##_c(                                  \
358*fb1b10abSAndroid Build Coastguard Worker       const uint8_t *src_ptr, int src_stride, const uint8_t *ref_ptr,       \
359*fb1b10abSAndroid Build Coastguard Worker       int ref_stride, uint32_t *sse) {                                      \
360*fb1b10abSAndroid Build Coastguard Worker     int sum;                                                                \
361*fb1b10abSAndroid Build Coastguard Worker     highbd_10_variance(src_ptr, src_stride, ref_ptr, ref_stride, W, H, sse, \
362*fb1b10abSAndroid Build Coastguard Worker                        &sum);                                               \
363*fb1b10abSAndroid Build Coastguard Worker     return *sse;                                                            \
364*fb1b10abSAndroid Build Coastguard Worker   }                                                                         \
365*fb1b10abSAndroid Build Coastguard Worker                                                                             \
366*fb1b10abSAndroid Build Coastguard Worker   uint32_t vpx_highbd_12_mse##W##x##H##_c(                                  \
367*fb1b10abSAndroid Build Coastguard Worker       const uint8_t *src_ptr, int src_stride, const uint8_t *ref_ptr,       \
368*fb1b10abSAndroid Build Coastguard Worker       int ref_stride, uint32_t *sse) {                                      \
369*fb1b10abSAndroid Build Coastguard Worker     int sum;                                                                \
370*fb1b10abSAndroid Build Coastguard Worker     highbd_12_variance(src_ptr, src_stride, ref_ptr, ref_stride, W, H, sse, \
371*fb1b10abSAndroid Build Coastguard Worker                        &sum);                                               \
372*fb1b10abSAndroid Build Coastguard Worker     return *sse;                                                            \
373*fb1b10abSAndroid Build Coastguard Worker   }
374*fb1b10abSAndroid Build Coastguard Worker 
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)375*fb1b10abSAndroid Build Coastguard Worker static void highbd_var_filter_block2d_bil_first_pass(
376*fb1b10abSAndroid Build Coastguard Worker     const uint8_t *src_ptr8, uint16_t *output_ptr,
377*fb1b10abSAndroid Build Coastguard Worker     unsigned int src_pixels_per_line, int pixel_step,
378*fb1b10abSAndroid Build Coastguard Worker     unsigned int output_height, unsigned int output_width,
379*fb1b10abSAndroid Build Coastguard Worker     const uint8_t *filter) {
380*fb1b10abSAndroid Build Coastguard Worker   unsigned int i, j;
381*fb1b10abSAndroid Build Coastguard Worker   uint16_t *src_ptr = CONVERT_TO_SHORTPTR(src_ptr8);
382*fb1b10abSAndroid Build Coastguard Worker   for (i = 0; i < output_height; ++i) {
383*fb1b10abSAndroid Build Coastguard Worker     for (j = 0; j < output_width; ++j) {
384*fb1b10abSAndroid Build Coastguard Worker       output_ptr[j] = ROUND_POWER_OF_TWO(
385*fb1b10abSAndroid Build Coastguard Worker           (int)src_ptr[0] * filter[0] + (int)src_ptr[pixel_step] * filter[1],
386*fb1b10abSAndroid Build Coastguard Worker           FILTER_BITS);
387*fb1b10abSAndroid Build Coastguard Worker 
388*fb1b10abSAndroid Build Coastguard Worker       ++src_ptr;
389*fb1b10abSAndroid Build Coastguard Worker     }
390*fb1b10abSAndroid Build Coastguard Worker 
391*fb1b10abSAndroid Build Coastguard Worker     // Next row...
392*fb1b10abSAndroid Build Coastguard Worker     src_ptr += src_pixels_per_line - output_width;
393*fb1b10abSAndroid Build Coastguard Worker     output_ptr += output_width;
394*fb1b10abSAndroid Build Coastguard Worker   }
395*fb1b10abSAndroid Build Coastguard Worker }
396*fb1b10abSAndroid Build Coastguard Worker 
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)397*fb1b10abSAndroid Build Coastguard Worker static void highbd_var_filter_block2d_bil_second_pass(
398*fb1b10abSAndroid Build Coastguard Worker     const uint16_t *src_ptr, uint16_t *output_ptr,
399*fb1b10abSAndroid Build Coastguard Worker     unsigned int src_pixels_per_line, unsigned int pixel_step,
400*fb1b10abSAndroid Build Coastguard Worker     unsigned int output_height, unsigned int output_width,
401*fb1b10abSAndroid Build Coastguard Worker     const uint8_t *filter) {
402*fb1b10abSAndroid Build Coastguard Worker   unsigned int i, j;
403*fb1b10abSAndroid Build Coastguard Worker 
404*fb1b10abSAndroid Build Coastguard Worker   for (i = 0; i < output_height; ++i) {
405*fb1b10abSAndroid Build Coastguard Worker     for (j = 0; j < output_width; ++j) {
406*fb1b10abSAndroid Build Coastguard Worker       output_ptr[j] = ROUND_POWER_OF_TWO(
407*fb1b10abSAndroid Build Coastguard Worker           (int)src_ptr[0] * filter[0] + (int)src_ptr[pixel_step] * filter[1],
408*fb1b10abSAndroid Build Coastguard Worker           FILTER_BITS);
409*fb1b10abSAndroid Build Coastguard Worker       ++src_ptr;
410*fb1b10abSAndroid Build Coastguard Worker     }
411*fb1b10abSAndroid Build Coastguard Worker 
412*fb1b10abSAndroid Build Coastguard Worker     src_ptr += src_pixels_per_line - output_width;
413*fb1b10abSAndroid Build Coastguard Worker     output_ptr += output_width;
414*fb1b10abSAndroid Build Coastguard Worker   }
415*fb1b10abSAndroid Build Coastguard Worker }
416*fb1b10abSAndroid Build Coastguard Worker 
417*fb1b10abSAndroid Build Coastguard Worker #define HIGHBD_SUBPIX_VAR(W, H)                                                \
418*fb1b10abSAndroid Build Coastguard Worker   uint32_t vpx_highbd_8_sub_pixel_variance##W##x##H##_c(                       \
419*fb1b10abSAndroid Build Coastguard Worker       const uint8_t *src_ptr, int src_stride, int x_offset, int y_offset,      \
420*fb1b10abSAndroid Build Coastguard Worker       const uint8_t *ref_ptr, int ref_stride, uint32_t *sse) {                 \
421*fb1b10abSAndroid Build Coastguard Worker     uint16_t fdata3[(H + 1) * W];                                              \
422*fb1b10abSAndroid Build Coastguard Worker     uint16_t temp2[H * W];                                                     \
423*fb1b10abSAndroid Build Coastguard Worker                                                                                \
424*fb1b10abSAndroid Build Coastguard Worker     highbd_var_filter_block2d_bil_first_pass(                                  \
425*fb1b10abSAndroid Build Coastguard Worker         src_ptr, fdata3, src_stride, 1, H + 1, W, bilinear_filters[x_offset]); \
426*fb1b10abSAndroid Build Coastguard Worker     highbd_var_filter_block2d_bil_second_pass(fdata3, temp2, W, W, H, W,       \
427*fb1b10abSAndroid Build Coastguard Worker                                               bilinear_filters[y_offset]);     \
428*fb1b10abSAndroid Build Coastguard Worker                                                                                \
429*fb1b10abSAndroid Build Coastguard Worker     return vpx_highbd_8_variance##W##x##H##_c(CONVERT_TO_BYTEPTR(temp2), W,    \
430*fb1b10abSAndroid Build Coastguard Worker                                               ref_ptr, ref_stride, sse);       \
431*fb1b10abSAndroid Build Coastguard Worker   }                                                                            \
432*fb1b10abSAndroid Build Coastguard Worker                                                                                \
433*fb1b10abSAndroid Build Coastguard Worker   uint32_t vpx_highbd_10_sub_pixel_variance##W##x##H##_c(                      \
434*fb1b10abSAndroid Build Coastguard Worker       const uint8_t *src_ptr, int src_stride, int x_offset, int y_offset,      \
435*fb1b10abSAndroid Build Coastguard Worker       const uint8_t *ref_ptr, int ref_stride, uint32_t *sse) {                 \
436*fb1b10abSAndroid Build Coastguard Worker     uint16_t fdata3[(H + 1) * W];                                              \
437*fb1b10abSAndroid Build Coastguard Worker     uint16_t temp2[H * W];                                                     \
438*fb1b10abSAndroid Build Coastguard Worker                                                                                \
439*fb1b10abSAndroid Build Coastguard Worker     highbd_var_filter_block2d_bil_first_pass(                                  \
440*fb1b10abSAndroid Build Coastguard Worker         src_ptr, fdata3, src_stride, 1, H + 1, W, bilinear_filters[x_offset]); \
441*fb1b10abSAndroid Build Coastguard Worker     highbd_var_filter_block2d_bil_second_pass(fdata3, temp2, W, W, H, W,       \
442*fb1b10abSAndroid Build Coastguard Worker                                               bilinear_filters[y_offset]);     \
443*fb1b10abSAndroid Build Coastguard Worker                                                                                \
444*fb1b10abSAndroid Build Coastguard Worker     return vpx_highbd_10_variance##W##x##H##_c(CONVERT_TO_BYTEPTR(temp2), W,   \
445*fb1b10abSAndroid Build Coastguard Worker                                                ref_ptr, ref_stride, sse);      \
446*fb1b10abSAndroid Build Coastguard Worker   }                                                                            \
447*fb1b10abSAndroid Build Coastguard Worker                                                                                \
448*fb1b10abSAndroid Build Coastguard Worker   uint32_t vpx_highbd_12_sub_pixel_variance##W##x##H##_c(                      \
449*fb1b10abSAndroid Build Coastguard Worker       const uint8_t *src_ptr, int src_stride, int x_offset, int y_offset,      \
450*fb1b10abSAndroid Build Coastguard Worker       const uint8_t *ref_ptr, int ref_stride, uint32_t *sse) {                 \
451*fb1b10abSAndroid Build Coastguard Worker     uint16_t fdata3[(H + 1) * W];                                              \
452*fb1b10abSAndroid Build Coastguard Worker     uint16_t temp2[H * W];                                                     \
453*fb1b10abSAndroid Build Coastguard Worker                                                                                \
454*fb1b10abSAndroid Build Coastguard Worker     highbd_var_filter_block2d_bil_first_pass(                                  \
455*fb1b10abSAndroid Build Coastguard Worker         src_ptr, fdata3, src_stride, 1, H + 1, W, bilinear_filters[x_offset]); \
456*fb1b10abSAndroid Build Coastguard Worker     highbd_var_filter_block2d_bil_second_pass(fdata3, temp2, W, W, H, W,       \
457*fb1b10abSAndroid Build Coastguard Worker                                               bilinear_filters[y_offset]);     \
458*fb1b10abSAndroid Build Coastguard Worker                                                                                \
459*fb1b10abSAndroid Build Coastguard Worker     return vpx_highbd_12_variance##W##x##H##_c(CONVERT_TO_BYTEPTR(temp2), W,   \
460*fb1b10abSAndroid Build Coastguard Worker                                                ref_ptr, ref_stride, sse);      \
461*fb1b10abSAndroid Build Coastguard Worker   }
462*fb1b10abSAndroid Build Coastguard Worker 
463*fb1b10abSAndroid Build Coastguard Worker #define HIGHBD_SUBPIX_AVG_VAR(W, H)                                            \
464*fb1b10abSAndroid Build Coastguard Worker   uint32_t vpx_highbd_8_sub_pixel_avg_variance##W##x##H##_c(                   \
465*fb1b10abSAndroid Build Coastguard Worker       const uint8_t *src_ptr, int src_stride, int x_offset, int y_offset,      \
466*fb1b10abSAndroid Build Coastguard Worker       const uint8_t *ref_ptr, int ref_stride, uint32_t *sse,                   \
467*fb1b10abSAndroid Build Coastguard Worker       const uint8_t *second_pred) {                                            \
468*fb1b10abSAndroid Build Coastguard Worker     uint16_t fdata3[(H + 1) * W];                                              \
469*fb1b10abSAndroid Build Coastguard Worker     uint16_t temp2[H * W];                                                     \
470*fb1b10abSAndroid Build Coastguard Worker     DECLARE_ALIGNED(16, uint16_t, temp3[H * W]);                               \
471*fb1b10abSAndroid Build Coastguard Worker                                                                                \
472*fb1b10abSAndroid Build Coastguard Worker     highbd_var_filter_block2d_bil_first_pass(                                  \
473*fb1b10abSAndroid Build Coastguard Worker         src_ptr, fdata3, src_stride, 1, H + 1, W, bilinear_filters[x_offset]); \
474*fb1b10abSAndroid Build Coastguard Worker     highbd_var_filter_block2d_bil_second_pass(fdata3, temp2, W, W, H, W,       \
475*fb1b10abSAndroid Build Coastguard Worker                                               bilinear_filters[y_offset]);     \
476*fb1b10abSAndroid Build Coastguard Worker                                                                                \
477*fb1b10abSAndroid Build Coastguard Worker     vpx_highbd_comp_avg_pred_c(temp3, CONVERT_TO_SHORTPTR(second_pred), W, H,  \
478*fb1b10abSAndroid Build Coastguard Worker                                temp2, W);                                      \
479*fb1b10abSAndroid Build Coastguard Worker                                                                                \
480*fb1b10abSAndroid Build Coastguard Worker     return vpx_highbd_8_variance##W##x##H##_c(CONVERT_TO_BYTEPTR(temp3), W,    \
481*fb1b10abSAndroid Build Coastguard Worker                                               ref_ptr, ref_stride, sse);       \
482*fb1b10abSAndroid Build Coastguard Worker   }                                                                            \
483*fb1b10abSAndroid Build Coastguard Worker                                                                                \
484*fb1b10abSAndroid Build Coastguard Worker   uint32_t vpx_highbd_10_sub_pixel_avg_variance##W##x##H##_c(                  \
485*fb1b10abSAndroid Build Coastguard Worker       const uint8_t *src_ptr, int src_stride, int x_offset, int y_offset,      \
486*fb1b10abSAndroid Build Coastguard Worker       const uint8_t *ref_ptr, int ref_stride, uint32_t *sse,                   \
487*fb1b10abSAndroid Build Coastguard Worker       const uint8_t *second_pred) {                                            \
488*fb1b10abSAndroid Build Coastguard Worker     uint16_t fdata3[(H + 1) * W];                                              \
489*fb1b10abSAndroid Build Coastguard Worker     uint16_t temp2[H * W];                                                     \
490*fb1b10abSAndroid Build Coastguard Worker     DECLARE_ALIGNED(16, uint16_t, temp3[H * W]);                               \
491*fb1b10abSAndroid Build Coastguard Worker                                                                                \
492*fb1b10abSAndroid Build Coastguard Worker     highbd_var_filter_block2d_bil_first_pass(                                  \
493*fb1b10abSAndroid Build Coastguard Worker         src_ptr, fdata3, src_stride, 1, H + 1, W, bilinear_filters[x_offset]); \
494*fb1b10abSAndroid Build Coastguard Worker     highbd_var_filter_block2d_bil_second_pass(fdata3, temp2, W, W, H, W,       \
495*fb1b10abSAndroid Build Coastguard Worker                                               bilinear_filters[y_offset]);     \
496*fb1b10abSAndroid Build Coastguard Worker                                                                                \
497*fb1b10abSAndroid Build Coastguard Worker     vpx_highbd_comp_avg_pred_c(temp3, CONVERT_TO_SHORTPTR(second_pred), W, H,  \
498*fb1b10abSAndroid Build Coastguard Worker                                temp2, W);                                      \
499*fb1b10abSAndroid Build Coastguard Worker                                                                                \
500*fb1b10abSAndroid Build Coastguard Worker     return vpx_highbd_10_variance##W##x##H##_c(CONVERT_TO_BYTEPTR(temp3), W,   \
501*fb1b10abSAndroid Build Coastguard Worker                                                ref_ptr, ref_stride, sse);      \
502*fb1b10abSAndroid Build Coastguard Worker   }                                                                            \
503*fb1b10abSAndroid Build Coastguard Worker                                                                                \
504*fb1b10abSAndroid Build Coastguard Worker   uint32_t vpx_highbd_12_sub_pixel_avg_variance##W##x##H##_c(                  \
505*fb1b10abSAndroid Build Coastguard Worker       const uint8_t *src_ptr, int src_stride, int x_offset, int y_offset,      \
506*fb1b10abSAndroid Build Coastguard Worker       const uint8_t *ref_ptr, int ref_stride, uint32_t *sse,                   \
507*fb1b10abSAndroid Build Coastguard Worker       const uint8_t *second_pred) {                                            \
508*fb1b10abSAndroid Build Coastguard Worker     uint16_t fdata3[(H + 1) * W];                                              \
509*fb1b10abSAndroid Build Coastguard Worker     uint16_t temp2[H * W];                                                     \
510*fb1b10abSAndroid Build Coastguard Worker     DECLARE_ALIGNED(16, uint16_t, temp3[H * W]);                               \
511*fb1b10abSAndroid Build Coastguard Worker                                                                                \
512*fb1b10abSAndroid Build Coastguard Worker     highbd_var_filter_block2d_bil_first_pass(                                  \
513*fb1b10abSAndroid Build Coastguard Worker         src_ptr, fdata3, src_stride, 1, H + 1, W, bilinear_filters[x_offset]); \
514*fb1b10abSAndroid Build Coastguard Worker     highbd_var_filter_block2d_bil_second_pass(fdata3, temp2, W, W, H, W,       \
515*fb1b10abSAndroid Build Coastguard Worker                                               bilinear_filters[y_offset]);     \
516*fb1b10abSAndroid Build Coastguard Worker                                                                                \
517*fb1b10abSAndroid Build Coastguard Worker     vpx_highbd_comp_avg_pred_c(temp3, CONVERT_TO_SHORTPTR(second_pred), W, H,  \
518*fb1b10abSAndroid Build Coastguard Worker                                temp2, W);                                      \
519*fb1b10abSAndroid Build Coastguard Worker                                                                                \
520*fb1b10abSAndroid Build Coastguard Worker     return vpx_highbd_12_variance##W##x##H##_c(CONVERT_TO_BYTEPTR(temp3), W,   \
521*fb1b10abSAndroid Build Coastguard Worker                                                ref_ptr, ref_stride, sse);      \
522*fb1b10abSAndroid Build Coastguard Worker   }
523*fb1b10abSAndroid Build Coastguard Worker 
524*fb1b10abSAndroid Build Coastguard Worker /* All three forms of the variance are available in the same sizes. */
525*fb1b10abSAndroid Build Coastguard Worker #define HIGHBD_VARIANCES(W, H) \
526*fb1b10abSAndroid Build Coastguard Worker   HIGHBD_VAR(W, H)             \
527*fb1b10abSAndroid Build Coastguard Worker   HIGHBD_SUBPIX_VAR(W, H)      \
528*fb1b10abSAndroid Build Coastguard Worker   HIGHBD_SUBPIX_AVG_VAR(W, H)
529*fb1b10abSAndroid Build Coastguard Worker 
530*fb1b10abSAndroid Build Coastguard Worker HIGHBD_VARIANCES(64, 64)
531*fb1b10abSAndroid Build Coastguard Worker HIGHBD_VARIANCES(64, 32)
532*fb1b10abSAndroid Build Coastguard Worker HIGHBD_VARIANCES(32, 64)
533*fb1b10abSAndroid Build Coastguard Worker HIGHBD_VARIANCES(32, 32)
534*fb1b10abSAndroid Build Coastguard Worker HIGHBD_VARIANCES(32, 16)
535*fb1b10abSAndroid Build Coastguard Worker HIGHBD_VARIANCES(16, 32)
536*fb1b10abSAndroid Build Coastguard Worker HIGHBD_VARIANCES(16, 16)
537*fb1b10abSAndroid Build Coastguard Worker HIGHBD_VARIANCES(16, 8)
538*fb1b10abSAndroid Build Coastguard Worker HIGHBD_VARIANCES(8, 16)
539*fb1b10abSAndroid Build Coastguard Worker HIGHBD_VARIANCES(8, 8)
540*fb1b10abSAndroid Build Coastguard Worker HIGHBD_VARIANCES(8, 4)
541*fb1b10abSAndroid Build Coastguard Worker HIGHBD_VARIANCES(4, 8)
542*fb1b10abSAndroid Build Coastguard Worker HIGHBD_VARIANCES(4, 4)
543*fb1b10abSAndroid Build Coastguard Worker 
544*fb1b10abSAndroid Build Coastguard Worker HIGHBD_GET_VAR(8)
545*fb1b10abSAndroid Build Coastguard Worker HIGHBD_GET_VAR(16)
546*fb1b10abSAndroid Build Coastguard Worker 
547*fb1b10abSAndroid Build Coastguard Worker HIGHBD_MSE(16, 16)
548*fb1b10abSAndroid Build Coastguard Worker HIGHBD_MSE(16, 8)
549*fb1b10abSAndroid Build Coastguard Worker HIGHBD_MSE(8, 16)
550*fb1b10abSAndroid Build Coastguard Worker HIGHBD_MSE(8, 8)
551*fb1b10abSAndroid Build Coastguard Worker 
vpx_highbd_comp_avg_pred_c(uint16_t * comp_pred,const uint16_t * pred,int width,int height,const uint16_t * ref,int ref_stride)552*fb1b10abSAndroid Build Coastguard Worker void vpx_highbd_comp_avg_pred_c(uint16_t *comp_pred, const uint16_t *pred,
553*fb1b10abSAndroid Build Coastguard Worker                                 int width, int height, const uint16_t *ref,
554*fb1b10abSAndroid Build Coastguard Worker                                 int ref_stride) {
555*fb1b10abSAndroid Build Coastguard Worker   int i, j;
556*fb1b10abSAndroid Build Coastguard Worker   for (i = 0; i < height; ++i) {
557*fb1b10abSAndroid Build Coastguard Worker     for (j = 0; j < width; ++j) {
558*fb1b10abSAndroid Build Coastguard Worker       const int tmp = pred[j] + ref[j];
559*fb1b10abSAndroid Build Coastguard Worker       comp_pred[j] = ROUND_POWER_OF_TWO(tmp, 1);
560*fb1b10abSAndroid Build Coastguard Worker     }
561*fb1b10abSAndroid Build Coastguard Worker     comp_pred += width;
562*fb1b10abSAndroid Build Coastguard Worker     pred += width;
563*fb1b10abSAndroid Build Coastguard Worker     ref += ref_stride;
564*fb1b10abSAndroid Build Coastguard Worker   }
565*fb1b10abSAndroid Build Coastguard Worker }
566*fb1b10abSAndroid Build Coastguard Worker #endif  // CONFIG_VP9_HIGHBITDEPTH
567