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