1*77c1e3ccSAndroid Build Coastguard Worker /*
2*77c1e3ccSAndroid Build Coastguard Worker * Copyright (c) 2016, Alliance for Open Media. All rights reserved.
3*77c1e3ccSAndroid Build Coastguard Worker *
4*77c1e3ccSAndroid Build Coastguard Worker * This source code is subject to the terms of the BSD 2 Clause License and
5*77c1e3ccSAndroid Build Coastguard Worker * the Alliance for Open Media Patent License 1.0. If the BSD 2 Clause License
6*77c1e3ccSAndroid Build Coastguard Worker * was not distributed with this source code in the LICENSE file, you can
7*77c1e3ccSAndroid Build Coastguard Worker * obtain it at www.aomedia.org/license/software. If the Alliance for Open
8*77c1e3ccSAndroid Build Coastguard Worker * Media Patent License 1.0 was not distributed with this source code in the
9*77c1e3ccSAndroid Build Coastguard Worker * PATENTS file, you can obtain it at www.aomedia.org/license/patent.
10*77c1e3ccSAndroid Build Coastguard Worker */
11*77c1e3ccSAndroid Build Coastguard Worker #include <assert.h>
12*77c1e3ccSAndroid Build Coastguard Worker #include <stdlib.h>
13*77c1e3ccSAndroid Build Coastguard Worker
14*77c1e3ccSAndroid Build Coastguard Worker #include "config/aom_config.h"
15*77c1e3ccSAndroid Build Coastguard Worker #include "config/aom_dsp_rtcd.h"
16*77c1e3ccSAndroid Build Coastguard Worker
17*77c1e3ccSAndroid Build Coastguard Worker #include "aom/aom_integer.h"
18*77c1e3ccSAndroid Build Coastguard Worker #include "aom_ports/mem.h"
19*77c1e3ccSAndroid Build Coastguard Worker
20*77c1e3ccSAndroid Build Coastguard Worker #include "aom_dsp/aom_filter.h"
21*77c1e3ccSAndroid Build Coastguard Worker #include "aom_dsp/blend.h"
22*77c1e3ccSAndroid Build Coastguard Worker #include "aom_dsp/variance.h"
23*77c1e3ccSAndroid Build Coastguard Worker
24*77c1e3ccSAndroid Build Coastguard Worker #include "av1/common/filter.h"
25*77c1e3ccSAndroid Build Coastguard Worker #include "av1/common/reconinter.h"
26*77c1e3ccSAndroid Build Coastguard Worker
27*77c1e3ccSAndroid Build Coastguard Worker #if !CONFIG_REALTIME_ONLY
aom_get_mb_ss_c(const int16_t * a)28*77c1e3ccSAndroid Build Coastguard Worker uint32_t aom_get_mb_ss_c(const int16_t *a) {
29*77c1e3ccSAndroid Build Coastguard Worker unsigned int i, sum = 0;
30*77c1e3ccSAndroid Build Coastguard Worker
31*77c1e3ccSAndroid Build Coastguard Worker for (i = 0; i < 256; ++i) {
32*77c1e3ccSAndroid Build Coastguard Worker sum += a[i] * a[i];
33*77c1e3ccSAndroid Build Coastguard Worker }
34*77c1e3ccSAndroid Build Coastguard Worker
35*77c1e3ccSAndroid Build Coastguard Worker return sum;
36*77c1e3ccSAndroid Build Coastguard Worker }
37*77c1e3ccSAndroid Build Coastguard Worker #endif // !CONFIG_REALTIME_ONLY
38*77c1e3ccSAndroid Build Coastguard Worker
variance(const uint8_t * a,int a_stride,const uint8_t * b,int b_stride,int w,int h,uint32_t * sse,int * sum)39*77c1e3ccSAndroid Build Coastguard Worker static void variance(const uint8_t *a, int a_stride, const uint8_t *b,
40*77c1e3ccSAndroid Build Coastguard Worker int b_stride, int w, int h, uint32_t *sse, int *sum) {
41*77c1e3ccSAndroid Build Coastguard Worker int i, j;
42*77c1e3ccSAndroid Build Coastguard Worker
43*77c1e3ccSAndroid Build Coastguard Worker *sum = 0;
44*77c1e3ccSAndroid Build Coastguard Worker *sse = 0;
45*77c1e3ccSAndroid Build Coastguard Worker
46*77c1e3ccSAndroid Build Coastguard Worker for (i = 0; i < h; ++i) {
47*77c1e3ccSAndroid Build Coastguard Worker for (j = 0; j < w; ++j) {
48*77c1e3ccSAndroid Build Coastguard Worker const int diff = a[j] - b[j];
49*77c1e3ccSAndroid Build Coastguard Worker *sum += diff;
50*77c1e3ccSAndroid Build Coastguard Worker *sse += diff * diff;
51*77c1e3ccSAndroid Build Coastguard Worker }
52*77c1e3ccSAndroid Build Coastguard Worker
53*77c1e3ccSAndroid Build Coastguard Worker a += a_stride;
54*77c1e3ccSAndroid Build Coastguard Worker b += b_stride;
55*77c1e3ccSAndroid Build Coastguard Worker }
56*77c1e3ccSAndroid Build Coastguard Worker }
57*77c1e3ccSAndroid Build Coastguard Worker
aom_sse_odd_size(const uint8_t * a,int a_stride,const uint8_t * b,int b_stride,int w,int h)58*77c1e3ccSAndroid Build Coastguard Worker uint32_t aom_sse_odd_size(const uint8_t *a, int a_stride, const uint8_t *b,
59*77c1e3ccSAndroid Build Coastguard Worker int b_stride, int w, int h) {
60*77c1e3ccSAndroid Build Coastguard Worker uint32_t sse;
61*77c1e3ccSAndroid Build Coastguard Worker int sum;
62*77c1e3ccSAndroid Build Coastguard Worker variance(a, a_stride, b, b_stride, w, h, &sse, &sum);
63*77c1e3ccSAndroid Build Coastguard Worker return sse;
64*77c1e3ccSAndroid Build Coastguard Worker }
65*77c1e3ccSAndroid Build Coastguard Worker
66*77c1e3ccSAndroid Build Coastguard Worker // Applies a 1-D 2-tap bilinear filter to the source block in either horizontal
67*77c1e3ccSAndroid Build Coastguard Worker // or vertical direction to produce the filtered output block. Used to implement
68*77c1e3ccSAndroid Build Coastguard Worker // the first-pass of 2-D separable filter.
69*77c1e3ccSAndroid Build Coastguard Worker //
70*77c1e3ccSAndroid Build Coastguard Worker // Produces int16_t output to retain precision for the next pass. Two filter
71*77c1e3ccSAndroid Build Coastguard Worker // taps should sum to FILTER_WEIGHT. pixel_step defines whether the filter is
72*77c1e3ccSAndroid Build Coastguard Worker // applied horizontally (pixel_step = 1) or vertically (pixel_step = stride).
73*77c1e3ccSAndroid Build Coastguard Worker // It defines the offset required to move from one input to the next.
var_filter_block2d_bil_first_pass_c(const uint8_t * a,uint16_t * b,unsigned int src_pixels_per_line,unsigned int pixel_step,unsigned int output_height,unsigned int output_width,const uint8_t * filter)74*77c1e3ccSAndroid Build Coastguard Worker static void var_filter_block2d_bil_first_pass_c(
75*77c1e3ccSAndroid Build Coastguard Worker const uint8_t *a, uint16_t *b, unsigned int src_pixels_per_line,
76*77c1e3ccSAndroid Build Coastguard Worker unsigned int pixel_step, unsigned int output_height,
77*77c1e3ccSAndroid Build Coastguard Worker unsigned int output_width, const uint8_t *filter) {
78*77c1e3ccSAndroid Build Coastguard Worker unsigned int i, j;
79*77c1e3ccSAndroid Build Coastguard Worker
80*77c1e3ccSAndroid Build Coastguard Worker for (i = 0; i < output_height; ++i) {
81*77c1e3ccSAndroid Build Coastguard Worker for (j = 0; j < output_width; ++j) {
82*77c1e3ccSAndroid Build Coastguard Worker b[j] = ROUND_POWER_OF_TWO(
83*77c1e3ccSAndroid Build Coastguard Worker (int)a[0] * filter[0] + (int)a[pixel_step] * filter[1], FILTER_BITS);
84*77c1e3ccSAndroid Build Coastguard Worker
85*77c1e3ccSAndroid Build Coastguard Worker ++a;
86*77c1e3ccSAndroid Build Coastguard Worker }
87*77c1e3ccSAndroid Build Coastguard Worker
88*77c1e3ccSAndroid Build Coastguard Worker a += src_pixels_per_line - output_width;
89*77c1e3ccSAndroid Build Coastguard Worker b += output_width;
90*77c1e3ccSAndroid Build Coastguard Worker }
91*77c1e3ccSAndroid Build Coastguard Worker }
92*77c1e3ccSAndroid Build Coastguard Worker
93*77c1e3ccSAndroid Build Coastguard Worker // Applies a 1-D 2-tap bilinear filter to the source block in either horizontal
94*77c1e3ccSAndroid Build Coastguard Worker // or vertical direction to produce the filtered output block. Used to implement
95*77c1e3ccSAndroid Build Coastguard Worker // the second-pass of 2-D separable filter.
96*77c1e3ccSAndroid Build Coastguard Worker //
97*77c1e3ccSAndroid Build Coastguard Worker // Requires 16-bit input as produced by filter_block2d_bil_first_pass. Two
98*77c1e3ccSAndroid Build Coastguard Worker // filter taps should sum to FILTER_WEIGHT. pixel_step defines whether the
99*77c1e3ccSAndroid Build Coastguard Worker // filter is applied horizontally (pixel_step = 1) or vertically
100*77c1e3ccSAndroid Build Coastguard Worker // (pixel_step = stride). It defines the offset required to move from one input
101*77c1e3ccSAndroid Build Coastguard Worker // to the next. Output is 8-bit.
var_filter_block2d_bil_second_pass_c(const uint16_t * a,uint8_t * b,unsigned int src_pixels_per_line,unsigned int pixel_step,unsigned int output_height,unsigned int output_width,const uint8_t * filter)102*77c1e3ccSAndroid Build Coastguard Worker static void var_filter_block2d_bil_second_pass_c(
103*77c1e3ccSAndroid Build Coastguard Worker const uint16_t *a, uint8_t *b, unsigned int src_pixels_per_line,
104*77c1e3ccSAndroid Build Coastguard Worker unsigned int pixel_step, unsigned int output_height,
105*77c1e3ccSAndroid Build Coastguard Worker unsigned int output_width, const uint8_t *filter) {
106*77c1e3ccSAndroid Build Coastguard Worker unsigned int i, j;
107*77c1e3ccSAndroid Build Coastguard Worker
108*77c1e3ccSAndroid Build Coastguard Worker for (i = 0; i < output_height; ++i) {
109*77c1e3ccSAndroid Build Coastguard Worker for (j = 0; j < output_width; ++j) {
110*77c1e3ccSAndroid Build Coastguard Worker b[j] = ROUND_POWER_OF_TWO(
111*77c1e3ccSAndroid Build Coastguard Worker (int)a[0] * filter[0] + (int)a[pixel_step] * filter[1], FILTER_BITS);
112*77c1e3ccSAndroid Build Coastguard Worker ++a;
113*77c1e3ccSAndroid Build Coastguard Worker }
114*77c1e3ccSAndroid Build Coastguard Worker
115*77c1e3ccSAndroid Build Coastguard Worker a += src_pixels_per_line - output_width;
116*77c1e3ccSAndroid Build Coastguard Worker b += output_width;
117*77c1e3ccSAndroid Build Coastguard Worker }
118*77c1e3ccSAndroid Build Coastguard Worker }
119*77c1e3ccSAndroid Build Coastguard Worker
120*77c1e3ccSAndroid Build Coastguard Worker #define VAR(W, H) \
121*77c1e3ccSAndroid Build Coastguard Worker uint32_t aom_variance##W##x##H##_c(const uint8_t *a, int a_stride, \
122*77c1e3ccSAndroid Build Coastguard Worker const uint8_t *b, int b_stride, \
123*77c1e3ccSAndroid Build Coastguard Worker uint32_t *sse) { \
124*77c1e3ccSAndroid Build Coastguard Worker int sum; \
125*77c1e3ccSAndroid Build Coastguard Worker variance(a, a_stride, b, b_stride, W, H, sse, &sum); \
126*77c1e3ccSAndroid Build Coastguard Worker return *sse - (uint32_t)(((int64_t)sum * sum) / (W * H)); \
127*77c1e3ccSAndroid Build Coastguard Worker }
128*77c1e3ccSAndroid Build Coastguard Worker
129*77c1e3ccSAndroid Build Coastguard Worker #define SUBPIX_VAR(W, H) \
130*77c1e3ccSAndroid Build Coastguard Worker uint32_t aom_sub_pixel_variance##W##x##H##_c( \
131*77c1e3ccSAndroid Build Coastguard Worker const uint8_t *a, int a_stride, int xoffset, int yoffset, \
132*77c1e3ccSAndroid Build Coastguard Worker const uint8_t *b, int b_stride, uint32_t *sse) { \
133*77c1e3ccSAndroid Build Coastguard Worker uint16_t fdata3[(H + 1) * W]; \
134*77c1e3ccSAndroid Build Coastguard Worker uint8_t temp2[H * W]; \
135*77c1e3ccSAndroid Build Coastguard Worker \
136*77c1e3ccSAndroid Build Coastguard Worker var_filter_block2d_bil_first_pass_c(a, fdata3, a_stride, 1, H + 1, W, \
137*77c1e3ccSAndroid Build Coastguard Worker bilinear_filters_2t[xoffset]); \
138*77c1e3ccSAndroid Build Coastguard Worker var_filter_block2d_bil_second_pass_c(fdata3, temp2, W, W, H, W, \
139*77c1e3ccSAndroid Build Coastguard Worker bilinear_filters_2t[yoffset]); \
140*77c1e3ccSAndroid Build Coastguard Worker \
141*77c1e3ccSAndroid Build Coastguard Worker return aom_variance##W##x##H##_c(temp2, W, b, b_stride, sse); \
142*77c1e3ccSAndroid Build Coastguard Worker }
143*77c1e3ccSAndroid Build Coastguard Worker
144*77c1e3ccSAndroid Build Coastguard Worker #define SUBPIX_AVG_VAR(W, H) \
145*77c1e3ccSAndroid Build Coastguard Worker uint32_t aom_sub_pixel_avg_variance##W##x##H##_c( \
146*77c1e3ccSAndroid Build Coastguard Worker const uint8_t *a, int a_stride, int xoffset, int yoffset, \
147*77c1e3ccSAndroid Build Coastguard Worker const uint8_t *b, int b_stride, uint32_t *sse, \
148*77c1e3ccSAndroid Build Coastguard Worker const uint8_t *second_pred) { \
149*77c1e3ccSAndroid Build Coastguard Worker uint16_t fdata3[(H + 1) * W]; \
150*77c1e3ccSAndroid Build Coastguard Worker uint8_t temp2[H * W]; \
151*77c1e3ccSAndroid Build Coastguard Worker DECLARE_ALIGNED(16, uint8_t, temp3[H * W]); \
152*77c1e3ccSAndroid Build Coastguard Worker \
153*77c1e3ccSAndroid Build Coastguard Worker var_filter_block2d_bil_first_pass_c(a, fdata3, a_stride, 1, H + 1, W, \
154*77c1e3ccSAndroid Build Coastguard Worker bilinear_filters_2t[xoffset]); \
155*77c1e3ccSAndroid Build Coastguard Worker var_filter_block2d_bil_second_pass_c(fdata3, temp2, W, W, H, W, \
156*77c1e3ccSAndroid Build Coastguard Worker bilinear_filters_2t[yoffset]); \
157*77c1e3ccSAndroid Build Coastguard Worker \
158*77c1e3ccSAndroid Build Coastguard Worker aom_comp_avg_pred(temp3, second_pred, W, H, temp2, W); \
159*77c1e3ccSAndroid Build Coastguard Worker \
160*77c1e3ccSAndroid Build Coastguard Worker return aom_variance##W##x##H##_c(temp3, W, b, b_stride, sse); \
161*77c1e3ccSAndroid Build Coastguard Worker } \
162*77c1e3ccSAndroid Build Coastguard Worker uint32_t aom_dist_wtd_sub_pixel_avg_variance##W##x##H##_c( \
163*77c1e3ccSAndroid Build Coastguard Worker const uint8_t *a, int a_stride, int xoffset, int yoffset, \
164*77c1e3ccSAndroid Build Coastguard Worker const uint8_t *b, int b_stride, uint32_t *sse, \
165*77c1e3ccSAndroid Build Coastguard Worker const uint8_t *second_pred, const DIST_WTD_COMP_PARAMS *jcp_param) { \
166*77c1e3ccSAndroid Build Coastguard Worker uint16_t fdata3[(H + 1) * W]; \
167*77c1e3ccSAndroid Build Coastguard Worker uint8_t temp2[H * W]; \
168*77c1e3ccSAndroid Build Coastguard Worker DECLARE_ALIGNED(16, uint8_t, temp3[H * W]); \
169*77c1e3ccSAndroid Build Coastguard Worker \
170*77c1e3ccSAndroid Build Coastguard Worker var_filter_block2d_bil_first_pass_c(a, fdata3, a_stride, 1, H + 1, W, \
171*77c1e3ccSAndroid Build Coastguard Worker bilinear_filters_2t[xoffset]); \
172*77c1e3ccSAndroid Build Coastguard Worker var_filter_block2d_bil_second_pass_c(fdata3, temp2, W, W, H, W, \
173*77c1e3ccSAndroid Build Coastguard Worker bilinear_filters_2t[yoffset]); \
174*77c1e3ccSAndroid Build Coastguard Worker \
175*77c1e3ccSAndroid Build Coastguard Worker aom_dist_wtd_comp_avg_pred(temp3, second_pred, W, H, temp2, W, jcp_param); \
176*77c1e3ccSAndroid Build Coastguard Worker \
177*77c1e3ccSAndroid Build Coastguard Worker return aom_variance##W##x##H(temp3, W, b, b_stride, sse); \
178*77c1e3ccSAndroid Build Coastguard Worker }
179*77c1e3ccSAndroid Build Coastguard Worker
aom_get_var_sse_sum_8x8_quad_c(const uint8_t * a,int a_stride,const uint8_t * b,int b_stride,uint32_t * sse8x8,int * sum8x8,unsigned int * tot_sse,int * tot_sum,uint32_t * var8x8)180*77c1e3ccSAndroid Build Coastguard Worker void aom_get_var_sse_sum_8x8_quad_c(const uint8_t *a, int a_stride,
181*77c1e3ccSAndroid Build Coastguard Worker const uint8_t *b, int b_stride,
182*77c1e3ccSAndroid Build Coastguard Worker uint32_t *sse8x8, int *sum8x8,
183*77c1e3ccSAndroid Build Coastguard Worker unsigned int *tot_sse, int *tot_sum,
184*77c1e3ccSAndroid Build Coastguard Worker uint32_t *var8x8) {
185*77c1e3ccSAndroid Build Coastguard Worker // Loop over 4 8x8 blocks. Process one 8x32 block.
186*77c1e3ccSAndroid Build Coastguard Worker for (int k = 0; k < 4; k++) {
187*77c1e3ccSAndroid Build Coastguard Worker variance(a + (k * 8), a_stride, b + (k * 8), b_stride, 8, 8, &sse8x8[k],
188*77c1e3ccSAndroid Build Coastguard Worker &sum8x8[k]);
189*77c1e3ccSAndroid Build Coastguard Worker }
190*77c1e3ccSAndroid Build Coastguard Worker
191*77c1e3ccSAndroid Build Coastguard Worker // Calculate variance at 8x8 level and total sse, sum of 8x32 block.
192*77c1e3ccSAndroid Build Coastguard Worker *tot_sse += sse8x8[0] + sse8x8[1] + sse8x8[2] + sse8x8[3];
193*77c1e3ccSAndroid Build Coastguard Worker *tot_sum += sum8x8[0] + sum8x8[1] + sum8x8[2] + sum8x8[3];
194*77c1e3ccSAndroid Build Coastguard Worker for (int i = 0; i < 4; i++)
195*77c1e3ccSAndroid Build Coastguard Worker var8x8[i] = sse8x8[i] - (uint32_t)(((int64_t)sum8x8[i] * sum8x8[i]) >> 6);
196*77c1e3ccSAndroid Build Coastguard Worker }
197*77c1e3ccSAndroid Build Coastguard Worker
aom_get_var_sse_sum_16x16_dual_c(const uint8_t * src_ptr,int source_stride,const uint8_t * ref_ptr,int ref_stride,uint32_t * sse16x16,unsigned int * tot_sse,int * tot_sum,uint32_t * var16x16)198*77c1e3ccSAndroid Build Coastguard Worker void aom_get_var_sse_sum_16x16_dual_c(const uint8_t *src_ptr, int source_stride,
199*77c1e3ccSAndroid Build Coastguard Worker const uint8_t *ref_ptr, int ref_stride,
200*77c1e3ccSAndroid Build Coastguard Worker uint32_t *sse16x16, unsigned int *tot_sse,
201*77c1e3ccSAndroid Build Coastguard Worker int *tot_sum, uint32_t *var16x16) {
202*77c1e3ccSAndroid Build Coastguard Worker int sum16x16[2] = { 0 };
203*77c1e3ccSAndroid Build Coastguard Worker // Loop over two consecutive 16x16 blocks and process as one 16x32 block.
204*77c1e3ccSAndroid Build Coastguard Worker for (int k = 0; k < 2; k++) {
205*77c1e3ccSAndroid Build Coastguard Worker variance(src_ptr + (k * 16), source_stride, ref_ptr + (k * 16), ref_stride,
206*77c1e3ccSAndroid Build Coastguard Worker 16, 16, &sse16x16[k], &sum16x16[k]);
207*77c1e3ccSAndroid Build Coastguard Worker }
208*77c1e3ccSAndroid Build Coastguard Worker
209*77c1e3ccSAndroid Build Coastguard Worker // Calculate variance at 16x16 level and total sse, sum of 16x32 block.
210*77c1e3ccSAndroid Build Coastguard Worker *tot_sse += sse16x16[0] + sse16x16[1];
211*77c1e3ccSAndroid Build Coastguard Worker *tot_sum += sum16x16[0] + sum16x16[1];
212*77c1e3ccSAndroid Build Coastguard Worker for (int i = 0; i < 2; i++)
213*77c1e3ccSAndroid Build Coastguard Worker var16x16[i] =
214*77c1e3ccSAndroid Build Coastguard Worker sse16x16[i] - (uint32_t)(((int64_t)sum16x16[i] * sum16x16[i]) >> 8);
215*77c1e3ccSAndroid Build Coastguard Worker }
216*77c1e3ccSAndroid Build Coastguard Worker
217*77c1e3ccSAndroid Build Coastguard Worker /* Identical to the variance call except it does not calculate the
218*77c1e3ccSAndroid Build Coastguard Worker * sse - sum^2 / w*h and returns sse in addtion to modifying the passed in
219*77c1e3ccSAndroid Build Coastguard Worker * variable.
220*77c1e3ccSAndroid Build Coastguard Worker */
221*77c1e3ccSAndroid Build Coastguard Worker #define MSE(W, H) \
222*77c1e3ccSAndroid Build Coastguard Worker uint32_t aom_mse##W##x##H##_c(const uint8_t *a, int a_stride, \
223*77c1e3ccSAndroid Build Coastguard Worker const uint8_t *b, int b_stride, \
224*77c1e3ccSAndroid Build Coastguard Worker uint32_t *sse) { \
225*77c1e3ccSAndroid Build Coastguard Worker int sum; \
226*77c1e3ccSAndroid Build Coastguard Worker variance(a, a_stride, b, b_stride, W, H, sse, &sum); \
227*77c1e3ccSAndroid Build Coastguard Worker return *sse; \
228*77c1e3ccSAndroid Build Coastguard Worker }
229*77c1e3ccSAndroid Build Coastguard Worker
230*77c1e3ccSAndroid Build Coastguard Worker /* All three forms of the variance are available in the same sizes. */
231*77c1e3ccSAndroid Build Coastguard Worker #define VARIANCES(W, H) \
232*77c1e3ccSAndroid Build Coastguard Worker VAR(W, H) \
233*77c1e3ccSAndroid Build Coastguard Worker SUBPIX_VAR(W, H) \
234*77c1e3ccSAndroid Build Coastguard Worker SUBPIX_AVG_VAR(W, H)
235*77c1e3ccSAndroid Build Coastguard Worker
236*77c1e3ccSAndroid Build Coastguard Worker VARIANCES(128, 128)
237*77c1e3ccSAndroid Build Coastguard Worker VARIANCES(128, 64)
238*77c1e3ccSAndroid Build Coastguard Worker VARIANCES(64, 128)
239*77c1e3ccSAndroid Build Coastguard Worker VARIANCES(64, 64)
240*77c1e3ccSAndroid Build Coastguard Worker VARIANCES(64, 32)
241*77c1e3ccSAndroid Build Coastguard Worker VARIANCES(32, 64)
242*77c1e3ccSAndroid Build Coastguard Worker VARIANCES(32, 32)
243*77c1e3ccSAndroid Build Coastguard Worker VARIANCES(32, 16)
244*77c1e3ccSAndroid Build Coastguard Worker VARIANCES(16, 32)
245*77c1e3ccSAndroid Build Coastguard Worker VARIANCES(16, 16)
246*77c1e3ccSAndroid Build Coastguard Worker VARIANCES(16, 8)
247*77c1e3ccSAndroid Build Coastguard Worker VARIANCES(8, 16)
248*77c1e3ccSAndroid Build Coastguard Worker VARIANCES(8, 8)
249*77c1e3ccSAndroid Build Coastguard Worker VARIANCES(8, 4)
250*77c1e3ccSAndroid Build Coastguard Worker VARIANCES(4, 8)
251*77c1e3ccSAndroid Build Coastguard Worker VARIANCES(4, 4)
252*77c1e3ccSAndroid Build Coastguard Worker
253*77c1e3ccSAndroid Build Coastguard Worker // Realtime mode doesn't use rectangular blocks.
254*77c1e3ccSAndroid Build Coastguard Worker #if !CONFIG_REALTIME_ONLY
255*77c1e3ccSAndroid Build Coastguard Worker VARIANCES(4, 16)
256*77c1e3ccSAndroid Build Coastguard Worker VARIANCES(16, 4)
257*77c1e3ccSAndroid Build Coastguard Worker VARIANCES(8, 32)
258*77c1e3ccSAndroid Build Coastguard Worker VARIANCES(32, 8)
259*77c1e3ccSAndroid Build Coastguard Worker VARIANCES(16, 64)
260*77c1e3ccSAndroid Build Coastguard Worker VARIANCES(64, 16)
261*77c1e3ccSAndroid Build Coastguard Worker #endif
262*77c1e3ccSAndroid Build Coastguard Worker
263*77c1e3ccSAndroid Build Coastguard Worker MSE(16, 16)
264*77c1e3ccSAndroid Build Coastguard Worker MSE(16, 8)
265*77c1e3ccSAndroid Build Coastguard Worker MSE(8, 16)
266*77c1e3ccSAndroid Build Coastguard Worker MSE(8, 8)
267*77c1e3ccSAndroid Build Coastguard Worker
aom_comp_avg_pred_c(uint8_t * comp_pred,const uint8_t * pred,int width,int height,const uint8_t * ref,int ref_stride)268*77c1e3ccSAndroid Build Coastguard Worker void aom_comp_avg_pred_c(uint8_t *comp_pred, const uint8_t *pred, int width,
269*77c1e3ccSAndroid Build Coastguard Worker int height, const uint8_t *ref, int ref_stride) {
270*77c1e3ccSAndroid Build Coastguard Worker int i, j;
271*77c1e3ccSAndroid Build Coastguard Worker
272*77c1e3ccSAndroid Build Coastguard Worker for (i = 0; i < height; ++i) {
273*77c1e3ccSAndroid Build Coastguard Worker for (j = 0; j < width; ++j) {
274*77c1e3ccSAndroid Build Coastguard Worker const int tmp = pred[j] + ref[j];
275*77c1e3ccSAndroid Build Coastguard Worker comp_pred[j] = ROUND_POWER_OF_TWO(tmp, 1);
276*77c1e3ccSAndroid Build Coastguard Worker }
277*77c1e3ccSAndroid Build Coastguard Worker comp_pred += width;
278*77c1e3ccSAndroid Build Coastguard Worker pred += width;
279*77c1e3ccSAndroid Build Coastguard Worker ref += ref_stride;
280*77c1e3ccSAndroid Build Coastguard Worker }
281*77c1e3ccSAndroid Build Coastguard Worker }
282*77c1e3ccSAndroid Build Coastguard Worker
aom_dist_wtd_comp_avg_pred_c(uint8_t * comp_pred,const uint8_t * pred,int width,int height,const uint8_t * ref,int ref_stride,const DIST_WTD_COMP_PARAMS * jcp_param)283*77c1e3ccSAndroid Build Coastguard Worker void aom_dist_wtd_comp_avg_pred_c(uint8_t *comp_pred, const uint8_t *pred,
284*77c1e3ccSAndroid Build Coastguard Worker int width, int height, const uint8_t *ref,
285*77c1e3ccSAndroid Build Coastguard Worker int ref_stride,
286*77c1e3ccSAndroid Build Coastguard Worker const DIST_WTD_COMP_PARAMS *jcp_param) {
287*77c1e3ccSAndroid Build Coastguard Worker int i, j;
288*77c1e3ccSAndroid Build Coastguard Worker const int fwd_offset = jcp_param->fwd_offset;
289*77c1e3ccSAndroid Build Coastguard Worker const int bck_offset = jcp_param->bck_offset;
290*77c1e3ccSAndroid Build Coastguard Worker
291*77c1e3ccSAndroid Build Coastguard Worker for (i = 0; i < height; ++i) {
292*77c1e3ccSAndroid Build Coastguard Worker for (j = 0; j < width; ++j) {
293*77c1e3ccSAndroid Build Coastguard Worker int tmp = pred[j] * bck_offset + ref[j] * fwd_offset;
294*77c1e3ccSAndroid Build Coastguard Worker tmp = ROUND_POWER_OF_TWO(tmp, DIST_PRECISION_BITS);
295*77c1e3ccSAndroid Build Coastguard Worker comp_pred[j] = (uint8_t)tmp;
296*77c1e3ccSAndroid Build Coastguard Worker }
297*77c1e3ccSAndroid Build Coastguard Worker comp_pred += width;
298*77c1e3ccSAndroid Build Coastguard Worker pred += width;
299*77c1e3ccSAndroid Build Coastguard Worker ref += ref_stride;
300*77c1e3ccSAndroid Build Coastguard Worker }
301*77c1e3ccSAndroid Build Coastguard Worker }
302*77c1e3ccSAndroid Build Coastguard Worker
303*77c1e3ccSAndroid Build Coastguard Worker #if CONFIG_AV1_HIGHBITDEPTH
highbd_variance64(const uint8_t * a8,int a_stride,const uint8_t * b8,int b_stride,int w,int h,uint64_t * sse,int64_t * sum)304*77c1e3ccSAndroid Build Coastguard Worker static void highbd_variance64(const uint8_t *a8, int a_stride,
305*77c1e3ccSAndroid Build Coastguard Worker const uint8_t *b8, int b_stride, int w, int h,
306*77c1e3ccSAndroid Build Coastguard Worker uint64_t *sse, int64_t *sum) {
307*77c1e3ccSAndroid Build Coastguard Worker const uint16_t *a = CONVERT_TO_SHORTPTR(a8);
308*77c1e3ccSAndroid Build Coastguard Worker const uint16_t *b = CONVERT_TO_SHORTPTR(b8);
309*77c1e3ccSAndroid Build Coastguard Worker int64_t tsum = 0;
310*77c1e3ccSAndroid Build Coastguard Worker uint64_t tsse = 0;
311*77c1e3ccSAndroid Build Coastguard Worker for (int i = 0; i < h; ++i) {
312*77c1e3ccSAndroid Build Coastguard Worker int32_t lsum = 0;
313*77c1e3ccSAndroid Build Coastguard Worker for (int j = 0; j < w; ++j) {
314*77c1e3ccSAndroid Build Coastguard Worker const int diff = a[j] - b[j];
315*77c1e3ccSAndroid Build Coastguard Worker lsum += diff;
316*77c1e3ccSAndroid Build Coastguard Worker tsse += (uint32_t)(diff * diff);
317*77c1e3ccSAndroid Build Coastguard Worker }
318*77c1e3ccSAndroid Build Coastguard Worker tsum += lsum;
319*77c1e3ccSAndroid Build Coastguard Worker a += a_stride;
320*77c1e3ccSAndroid Build Coastguard Worker b += b_stride;
321*77c1e3ccSAndroid Build Coastguard Worker }
322*77c1e3ccSAndroid Build Coastguard Worker *sum = tsum;
323*77c1e3ccSAndroid Build Coastguard Worker *sse = tsse;
324*77c1e3ccSAndroid Build Coastguard Worker }
325*77c1e3ccSAndroid Build Coastguard Worker
aom_highbd_sse_odd_size(const uint8_t * a,int a_stride,const uint8_t * b,int b_stride,int w,int h)326*77c1e3ccSAndroid Build Coastguard Worker uint64_t aom_highbd_sse_odd_size(const uint8_t *a, int a_stride,
327*77c1e3ccSAndroid Build Coastguard Worker const uint8_t *b, int b_stride, int w, int h) {
328*77c1e3ccSAndroid Build Coastguard Worker uint64_t sse;
329*77c1e3ccSAndroid Build Coastguard Worker int64_t sum;
330*77c1e3ccSAndroid Build Coastguard Worker highbd_variance64(a, a_stride, b, b_stride, w, h, &sse, &sum);
331*77c1e3ccSAndroid Build Coastguard Worker return sse;
332*77c1e3ccSAndroid Build Coastguard Worker }
333*77c1e3ccSAndroid Build Coastguard Worker
highbd_8_variance(const uint8_t * a8,int a_stride,const uint8_t * b8,int b_stride,int w,int h,uint32_t * sse,int * sum)334*77c1e3ccSAndroid Build Coastguard Worker static void highbd_8_variance(const uint8_t *a8, int a_stride,
335*77c1e3ccSAndroid Build Coastguard Worker const uint8_t *b8, int b_stride, int w, int h,
336*77c1e3ccSAndroid Build Coastguard Worker uint32_t *sse, int *sum) {
337*77c1e3ccSAndroid Build Coastguard Worker uint64_t sse_long = 0;
338*77c1e3ccSAndroid Build Coastguard Worker int64_t sum_long = 0;
339*77c1e3ccSAndroid Build Coastguard Worker highbd_variance64(a8, a_stride, b8, b_stride, w, h, &sse_long, &sum_long);
340*77c1e3ccSAndroid Build Coastguard Worker *sse = (uint32_t)sse_long;
341*77c1e3ccSAndroid Build Coastguard Worker *sum = (int)sum_long;
342*77c1e3ccSAndroid Build Coastguard Worker }
343*77c1e3ccSAndroid Build Coastguard Worker
highbd_10_variance(const uint8_t * a8,int a_stride,const uint8_t * b8,int b_stride,int w,int h,uint32_t * sse,int * sum)344*77c1e3ccSAndroid Build Coastguard Worker static void highbd_10_variance(const uint8_t *a8, int a_stride,
345*77c1e3ccSAndroid Build Coastguard Worker const uint8_t *b8, int b_stride, int w, int h,
346*77c1e3ccSAndroid Build Coastguard Worker uint32_t *sse, int *sum) {
347*77c1e3ccSAndroid Build Coastguard Worker uint64_t sse_long = 0;
348*77c1e3ccSAndroid Build Coastguard Worker int64_t sum_long = 0;
349*77c1e3ccSAndroid Build Coastguard Worker highbd_variance64(a8, a_stride, b8, b_stride, w, h, &sse_long, &sum_long);
350*77c1e3ccSAndroid Build Coastguard Worker *sse = (uint32_t)ROUND_POWER_OF_TWO(sse_long, 4);
351*77c1e3ccSAndroid Build Coastguard Worker *sum = (int)ROUND_POWER_OF_TWO(sum_long, 2);
352*77c1e3ccSAndroid Build Coastguard Worker }
353*77c1e3ccSAndroid Build Coastguard Worker
highbd_12_variance(const uint8_t * a8,int a_stride,const uint8_t * b8,int b_stride,int w,int h,uint32_t * sse,int * sum)354*77c1e3ccSAndroid Build Coastguard Worker static void highbd_12_variance(const uint8_t *a8, int a_stride,
355*77c1e3ccSAndroid Build Coastguard Worker const uint8_t *b8, int b_stride, int w, int h,
356*77c1e3ccSAndroid Build Coastguard Worker uint32_t *sse, int *sum) {
357*77c1e3ccSAndroid Build Coastguard Worker uint64_t sse_long = 0;
358*77c1e3ccSAndroid Build Coastguard Worker int64_t sum_long = 0;
359*77c1e3ccSAndroid Build Coastguard Worker highbd_variance64(a8, a_stride, b8, b_stride, w, h, &sse_long, &sum_long);
360*77c1e3ccSAndroid Build Coastguard Worker *sse = (uint32_t)ROUND_POWER_OF_TWO(sse_long, 8);
361*77c1e3ccSAndroid Build Coastguard Worker *sum = (int)ROUND_POWER_OF_TWO(sum_long, 4);
362*77c1e3ccSAndroid Build Coastguard Worker }
363*77c1e3ccSAndroid Build Coastguard Worker
364*77c1e3ccSAndroid Build Coastguard Worker #define HIGHBD_VAR(W, H) \
365*77c1e3ccSAndroid Build Coastguard Worker uint32_t aom_highbd_8_variance##W##x##H##_c(const uint8_t *a, int a_stride, \
366*77c1e3ccSAndroid Build Coastguard Worker const uint8_t *b, int b_stride, \
367*77c1e3ccSAndroid Build Coastguard Worker uint32_t *sse) { \
368*77c1e3ccSAndroid Build Coastguard Worker int sum; \
369*77c1e3ccSAndroid Build Coastguard Worker highbd_8_variance(a, a_stride, b, b_stride, W, H, sse, &sum); \
370*77c1e3ccSAndroid Build Coastguard Worker return *sse - (uint32_t)(((int64_t)sum * sum) / (W * H)); \
371*77c1e3ccSAndroid Build Coastguard Worker } \
372*77c1e3ccSAndroid Build Coastguard Worker \
373*77c1e3ccSAndroid Build Coastguard Worker uint32_t aom_highbd_10_variance##W##x##H##_c(const uint8_t *a, int a_stride, \
374*77c1e3ccSAndroid Build Coastguard Worker const uint8_t *b, int b_stride, \
375*77c1e3ccSAndroid Build Coastguard Worker uint32_t *sse) { \
376*77c1e3ccSAndroid Build Coastguard Worker int sum; \
377*77c1e3ccSAndroid Build Coastguard Worker int64_t var; \
378*77c1e3ccSAndroid Build Coastguard Worker highbd_10_variance(a, a_stride, b, b_stride, W, H, sse, &sum); \
379*77c1e3ccSAndroid Build Coastguard Worker var = (int64_t)(*sse) - (((int64_t)sum * sum) / (W * H)); \
380*77c1e3ccSAndroid Build Coastguard Worker return (var >= 0) ? (uint32_t)var : 0; \
381*77c1e3ccSAndroid Build Coastguard Worker } \
382*77c1e3ccSAndroid Build Coastguard Worker \
383*77c1e3ccSAndroid Build Coastguard Worker uint32_t aom_highbd_12_variance##W##x##H##_c(const uint8_t *a, int a_stride, \
384*77c1e3ccSAndroid Build Coastguard Worker const uint8_t *b, int b_stride, \
385*77c1e3ccSAndroid Build Coastguard Worker uint32_t *sse) { \
386*77c1e3ccSAndroid Build Coastguard Worker int sum; \
387*77c1e3ccSAndroid Build Coastguard Worker int64_t var; \
388*77c1e3ccSAndroid Build Coastguard Worker highbd_12_variance(a, a_stride, b, b_stride, W, H, sse, &sum); \
389*77c1e3ccSAndroid Build Coastguard Worker var = (int64_t)(*sse) - (((int64_t)sum * sum) / (W * H)); \
390*77c1e3ccSAndroid Build Coastguard Worker return (var >= 0) ? (uint32_t)var : 0; \
391*77c1e3ccSAndroid Build Coastguard Worker }
392*77c1e3ccSAndroid Build Coastguard Worker
393*77c1e3ccSAndroid Build Coastguard Worker #define HIGHBD_MSE(W, H) \
394*77c1e3ccSAndroid Build Coastguard Worker uint32_t aom_highbd_8_mse##W##x##H##_c(const uint8_t *src, int src_stride, \
395*77c1e3ccSAndroid Build Coastguard Worker const uint8_t *ref, int ref_stride, \
396*77c1e3ccSAndroid Build Coastguard Worker uint32_t *sse) { \
397*77c1e3ccSAndroid Build Coastguard Worker int sum; \
398*77c1e3ccSAndroid Build Coastguard Worker highbd_8_variance(src, src_stride, ref, ref_stride, W, H, sse, &sum); \
399*77c1e3ccSAndroid Build Coastguard Worker return *sse; \
400*77c1e3ccSAndroid Build Coastguard Worker } \
401*77c1e3ccSAndroid Build Coastguard Worker \
402*77c1e3ccSAndroid Build Coastguard Worker uint32_t aom_highbd_10_mse##W##x##H##_c(const uint8_t *src, int src_stride, \
403*77c1e3ccSAndroid Build Coastguard Worker const uint8_t *ref, int ref_stride, \
404*77c1e3ccSAndroid Build Coastguard Worker uint32_t *sse) { \
405*77c1e3ccSAndroid Build Coastguard Worker int sum; \
406*77c1e3ccSAndroid Build Coastguard Worker highbd_10_variance(src, src_stride, ref, ref_stride, W, H, sse, &sum); \
407*77c1e3ccSAndroid Build Coastguard Worker return *sse; \
408*77c1e3ccSAndroid Build Coastguard Worker } \
409*77c1e3ccSAndroid Build Coastguard Worker \
410*77c1e3ccSAndroid Build Coastguard Worker uint32_t aom_highbd_12_mse##W##x##H##_c(const uint8_t *src, int src_stride, \
411*77c1e3ccSAndroid Build Coastguard Worker const uint8_t *ref, int ref_stride, \
412*77c1e3ccSAndroid Build Coastguard Worker uint32_t *sse) { \
413*77c1e3ccSAndroid Build Coastguard Worker int sum; \
414*77c1e3ccSAndroid Build Coastguard Worker highbd_12_variance(src, src_stride, ref, ref_stride, W, H, sse, &sum); \
415*77c1e3ccSAndroid Build Coastguard Worker return *sse; \
416*77c1e3ccSAndroid Build Coastguard Worker }
417*77c1e3ccSAndroid Build Coastguard Worker
aom_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)418*77c1e3ccSAndroid Build Coastguard Worker void aom_highbd_var_filter_block2d_bil_first_pass(
419*77c1e3ccSAndroid Build Coastguard Worker const uint8_t *src_ptr8, uint16_t *output_ptr,
420*77c1e3ccSAndroid Build Coastguard Worker unsigned int src_pixels_per_line, int pixel_step,
421*77c1e3ccSAndroid Build Coastguard Worker unsigned int output_height, unsigned int output_width,
422*77c1e3ccSAndroid Build Coastguard Worker const uint8_t *filter) {
423*77c1e3ccSAndroid Build Coastguard Worker unsigned int i, j;
424*77c1e3ccSAndroid Build Coastguard Worker uint16_t *src_ptr = CONVERT_TO_SHORTPTR(src_ptr8);
425*77c1e3ccSAndroid Build Coastguard Worker for (i = 0; i < output_height; ++i) {
426*77c1e3ccSAndroid Build Coastguard Worker for (j = 0; j < output_width; ++j) {
427*77c1e3ccSAndroid Build Coastguard Worker output_ptr[j] = ROUND_POWER_OF_TWO(
428*77c1e3ccSAndroid Build Coastguard Worker (int)src_ptr[0] * filter[0] + (int)src_ptr[pixel_step] * filter[1],
429*77c1e3ccSAndroid Build Coastguard Worker FILTER_BITS);
430*77c1e3ccSAndroid Build Coastguard Worker
431*77c1e3ccSAndroid Build Coastguard Worker ++src_ptr;
432*77c1e3ccSAndroid Build Coastguard Worker }
433*77c1e3ccSAndroid Build Coastguard Worker
434*77c1e3ccSAndroid Build Coastguard Worker // Next row...
435*77c1e3ccSAndroid Build Coastguard Worker src_ptr += src_pixels_per_line - output_width;
436*77c1e3ccSAndroid Build Coastguard Worker output_ptr += output_width;
437*77c1e3ccSAndroid Build Coastguard Worker }
438*77c1e3ccSAndroid Build Coastguard Worker }
439*77c1e3ccSAndroid Build Coastguard Worker
aom_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)440*77c1e3ccSAndroid Build Coastguard Worker void aom_highbd_var_filter_block2d_bil_second_pass(
441*77c1e3ccSAndroid Build Coastguard Worker const uint16_t *src_ptr, uint16_t *output_ptr,
442*77c1e3ccSAndroid Build Coastguard Worker unsigned int src_pixels_per_line, unsigned int pixel_step,
443*77c1e3ccSAndroid Build Coastguard Worker unsigned int output_height, unsigned int output_width,
444*77c1e3ccSAndroid Build Coastguard Worker const uint8_t *filter) {
445*77c1e3ccSAndroid Build Coastguard Worker unsigned int i, j;
446*77c1e3ccSAndroid Build Coastguard Worker
447*77c1e3ccSAndroid Build Coastguard Worker for (i = 0; i < output_height; ++i) {
448*77c1e3ccSAndroid Build Coastguard Worker for (j = 0; j < output_width; ++j) {
449*77c1e3ccSAndroid Build Coastguard Worker output_ptr[j] = ROUND_POWER_OF_TWO(
450*77c1e3ccSAndroid Build Coastguard Worker (int)src_ptr[0] * filter[0] + (int)src_ptr[pixel_step] * filter[1],
451*77c1e3ccSAndroid Build Coastguard Worker FILTER_BITS);
452*77c1e3ccSAndroid Build Coastguard Worker ++src_ptr;
453*77c1e3ccSAndroid Build Coastguard Worker }
454*77c1e3ccSAndroid Build Coastguard Worker
455*77c1e3ccSAndroid Build Coastguard Worker src_ptr += src_pixels_per_line - output_width;
456*77c1e3ccSAndroid Build Coastguard Worker output_ptr += output_width;
457*77c1e3ccSAndroid Build Coastguard Worker }
458*77c1e3ccSAndroid Build Coastguard Worker }
459*77c1e3ccSAndroid Build Coastguard Worker
460*77c1e3ccSAndroid Build Coastguard Worker #define HIGHBD_SUBPIX_VAR(W, H) \
461*77c1e3ccSAndroid Build Coastguard Worker uint32_t aom_highbd_8_sub_pixel_variance##W##x##H##_c( \
462*77c1e3ccSAndroid Build Coastguard Worker const uint8_t *src, int src_stride, int xoffset, int yoffset, \
463*77c1e3ccSAndroid Build Coastguard Worker const uint8_t *dst, int dst_stride, uint32_t *sse) { \
464*77c1e3ccSAndroid Build Coastguard Worker uint16_t fdata3[(H + 1) * W]; \
465*77c1e3ccSAndroid Build Coastguard Worker uint16_t temp2[H * W]; \
466*77c1e3ccSAndroid Build Coastguard Worker \
467*77c1e3ccSAndroid Build Coastguard Worker aom_highbd_var_filter_block2d_bil_first_pass( \
468*77c1e3ccSAndroid Build Coastguard Worker src, fdata3, src_stride, 1, H + 1, W, bilinear_filters_2t[xoffset]); \
469*77c1e3ccSAndroid Build Coastguard Worker aom_highbd_var_filter_block2d_bil_second_pass( \
470*77c1e3ccSAndroid Build Coastguard Worker fdata3, temp2, W, W, H, W, bilinear_filters_2t[yoffset]); \
471*77c1e3ccSAndroid Build Coastguard Worker \
472*77c1e3ccSAndroid Build Coastguard Worker return aom_highbd_8_variance##W##x##H##_c(CONVERT_TO_BYTEPTR(temp2), W, \
473*77c1e3ccSAndroid Build Coastguard Worker dst, dst_stride, sse); \
474*77c1e3ccSAndroid Build Coastguard Worker } \
475*77c1e3ccSAndroid Build Coastguard Worker \
476*77c1e3ccSAndroid Build Coastguard Worker uint32_t aom_highbd_10_sub_pixel_variance##W##x##H##_c( \
477*77c1e3ccSAndroid Build Coastguard Worker const uint8_t *src, int src_stride, int xoffset, int yoffset, \
478*77c1e3ccSAndroid Build Coastguard Worker const uint8_t *dst, int dst_stride, uint32_t *sse) { \
479*77c1e3ccSAndroid Build Coastguard Worker uint16_t fdata3[(H + 1) * W]; \
480*77c1e3ccSAndroid Build Coastguard Worker uint16_t temp2[H * W]; \
481*77c1e3ccSAndroid Build Coastguard Worker \
482*77c1e3ccSAndroid Build Coastguard Worker aom_highbd_var_filter_block2d_bil_first_pass( \
483*77c1e3ccSAndroid Build Coastguard Worker src, fdata3, src_stride, 1, H + 1, W, bilinear_filters_2t[xoffset]); \
484*77c1e3ccSAndroid Build Coastguard Worker aom_highbd_var_filter_block2d_bil_second_pass( \
485*77c1e3ccSAndroid Build Coastguard Worker fdata3, temp2, W, W, H, W, bilinear_filters_2t[yoffset]); \
486*77c1e3ccSAndroid Build Coastguard Worker \
487*77c1e3ccSAndroid Build Coastguard Worker return aom_highbd_10_variance##W##x##H##_c(CONVERT_TO_BYTEPTR(temp2), W, \
488*77c1e3ccSAndroid Build Coastguard Worker dst, dst_stride, sse); \
489*77c1e3ccSAndroid Build Coastguard Worker } \
490*77c1e3ccSAndroid Build Coastguard Worker \
491*77c1e3ccSAndroid Build Coastguard Worker uint32_t aom_highbd_12_sub_pixel_variance##W##x##H##_c( \
492*77c1e3ccSAndroid Build Coastguard Worker const uint8_t *src, int src_stride, int xoffset, int yoffset, \
493*77c1e3ccSAndroid Build Coastguard Worker const uint8_t *dst, int dst_stride, uint32_t *sse) { \
494*77c1e3ccSAndroid Build Coastguard Worker uint16_t fdata3[(H + 1) * W]; \
495*77c1e3ccSAndroid Build Coastguard Worker uint16_t temp2[H * W]; \
496*77c1e3ccSAndroid Build Coastguard Worker \
497*77c1e3ccSAndroid Build Coastguard Worker aom_highbd_var_filter_block2d_bil_first_pass( \
498*77c1e3ccSAndroid Build Coastguard Worker src, fdata3, src_stride, 1, H + 1, W, bilinear_filters_2t[xoffset]); \
499*77c1e3ccSAndroid Build Coastguard Worker aom_highbd_var_filter_block2d_bil_second_pass( \
500*77c1e3ccSAndroid Build Coastguard Worker fdata3, temp2, W, W, H, W, bilinear_filters_2t[yoffset]); \
501*77c1e3ccSAndroid Build Coastguard Worker \
502*77c1e3ccSAndroid Build Coastguard Worker return aom_highbd_12_variance##W##x##H##_c(CONVERT_TO_BYTEPTR(temp2), W, \
503*77c1e3ccSAndroid Build Coastguard Worker dst, dst_stride, sse); \
504*77c1e3ccSAndroid Build Coastguard Worker }
505*77c1e3ccSAndroid Build Coastguard Worker
506*77c1e3ccSAndroid Build Coastguard Worker #define HIGHBD_SUBPIX_AVG_VAR(W, H) \
507*77c1e3ccSAndroid Build Coastguard Worker uint32_t aom_highbd_8_sub_pixel_avg_variance##W##x##H##_c( \
508*77c1e3ccSAndroid Build Coastguard Worker const uint8_t *src, int src_stride, int xoffset, int yoffset, \
509*77c1e3ccSAndroid Build Coastguard Worker const uint8_t *dst, int dst_stride, uint32_t *sse, \
510*77c1e3ccSAndroid Build Coastguard Worker const uint8_t *second_pred) { \
511*77c1e3ccSAndroid Build Coastguard Worker uint16_t fdata3[(H + 1) * W]; \
512*77c1e3ccSAndroid Build Coastguard Worker uint16_t temp2[H * W]; \
513*77c1e3ccSAndroid Build Coastguard Worker DECLARE_ALIGNED(16, uint16_t, temp3[H * W]); \
514*77c1e3ccSAndroid Build Coastguard Worker \
515*77c1e3ccSAndroid Build Coastguard Worker aom_highbd_var_filter_block2d_bil_first_pass( \
516*77c1e3ccSAndroid Build Coastguard Worker src, fdata3, src_stride, 1, H + 1, W, bilinear_filters_2t[xoffset]); \
517*77c1e3ccSAndroid Build Coastguard Worker aom_highbd_var_filter_block2d_bil_second_pass( \
518*77c1e3ccSAndroid Build Coastguard Worker fdata3, temp2, W, W, H, W, bilinear_filters_2t[yoffset]); \
519*77c1e3ccSAndroid Build Coastguard Worker \
520*77c1e3ccSAndroid Build Coastguard Worker aom_highbd_comp_avg_pred_c(CONVERT_TO_BYTEPTR(temp3), second_pred, W, H, \
521*77c1e3ccSAndroid Build Coastguard Worker CONVERT_TO_BYTEPTR(temp2), W); \
522*77c1e3ccSAndroid Build Coastguard Worker \
523*77c1e3ccSAndroid Build Coastguard Worker return aom_highbd_8_variance##W##x##H##_c(CONVERT_TO_BYTEPTR(temp3), W, \
524*77c1e3ccSAndroid Build Coastguard Worker dst, dst_stride, sse); \
525*77c1e3ccSAndroid Build Coastguard Worker } \
526*77c1e3ccSAndroid Build Coastguard Worker \
527*77c1e3ccSAndroid Build Coastguard Worker uint32_t aom_highbd_10_sub_pixel_avg_variance##W##x##H##_c( \
528*77c1e3ccSAndroid Build Coastguard Worker const uint8_t *src, int src_stride, int xoffset, int yoffset, \
529*77c1e3ccSAndroid Build Coastguard Worker const uint8_t *dst, int dst_stride, uint32_t *sse, \
530*77c1e3ccSAndroid Build Coastguard Worker const uint8_t *second_pred) { \
531*77c1e3ccSAndroid Build Coastguard Worker uint16_t fdata3[(H + 1) * W]; \
532*77c1e3ccSAndroid Build Coastguard Worker uint16_t temp2[H * W]; \
533*77c1e3ccSAndroid Build Coastguard Worker DECLARE_ALIGNED(16, uint16_t, temp3[H * W]); \
534*77c1e3ccSAndroid Build Coastguard Worker \
535*77c1e3ccSAndroid Build Coastguard Worker aom_highbd_var_filter_block2d_bil_first_pass( \
536*77c1e3ccSAndroid Build Coastguard Worker src, fdata3, src_stride, 1, H + 1, W, bilinear_filters_2t[xoffset]); \
537*77c1e3ccSAndroid Build Coastguard Worker aom_highbd_var_filter_block2d_bil_second_pass( \
538*77c1e3ccSAndroid Build Coastguard Worker fdata3, temp2, W, W, H, W, bilinear_filters_2t[yoffset]); \
539*77c1e3ccSAndroid Build Coastguard Worker \
540*77c1e3ccSAndroid Build Coastguard Worker aom_highbd_comp_avg_pred_c(CONVERT_TO_BYTEPTR(temp3), second_pred, W, H, \
541*77c1e3ccSAndroid Build Coastguard Worker CONVERT_TO_BYTEPTR(temp2), W); \
542*77c1e3ccSAndroid Build Coastguard Worker \
543*77c1e3ccSAndroid Build Coastguard Worker return aom_highbd_10_variance##W##x##H##_c(CONVERT_TO_BYTEPTR(temp3), W, \
544*77c1e3ccSAndroid Build Coastguard Worker dst, dst_stride, sse); \
545*77c1e3ccSAndroid Build Coastguard Worker } \
546*77c1e3ccSAndroid Build Coastguard Worker \
547*77c1e3ccSAndroid Build Coastguard Worker uint32_t aom_highbd_12_sub_pixel_avg_variance##W##x##H##_c( \
548*77c1e3ccSAndroid Build Coastguard Worker const uint8_t *src, int src_stride, int xoffset, int yoffset, \
549*77c1e3ccSAndroid Build Coastguard Worker const uint8_t *dst, int dst_stride, uint32_t *sse, \
550*77c1e3ccSAndroid Build Coastguard Worker const uint8_t *second_pred) { \
551*77c1e3ccSAndroid Build Coastguard Worker uint16_t fdata3[(H + 1) * W]; \
552*77c1e3ccSAndroid Build Coastguard Worker uint16_t temp2[H * W]; \
553*77c1e3ccSAndroid Build Coastguard Worker DECLARE_ALIGNED(16, uint16_t, temp3[H * W]); \
554*77c1e3ccSAndroid Build Coastguard Worker \
555*77c1e3ccSAndroid Build Coastguard Worker aom_highbd_var_filter_block2d_bil_first_pass( \
556*77c1e3ccSAndroid Build Coastguard Worker src, fdata3, src_stride, 1, H + 1, W, bilinear_filters_2t[xoffset]); \
557*77c1e3ccSAndroid Build Coastguard Worker aom_highbd_var_filter_block2d_bil_second_pass( \
558*77c1e3ccSAndroid Build Coastguard Worker fdata3, temp2, W, W, H, W, bilinear_filters_2t[yoffset]); \
559*77c1e3ccSAndroid Build Coastguard Worker \
560*77c1e3ccSAndroid Build Coastguard Worker aom_highbd_comp_avg_pred_c(CONVERT_TO_BYTEPTR(temp3), second_pred, W, H, \
561*77c1e3ccSAndroid Build Coastguard Worker CONVERT_TO_BYTEPTR(temp2), W); \
562*77c1e3ccSAndroid Build Coastguard Worker \
563*77c1e3ccSAndroid Build Coastguard Worker return aom_highbd_12_variance##W##x##H##_c(CONVERT_TO_BYTEPTR(temp3), W, \
564*77c1e3ccSAndroid Build Coastguard Worker dst, dst_stride, sse); \
565*77c1e3ccSAndroid Build Coastguard Worker } \
566*77c1e3ccSAndroid Build Coastguard Worker \
567*77c1e3ccSAndroid Build Coastguard Worker uint32_t aom_highbd_8_dist_wtd_sub_pixel_avg_variance##W##x##H##_c( \
568*77c1e3ccSAndroid Build Coastguard Worker const uint8_t *src, int src_stride, int xoffset, int yoffset, \
569*77c1e3ccSAndroid Build Coastguard Worker const uint8_t *dst, int dst_stride, uint32_t *sse, \
570*77c1e3ccSAndroid Build Coastguard Worker const uint8_t *second_pred, const DIST_WTD_COMP_PARAMS *jcp_param) { \
571*77c1e3ccSAndroid Build Coastguard Worker uint16_t fdata3[(H + 1) * W]; \
572*77c1e3ccSAndroid Build Coastguard Worker uint16_t temp2[H * W]; \
573*77c1e3ccSAndroid Build Coastguard Worker DECLARE_ALIGNED(16, uint16_t, temp3[H * W]); \
574*77c1e3ccSAndroid Build Coastguard Worker \
575*77c1e3ccSAndroid Build Coastguard Worker aom_highbd_var_filter_block2d_bil_first_pass( \
576*77c1e3ccSAndroid Build Coastguard Worker src, fdata3, src_stride, 1, H + 1, W, bilinear_filters_2t[xoffset]); \
577*77c1e3ccSAndroid Build Coastguard Worker aom_highbd_var_filter_block2d_bil_second_pass( \
578*77c1e3ccSAndroid Build Coastguard Worker fdata3, temp2, W, W, H, W, bilinear_filters_2t[yoffset]); \
579*77c1e3ccSAndroid Build Coastguard Worker \
580*77c1e3ccSAndroid Build Coastguard Worker aom_highbd_dist_wtd_comp_avg_pred(CONVERT_TO_BYTEPTR(temp3), second_pred, \
581*77c1e3ccSAndroid Build Coastguard Worker W, H, CONVERT_TO_BYTEPTR(temp2), W, \
582*77c1e3ccSAndroid Build Coastguard Worker jcp_param); \
583*77c1e3ccSAndroid Build Coastguard Worker \
584*77c1e3ccSAndroid Build Coastguard Worker return aom_highbd_8_variance##W##x##H(CONVERT_TO_BYTEPTR(temp3), W, dst, \
585*77c1e3ccSAndroid Build Coastguard Worker dst_stride, sse); \
586*77c1e3ccSAndroid Build Coastguard Worker } \
587*77c1e3ccSAndroid Build Coastguard Worker \
588*77c1e3ccSAndroid Build Coastguard Worker uint32_t aom_highbd_10_dist_wtd_sub_pixel_avg_variance##W##x##H##_c( \
589*77c1e3ccSAndroid Build Coastguard Worker const uint8_t *src, int src_stride, int xoffset, int yoffset, \
590*77c1e3ccSAndroid Build Coastguard Worker const uint8_t *dst, int dst_stride, uint32_t *sse, \
591*77c1e3ccSAndroid Build Coastguard Worker const uint8_t *second_pred, const DIST_WTD_COMP_PARAMS *jcp_param) { \
592*77c1e3ccSAndroid Build Coastguard Worker uint16_t fdata3[(H + 1) * W]; \
593*77c1e3ccSAndroid Build Coastguard Worker uint16_t temp2[H * W]; \
594*77c1e3ccSAndroid Build Coastguard Worker DECLARE_ALIGNED(16, uint16_t, temp3[H * W]); \
595*77c1e3ccSAndroid Build Coastguard Worker \
596*77c1e3ccSAndroid Build Coastguard Worker aom_highbd_var_filter_block2d_bil_first_pass( \
597*77c1e3ccSAndroid Build Coastguard Worker src, fdata3, src_stride, 1, H + 1, W, bilinear_filters_2t[xoffset]); \
598*77c1e3ccSAndroid Build Coastguard Worker aom_highbd_var_filter_block2d_bil_second_pass( \
599*77c1e3ccSAndroid Build Coastguard Worker fdata3, temp2, W, W, H, W, bilinear_filters_2t[yoffset]); \
600*77c1e3ccSAndroid Build Coastguard Worker \
601*77c1e3ccSAndroid Build Coastguard Worker aom_highbd_dist_wtd_comp_avg_pred(CONVERT_TO_BYTEPTR(temp3), second_pred, \
602*77c1e3ccSAndroid Build Coastguard Worker W, H, CONVERT_TO_BYTEPTR(temp2), W, \
603*77c1e3ccSAndroid Build Coastguard Worker jcp_param); \
604*77c1e3ccSAndroid Build Coastguard Worker \
605*77c1e3ccSAndroid Build Coastguard Worker return aom_highbd_10_variance##W##x##H(CONVERT_TO_BYTEPTR(temp3), W, dst, \
606*77c1e3ccSAndroid Build Coastguard Worker dst_stride, sse); \
607*77c1e3ccSAndroid Build Coastguard Worker } \
608*77c1e3ccSAndroid Build Coastguard Worker \
609*77c1e3ccSAndroid Build Coastguard Worker uint32_t aom_highbd_12_dist_wtd_sub_pixel_avg_variance##W##x##H##_c( \
610*77c1e3ccSAndroid Build Coastguard Worker const uint8_t *src, int src_stride, int xoffset, int yoffset, \
611*77c1e3ccSAndroid Build Coastguard Worker const uint8_t *dst, int dst_stride, uint32_t *sse, \
612*77c1e3ccSAndroid Build Coastguard Worker const uint8_t *second_pred, const DIST_WTD_COMP_PARAMS *jcp_param) { \
613*77c1e3ccSAndroid Build Coastguard Worker uint16_t fdata3[(H + 1) * W]; \
614*77c1e3ccSAndroid Build Coastguard Worker uint16_t temp2[H * W]; \
615*77c1e3ccSAndroid Build Coastguard Worker DECLARE_ALIGNED(16, uint16_t, temp3[H * W]); \
616*77c1e3ccSAndroid Build Coastguard Worker \
617*77c1e3ccSAndroid Build Coastguard Worker aom_highbd_var_filter_block2d_bil_first_pass( \
618*77c1e3ccSAndroid Build Coastguard Worker src, fdata3, src_stride, 1, H + 1, W, bilinear_filters_2t[xoffset]); \
619*77c1e3ccSAndroid Build Coastguard Worker aom_highbd_var_filter_block2d_bil_second_pass( \
620*77c1e3ccSAndroid Build Coastguard Worker fdata3, temp2, W, W, H, W, bilinear_filters_2t[yoffset]); \
621*77c1e3ccSAndroid Build Coastguard Worker \
622*77c1e3ccSAndroid Build Coastguard Worker aom_highbd_dist_wtd_comp_avg_pred(CONVERT_TO_BYTEPTR(temp3), second_pred, \
623*77c1e3ccSAndroid Build Coastguard Worker W, H, CONVERT_TO_BYTEPTR(temp2), W, \
624*77c1e3ccSAndroid Build Coastguard Worker jcp_param); \
625*77c1e3ccSAndroid Build Coastguard Worker \
626*77c1e3ccSAndroid Build Coastguard Worker return aom_highbd_12_variance##W##x##H(CONVERT_TO_BYTEPTR(temp3), W, dst, \
627*77c1e3ccSAndroid Build Coastguard Worker dst_stride, sse); \
628*77c1e3ccSAndroid Build Coastguard Worker }
629*77c1e3ccSAndroid Build Coastguard Worker
630*77c1e3ccSAndroid Build Coastguard Worker /* All three forms of the variance are available in the same sizes. */
631*77c1e3ccSAndroid Build Coastguard Worker #define HIGHBD_VARIANCES(W, H) \
632*77c1e3ccSAndroid Build Coastguard Worker HIGHBD_VAR(W, H) \
633*77c1e3ccSAndroid Build Coastguard Worker HIGHBD_SUBPIX_VAR(W, H) \
634*77c1e3ccSAndroid Build Coastguard Worker HIGHBD_SUBPIX_AVG_VAR(W, H)
635*77c1e3ccSAndroid Build Coastguard Worker
636*77c1e3ccSAndroid Build Coastguard Worker HIGHBD_VARIANCES(128, 128)
637*77c1e3ccSAndroid Build Coastguard Worker HIGHBD_VARIANCES(128, 64)
638*77c1e3ccSAndroid Build Coastguard Worker HIGHBD_VARIANCES(64, 128)
639*77c1e3ccSAndroid Build Coastguard Worker HIGHBD_VARIANCES(64, 64)
640*77c1e3ccSAndroid Build Coastguard Worker HIGHBD_VARIANCES(64, 32)
641*77c1e3ccSAndroid Build Coastguard Worker HIGHBD_VARIANCES(32, 64)
642*77c1e3ccSAndroid Build Coastguard Worker HIGHBD_VARIANCES(32, 32)
643*77c1e3ccSAndroid Build Coastguard Worker HIGHBD_VARIANCES(32, 16)
644*77c1e3ccSAndroid Build Coastguard Worker HIGHBD_VARIANCES(16, 32)
645*77c1e3ccSAndroid Build Coastguard Worker HIGHBD_VARIANCES(16, 16)
646*77c1e3ccSAndroid Build Coastguard Worker HIGHBD_VARIANCES(16, 8)
647*77c1e3ccSAndroid Build Coastguard Worker HIGHBD_VARIANCES(8, 16)
648*77c1e3ccSAndroid Build Coastguard Worker HIGHBD_VARIANCES(8, 8)
649*77c1e3ccSAndroid Build Coastguard Worker HIGHBD_VARIANCES(8, 4)
650*77c1e3ccSAndroid Build Coastguard Worker HIGHBD_VARIANCES(4, 8)
651*77c1e3ccSAndroid Build Coastguard Worker HIGHBD_VARIANCES(4, 4)
652*77c1e3ccSAndroid Build Coastguard Worker
653*77c1e3ccSAndroid Build Coastguard Worker // Realtime mode doesn't use 4x rectangular blocks.
654*77c1e3ccSAndroid Build Coastguard Worker #if !CONFIG_REALTIME_ONLY
655*77c1e3ccSAndroid Build Coastguard Worker HIGHBD_VARIANCES(4, 16)
656*77c1e3ccSAndroid Build Coastguard Worker HIGHBD_VARIANCES(16, 4)
657*77c1e3ccSAndroid Build Coastguard Worker HIGHBD_VARIANCES(8, 32)
658*77c1e3ccSAndroid Build Coastguard Worker HIGHBD_VARIANCES(32, 8)
659*77c1e3ccSAndroid Build Coastguard Worker HIGHBD_VARIANCES(16, 64)
660*77c1e3ccSAndroid Build Coastguard Worker HIGHBD_VARIANCES(64, 16)
661*77c1e3ccSAndroid Build Coastguard Worker #endif
662*77c1e3ccSAndroid Build Coastguard Worker
663*77c1e3ccSAndroid Build Coastguard Worker HIGHBD_MSE(16, 16)
664*77c1e3ccSAndroid Build Coastguard Worker HIGHBD_MSE(16, 8)
665*77c1e3ccSAndroid Build Coastguard Worker HIGHBD_MSE(8, 16)
666*77c1e3ccSAndroid Build Coastguard Worker HIGHBD_MSE(8, 8)
667*77c1e3ccSAndroid Build Coastguard Worker
aom_highbd_comp_avg_pred_c(uint8_t * comp_pred8,const uint8_t * pred8,int width,int height,const uint8_t * ref8,int ref_stride)668*77c1e3ccSAndroid Build Coastguard Worker void aom_highbd_comp_avg_pred_c(uint8_t *comp_pred8, const uint8_t *pred8,
669*77c1e3ccSAndroid Build Coastguard Worker int width, int height, const uint8_t *ref8,
670*77c1e3ccSAndroid Build Coastguard Worker int ref_stride) {
671*77c1e3ccSAndroid Build Coastguard Worker int i, j;
672*77c1e3ccSAndroid Build Coastguard Worker uint16_t *pred = CONVERT_TO_SHORTPTR(pred8);
673*77c1e3ccSAndroid Build Coastguard Worker uint16_t *ref = CONVERT_TO_SHORTPTR(ref8);
674*77c1e3ccSAndroid Build Coastguard Worker uint16_t *comp_pred = CONVERT_TO_SHORTPTR(comp_pred8);
675*77c1e3ccSAndroid Build Coastguard Worker for (i = 0; i < height; ++i) {
676*77c1e3ccSAndroid Build Coastguard Worker for (j = 0; j < width; ++j) {
677*77c1e3ccSAndroid Build Coastguard Worker const int tmp = pred[j] + ref[j];
678*77c1e3ccSAndroid Build Coastguard Worker comp_pred[j] = ROUND_POWER_OF_TWO(tmp, 1);
679*77c1e3ccSAndroid Build Coastguard Worker }
680*77c1e3ccSAndroid Build Coastguard Worker comp_pred += width;
681*77c1e3ccSAndroid Build Coastguard Worker pred += width;
682*77c1e3ccSAndroid Build Coastguard Worker ref += ref_stride;
683*77c1e3ccSAndroid Build Coastguard Worker }
684*77c1e3ccSAndroid Build Coastguard Worker }
685*77c1e3ccSAndroid Build Coastguard Worker
aom_highbd_dist_wtd_comp_avg_pred_c(uint8_t * comp_pred8,const uint8_t * pred8,int width,int height,const uint8_t * ref8,int ref_stride,const DIST_WTD_COMP_PARAMS * jcp_param)686*77c1e3ccSAndroid Build Coastguard Worker void aom_highbd_dist_wtd_comp_avg_pred_c(
687*77c1e3ccSAndroid Build Coastguard Worker uint8_t *comp_pred8, const uint8_t *pred8, int width, int height,
688*77c1e3ccSAndroid Build Coastguard Worker const uint8_t *ref8, int ref_stride,
689*77c1e3ccSAndroid Build Coastguard Worker const DIST_WTD_COMP_PARAMS *jcp_param) {
690*77c1e3ccSAndroid Build Coastguard Worker int i, j;
691*77c1e3ccSAndroid Build Coastguard Worker const int fwd_offset = jcp_param->fwd_offset;
692*77c1e3ccSAndroid Build Coastguard Worker const int bck_offset = jcp_param->bck_offset;
693*77c1e3ccSAndroid Build Coastguard Worker uint16_t *pred = CONVERT_TO_SHORTPTR(pred8);
694*77c1e3ccSAndroid Build Coastguard Worker uint16_t *ref = CONVERT_TO_SHORTPTR(ref8);
695*77c1e3ccSAndroid Build Coastguard Worker uint16_t *comp_pred = CONVERT_TO_SHORTPTR(comp_pred8);
696*77c1e3ccSAndroid Build Coastguard Worker
697*77c1e3ccSAndroid Build Coastguard Worker for (i = 0; i < height; ++i) {
698*77c1e3ccSAndroid Build Coastguard Worker for (j = 0; j < width; ++j) {
699*77c1e3ccSAndroid Build Coastguard Worker int tmp = pred[j] * bck_offset + ref[j] * fwd_offset;
700*77c1e3ccSAndroid Build Coastguard Worker tmp = ROUND_POWER_OF_TWO(tmp, DIST_PRECISION_BITS);
701*77c1e3ccSAndroid Build Coastguard Worker comp_pred[j] = (uint16_t)tmp;
702*77c1e3ccSAndroid Build Coastguard Worker }
703*77c1e3ccSAndroid Build Coastguard Worker comp_pred += width;
704*77c1e3ccSAndroid Build Coastguard Worker pred += width;
705*77c1e3ccSAndroid Build Coastguard Worker ref += ref_stride;
706*77c1e3ccSAndroid Build Coastguard Worker }
707*77c1e3ccSAndroid Build Coastguard Worker }
708*77c1e3ccSAndroid Build Coastguard Worker #endif // CONFIG_AV1_HIGHBITDEPTH
709*77c1e3ccSAndroid Build Coastguard Worker
aom_comp_mask_pred_c(uint8_t * comp_pred,const uint8_t * pred,int width,int height,const uint8_t * ref,int ref_stride,const uint8_t * mask,int mask_stride,int invert_mask)710*77c1e3ccSAndroid Build Coastguard Worker void aom_comp_mask_pred_c(uint8_t *comp_pred, const uint8_t *pred, int width,
711*77c1e3ccSAndroid Build Coastguard Worker int height, const uint8_t *ref, int ref_stride,
712*77c1e3ccSAndroid Build Coastguard Worker const uint8_t *mask, int mask_stride,
713*77c1e3ccSAndroid Build Coastguard Worker int invert_mask) {
714*77c1e3ccSAndroid Build Coastguard Worker int i, j;
715*77c1e3ccSAndroid Build Coastguard Worker const uint8_t *src0 = invert_mask ? pred : ref;
716*77c1e3ccSAndroid Build Coastguard Worker const uint8_t *src1 = invert_mask ? ref : pred;
717*77c1e3ccSAndroid Build Coastguard Worker const int stride0 = invert_mask ? width : ref_stride;
718*77c1e3ccSAndroid Build Coastguard Worker const int stride1 = invert_mask ? ref_stride : width;
719*77c1e3ccSAndroid Build Coastguard Worker for (i = 0; i < height; ++i) {
720*77c1e3ccSAndroid Build Coastguard Worker for (j = 0; j < width; ++j) {
721*77c1e3ccSAndroid Build Coastguard Worker comp_pred[j] = AOM_BLEND_A64(mask[j], src0[j], src1[j]);
722*77c1e3ccSAndroid Build Coastguard Worker }
723*77c1e3ccSAndroid Build Coastguard Worker comp_pred += width;
724*77c1e3ccSAndroid Build Coastguard Worker src0 += stride0;
725*77c1e3ccSAndroid Build Coastguard Worker src1 += stride1;
726*77c1e3ccSAndroid Build Coastguard Worker mask += mask_stride;
727*77c1e3ccSAndroid Build Coastguard Worker }
728*77c1e3ccSAndroid Build Coastguard Worker }
729*77c1e3ccSAndroid Build Coastguard Worker
730*77c1e3ccSAndroid Build Coastguard Worker #define MASK_SUBPIX_VAR(W, H) \
731*77c1e3ccSAndroid Build Coastguard Worker unsigned int aom_masked_sub_pixel_variance##W##x##H##_c( \
732*77c1e3ccSAndroid Build Coastguard Worker const uint8_t *src, int src_stride, int xoffset, int yoffset, \
733*77c1e3ccSAndroid Build Coastguard Worker const uint8_t *ref, int ref_stride, const uint8_t *second_pred, \
734*77c1e3ccSAndroid Build Coastguard Worker const uint8_t *msk, int msk_stride, int invert_mask, \
735*77c1e3ccSAndroid Build Coastguard Worker unsigned int *sse) { \
736*77c1e3ccSAndroid Build Coastguard Worker uint16_t fdata3[(H + 1) * W]; \
737*77c1e3ccSAndroid Build Coastguard Worker uint8_t temp2[H * W]; \
738*77c1e3ccSAndroid Build Coastguard Worker DECLARE_ALIGNED(16, uint8_t, temp3[H * W]); \
739*77c1e3ccSAndroid Build Coastguard Worker \
740*77c1e3ccSAndroid Build Coastguard Worker var_filter_block2d_bil_first_pass_c(src, fdata3, src_stride, 1, H + 1, W, \
741*77c1e3ccSAndroid Build Coastguard Worker bilinear_filters_2t[xoffset]); \
742*77c1e3ccSAndroid Build Coastguard Worker var_filter_block2d_bil_second_pass_c(fdata3, temp2, W, W, H, W, \
743*77c1e3ccSAndroid Build Coastguard Worker bilinear_filters_2t[yoffset]); \
744*77c1e3ccSAndroid Build Coastguard Worker \
745*77c1e3ccSAndroid Build Coastguard Worker aom_comp_mask_pred_c(temp3, second_pred, W, H, temp2, W, msk, msk_stride, \
746*77c1e3ccSAndroid Build Coastguard Worker invert_mask); \
747*77c1e3ccSAndroid Build Coastguard Worker return aom_variance##W##x##H##_c(temp3, W, ref, ref_stride, sse); \
748*77c1e3ccSAndroid Build Coastguard Worker }
749*77c1e3ccSAndroid Build Coastguard Worker
750*77c1e3ccSAndroid Build Coastguard Worker MASK_SUBPIX_VAR(4, 4)
751*77c1e3ccSAndroid Build Coastguard Worker MASK_SUBPIX_VAR(4, 8)
752*77c1e3ccSAndroid Build Coastguard Worker MASK_SUBPIX_VAR(8, 4)
753*77c1e3ccSAndroid Build Coastguard Worker MASK_SUBPIX_VAR(8, 8)
754*77c1e3ccSAndroid Build Coastguard Worker MASK_SUBPIX_VAR(8, 16)
755*77c1e3ccSAndroid Build Coastguard Worker MASK_SUBPIX_VAR(16, 8)
756*77c1e3ccSAndroid Build Coastguard Worker MASK_SUBPIX_VAR(16, 16)
757*77c1e3ccSAndroid Build Coastguard Worker MASK_SUBPIX_VAR(16, 32)
758*77c1e3ccSAndroid Build Coastguard Worker MASK_SUBPIX_VAR(32, 16)
759*77c1e3ccSAndroid Build Coastguard Worker MASK_SUBPIX_VAR(32, 32)
760*77c1e3ccSAndroid Build Coastguard Worker MASK_SUBPIX_VAR(32, 64)
761*77c1e3ccSAndroid Build Coastguard Worker MASK_SUBPIX_VAR(64, 32)
762*77c1e3ccSAndroid Build Coastguard Worker MASK_SUBPIX_VAR(64, 64)
763*77c1e3ccSAndroid Build Coastguard Worker MASK_SUBPIX_VAR(64, 128)
764*77c1e3ccSAndroid Build Coastguard Worker MASK_SUBPIX_VAR(128, 64)
765*77c1e3ccSAndroid Build Coastguard Worker MASK_SUBPIX_VAR(128, 128)
766*77c1e3ccSAndroid Build Coastguard Worker
767*77c1e3ccSAndroid Build Coastguard Worker // Realtime mode doesn't use 4x rectangular blocks.
768*77c1e3ccSAndroid Build Coastguard Worker #if !CONFIG_REALTIME_ONLY
769*77c1e3ccSAndroid Build Coastguard Worker MASK_SUBPIX_VAR(4, 16)
770*77c1e3ccSAndroid Build Coastguard Worker MASK_SUBPIX_VAR(16, 4)
771*77c1e3ccSAndroid Build Coastguard Worker MASK_SUBPIX_VAR(8, 32)
772*77c1e3ccSAndroid Build Coastguard Worker MASK_SUBPIX_VAR(32, 8)
773*77c1e3ccSAndroid Build Coastguard Worker MASK_SUBPIX_VAR(16, 64)
774*77c1e3ccSAndroid Build Coastguard Worker MASK_SUBPIX_VAR(64, 16)
775*77c1e3ccSAndroid Build Coastguard Worker #endif
776*77c1e3ccSAndroid Build Coastguard Worker
777*77c1e3ccSAndroid Build Coastguard Worker #if CONFIG_AV1_HIGHBITDEPTH
aom_highbd_comp_mask_pred_c(uint8_t * comp_pred8,const uint8_t * pred8,int width,int height,const uint8_t * ref8,int ref_stride,const uint8_t * mask,int mask_stride,int invert_mask)778*77c1e3ccSAndroid Build Coastguard Worker void aom_highbd_comp_mask_pred_c(uint8_t *comp_pred8, const uint8_t *pred8,
779*77c1e3ccSAndroid Build Coastguard Worker int width, int height, const uint8_t *ref8,
780*77c1e3ccSAndroid Build Coastguard Worker int ref_stride, const uint8_t *mask,
781*77c1e3ccSAndroid Build Coastguard Worker int mask_stride, int invert_mask) {
782*77c1e3ccSAndroid Build Coastguard Worker int i, j;
783*77c1e3ccSAndroid Build Coastguard Worker uint16_t *pred = CONVERT_TO_SHORTPTR(pred8);
784*77c1e3ccSAndroid Build Coastguard Worker uint16_t *ref = CONVERT_TO_SHORTPTR(ref8);
785*77c1e3ccSAndroid Build Coastguard Worker uint16_t *comp_pred = CONVERT_TO_SHORTPTR(comp_pred8);
786*77c1e3ccSAndroid Build Coastguard Worker for (i = 0; i < height; ++i) {
787*77c1e3ccSAndroid Build Coastguard Worker for (j = 0; j < width; ++j) {
788*77c1e3ccSAndroid Build Coastguard Worker if (!invert_mask)
789*77c1e3ccSAndroid Build Coastguard Worker comp_pred[j] = AOM_BLEND_A64(mask[j], ref[j], pred[j]);
790*77c1e3ccSAndroid Build Coastguard Worker else
791*77c1e3ccSAndroid Build Coastguard Worker comp_pred[j] = AOM_BLEND_A64(mask[j], pred[j], ref[j]);
792*77c1e3ccSAndroid Build Coastguard Worker }
793*77c1e3ccSAndroid Build Coastguard Worker comp_pred += width;
794*77c1e3ccSAndroid Build Coastguard Worker pred += width;
795*77c1e3ccSAndroid Build Coastguard Worker ref += ref_stride;
796*77c1e3ccSAndroid Build Coastguard Worker mask += mask_stride;
797*77c1e3ccSAndroid Build Coastguard Worker }
798*77c1e3ccSAndroid Build Coastguard Worker }
799*77c1e3ccSAndroid Build Coastguard Worker
800*77c1e3ccSAndroid Build Coastguard Worker #define HIGHBD_MASK_SUBPIX_VAR(W, H) \
801*77c1e3ccSAndroid Build Coastguard Worker unsigned int aom_highbd_8_masked_sub_pixel_variance##W##x##H##_c( \
802*77c1e3ccSAndroid Build Coastguard Worker const uint8_t *src, int src_stride, int xoffset, int yoffset, \
803*77c1e3ccSAndroid Build Coastguard Worker const uint8_t *ref, int ref_stride, const uint8_t *second_pred, \
804*77c1e3ccSAndroid Build Coastguard Worker const uint8_t *msk, int msk_stride, int invert_mask, \
805*77c1e3ccSAndroid Build Coastguard Worker unsigned int *sse) { \
806*77c1e3ccSAndroid Build Coastguard Worker uint16_t fdata3[(H + 1) * W]; \
807*77c1e3ccSAndroid Build Coastguard Worker uint16_t temp2[H * W]; \
808*77c1e3ccSAndroid Build Coastguard Worker DECLARE_ALIGNED(16, uint16_t, temp3[H * W]); \
809*77c1e3ccSAndroid Build Coastguard Worker \
810*77c1e3ccSAndroid Build Coastguard Worker aom_highbd_var_filter_block2d_bil_first_pass( \
811*77c1e3ccSAndroid Build Coastguard Worker src, fdata3, src_stride, 1, H + 1, W, bilinear_filters_2t[xoffset]); \
812*77c1e3ccSAndroid Build Coastguard Worker aom_highbd_var_filter_block2d_bil_second_pass( \
813*77c1e3ccSAndroid Build Coastguard Worker fdata3, temp2, W, W, H, W, bilinear_filters_2t[yoffset]); \
814*77c1e3ccSAndroid Build Coastguard Worker \
815*77c1e3ccSAndroid Build Coastguard Worker aom_highbd_comp_mask_pred_c(CONVERT_TO_BYTEPTR(temp3), second_pred, W, H, \
816*77c1e3ccSAndroid Build Coastguard Worker CONVERT_TO_BYTEPTR(temp2), W, msk, msk_stride, \
817*77c1e3ccSAndroid Build Coastguard Worker invert_mask); \
818*77c1e3ccSAndroid Build Coastguard Worker \
819*77c1e3ccSAndroid Build Coastguard Worker return aom_highbd_8_variance##W##x##H##_c(CONVERT_TO_BYTEPTR(temp3), W, \
820*77c1e3ccSAndroid Build Coastguard Worker ref, ref_stride, sse); \
821*77c1e3ccSAndroid Build Coastguard Worker } \
822*77c1e3ccSAndroid Build Coastguard Worker \
823*77c1e3ccSAndroid Build Coastguard Worker unsigned int aom_highbd_10_masked_sub_pixel_variance##W##x##H##_c( \
824*77c1e3ccSAndroid Build Coastguard Worker const uint8_t *src, int src_stride, int xoffset, int yoffset, \
825*77c1e3ccSAndroid Build Coastguard Worker const uint8_t *ref, int ref_stride, const uint8_t *second_pred, \
826*77c1e3ccSAndroid Build Coastguard Worker const uint8_t *msk, int msk_stride, int invert_mask, \
827*77c1e3ccSAndroid Build Coastguard Worker unsigned int *sse) { \
828*77c1e3ccSAndroid Build Coastguard Worker uint16_t fdata3[(H + 1) * W]; \
829*77c1e3ccSAndroid Build Coastguard Worker uint16_t temp2[H * W]; \
830*77c1e3ccSAndroid Build Coastguard Worker DECLARE_ALIGNED(16, uint16_t, temp3[H * W]); \
831*77c1e3ccSAndroid Build Coastguard Worker \
832*77c1e3ccSAndroid Build Coastguard Worker aom_highbd_var_filter_block2d_bil_first_pass( \
833*77c1e3ccSAndroid Build Coastguard Worker src, fdata3, src_stride, 1, H + 1, W, bilinear_filters_2t[xoffset]); \
834*77c1e3ccSAndroid Build Coastguard Worker aom_highbd_var_filter_block2d_bil_second_pass( \
835*77c1e3ccSAndroid Build Coastguard Worker fdata3, temp2, W, W, H, W, bilinear_filters_2t[yoffset]); \
836*77c1e3ccSAndroid Build Coastguard Worker \
837*77c1e3ccSAndroid Build Coastguard Worker aom_highbd_comp_mask_pred_c(CONVERT_TO_BYTEPTR(temp3), second_pred, W, H, \
838*77c1e3ccSAndroid Build Coastguard Worker CONVERT_TO_BYTEPTR(temp2), W, msk, msk_stride, \
839*77c1e3ccSAndroid Build Coastguard Worker invert_mask); \
840*77c1e3ccSAndroid Build Coastguard Worker \
841*77c1e3ccSAndroid Build Coastguard Worker return aom_highbd_10_variance##W##x##H##_c(CONVERT_TO_BYTEPTR(temp3), W, \
842*77c1e3ccSAndroid Build Coastguard Worker ref, ref_stride, sse); \
843*77c1e3ccSAndroid Build Coastguard Worker } \
844*77c1e3ccSAndroid Build Coastguard Worker \
845*77c1e3ccSAndroid Build Coastguard Worker unsigned int aom_highbd_12_masked_sub_pixel_variance##W##x##H##_c( \
846*77c1e3ccSAndroid Build Coastguard Worker const uint8_t *src, int src_stride, int xoffset, int yoffset, \
847*77c1e3ccSAndroid Build Coastguard Worker const uint8_t *ref, int ref_stride, const uint8_t *second_pred, \
848*77c1e3ccSAndroid Build Coastguard Worker const uint8_t *msk, int msk_stride, int invert_mask, \
849*77c1e3ccSAndroid Build Coastguard Worker unsigned int *sse) { \
850*77c1e3ccSAndroid Build Coastguard Worker uint16_t fdata3[(H + 1) * W]; \
851*77c1e3ccSAndroid Build Coastguard Worker uint16_t temp2[H * W]; \
852*77c1e3ccSAndroid Build Coastguard Worker DECLARE_ALIGNED(16, uint16_t, temp3[H * W]); \
853*77c1e3ccSAndroid Build Coastguard Worker \
854*77c1e3ccSAndroid Build Coastguard Worker aom_highbd_var_filter_block2d_bil_first_pass( \
855*77c1e3ccSAndroid Build Coastguard Worker src, fdata3, src_stride, 1, H + 1, W, bilinear_filters_2t[xoffset]); \
856*77c1e3ccSAndroid Build Coastguard Worker aom_highbd_var_filter_block2d_bil_second_pass( \
857*77c1e3ccSAndroid Build Coastguard Worker fdata3, temp2, W, W, H, W, bilinear_filters_2t[yoffset]); \
858*77c1e3ccSAndroid Build Coastguard Worker \
859*77c1e3ccSAndroid Build Coastguard Worker aom_highbd_comp_mask_pred_c(CONVERT_TO_BYTEPTR(temp3), second_pred, W, H, \
860*77c1e3ccSAndroid Build Coastguard Worker CONVERT_TO_BYTEPTR(temp2), W, msk, msk_stride, \
861*77c1e3ccSAndroid Build Coastguard Worker invert_mask); \
862*77c1e3ccSAndroid Build Coastguard Worker \
863*77c1e3ccSAndroid Build Coastguard Worker return aom_highbd_12_variance##W##x##H##_c(CONVERT_TO_BYTEPTR(temp3), W, \
864*77c1e3ccSAndroid Build Coastguard Worker ref, ref_stride, sse); \
865*77c1e3ccSAndroid Build Coastguard Worker }
866*77c1e3ccSAndroid Build Coastguard Worker
867*77c1e3ccSAndroid Build Coastguard Worker HIGHBD_MASK_SUBPIX_VAR(4, 4)
868*77c1e3ccSAndroid Build Coastguard Worker HIGHBD_MASK_SUBPIX_VAR(4, 8)
869*77c1e3ccSAndroid Build Coastguard Worker HIGHBD_MASK_SUBPIX_VAR(8, 4)
870*77c1e3ccSAndroid Build Coastguard Worker HIGHBD_MASK_SUBPIX_VAR(8, 8)
871*77c1e3ccSAndroid Build Coastguard Worker HIGHBD_MASK_SUBPIX_VAR(8, 16)
872*77c1e3ccSAndroid Build Coastguard Worker HIGHBD_MASK_SUBPIX_VAR(16, 8)
873*77c1e3ccSAndroid Build Coastguard Worker HIGHBD_MASK_SUBPIX_VAR(16, 16)
874*77c1e3ccSAndroid Build Coastguard Worker HIGHBD_MASK_SUBPIX_VAR(16, 32)
875*77c1e3ccSAndroid Build Coastguard Worker HIGHBD_MASK_SUBPIX_VAR(32, 16)
876*77c1e3ccSAndroid Build Coastguard Worker HIGHBD_MASK_SUBPIX_VAR(32, 32)
877*77c1e3ccSAndroid Build Coastguard Worker HIGHBD_MASK_SUBPIX_VAR(32, 64)
878*77c1e3ccSAndroid Build Coastguard Worker HIGHBD_MASK_SUBPIX_VAR(64, 32)
879*77c1e3ccSAndroid Build Coastguard Worker HIGHBD_MASK_SUBPIX_VAR(64, 64)
880*77c1e3ccSAndroid Build Coastguard Worker HIGHBD_MASK_SUBPIX_VAR(64, 128)
881*77c1e3ccSAndroid Build Coastguard Worker HIGHBD_MASK_SUBPIX_VAR(128, 64)
882*77c1e3ccSAndroid Build Coastguard Worker HIGHBD_MASK_SUBPIX_VAR(128, 128)
883*77c1e3ccSAndroid Build Coastguard Worker #if !CONFIG_REALTIME_ONLY
884*77c1e3ccSAndroid Build Coastguard Worker HIGHBD_MASK_SUBPIX_VAR(4, 16)
885*77c1e3ccSAndroid Build Coastguard Worker HIGHBD_MASK_SUBPIX_VAR(16, 4)
886*77c1e3ccSAndroid Build Coastguard Worker HIGHBD_MASK_SUBPIX_VAR(8, 32)
887*77c1e3ccSAndroid Build Coastguard Worker HIGHBD_MASK_SUBPIX_VAR(32, 8)
888*77c1e3ccSAndroid Build Coastguard Worker HIGHBD_MASK_SUBPIX_VAR(16, 64)
889*77c1e3ccSAndroid Build Coastguard Worker HIGHBD_MASK_SUBPIX_VAR(64, 16)
890*77c1e3ccSAndroid Build Coastguard Worker #endif
891*77c1e3ccSAndroid Build Coastguard Worker #endif // CONFIG_AV1_HIGHBITDEPTH
892*77c1e3ccSAndroid Build Coastguard Worker
893*77c1e3ccSAndroid Build Coastguard Worker #if !CONFIG_REALTIME_ONLY
obmc_variance(const uint8_t * pre,int pre_stride,const int32_t * wsrc,const int32_t * mask,int w,int h,unsigned int * sse,int * sum)894*77c1e3ccSAndroid Build Coastguard Worker static inline void obmc_variance(const uint8_t *pre, int pre_stride,
895*77c1e3ccSAndroid Build Coastguard Worker const int32_t *wsrc, const int32_t *mask,
896*77c1e3ccSAndroid Build Coastguard Worker int w, int h, unsigned int *sse, int *sum) {
897*77c1e3ccSAndroid Build Coastguard Worker int i, j;
898*77c1e3ccSAndroid Build Coastguard Worker
899*77c1e3ccSAndroid Build Coastguard Worker *sse = 0;
900*77c1e3ccSAndroid Build Coastguard Worker *sum = 0;
901*77c1e3ccSAndroid Build Coastguard Worker
902*77c1e3ccSAndroid Build Coastguard Worker for (i = 0; i < h; i++) {
903*77c1e3ccSAndroid Build Coastguard Worker for (j = 0; j < w; j++) {
904*77c1e3ccSAndroid Build Coastguard Worker int diff = ROUND_POWER_OF_TWO_SIGNED(wsrc[j] - pre[j] * mask[j], 12);
905*77c1e3ccSAndroid Build Coastguard Worker *sum += diff;
906*77c1e3ccSAndroid Build Coastguard Worker *sse += diff * diff;
907*77c1e3ccSAndroid Build Coastguard Worker }
908*77c1e3ccSAndroid Build Coastguard Worker
909*77c1e3ccSAndroid Build Coastguard Worker pre += pre_stride;
910*77c1e3ccSAndroid Build Coastguard Worker wsrc += w;
911*77c1e3ccSAndroid Build Coastguard Worker mask += w;
912*77c1e3ccSAndroid Build Coastguard Worker }
913*77c1e3ccSAndroid Build Coastguard Worker }
914*77c1e3ccSAndroid Build Coastguard Worker
915*77c1e3ccSAndroid Build Coastguard Worker #define OBMC_VAR(W, H) \
916*77c1e3ccSAndroid Build Coastguard Worker unsigned int aom_obmc_variance##W##x##H##_c( \
917*77c1e3ccSAndroid Build Coastguard Worker const uint8_t *pre, int pre_stride, const int32_t *wsrc, \
918*77c1e3ccSAndroid Build Coastguard Worker const int32_t *mask, unsigned int *sse) { \
919*77c1e3ccSAndroid Build Coastguard Worker int sum; \
920*77c1e3ccSAndroid Build Coastguard Worker obmc_variance(pre, pre_stride, wsrc, mask, W, H, sse, &sum); \
921*77c1e3ccSAndroid Build Coastguard Worker return *sse - (unsigned int)(((int64_t)sum * sum) / (W * H)); \
922*77c1e3ccSAndroid Build Coastguard Worker }
923*77c1e3ccSAndroid Build Coastguard Worker
924*77c1e3ccSAndroid Build Coastguard Worker #define OBMC_SUBPIX_VAR(W, H) \
925*77c1e3ccSAndroid Build Coastguard Worker unsigned int aom_obmc_sub_pixel_variance##W##x##H##_c( \
926*77c1e3ccSAndroid Build Coastguard Worker const uint8_t *pre, int pre_stride, int xoffset, int yoffset, \
927*77c1e3ccSAndroid Build Coastguard Worker const int32_t *wsrc, const int32_t *mask, unsigned int *sse) { \
928*77c1e3ccSAndroid Build Coastguard Worker uint16_t fdata3[(H + 1) * W]; \
929*77c1e3ccSAndroid Build Coastguard Worker uint8_t temp2[H * W]; \
930*77c1e3ccSAndroid Build Coastguard Worker \
931*77c1e3ccSAndroid Build Coastguard Worker var_filter_block2d_bil_first_pass_c(pre, fdata3, pre_stride, 1, H + 1, W, \
932*77c1e3ccSAndroid Build Coastguard Worker bilinear_filters_2t[xoffset]); \
933*77c1e3ccSAndroid Build Coastguard Worker var_filter_block2d_bil_second_pass_c(fdata3, temp2, W, W, H, W, \
934*77c1e3ccSAndroid Build Coastguard Worker bilinear_filters_2t[yoffset]); \
935*77c1e3ccSAndroid Build Coastguard Worker \
936*77c1e3ccSAndroid Build Coastguard Worker return aom_obmc_variance##W##x##H##_c(temp2, W, wsrc, mask, sse); \
937*77c1e3ccSAndroid Build Coastguard Worker }
938*77c1e3ccSAndroid Build Coastguard Worker
939*77c1e3ccSAndroid Build Coastguard Worker OBMC_VAR(4, 4)
940*77c1e3ccSAndroid Build Coastguard Worker OBMC_SUBPIX_VAR(4, 4)
941*77c1e3ccSAndroid Build Coastguard Worker
942*77c1e3ccSAndroid Build Coastguard Worker OBMC_VAR(4, 8)
943*77c1e3ccSAndroid Build Coastguard Worker OBMC_SUBPIX_VAR(4, 8)
944*77c1e3ccSAndroid Build Coastguard Worker
945*77c1e3ccSAndroid Build Coastguard Worker OBMC_VAR(8, 4)
946*77c1e3ccSAndroid Build Coastguard Worker OBMC_SUBPIX_VAR(8, 4)
947*77c1e3ccSAndroid Build Coastguard Worker
948*77c1e3ccSAndroid Build Coastguard Worker OBMC_VAR(8, 8)
949*77c1e3ccSAndroid Build Coastguard Worker OBMC_SUBPIX_VAR(8, 8)
950*77c1e3ccSAndroid Build Coastguard Worker
951*77c1e3ccSAndroid Build Coastguard Worker OBMC_VAR(8, 16)
952*77c1e3ccSAndroid Build Coastguard Worker OBMC_SUBPIX_VAR(8, 16)
953*77c1e3ccSAndroid Build Coastguard Worker
954*77c1e3ccSAndroid Build Coastguard Worker OBMC_VAR(16, 8)
955*77c1e3ccSAndroid Build Coastguard Worker OBMC_SUBPIX_VAR(16, 8)
956*77c1e3ccSAndroid Build Coastguard Worker
957*77c1e3ccSAndroid Build Coastguard Worker OBMC_VAR(16, 16)
958*77c1e3ccSAndroid Build Coastguard Worker OBMC_SUBPIX_VAR(16, 16)
959*77c1e3ccSAndroid Build Coastguard Worker
960*77c1e3ccSAndroid Build Coastguard Worker OBMC_VAR(16, 32)
961*77c1e3ccSAndroid Build Coastguard Worker OBMC_SUBPIX_VAR(16, 32)
962*77c1e3ccSAndroid Build Coastguard Worker
963*77c1e3ccSAndroid Build Coastguard Worker OBMC_VAR(32, 16)
964*77c1e3ccSAndroid Build Coastguard Worker OBMC_SUBPIX_VAR(32, 16)
965*77c1e3ccSAndroid Build Coastguard Worker
966*77c1e3ccSAndroid Build Coastguard Worker OBMC_VAR(32, 32)
967*77c1e3ccSAndroid Build Coastguard Worker OBMC_SUBPIX_VAR(32, 32)
968*77c1e3ccSAndroid Build Coastguard Worker
969*77c1e3ccSAndroid Build Coastguard Worker OBMC_VAR(32, 64)
970*77c1e3ccSAndroid Build Coastguard Worker OBMC_SUBPIX_VAR(32, 64)
971*77c1e3ccSAndroid Build Coastguard Worker
972*77c1e3ccSAndroid Build Coastguard Worker OBMC_VAR(64, 32)
973*77c1e3ccSAndroid Build Coastguard Worker OBMC_SUBPIX_VAR(64, 32)
974*77c1e3ccSAndroid Build Coastguard Worker
975*77c1e3ccSAndroid Build Coastguard Worker OBMC_VAR(64, 64)
976*77c1e3ccSAndroid Build Coastguard Worker OBMC_SUBPIX_VAR(64, 64)
977*77c1e3ccSAndroid Build Coastguard Worker
978*77c1e3ccSAndroid Build Coastguard Worker OBMC_VAR(64, 128)
979*77c1e3ccSAndroid Build Coastguard Worker OBMC_SUBPIX_VAR(64, 128)
980*77c1e3ccSAndroid Build Coastguard Worker
981*77c1e3ccSAndroid Build Coastguard Worker OBMC_VAR(128, 64)
982*77c1e3ccSAndroid Build Coastguard Worker OBMC_SUBPIX_VAR(128, 64)
983*77c1e3ccSAndroid Build Coastguard Worker
984*77c1e3ccSAndroid Build Coastguard Worker OBMC_VAR(128, 128)
985*77c1e3ccSAndroid Build Coastguard Worker OBMC_SUBPIX_VAR(128, 128)
986*77c1e3ccSAndroid Build Coastguard Worker
987*77c1e3ccSAndroid Build Coastguard Worker OBMC_VAR(4, 16)
988*77c1e3ccSAndroid Build Coastguard Worker OBMC_SUBPIX_VAR(4, 16)
989*77c1e3ccSAndroid Build Coastguard Worker OBMC_VAR(16, 4)
990*77c1e3ccSAndroid Build Coastguard Worker OBMC_SUBPIX_VAR(16, 4)
991*77c1e3ccSAndroid Build Coastguard Worker OBMC_VAR(8, 32)
992*77c1e3ccSAndroid Build Coastguard Worker OBMC_SUBPIX_VAR(8, 32)
993*77c1e3ccSAndroid Build Coastguard Worker OBMC_VAR(32, 8)
994*77c1e3ccSAndroid Build Coastguard Worker OBMC_SUBPIX_VAR(32, 8)
995*77c1e3ccSAndroid Build Coastguard Worker OBMC_VAR(16, 64)
996*77c1e3ccSAndroid Build Coastguard Worker OBMC_SUBPIX_VAR(16, 64)
997*77c1e3ccSAndroid Build Coastguard Worker OBMC_VAR(64, 16)
998*77c1e3ccSAndroid Build Coastguard Worker OBMC_SUBPIX_VAR(64, 16)
999*77c1e3ccSAndroid Build Coastguard Worker
1000*77c1e3ccSAndroid Build Coastguard Worker #if CONFIG_AV1_HIGHBITDEPTH
highbd_obmc_variance64(const uint8_t * pre8,int pre_stride,const int32_t * wsrc,const int32_t * mask,int w,int h,uint64_t * sse,int64_t * sum)1001*77c1e3ccSAndroid Build Coastguard Worker static inline void highbd_obmc_variance64(const uint8_t *pre8, int pre_stride,
1002*77c1e3ccSAndroid Build Coastguard Worker const int32_t *wsrc,
1003*77c1e3ccSAndroid Build Coastguard Worker const int32_t *mask, int w, int h,
1004*77c1e3ccSAndroid Build Coastguard Worker uint64_t *sse, int64_t *sum) {
1005*77c1e3ccSAndroid Build Coastguard Worker int i, j;
1006*77c1e3ccSAndroid Build Coastguard Worker uint16_t *pre = CONVERT_TO_SHORTPTR(pre8);
1007*77c1e3ccSAndroid Build Coastguard Worker
1008*77c1e3ccSAndroid Build Coastguard Worker *sse = 0;
1009*77c1e3ccSAndroid Build Coastguard Worker *sum = 0;
1010*77c1e3ccSAndroid Build Coastguard Worker
1011*77c1e3ccSAndroid Build Coastguard Worker for (i = 0; i < h; i++) {
1012*77c1e3ccSAndroid Build Coastguard Worker for (j = 0; j < w; j++) {
1013*77c1e3ccSAndroid Build Coastguard Worker int diff = ROUND_POWER_OF_TWO_SIGNED(wsrc[j] - pre[j] * mask[j], 12);
1014*77c1e3ccSAndroid Build Coastguard Worker *sum += diff;
1015*77c1e3ccSAndroid Build Coastguard Worker *sse += diff * diff;
1016*77c1e3ccSAndroid Build Coastguard Worker }
1017*77c1e3ccSAndroid Build Coastguard Worker
1018*77c1e3ccSAndroid Build Coastguard Worker pre += pre_stride;
1019*77c1e3ccSAndroid Build Coastguard Worker wsrc += w;
1020*77c1e3ccSAndroid Build Coastguard Worker mask += w;
1021*77c1e3ccSAndroid Build Coastguard Worker }
1022*77c1e3ccSAndroid Build Coastguard Worker }
1023*77c1e3ccSAndroid Build Coastguard Worker
highbd_obmc_variance(const uint8_t * pre8,int pre_stride,const int32_t * wsrc,const int32_t * mask,int w,int h,unsigned int * sse,int * sum)1024*77c1e3ccSAndroid Build Coastguard Worker static inline void highbd_obmc_variance(const uint8_t *pre8, int pre_stride,
1025*77c1e3ccSAndroid Build Coastguard Worker const int32_t *wsrc,
1026*77c1e3ccSAndroid Build Coastguard Worker const int32_t *mask, int w, int h,
1027*77c1e3ccSAndroid Build Coastguard Worker unsigned int *sse, int *sum) {
1028*77c1e3ccSAndroid Build Coastguard Worker int64_t sum64;
1029*77c1e3ccSAndroid Build Coastguard Worker uint64_t sse64;
1030*77c1e3ccSAndroid Build Coastguard Worker highbd_obmc_variance64(pre8, pre_stride, wsrc, mask, w, h, &sse64, &sum64);
1031*77c1e3ccSAndroid Build Coastguard Worker *sum = (int)sum64;
1032*77c1e3ccSAndroid Build Coastguard Worker *sse = (unsigned int)sse64;
1033*77c1e3ccSAndroid Build Coastguard Worker }
1034*77c1e3ccSAndroid Build Coastguard Worker
highbd_10_obmc_variance(const uint8_t * pre8,int pre_stride,const int32_t * wsrc,const int32_t * mask,int w,int h,unsigned int * sse,int * sum)1035*77c1e3ccSAndroid Build Coastguard Worker static inline void highbd_10_obmc_variance(const uint8_t *pre8, int pre_stride,
1036*77c1e3ccSAndroid Build Coastguard Worker const int32_t *wsrc,
1037*77c1e3ccSAndroid Build Coastguard Worker const int32_t *mask, int w, int h,
1038*77c1e3ccSAndroid Build Coastguard Worker unsigned int *sse, int *sum) {
1039*77c1e3ccSAndroid Build Coastguard Worker int64_t sum64;
1040*77c1e3ccSAndroid Build Coastguard Worker uint64_t sse64;
1041*77c1e3ccSAndroid Build Coastguard Worker highbd_obmc_variance64(pre8, pre_stride, wsrc, mask, w, h, &sse64, &sum64);
1042*77c1e3ccSAndroid Build Coastguard Worker *sum = (int)ROUND_POWER_OF_TWO(sum64, 2);
1043*77c1e3ccSAndroid Build Coastguard Worker *sse = (unsigned int)ROUND_POWER_OF_TWO(sse64, 4);
1044*77c1e3ccSAndroid Build Coastguard Worker }
1045*77c1e3ccSAndroid Build Coastguard Worker
highbd_12_obmc_variance(const uint8_t * pre8,int pre_stride,const int32_t * wsrc,const int32_t * mask,int w,int h,unsigned int * sse,int * sum)1046*77c1e3ccSAndroid Build Coastguard Worker static inline void highbd_12_obmc_variance(const uint8_t *pre8, int pre_stride,
1047*77c1e3ccSAndroid Build Coastguard Worker const int32_t *wsrc,
1048*77c1e3ccSAndroid Build Coastguard Worker const int32_t *mask, int w, int h,
1049*77c1e3ccSAndroid Build Coastguard Worker unsigned int *sse, int *sum) {
1050*77c1e3ccSAndroid Build Coastguard Worker int64_t sum64;
1051*77c1e3ccSAndroid Build Coastguard Worker uint64_t sse64;
1052*77c1e3ccSAndroid Build Coastguard Worker highbd_obmc_variance64(pre8, pre_stride, wsrc, mask, w, h, &sse64, &sum64);
1053*77c1e3ccSAndroid Build Coastguard Worker *sum = (int)ROUND_POWER_OF_TWO(sum64, 4);
1054*77c1e3ccSAndroid Build Coastguard Worker *sse = (unsigned int)ROUND_POWER_OF_TWO(sse64, 8);
1055*77c1e3ccSAndroid Build Coastguard Worker }
1056*77c1e3ccSAndroid Build Coastguard Worker
1057*77c1e3ccSAndroid Build Coastguard Worker #define HIGHBD_OBMC_VAR(W, H) \
1058*77c1e3ccSAndroid Build Coastguard Worker unsigned int aom_highbd_8_obmc_variance##W##x##H##_c( \
1059*77c1e3ccSAndroid Build Coastguard Worker const uint8_t *pre, int pre_stride, const int32_t *wsrc, \
1060*77c1e3ccSAndroid Build Coastguard Worker const int32_t *mask, unsigned int *sse) { \
1061*77c1e3ccSAndroid Build Coastguard Worker int sum; \
1062*77c1e3ccSAndroid Build Coastguard Worker highbd_obmc_variance(pre, pre_stride, wsrc, mask, W, H, sse, &sum); \
1063*77c1e3ccSAndroid Build Coastguard Worker return *sse - (unsigned int)(((int64_t)sum * sum) / (W * H)); \
1064*77c1e3ccSAndroid Build Coastguard Worker } \
1065*77c1e3ccSAndroid Build Coastguard Worker \
1066*77c1e3ccSAndroid Build Coastguard Worker unsigned int aom_highbd_10_obmc_variance##W##x##H##_c( \
1067*77c1e3ccSAndroid Build Coastguard Worker const uint8_t *pre, int pre_stride, const int32_t *wsrc, \
1068*77c1e3ccSAndroid Build Coastguard Worker const int32_t *mask, unsigned int *sse) { \
1069*77c1e3ccSAndroid Build Coastguard Worker int sum; \
1070*77c1e3ccSAndroid Build Coastguard Worker int64_t var; \
1071*77c1e3ccSAndroid Build Coastguard Worker highbd_10_obmc_variance(pre, pre_stride, wsrc, mask, W, H, sse, &sum); \
1072*77c1e3ccSAndroid Build Coastguard Worker var = (int64_t)(*sse) - (((int64_t)sum * sum) / (W * H)); \
1073*77c1e3ccSAndroid Build Coastguard Worker return (var >= 0) ? (uint32_t)var : 0; \
1074*77c1e3ccSAndroid Build Coastguard Worker } \
1075*77c1e3ccSAndroid Build Coastguard Worker \
1076*77c1e3ccSAndroid Build Coastguard Worker unsigned int aom_highbd_12_obmc_variance##W##x##H##_c( \
1077*77c1e3ccSAndroid Build Coastguard Worker const uint8_t *pre, int pre_stride, const int32_t *wsrc, \
1078*77c1e3ccSAndroid Build Coastguard Worker const int32_t *mask, unsigned int *sse) { \
1079*77c1e3ccSAndroid Build Coastguard Worker int sum; \
1080*77c1e3ccSAndroid Build Coastguard Worker int64_t var; \
1081*77c1e3ccSAndroid Build Coastguard Worker highbd_12_obmc_variance(pre, pre_stride, wsrc, mask, W, H, sse, &sum); \
1082*77c1e3ccSAndroid Build Coastguard Worker var = (int64_t)(*sse) - (((int64_t)sum * sum) / (W * H)); \
1083*77c1e3ccSAndroid Build Coastguard Worker return (var >= 0) ? (uint32_t)var : 0; \
1084*77c1e3ccSAndroid Build Coastguard Worker }
1085*77c1e3ccSAndroid Build Coastguard Worker
1086*77c1e3ccSAndroid Build Coastguard Worker #define HIGHBD_OBMC_SUBPIX_VAR(W, H) \
1087*77c1e3ccSAndroid Build Coastguard Worker unsigned int aom_highbd_8_obmc_sub_pixel_variance##W##x##H##_c( \
1088*77c1e3ccSAndroid Build Coastguard Worker const uint8_t *pre, int pre_stride, int xoffset, int yoffset, \
1089*77c1e3ccSAndroid Build Coastguard Worker const int32_t *wsrc, const int32_t *mask, unsigned int *sse) { \
1090*77c1e3ccSAndroid Build Coastguard Worker uint16_t fdata3[(H + 1) * W]; \
1091*77c1e3ccSAndroid Build Coastguard Worker uint16_t temp2[H * W]; \
1092*77c1e3ccSAndroid Build Coastguard Worker \
1093*77c1e3ccSAndroid Build Coastguard Worker aom_highbd_var_filter_block2d_bil_first_pass( \
1094*77c1e3ccSAndroid Build Coastguard Worker pre, fdata3, pre_stride, 1, H + 1, W, bilinear_filters_2t[xoffset]); \
1095*77c1e3ccSAndroid Build Coastguard Worker aom_highbd_var_filter_block2d_bil_second_pass( \
1096*77c1e3ccSAndroid Build Coastguard Worker fdata3, temp2, W, W, H, W, bilinear_filters_2t[yoffset]); \
1097*77c1e3ccSAndroid Build Coastguard Worker \
1098*77c1e3ccSAndroid Build Coastguard Worker return aom_highbd_8_obmc_variance##W##x##H##_c(CONVERT_TO_BYTEPTR(temp2), \
1099*77c1e3ccSAndroid Build Coastguard Worker W, wsrc, mask, sse); \
1100*77c1e3ccSAndroid Build Coastguard Worker } \
1101*77c1e3ccSAndroid Build Coastguard Worker \
1102*77c1e3ccSAndroid Build Coastguard Worker unsigned int aom_highbd_10_obmc_sub_pixel_variance##W##x##H##_c( \
1103*77c1e3ccSAndroid Build Coastguard Worker const uint8_t *pre, int pre_stride, int xoffset, int yoffset, \
1104*77c1e3ccSAndroid Build Coastguard Worker const int32_t *wsrc, const int32_t *mask, unsigned int *sse) { \
1105*77c1e3ccSAndroid Build Coastguard Worker uint16_t fdata3[(H + 1) * W]; \
1106*77c1e3ccSAndroid Build Coastguard Worker uint16_t temp2[H * W]; \
1107*77c1e3ccSAndroid Build Coastguard Worker \
1108*77c1e3ccSAndroid Build Coastguard Worker aom_highbd_var_filter_block2d_bil_first_pass( \
1109*77c1e3ccSAndroid Build Coastguard Worker pre, fdata3, pre_stride, 1, H + 1, W, bilinear_filters_2t[xoffset]); \
1110*77c1e3ccSAndroid Build Coastguard Worker aom_highbd_var_filter_block2d_bil_second_pass( \
1111*77c1e3ccSAndroid Build Coastguard Worker fdata3, temp2, W, W, H, W, bilinear_filters_2t[yoffset]); \
1112*77c1e3ccSAndroid Build Coastguard Worker \
1113*77c1e3ccSAndroid Build Coastguard Worker return aom_highbd_10_obmc_variance##W##x##H##_c(CONVERT_TO_BYTEPTR(temp2), \
1114*77c1e3ccSAndroid Build Coastguard Worker W, wsrc, mask, sse); \
1115*77c1e3ccSAndroid Build Coastguard Worker } \
1116*77c1e3ccSAndroid Build Coastguard Worker \
1117*77c1e3ccSAndroid Build Coastguard Worker unsigned int aom_highbd_12_obmc_sub_pixel_variance##W##x##H##_c( \
1118*77c1e3ccSAndroid Build Coastguard Worker const uint8_t *pre, int pre_stride, int xoffset, int yoffset, \
1119*77c1e3ccSAndroid Build Coastguard Worker const int32_t *wsrc, const int32_t *mask, unsigned int *sse) { \
1120*77c1e3ccSAndroid Build Coastguard Worker uint16_t fdata3[(H + 1) * W]; \
1121*77c1e3ccSAndroid Build Coastguard Worker uint16_t temp2[H * W]; \
1122*77c1e3ccSAndroid Build Coastguard Worker \
1123*77c1e3ccSAndroid Build Coastguard Worker aom_highbd_var_filter_block2d_bil_first_pass( \
1124*77c1e3ccSAndroid Build Coastguard Worker pre, fdata3, pre_stride, 1, H + 1, W, bilinear_filters_2t[xoffset]); \
1125*77c1e3ccSAndroid Build Coastguard Worker aom_highbd_var_filter_block2d_bil_second_pass( \
1126*77c1e3ccSAndroid Build Coastguard Worker fdata3, temp2, W, W, H, W, bilinear_filters_2t[yoffset]); \
1127*77c1e3ccSAndroid Build Coastguard Worker \
1128*77c1e3ccSAndroid Build Coastguard Worker return aom_highbd_12_obmc_variance##W##x##H##_c(CONVERT_TO_BYTEPTR(temp2), \
1129*77c1e3ccSAndroid Build Coastguard Worker W, wsrc, mask, sse); \
1130*77c1e3ccSAndroid Build Coastguard Worker }
1131*77c1e3ccSAndroid Build Coastguard Worker
1132*77c1e3ccSAndroid Build Coastguard Worker HIGHBD_OBMC_VAR(4, 4)
1133*77c1e3ccSAndroid Build Coastguard Worker HIGHBD_OBMC_SUBPIX_VAR(4, 4)
1134*77c1e3ccSAndroid Build Coastguard Worker
1135*77c1e3ccSAndroid Build Coastguard Worker HIGHBD_OBMC_VAR(4, 8)
1136*77c1e3ccSAndroid Build Coastguard Worker HIGHBD_OBMC_SUBPIX_VAR(4, 8)
1137*77c1e3ccSAndroid Build Coastguard Worker
1138*77c1e3ccSAndroid Build Coastguard Worker HIGHBD_OBMC_VAR(8, 4)
1139*77c1e3ccSAndroid Build Coastguard Worker HIGHBD_OBMC_SUBPIX_VAR(8, 4)
1140*77c1e3ccSAndroid Build Coastguard Worker
1141*77c1e3ccSAndroid Build Coastguard Worker HIGHBD_OBMC_VAR(8, 8)
1142*77c1e3ccSAndroid Build Coastguard Worker HIGHBD_OBMC_SUBPIX_VAR(8, 8)
1143*77c1e3ccSAndroid Build Coastguard Worker
1144*77c1e3ccSAndroid Build Coastguard Worker HIGHBD_OBMC_VAR(8, 16)
1145*77c1e3ccSAndroid Build Coastguard Worker HIGHBD_OBMC_SUBPIX_VAR(8, 16)
1146*77c1e3ccSAndroid Build Coastguard Worker
1147*77c1e3ccSAndroid Build Coastguard Worker HIGHBD_OBMC_VAR(16, 8)
1148*77c1e3ccSAndroid Build Coastguard Worker HIGHBD_OBMC_SUBPIX_VAR(16, 8)
1149*77c1e3ccSAndroid Build Coastguard Worker
1150*77c1e3ccSAndroid Build Coastguard Worker HIGHBD_OBMC_VAR(16, 16)
1151*77c1e3ccSAndroid Build Coastguard Worker HIGHBD_OBMC_SUBPIX_VAR(16, 16)
1152*77c1e3ccSAndroid Build Coastguard Worker
1153*77c1e3ccSAndroid Build Coastguard Worker HIGHBD_OBMC_VAR(16, 32)
1154*77c1e3ccSAndroid Build Coastguard Worker HIGHBD_OBMC_SUBPIX_VAR(16, 32)
1155*77c1e3ccSAndroid Build Coastguard Worker
1156*77c1e3ccSAndroid Build Coastguard Worker HIGHBD_OBMC_VAR(32, 16)
1157*77c1e3ccSAndroid Build Coastguard Worker HIGHBD_OBMC_SUBPIX_VAR(32, 16)
1158*77c1e3ccSAndroid Build Coastguard Worker
1159*77c1e3ccSAndroid Build Coastguard Worker HIGHBD_OBMC_VAR(32, 32)
1160*77c1e3ccSAndroid Build Coastguard Worker HIGHBD_OBMC_SUBPIX_VAR(32, 32)
1161*77c1e3ccSAndroid Build Coastguard Worker
1162*77c1e3ccSAndroid Build Coastguard Worker HIGHBD_OBMC_VAR(32, 64)
1163*77c1e3ccSAndroid Build Coastguard Worker HIGHBD_OBMC_SUBPIX_VAR(32, 64)
1164*77c1e3ccSAndroid Build Coastguard Worker
1165*77c1e3ccSAndroid Build Coastguard Worker HIGHBD_OBMC_VAR(64, 32)
1166*77c1e3ccSAndroid Build Coastguard Worker HIGHBD_OBMC_SUBPIX_VAR(64, 32)
1167*77c1e3ccSAndroid Build Coastguard Worker
1168*77c1e3ccSAndroid Build Coastguard Worker HIGHBD_OBMC_VAR(64, 64)
1169*77c1e3ccSAndroid Build Coastguard Worker HIGHBD_OBMC_SUBPIX_VAR(64, 64)
1170*77c1e3ccSAndroid Build Coastguard Worker
1171*77c1e3ccSAndroid Build Coastguard Worker HIGHBD_OBMC_VAR(64, 128)
1172*77c1e3ccSAndroid Build Coastguard Worker HIGHBD_OBMC_SUBPIX_VAR(64, 128)
1173*77c1e3ccSAndroid Build Coastguard Worker
1174*77c1e3ccSAndroid Build Coastguard Worker HIGHBD_OBMC_VAR(128, 64)
1175*77c1e3ccSAndroid Build Coastguard Worker HIGHBD_OBMC_SUBPIX_VAR(128, 64)
1176*77c1e3ccSAndroid Build Coastguard Worker
1177*77c1e3ccSAndroid Build Coastguard Worker HIGHBD_OBMC_VAR(128, 128)
1178*77c1e3ccSAndroid Build Coastguard Worker HIGHBD_OBMC_SUBPIX_VAR(128, 128)
1179*77c1e3ccSAndroid Build Coastguard Worker
1180*77c1e3ccSAndroid Build Coastguard Worker HIGHBD_OBMC_VAR(4, 16)
1181*77c1e3ccSAndroid Build Coastguard Worker HIGHBD_OBMC_SUBPIX_VAR(4, 16)
1182*77c1e3ccSAndroid Build Coastguard Worker HIGHBD_OBMC_VAR(16, 4)
1183*77c1e3ccSAndroid Build Coastguard Worker HIGHBD_OBMC_SUBPIX_VAR(16, 4)
1184*77c1e3ccSAndroid Build Coastguard Worker HIGHBD_OBMC_VAR(8, 32)
1185*77c1e3ccSAndroid Build Coastguard Worker HIGHBD_OBMC_SUBPIX_VAR(8, 32)
1186*77c1e3ccSAndroid Build Coastguard Worker HIGHBD_OBMC_VAR(32, 8)
1187*77c1e3ccSAndroid Build Coastguard Worker HIGHBD_OBMC_SUBPIX_VAR(32, 8)
1188*77c1e3ccSAndroid Build Coastguard Worker HIGHBD_OBMC_VAR(16, 64)
1189*77c1e3ccSAndroid Build Coastguard Worker HIGHBD_OBMC_SUBPIX_VAR(16, 64)
1190*77c1e3ccSAndroid Build Coastguard Worker HIGHBD_OBMC_VAR(64, 16)
1191*77c1e3ccSAndroid Build Coastguard Worker HIGHBD_OBMC_SUBPIX_VAR(64, 16)
1192*77c1e3ccSAndroid Build Coastguard Worker #endif // CONFIG_AV1_HIGHBITDEPTH
1193*77c1e3ccSAndroid Build Coastguard Worker #endif // !CONFIG_REALTIME_ONLY
1194*77c1e3ccSAndroid Build Coastguard Worker
aom_mse_wxh_16bit_c(uint8_t * dst,int dstride,uint16_t * src,int sstride,int w,int h)1195*77c1e3ccSAndroid Build Coastguard Worker uint64_t aom_mse_wxh_16bit_c(uint8_t *dst, int dstride, uint16_t *src,
1196*77c1e3ccSAndroid Build Coastguard Worker int sstride, int w, int h) {
1197*77c1e3ccSAndroid Build Coastguard Worker uint64_t sum = 0;
1198*77c1e3ccSAndroid Build Coastguard Worker for (int i = 0; i < h; i++) {
1199*77c1e3ccSAndroid Build Coastguard Worker for (int j = 0; j < w; j++) {
1200*77c1e3ccSAndroid Build Coastguard Worker int e = (uint16_t)dst[i * dstride + j] - src[i * sstride + j];
1201*77c1e3ccSAndroid Build Coastguard Worker sum += e * e;
1202*77c1e3ccSAndroid Build Coastguard Worker }
1203*77c1e3ccSAndroid Build Coastguard Worker }
1204*77c1e3ccSAndroid Build Coastguard Worker return sum;
1205*77c1e3ccSAndroid Build Coastguard Worker }
1206*77c1e3ccSAndroid Build Coastguard Worker
aom_mse_16xh_16bit_c(uint8_t * dst,int dstride,uint16_t * src,int w,int h)1207*77c1e3ccSAndroid Build Coastguard Worker uint64_t aom_mse_16xh_16bit_c(uint8_t *dst, int dstride, uint16_t *src, int w,
1208*77c1e3ccSAndroid Build Coastguard Worker int h) {
1209*77c1e3ccSAndroid Build Coastguard Worker uint16_t *src_temp = src;
1210*77c1e3ccSAndroid Build Coastguard Worker uint8_t *dst_temp = dst;
1211*77c1e3ccSAndroid Build Coastguard Worker const int num_blks = 16 / w;
1212*77c1e3ccSAndroid Build Coastguard Worker int64_t sum = 0;
1213*77c1e3ccSAndroid Build Coastguard Worker for (int i = 0; i < num_blks; i++) {
1214*77c1e3ccSAndroid Build Coastguard Worker sum += aom_mse_wxh_16bit_c(dst_temp, dstride, src_temp, w, w, h);
1215*77c1e3ccSAndroid Build Coastguard Worker dst_temp += w;
1216*77c1e3ccSAndroid Build Coastguard Worker src_temp += (w * h);
1217*77c1e3ccSAndroid Build Coastguard Worker }
1218*77c1e3ccSAndroid Build Coastguard Worker return sum;
1219*77c1e3ccSAndroid Build Coastguard Worker }
1220*77c1e3ccSAndroid Build Coastguard Worker
1221*77c1e3ccSAndroid Build Coastguard Worker #if CONFIG_AV1_HIGHBITDEPTH
aom_mse_wxh_16bit_highbd_c(uint16_t * dst,int dstride,uint16_t * src,int sstride,int w,int h)1222*77c1e3ccSAndroid Build Coastguard Worker uint64_t aom_mse_wxh_16bit_highbd_c(uint16_t *dst, int dstride, uint16_t *src,
1223*77c1e3ccSAndroid Build Coastguard Worker int sstride, int w, int h) {
1224*77c1e3ccSAndroid Build Coastguard Worker uint64_t sum = 0;
1225*77c1e3ccSAndroid Build Coastguard Worker for (int i = 0; i < h; i++) {
1226*77c1e3ccSAndroid Build Coastguard Worker for (int j = 0; j < w; j++) {
1227*77c1e3ccSAndroid Build Coastguard Worker int e = dst[i * dstride + j] - src[i * sstride + j];
1228*77c1e3ccSAndroid Build Coastguard Worker sum += e * e;
1229*77c1e3ccSAndroid Build Coastguard Worker }
1230*77c1e3ccSAndroid Build Coastguard Worker }
1231*77c1e3ccSAndroid Build Coastguard Worker return sum;
1232*77c1e3ccSAndroid Build Coastguard Worker }
1233*77c1e3ccSAndroid Build Coastguard Worker #endif // CONFIG_AV1_HIGHBITDEPTH
1234