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
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 #include "aom_dsp/blend.h"
20*77c1e3ccSAndroid Build Coastguard Worker
21*77c1e3ccSAndroid Build Coastguard Worker /* Sum the difference between every corresponding element of the buffers. */
sad(const uint8_t * a,int a_stride,const uint8_t * b,int b_stride,int width,int height)22*77c1e3ccSAndroid Build Coastguard Worker static inline unsigned int sad(const uint8_t *a, int a_stride, const uint8_t *b,
23*77c1e3ccSAndroid Build Coastguard Worker int b_stride, int width, int height) {
24*77c1e3ccSAndroid Build Coastguard Worker int y, x;
25*77c1e3ccSAndroid Build Coastguard Worker unsigned int sad = 0;
26*77c1e3ccSAndroid Build Coastguard Worker
27*77c1e3ccSAndroid Build Coastguard Worker for (y = 0; y < height; y++) {
28*77c1e3ccSAndroid Build Coastguard Worker for (x = 0; x < width; x++) {
29*77c1e3ccSAndroid Build Coastguard Worker sad += abs(a[x] - b[x]);
30*77c1e3ccSAndroid Build Coastguard Worker }
31*77c1e3ccSAndroid Build Coastguard Worker
32*77c1e3ccSAndroid Build Coastguard Worker a += a_stride;
33*77c1e3ccSAndroid Build Coastguard Worker b += b_stride;
34*77c1e3ccSAndroid Build Coastguard Worker }
35*77c1e3ccSAndroid Build Coastguard Worker return sad;
36*77c1e3ccSAndroid Build Coastguard Worker }
37*77c1e3ccSAndroid Build Coastguard Worker
38*77c1e3ccSAndroid Build Coastguard Worker #define SADMXN(m, n) \
39*77c1e3ccSAndroid Build Coastguard Worker unsigned int aom_sad##m##x##n##_c(const uint8_t *src, int src_stride, \
40*77c1e3ccSAndroid Build Coastguard Worker const uint8_t *ref, int ref_stride) { \
41*77c1e3ccSAndroid Build Coastguard Worker return sad(src, src_stride, ref, ref_stride, m, n); \
42*77c1e3ccSAndroid Build Coastguard Worker } \
43*77c1e3ccSAndroid Build Coastguard Worker unsigned int aom_sad##m##x##n##_avg_c(const uint8_t *src, int src_stride, \
44*77c1e3ccSAndroid Build Coastguard Worker const uint8_t *ref, int ref_stride, \
45*77c1e3ccSAndroid Build Coastguard Worker const uint8_t *second_pred) { \
46*77c1e3ccSAndroid Build Coastguard Worker uint8_t comp_pred[m * n]; \
47*77c1e3ccSAndroid Build Coastguard Worker aom_comp_avg_pred(comp_pred, second_pred, m, n, ref, ref_stride); \
48*77c1e3ccSAndroid Build Coastguard Worker return sad(src, src_stride, comp_pred, m, m, n); \
49*77c1e3ccSAndroid Build Coastguard Worker } \
50*77c1e3ccSAndroid Build Coastguard Worker unsigned int aom_dist_wtd_sad##m##x##n##_avg_c( \
51*77c1e3ccSAndroid Build Coastguard Worker const uint8_t *src, int src_stride, const uint8_t *ref, int ref_stride, \
52*77c1e3ccSAndroid Build Coastguard Worker const uint8_t *second_pred, const DIST_WTD_COMP_PARAMS *jcp_param) { \
53*77c1e3ccSAndroid Build Coastguard Worker uint8_t comp_pred[m * n]; \
54*77c1e3ccSAndroid Build Coastguard Worker aom_dist_wtd_comp_avg_pred_c(comp_pred, second_pred, m, n, ref, \
55*77c1e3ccSAndroid Build Coastguard Worker ref_stride, jcp_param); \
56*77c1e3ccSAndroid Build Coastguard Worker return sad(src, src_stride, comp_pred, m, m, n); \
57*77c1e3ccSAndroid Build Coastguard Worker } \
58*77c1e3ccSAndroid Build Coastguard Worker unsigned int aom_sad_skip_##m##x##n##_c(const uint8_t *src, int src_stride, \
59*77c1e3ccSAndroid Build Coastguard Worker const uint8_t *ref, \
60*77c1e3ccSAndroid Build Coastguard Worker int ref_stride) { \
61*77c1e3ccSAndroid Build Coastguard Worker return 2 * sad(src, 2 * src_stride, ref, 2 * ref_stride, (m), (n / 2)); \
62*77c1e3ccSAndroid Build Coastguard Worker }
63*77c1e3ccSAndroid Build Coastguard Worker
64*77c1e3ccSAndroid Build Coastguard Worker // Calculate sad against 4 reference locations and store each in sad_array
65*77c1e3ccSAndroid Build Coastguard Worker #define SAD_MXNX4D(m, n) \
66*77c1e3ccSAndroid Build Coastguard Worker void aom_sad##m##x##n##x4d_c(const uint8_t *src, int src_stride, \
67*77c1e3ccSAndroid Build Coastguard Worker const uint8_t *const ref_array[4], \
68*77c1e3ccSAndroid Build Coastguard Worker int ref_stride, uint32_t sad_array[4]) { \
69*77c1e3ccSAndroid Build Coastguard Worker int i; \
70*77c1e3ccSAndroid Build Coastguard Worker for (i = 0; i < 4; ++i) { \
71*77c1e3ccSAndroid Build Coastguard Worker sad_array[i] = \
72*77c1e3ccSAndroid Build Coastguard Worker aom_sad##m##x##n##_c(src, src_stride, ref_array[i], ref_stride); \
73*77c1e3ccSAndroid Build Coastguard Worker } \
74*77c1e3ccSAndroid Build Coastguard Worker } \
75*77c1e3ccSAndroid Build Coastguard Worker void aom_sad_skip_##m##x##n##x4d_c(const uint8_t *src, int src_stride, \
76*77c1e3ccSAndroid Build Coastguard Worker const uint8_t *const ref_array[4], \
77*77c1e3ccSAndroid Build Coastguard Worker int ref_stride, uint32_t sad_array[4]) { \
78*77c1e3ccSAndroid Build Coastguard Worker int i; \
79*77c1e3ccSAndroid Build Coastguard Worker for (i = 0; i < 4; ++i) { \
80*77c1e3ccSAndroid Build Coastguard Worker sad_array[i] = 2 * sad(src, 2 * src_stride, ref_array[i], \
81*77c1e3ccSAndroid Build Coastguard Worker 2 * ref_stride, (m), (n / 2)); \
82*77c1e3ccSAndroid Build Coastguard Worker } \
83*77c1e3ccSAndroid Build Coastguard Worker }
84*77c1e3ccSAndroid Build Coastguard Worker // Call SIMD version of aom_sad_mxnx4d if the 3d version is unavailable.
85*77c1e3ccSAndroid Build Coastguard Worker #define SAD_MXNX3D(m, n) \
86*77c1e3ccSAndroid Build Coastguard Worker void aom_sad##m##x##n##x3d_c(const uint8_t *src, int src_stride, \
87*77c1e3ccSAndroid Build Coastguard Worker const uint8_t *const ref_array[4], \
88*77c1e3ccSAndroid Build Coastguard Worker int ref_stride, uint32_t sad_array[4]) { \
89*77c1e3ccSAndroid Build Coastguard Worker aom_sad##m##x##n##x4d(src, src_stride, ref_array, ref_stride, sad_array); \
90*77c1e3ccSAndroid Build Coastguard Worker }
91*77c1e3ccSAndroid Build Coastguard Worker
92*77c1e3ccSAndroid Build Coastguard Worker // 128x128
93*77c1e3ccSAndroid Build Coastguard Worker SADMXN(128, 128)
94*77c1e3ccSAndroid Build Coastguard Worker SAD_MXNX4D(128, 128)
95*77c1e3ccSAndroid Build Coastguard Worker SAD_MXNX3D(128, 128)
96*77c1e3ccSAndroid Build Coastguard Worker
97*77c1e3ccSAndroid Build Coastguard Worker // 128x64
98*77c1e3ccSAndroid Build Coastguard Worker SADMXN(128, 64)
99*77c1e3ccSAndroid Build Coastguard Worker SAD_MXNX4D(128, 64)
100*77c1e3ccSAndroid Build Coastguard Worker SAD_MXNX3D(128, 64)
101*77c1e3ccSAndroid Build Coastguard Worker
102*77c1e3ccSAndroid Build Coastguard Worker // 64x128
103*77c1e3ccSAndroid Build Coastguard Worker SADMXN(64, 128)
104*77c1e3ccSAndroid Build Coastguard Worker SAD_MXNX4D(64, 128)
105*77c1e3ccSAndroid Build Coastguard Worker SAD_MXNX3D(64, 128)
106*77c1e3ccSAndroid Build Coastguard Worker
107*77c1e3ccSAndroid Build Coastguard Worker // 64x64
108*77c1e3ccSAndroid Build Coastguard Worker SADMXN(64, 64)
109*77c1e3ccSAndroid Build Coastguard Worker SAD_MXNX4D(64, 64)
110*77c1e3ccSAndroid Build Coastguard Worker SAD_MXNX3D(64, 64)
111*77c1e3ccSAndroid Build Coastguard Worker
112*77c1e3ccSAndroid Build Coastguard Worker // 64x32
113*77c1e3ccSAndroid Build Coastguard Worker SADMXN(64, 32)
114*77c1e3ccSAndroid Build Coastguard Worker SAD_MXNX4D(64, 32)
115*77c1e3ccSAndroid Build Coastguard Worker SAD_MXNX3D(64, 32)
116*77c1e3ccSAndroid Build Coastguard Worker
117*77c1e3ccSAndroid Build Coastguard Worker // 32x64
118*77c1e3ccSAndroid Build Coastguard Worker SADMXN(32, 64)
119*77c1e3ccSAndroid Build Coastguard Worker SAD_MXNX4D(32, 64)
120*77c1e3ccSAndroid Build Coastguard Worker SAD_MXNX3D(32, 64)
121*77c1e3ccSAndroid Build Coastguard Worker
122*77c1e3ccSAndroid Build Coastguard Worker // 32x32
123*77c1e3ccSAndroid Build Coastguard Worker SADMXN(32, 32)
124*77c1e3ccSAndroid Build Coastguard Worker SAD_MXNX4D(32, 32)
125*77c1e3ccSAndroid Build Coastguard Worker SAD_MXNX3D(32, 32)
126*77c1e3ccSAndroid Build Coastguard Worker
127*77c1e3ccSAndroid Build Coastguard Worker // 32x16
128*77c1e3ccSAndroid Build Coastguard Worker SADMXN(32, 16)
129*77c1e3ccSAndroid Build Coastguard Worker SAD_MXNX4D(32, 16)
130*77c1e3ccSAndroid Build Coastguard Worker SAD_MXNX3D(32, 16)
131*77c1e3ccSAndroid Build Coastguard Worker
132*77c1e3ccSAndroid Build Coastguard Worker // 16x32
133*77c1e3ccSAndroid Build Coastguard Worker SADMXN(16, 32)
134*77c1e3ccSAndroid Build Coastguard Worker SAD_MXNX4D(16, 32)
135*77c1e3ccSAndroid Build Coastguard Worker SAD_MXNX3D(16, 32)
136*77c1e3ccSAndroid Build Coastguard Worker
137*77c1e3ccSAndroid Build Coastguard Worker // 16x16
138*77c1e3ccSAndroid Build Coastguard Worker SADMXN(16, 16)
139*77c1e3ccSAndroid Build Coastguard Worker SAD_MXNX4D(16, 16)
140*77c1e3ccSAndroid Build Coastguard Worker SAD_MXNX3D(16, 16)
141*77c1e3ccSAndroid Build Coastguard Worker
142*77c1e3ccSAndroid Build Coastguard Worker // 16x8
143*77c1e3ccSAndroid Build Coastguard Worker SADMXN(16, 8)
144*77c1e3ccSAndroid Build Coastguard Worker SAD_MXNX4D(16, 8)
145*77c1e3ccSAndroid Build Coastguard Worker SAD_MXNX3D(16, 8)
146*77c1e3ccSAndroid Build Coastguard Worker
147*77c1e3ccSAndroid Build Coastguard Worker // 8x16
148*77c1e3ccSAndroid Build Coastguard Worker SADMXN(8, 16)
149*77c1e3ccSAndroid Build Coastguard Worker SAD_MXNX4D(8, 16)
150*77c1e3ccSAndroid Build Coastguard Worker SAD_MXNX3D(8, 16)
151*77c1e3ccSAndroid Build Coastguard Worker
152*77c1e3ccSAndroid Build Coastguard Worker // 8x8
153*77c1e3ccSAndroid Build Coastguard Worker SADMXN(8, 8)
154*77c1e3ccSAndroid Build Coastguard Worker SAD_MXNX4D(8, 8)
155*77c1e3ccSAndroid Build Coastguard Worker SAD_MXNX3D(8, 8)
156*77c1e3ccSAndroid Build Coastguard Worker
157*77c1e3ccSAndroid Build Coastguard Worker // 8x4
158*77c1e3ccSAndroid Build Coastguard Worker SADMXN(8, 4)
159*77c1e3ccSAndroid Build Coastguard Worker SAD_MXNX4D(8, 4)
160*77c1e3ccSAndroid Build Coastguard Worker SAD_MXNX3D(8, 4)
161*77c1e3ccSAndroid Build Coastguard Worker
162*77c1e3ccSAndroid Build Coastguard Worker // 4x8
163*77c1e3ccSAndroid Build Coastguard Worker SADMXN(4, 8)
164*77c1e3ccSAndroid Build Coastguard Worker SAD_MXNX4D(4, 8)
165*77c1e3ccSAndroid Build Coastguard Worker SAD_MXNX3D(4, 8)
166*77c1e3ccSAndroid Build Coastguard Worker
167*77c1e3ccSAndroid Build Coastguard Worker // 4x4
168*77c1e3ccSAndroid Build Coastguard Worker SADMXN(4, 4)
169*77c1e3ccSAndroid Build Coastguard Worker SAD_MXNX4D(4, 4)
170*77c1e3ccSAndroid Build Coastguard Worker SAD_MXNX3D(4, 4)
171*77c1e3ccSAndroid Build Coastguard Worker
172*77c1e3ccSAndroid Build Coastguard Worker #if !CONFIG_REALTIME_ONLY
173*77c1e3ccSAndroid Build Coastguard Worker SADMXN(4, 16)
174*77c1e3ccSAndroid Build Coastguard Worker SAD_MXNX4D(4, 16)
175*77c1e3ccSAndroid Build Coastguard Worker SADMXN(16, 4)
176*77c1e3ccSAndroid Build Coastguard Worker SAD_MXNX4D(16, 4)
177*77c1e3ccSAndroid Build Coastguard Worker SADMXN(8, 32)
178*77c1e3ccSAndroid Build Coastguard Worker SAD_MXNX4D(8, 32)
179*77c1e3ccSAndroid Build Coastguard Worker SADMXN(32, 8)
180*77c1e3ccSAndroid Build Coastguard Worker SAD_MXNX4D(32, 8)
181*77c1e3ccSAndroid Build Coastguard Worker SADMXN(16, 64)
182*77c1e3ccSAndroid Build Coastguard Worker SAD_MXNX4D(16, 64)
183*77c1e3ccSAndroid Build Coastguard Worker SADMXN(64, 16)
184*77c1e3ccSAndroid Build Coastguard Worker SAD_MXNX4D(64, 16)
185*77c1e3ccSAndroid Build Coastguard Worker SAD_MXNX3D(4, 16)
186*77c1e3ccSAndroid Build Coastguard Worker SAD_MXNX3D(16, 4)
187*77c1e3ccSAndroid Build Coastguard Worker SAD_MXNX3D(8, 32)
188*77c1e3ccSAndroid Build Coastguard Worker SAD_MXNX3D(32, 8)
189*77c1e3ccSAndroid Build Coastguard Worker SAD_MXNX3D(16, 64)
190*77c1e3ccSAndroid Build Coastguard Worker SAD_MXNX3D(64, 16)
191*77c1e3ccSAndroid Build Coastguard Worker #endif // !CONFIG_REALTIME_ONLY
192*77c1e3ccSAndroid Build Coastguard Worker
193*77c1e3ccSAndroid Build Coastguard Worker #if CONFIG_AV1_HIGHBITDEPTH
highbd_sad(const uint8_t * a8,int a_stride,const uint8_t * b8,int b_stride,int width,int height)194*77c1e3ccSAndroid Build Coastguard Worker static inline unsigned int highbd_sad(const uint8_t *a8, int a_stride,
195*77c1e3ccSAndroid Build Coastguard Worker const uint8_t *b8, int b_stride,
196*77c1e3ccSAndroid Build Coastguard Worker int width, int height) {
197*77c1e3ccSAndroid Build Coastguard Worker int y, x;
198*77c1e3ccSAndroid Build Coastguard Worker unsigned int sad = 0;
199*77c1e3ccSAndroid Build Coastguard Worker const uint16_t *a = CONVERT_TO_SHORTPTR(a8);
200*77c1e3ccSAndroid Build Coastguard Worker const uint16_t *b = CONVERT_TO_SHORTPTR(b8);
201*77c1e3ccSAndroid Build Coastguard Worker for (y = 0; y < height; y++) {
202*77c1e3ccSAndroid Build Coastguard Worker for (x = 0; x < width; x++) {
203*77c1e3ccSAndroid Build Coastguard Worker sad += abs(a[x] - b[x]);
204*77c1e3ccSAndroid Build Coastguard Worker }
205*77c1e3ccSAndroid Build Coastguard Worker
206*77c1e3ccSAndroid Build Coastguard Worker a += a_stride;
207*77c1e3ccSAndroid Build Coastguard Worker b += b_stride;
208*77c1e3ccSAndroid Build Coastguard Worker }
209*77c1e3ccSAndroid Build Coastguard Worker return sad;
210*77c1e3ccSAndroid Build Coastguard Worker }
211*77c1e3ccSAndroid Build Coastguard Worker
highbd_sadb(const uint8_t * a8,int a_stride,const uint8_t * b8,int b_stride,int width,int height)212*77c1e3ccSAndroid Build Coastguard Worker static inline unsigned int highbd_sadb(const uint8_t *a8, int a_stride,
213*77c1e3ccSAndroid Build Coastguard Worker const uint8_t *b8, int b_stride,
214*77c1e3ccSAndroid Build Coastguard Worker int width, int height) {
215*77c1e3ccSAndroid Build Coastguard Worker int y, x;
216*77c1e3ccSAndroid Build Coastguard Worker unsigned int sad = 0;
217*77c1e3ccSAndroid Build Coastguard Worker const uint16_t *a = CONVERT_TO_SHORTPTR(a8);
218*77c1e3ccSAndroid Build Coastguard Worker const uint16_t *b = CONVERT_TO_SHORTPTR(b8);
219*77c1e3ccSAndroid Build Coastguard Worker for (y = 0; y < height; y++) {
220*77c1e3ccSAndroid Build Coastguard Worker for (x = 0; x < width; x++) {
221*77c1e3ccSAndroid Build Coastguard Worker sad += abs(a[x] - b[x]);
222*77c1e3ccSAndroid Build Coastguard Worker }
223*77c1e3ccSAndroid Build Coastguard Worker
224*77c1e3ccSAndroid Build Coastguard Worker a += a_stride;
225*77c1e3ccSAndroid Build Coastguard Worker b += b_stride;
226*77c1e3ccSAndroid Build Coastguard Worker }
227*77c1e3ccSAndroid Build Coastguard Worker return sad;
228*77c1e3ccSAndroid Build Coastguard Worker }
229*77c1e3ccSAndroid Build Coastguard Worker
230*77c1e3ccSAndroid Build Coastguard Worker #define HIGHBD_SADMXN(m, n) \
231*77c1e3ccSAndroid Build Coastguard Worker unsigned int aom_highbd_sad##m##x##n##_c(const uint8_t *src, int src_stride, \
232*77c1e3ccSAndroid Build Coastguard Worker const uint8_t *ref, \
233*77c1e3ccSAndroid Build Coastguard Worker int ref_stride) { \
234*77c1e3ccSAndroid Build Coastguard Worker return highbd_sad(src, src_stride, ref, ref_stride, m, n); \
235*77c1e3ccSAndroid Build Coastguard Worker } \
236*77c1e3ccSAndroid Build Coastguard Worker unsigned int aom_highbd_sad##m##x##n##_avg_c( \
237*77c1e3ccSAndroid Build Coastguard Worker const uint8_t *src, int src_stride, const uint8_t *ref, int ref_stride, \
238*77c1e3ccSAndroid Build Coastguard Worker const uint8_t *second_pred) { \
239*77c1e3ccSAndroid Build Coastguard Worker uint16_t comp_pred[m * n]; \
240*77c1e3ccSAndroid Build Coastguard Worker uint8_t *const comp_pred8 = CONVERT_TO_BYTEPTR(comp_pred); \
241*77c1e3ccSAndroid Build Coastguard Worker aom_highbd_comp_avg_pred(comp_pred8, second_pred, m, n, ref, ref_stride); \
242*77c1e3ccSAndroid Build Coastguard Worker return highbd_sadb(src, src_stride, comp_pred8, m, m, n); \
243*77c1e3ccSAndroid Build Coastguard Worker } \
244*77c1e3ccSAndroid Build Coastguard Worker unsigned int aom_highbd_dist_wtd_sad##m##x##n##_avg_c( \
245*77c1e3ccSAndroid Build Coastguard Worker const uint8_t *src, int src_stride, const uint8_t *ref, int ref_stride, \
246*77c1e3ccSAndroid Build Coastguard Worker const uint8_t *second_pred, const DIST_WTD_COMP_PARAMS *jcp_param) { \
247*77c1e3ccSAndroid Build Coastguard Worker uint16_t comp_pred[m * n]; \
248*77c1e3ccSAndroid Build Coastguard Worker uint8_t *const comp_pred8 = CONVERT_TO_BYTEPTR(comp_pred); \
249*77c1e3ccSAndroid Build Coastguard Worker aom_highbd_dist_wtd_comp_avg_pred(comp_pred8, second_pred, m, n, ref, \
250*77c1e3ccSAndroid Build Coastguard Worker ref_stride, jcp_param); \
251*77c1e3ccSAndroid Build Coastguard Worker return highbd_sadb(src, src_stride, comp_pred8, m, m, n); \
252*77c1e3ccSAndroid Build Coastguard Worker } \
253*77c1e3ccSAndroid Build Coastguard Worker unsigned int aom_highbd_sad_skip_##m##x##n##_c( \
254*77c1e3ccSAndroid Build Coastguard Worker const uint8_t *src, int src_stride, const uint8_t *ref, \
255*77c1e3ccSAndroid Build Coastguard Worker int ref_stride) { \
256*77c1e3ccSAndroid Build Coastguard Worker return 2 * \
257*77c1e3ccSAndroid Build Coastguard Worker highbd_sad(src, 2 * src_stride, ref, 2 * ref_stride, (m), (n / 2)); \
258*77c1e3ccSAndroid Build Coastguard Worker }
259*77c1e3ccSAndroid Build Coastguard Worker
260*77c1e3ccSAndroid Build Coastguard Worker #define HIGHBD_SAD_MXNX4D(m, n) \
261*77c1e3ccSAndroid Build Coastguard Worker void aom_highbd_sad##m##x##n##x4d_c(const uint8_t *src, int src_stride, \
262*77c1e3ccSAndroid Build Coastguard Worker const uint8_t *const ref_array[4], \
263*77c1e3ccSAndroid Build Coastguard Worker int ref_stride, uint32_t sad_array[4]) { \
264*77c1e3ccSAndroid Build Coastguard Worker int i; \
265*77c1e3ccSAndroid Build Coastguard Worker for (i = 0; i < 4; ++i) { \
266*77c1e3ccSAndroid Build Coastguard Worker sad_array[i] = aom_highbd_sad##m##x##n##_c(src, src_stride, \
267*77c1e3ccSAndroid Build Coastguard Worker ref_array[i], ref_stride); \
268*77c1e3ccSAndroid Build Coastguard Worker } \
269*77c1e3ccSAndroid Build Coastguard Worker } \
270*77c1e3ccSAndroid Build Coastguard Worker void aom_highbd_sad_skip_##m##x##n##x4d_c( \
271*77c1e3ccSAndroid Build Coastguard Worker const uint8_t *src, int src_stride, const uint8_t *const ref_array[4], \
272*77c1e3ccSAndroid Build Coastguard Worker int ref_stride, uint32_t sad_array[4]) { \
273*77c1e3ccSAndroid Build Coastguard Worker int i; \
274*77c1e3ccSAndroid Build Coastguard Worker for (i = 0; i < 4; ++i) { \
275*77c1e3ccSAndroid Build Coastguard Worker sad_array[i] = 2 * highbd_sad(src, 2 * src_stride, ref_array[i], \
276*77c1e3ccSAndroid Build Coastguard Worker 2 * ref_stride, (m), (n / 2)); \
277*77c1e3ccSAndroid Build Coastguard Worker } \
278*77c1e3ccSAndroid Build Coastguard Worker }
279*77c1e3ccSAndroid Build Coastguard Worker // Call SIMD version of aom_highbd_sad_mxnx4d if the 3d version is unavailable.
280*77c1e3ccSAndroid Build Coastguard Worker #define HIGHBD_SAD_MXNX3D(m, n) \
281*77c1e3ccSAndroid Build Coastguard Worker void aom_highbd_sad##m##x##n##x3d_c(const uint8_t *src, int src_stride, \
282*77c1e3ccSAndroid Build Coastguard Worker const uint8_t *const ref_array[4], \
283*77c1e3ccSAndroid Build Coastguard Worker int ref_stride, uint32_t sad_array[4]) { \
284*77c1e3ccSAndroid Build Coastguard Worker aom_highbd_sad##m##x##n##x4d(src, src_stride, ref_array, ref_stride, \
285*77c1e3ccSAndroid Build Coastguard Worker sad_array); \
286*77c1e3ccSAndroid Build Coastguard Worker }
287*77c1e3ccSAndroid Build Coastguard Worker
288*77c1e3ccSAndroid Build Coastguard Worker // 128x128
289*77c1e3ccSAndroid Build Coastguard Worker HIGHBD_SADMXN(128, 128)
290*77c1e3ccSAndroid Build Coastguard Worker HIGHBD_SAD_MXNX4D(128, 128)
291*77c1e3ccSAndroid Build Coastguard Worker HIGHBD_SAD_MXNX3D(128, 128)
292*77c1e3ccSAndroid Build Coastguard Worker
293*77c1e3ccSAndroid Build Coastguard Worker // 128x64
294*77c1e3ccSAndroid Build Coastguard Worker HIGHBD_SADMXN(128, 64)
295*77c1e3ccSAndroid Build Coastguard Worker HIGHBD_SAD_MXNX4D(128, 64)
296*77c1e3ccSAndroid Build Coastguard Worker HIGHBD_SAD_MXNX3D(128, 64)
297*77c1e3ccSAndroid Build Coastguard Worker
298*77c1e3ccSAndroid Build Coastguard Worker // 64x128
299*77c1e3ccSAndroid Build Coastguard Worker HIGHBD_SADMXN(64, 128)
300*77c1e3ccSAndroid Build Coastguard Worker HIGHBD_SAD_MXNX4D(64, 128)
301*77c1e3ccSAndroid Build Coastguard Worker HIGHBD_SAD_MXNX3D(64, 128)
302*77c1e3ccSAndroid Build Coastguard Worker
303*77c1e3ccSAndroid Build Coastguard Worker // 64x64
304*77c1e3ccSAndroid Build Coastguard Worker HIGHBD_SADMXN(64, 64)
305*77c1e3ccSAndroid Build Coastguard Worker HIGHBD_SAD_MXNX4D(64, 64)
306*77c1e3ccSAndroid Build Coastguard Worker HIGHBD_SAD_MXNX3D(64, 64)
307*77c1e3ccSAndroid Build Coastguard Worker
308*77c1e3ccSAndroid Build Coastguard Worker // 64x32
309*77c1e3ccSAndroid Build Coastguard Worker HIGHBD_SADMXN(64, 32)
310*77c1e3ccSAndroid Build Coastguard Worker HIGHBD_SAD_MXNX4D(64, 32)
311*77c1e3ccSAndroid Build Coastguard Worker HIGHBD_SAD_MXNX3D(64, 32)
312*77c1e3ccSAndroid Build Coastguard Worker
313*77c1e3ccSAndroid Build Coastguard Worker // 32x64
314*77c1e3ccSAndroid Build Coastguard Worker HIGHBD_SADMXN(32, 64)
315*77c1e3ccSAndroid Build Coastguard Worker HIGHBD_SAD_MXNX4D(32, 64)
316*77c1e3ccSAndroid Build Coastguard Worker HIGHBD_SAD_MXNX3D(32, 64)
317*77c1e3ccSAndroid Build Coastguard Worker
318*77c1e3ccSAndroid Build Coastguard Worker // 32x32
319*77c1e3ccSAndroid Build Coastguard Worker HIGHBD_SADMXN(32, 32)
320*77c1e3ccSAndroid Build Coastguard Worker HIGHBD_SAD_MXNX4D(32, 32)
321*77c1e3ccSAndroid Build Coastguard Worker HIGHBD_SAD_MXNX3D(32, 32)
322*77c1e3ccSAndroid Build Coastguard Worker
323*77c1e3ccSAndroid Build Coastguard Worker // 32x16
324*77c1e3ccSAndroid Build Coastguard Worker HIGHBD_SADMXN(32, 16)
325*77c1e3ccSAndroid Build Coastguard Worker HIGHBD_SAD_MXNX4D(32, 16)
326*77c1e3ccSAndroid Build Coastguard Worker HIGHBD_SAD_MXNX3D(32, 16)
327*77c1e3ccSAndroid Build Coastguard Worker
328*77c1e3ccSAndroid Build Coastguard Worker // 16x32
329*77c1e3ccSAndroid Build Coastguard Worker HIGHBD_SADMXN(16, 32)
330*77c1e3ccSAndroid Build Coastguard Worker HIGHBD_SAD_MXNX4D(16, 32)
331*77c1e3ccSAndroid Build Coastguard Worker HIGHBD_SAD_MXNX3D(16, 32)
332*77c1e3ccSAndroid Build Coastguard Worker
333*77c1e3ccSAndroid Build Coastguard Worker // 16x16
334*77c1e3ccSAndroid Build Coastguard Worker HIGHBD_SADMXN(16, 16)
335*77c1e3ccSAndroid Build Coastguard Worker HIGHBD_SAD_MXNX4D(16, 16)
336*77c1e3ccSAndroid Build Coastguard Worker HIGHBD_SAD_MXNX3D(16, 16)
337*77c1e3ccSAndroid Build Coastguard Worker
338*77c1e3ccSAndroid Build Coastguard Worker // 16x8
339*77c1e3ccSAndroid Build Coastguard Worker HIGHBD_SADMXN(16, 8)
340*77c1e3ccSAndroid Build Coastguard Worker HIGHBD_SAD_MXNX4D(16, 8)
341*77c1e3ccSAndroid Build Coastguard Worker HIGHBD_SAD_MXNX3D(16, 8)
342*77c1e3ccSAndroid Build Coastguard Worker
343*77c1e3ccSAndroid Build Coastguard Worker // 8x16
344*77c1e3ccSAndroid Build Coastguard Worker HIGHBD_SADMXN(8, 16)
345*77c1e3ccSAndroid Build Coastguard Worker HIGHBD_SAD_MXNX4D(8, 16)
346*77c1e3ccSAndroid Build Coastguard Worker HIGHBD_SAD_MXNX3D(8, 16)
347*77c1e3ccSAndroid Build Coastguard Worker
348*77c1e3ccSAndroid Build Coastguard Worker // 8x8
349*77c1e3ccSAndroid Build Coastguard Worker HIGHBD_SADMXN(8, 8)
350*77c1e3ccSAndroid Build Coastguard Worker HIGHBD_SAD_MXNX4D(8, 8)
351*77c1e3ccSAndroid Build Coastguard Worker HIGHBD_SAD_MXNX3D(8, 8)
352*77c1e3ccSAndroid Build Coastguard Worker
353*77c1e3ccSAndroid Build Coastguard Worker // 8x4
354*77c1e3ccSAndroid Build Coastguard Worker HIGHBD_SADMXN(8, 4)
355*77c1e3ccSAndroid Build Coastguard Worker HIGHBD_SAD_MXNX4D(8, 4)
356*77c1e3ccSAndroid Build Coastguard Worker HIGHBD_SAD_MXNX3D(8, 4)
357*77c1e3ccSAndroid Build Coastguard Worker
358*77c1e3ccSAndroid Build Coastguard Worker // 4x8
359*77c1e3ccSAndroid Build Coastguard Worker HIGHBD_SADMXN(4, 8)
360*77c1e3ccSAndroid Build Coastguard Worker HIGHBD_SAD_MXNX4D(4, 8)
361*77c1e3ccSAndroid Build Coastguard Worker HIGHBD_SAD_MXNX3D(4, 8)
362*77c1e3ccSAndroid Build Coastguard Worker
363*77c1e3ccSAndroid Build Coastguard Worker // 4x4
364*77c1e3ccSAndroid Build Coastguard Worker HIGHBD_SADMXN(4, 4)
365*77c1e3ccSAndroid Build Coastguard Worker HIGHBD_SAD_MXNX4D(4, 4)
366*77c1e3ccSAndroid Build Coastguard Worker HIGHBD_SAD_MXNX3D(4, 4)
367*77c1e3ccSAndroid Build Coastguard Worker
368*77c1e3ccSAndroid Build Coastguard Worker #if !CONFIG_REALTIME_ONLY
369*77c1e3ccSAndroid Build Coastguard Worker HIGHBD_SADMXN(4, 16)
370*77c1e3ccSAndroid Build Coastguard Worker HIGHBD_SAD_MXNX4D(4, 16)
371*77c1e3ccSAndroid Build Coastguard Worker HIGHBD_SADMXN(16, 4)
372*77c1e3ccSAndroid Build Coastguard Worker HIGHBD_SAD_MXNX4D(16, 4)
373*77c1e3ccSAndroid Build Coastguard Worker HIGHBD_SADMXN(8, 32)
374*77c1e3ccSAndroid Build Coastguard Worker HIGHBD_SAD_MXNX4D(8, 32)
375*77c1e3ccSAndroid Build Coastguard Worker HIGHBD_SADMXN(32, 8)
376*77c1e3ccSAndroid Build Coastguard Worker HIGHBD_SAD_MXNX4D(32, 8)
377*77c1e3ccSAndroid Build Coastguard Worker HIGHBD_SADMXN(16, 64)
378*77c1e3ccSAndroid Build Coastguard Worker HIGHBD_SAD_MXNX4D(16, 64)
379*77c1e3ccSAndroid Build Coastguard Worker HIGHBD_SADMXN(64, 16)
380*77c1e3ccSAndroid Build Coastguard Worker HIGHBD_SAD_MXNX4D(64, 16)
381*77c1e3ccSAndroid Build Coastguard Worker
382*77c1e3ccSAndroid Build Coastguard Worker HIGHBD_SAD_MXNX3D(4, 16)
383*77c1e3ccSAndroid Build Coastguard Worker HIGHBD_SAD_MXNX3D(16, 4)
384*77c1e3ccSAndroid Build Coastguard Worker HIGHBD_SAD_MXNX3D(8, 32)
385*77c1e3ccSAndroid Build Coastguard Worker HIGHBD_SAD_MXNX3D(32, 8)
386*77c1e3ccSAndroid Build Coastguard Worker HIGHBD_SAD_MXNX3D(16, 64)
387*77c1e3ccSAndroid Build Coastguard Worker HIGHBD_SAD_MXNX3D(64, 16)
388*77c1e3ccSAndroid Build Coastguard Worker #endif // !CONFIG_REALTIME_ONLY
389*77c1e3ccSAndroid Build Coastguard Worker #endif // CONFIG_AV1_HIGHBITDEPTH
390