xref: /aosp_15_r20/external/libvpx/test/dct16x16_test.cc (revision fb1b10ab9aebc7c7068eedab379b749d7e3900be)
1*fb1b10abSAndroid Build Coastguard Worker /*
2*fb1b10abSAndroid Build Coastguard Worker  *  Copyright (c) 2012 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 <math.h>
12*fb1b10abSAndroid Build Coastguard Worker #include <stdlib.h>
13*fb1b10abSAndroid Build Coastguard Worker #include <string.h>
14*fb1b10abSAndroid Build Coastguard Worker #include <tuple>
15*fb1b10abSAndroid Build Coastguard Worker 
16*fb1b10abSAndroid Build Coastguard Worker #include "gtest/gtest.h"
17*fb1b10abSAndroid Build Coastguard Worker 
18*fb1b10abSAndroid Build Coastguard Worker #include "./vp9_rtcd.h"
19*fb1b10abSAndroid Build Coastguard Worker #include "./vpx_dsp_rtcd.h"
20*fb1b10abSAndroid Build Coastguard Worker #include "test/acm_random.h"
21*fb1b10abSAndroid Build Coastguard Worker #include "test/clear_system_state.h"
22*fb1b10abSAndroid Build Coastguard Worker #include "test/register_state_check.h"
23*fb1b10abSAndroid Build Coastguard Worker #include "test/util.h"
24*fb1b10abSAndroid Build Coastguard Worker #include "vp9/common/vp9_entropy.h"
25*fb1b10abSAndroid Build Coastguard Worker #include "vp9/common/vp9_scan.h"
26*fb1b10abSAndroid Build Coastguard Worker #include "vpx/vpx_codec.h"
27*fb1b10abSAndroid Build Coastguard Worker #include "vpx/vpx_integer.h"
28*fb1b10abSAndroid Build Coastguard Worker #include "vpx_config.h"
29*fb1b10abSAndroid Build Coastguard Worker #include "vpx_ports/mem.h"
30*fb1b10abSAndroid Build Coastguard Worker #include "vpx_ports/vpx_timer.h"
31*fb1b10abSAndroid Build Coastguard Worker 
32*fb1b10abSAndroid Build Coastguard Worker using libvpx_test::ACMRandom;
33*fb1b10abSAndroid Build Coastguard Worker 
34*fb1b10abSAndroid Build Coastguard Worker namespace {
35*fb1b10abSAndroid Build Coastguard Worker 
36*fb1b10abSAndroid Build Coastguard Worker const int kNumCoeffs = 256;
37*fb1b10abSAndroid Build Coastguard Worker const double C1 = 0.995184726672197;
38*fb1b10abSAndroid Build Coastguard Worker const double C2 = 0.98078528040323;
39*fb1b10abSAndroid Build Coastguard Worker const double C3 = 0.956940335732209;
40*fb1b10abSAndroid Build Coastguard Worker const double C4 = 0.923879532511287;
41*fb1b10abSAndroid Build Coastguard Worker const double C5 = 0.881921264348355;
42*fb1b10abSAndroid Build Coastguard Worker const double C6 = 0.831469612302545;
43*fb1b10abSAndroid Build Coastguard Worker const double C7 = 0.773010453362737;
44*fb1b10abSAndroid Build Coastguard Worker const double C8 = 0.707106781186548;
45*fb1b10abSAndroid Build Coastguard Worker const double C9 = 0.634393284163646;
46*fb1b10abSAndroid Build Coastguard Worker const double C10 = 0.555570233019602;
47*fb1b10abSAndroid Build Coastguard Worker const double C11 = 0.471396736825998;
48*fb1b10abSAndroid Build Coastguard Worker const double C12 = 0.38268343236509;
49*fb1b10abSAndroid Build Coastguard Worker const double C13 = 0.290284677254462;
50*fb1b10abSAndroid Build Coastguard Worker const double C14 = 0.195090322016128;
51*fb1b10abSAndroid Build Coastguard Worker const double C15 = 0.098017140329561;
52*fb1b10abSAndroid Build Coastguard Worker 
butterfly_16x16_dct_1d(double input[16],double output[16])53*fb1b10abSAndroid Build Coastguard Worker void butterfly_16x16_dct_1d(double input[16], double output[16]) {
54*fb1b10abSAndroid Build Coastguard Worker   double step[16];
55*fb1b10abSAndroid Build Coastguard Worker   double intermediate[16];
56*fb1b10abSAndroid Build Coastguard Worker   double temp1, temp2;
57*fb1b10abSAndroid Build Coastguard Worker 
58*fb1b10abSAndroid Build Coastguard Worker   // step 1
59*fb1b10abSAndroid Build Coastguard Worker   step[0] = input[0] + input[15];
60*fb1b10abSAndroid Build Coastguard Worker   step[1] = input[1] + input[14];
61*fb1b10abSAndroid Build Coastguard Worker   step[2] = input[2] + input[13];
62*fb1b10abSAndroid Build Coastguard Worker   step[3] = input[3] + input[12];
63*fb1b10abSAndroid Build Coastguard Worker   step[4] = input[4] + input[11];
64*fb1b10abSAndroid Build Coastguard Worker   step[5] = input[5] + input[10];
65*fb1b10abSAndroid Build Coastguard Worker   step[6] = input[6] + input[9];
66*fb1b10abSAndroid Build Coastguard Worker   step[7] = input[7] + input[8];
67*fb1b10abSAndroid Build Coastguard Worker   step[8] = input[7] - input[8];
68*fb1b10abSAndroid Build Coastguard Worker   step[9] = input[6] - input[9];
69*fb1b10abSAndroid Build Coastguard Worker   step[10] = input[5] - input[10];
70*fb1b10abSAndroid Build Coastguard Worker   step[11] = input[4] - input[11];
71*fb1b10abSAndroid Build Coastguard Worker   step[12] = input[3] - input[12];
72*fb1b10abSAndroid Build Coastguard Worker   step[13] = input[2] - input[13];
73*fb1b10abSAndroid Build Coastguard Worker   step[14] = input[1] - input[14];
74*fb1b10abSAndroid Build Coastguard Worker   step[15] = input[0] - input[15];
75*fb1b10abSAndroid Build Coastguard Worker 
76*fb1b10abSAndroid Build Coastguard Worker   // step 2
77*fb1b10abSAndroid Build Coastguard Worker   output[0] = step[0] + step[7];
78*fb1b10abSAndroid Build Coastguard Worker   output[1] = step[1] + step[6];
79*fb1b10abSAndroid Build Coastguard Worker   output[2] = step[2] + step[5];
80*fb1b10abSAndroid Build Coastguard Worker   output[3] = step[3] + step[4];
81*fb1b10abSAndroid Build Coastguard Worker   output[4] = step[3] - step[4];
82*fb1b10abSAndroid Build Coastguard Worker   output[5] = step[2] - step[5];
83*fb1b10abSAndroid Build Coastguard Worker   output[6] = step[1] - step[6];
84*fb1b10abSAndroid Build Coastguard Worker   output[7] = step[0] - step[7];
85*fb1b10abSAndroid Build Coastguard Worker 
86*fb1b10abSAndroid Build Coastguard Worker   temp1 = step[8] * C7;
87*fb1b10abSAndroid Build Coastguard Worker   temp2 = step[15] * C9;
88*fb1b10abSAndroid Build Coastguard Worker   output[8] = temp1 + temp2;
89*fb1b10abSAndroid Build Coastguard Worker 
90*fb1b10abSAndroid Build Coastguard Worker   temp1 = step[9] * C11;
91*fb1b10abSAndroid Build Coastguard Worker   temp2 = step[14] * C5;
92*fb1b10abSAndroid Build Coastguard Worker   output[9] = temp1 - temp2;
93*fb1b10abSAndroid Build Coastguard Worker 
94*fb1b10abSAndroid Build Coastguard Worker   temp1 = step[10] * C3;
95*fb1b10abSAndroid Build Coastguard Worker   temp2 = step[13] * C13;
96*fb1b10abSAndroid Build Coastguard Worker   output[10] = temp1 + temp2;
97*fb1b10abSAndroid Build Coastguard Worker 
98*fb1b10abSAndroid Build Coastguard Worker   temp1 = step[11] * C15;
99*fb1b10abSAndroid Build Coastguard Worker   temp2 = step[12] * C1;
100*fb1b10abSAndroid Build Coastguard Worker   output[11] = temp1 - temp2;
101*fb1b10abSAndroid Build Coastguard Worker 
102*fb1b10abSAndroid Build Coastguard Worker   temp1 = step[11] * C1;
103*fb1b10abSAndroid Build Coastguard Worker   temp2 = step[12] * C15;
104*fb1b10abSAndroid Build Coastguard Worker   output[12] = temp2 + temp1;
105*fb1b10abSAndroid Build Coastguard Worker 
106*fb1b10abSAndroid Build Coastguard Worker   temp1 = step[10] * C13;
107*fb1b10abSAndroid Build Coastguard Worker   temp2 = step[13] * C3;
108*fb1b10abSAndroid Build Coastguard Worker   output[13] = temp2 - temp1;
109*fb1b10abSAndroid Build Coastguard Worker 
110*fb1b10abSAndroid Build Coastguard Worker   temp1 = step[9] * C5;
111*fb1b10abSAndroid Build Coastguard Worker   temp2 = step[14] * C11;
112*fb1b10abSAndroid Build Coastguard Worker   output[14] = temp2 + temp1;
113*fb1b10abSAndroid Build Coastguard Worker 
114*fb1b10abSAndroid Build Coastguard Worker   temp1 = step[8] * C9;
115*fb1b10abSAndroid Build Coastguard Worker   temp2 = step[15] * C7;
116*fb1b10abSAndroid Build Coastguard Worker   output[15] = temp2 - temp1;
117*fb1b10abSAndroid Build Coastguard Worker 
118*fb1b10abSAndroid Build Coastguard Worker   // step 3
119*fb1b10abSAndroid Build Coastguard Worker   step[0] = output[0] + output[3];
120*fb1b10abSAndroid Build Coastguard Worker   step[1] = output[1] + output[2];
121*fb1b10abSAndroid Build Coastguard Worker   step[2] = output[1] - output[2];
122*fb1b10abSAndroid Build Coastguard Worker   step[3] = output[0] - output[3];
123*fb1b10abSAndroid Build Coastguard Worker 
124*fb1b10abSAndroid Build Coastguard Worker   temp1 = output[4] * C14;
125*fb1b10abSAndroid Build Coastguard Worker   temp2 = output[7] * C2;
126*fb1b10abSAndroid Build Coastguard Worker   step[4] = temp1 + temp2;
127*fb1b10abSAndroid Build Coastguard Worker 
128*fb1b10abSAndroid Build Coastguard Worker   temp1 = output[5] * C10;
129*fb1b10abSAndroid Build Coastguard Worker   temp2 = output[6] * C6;
130*fb1b10abSAndroid Build Coastguard Worker   step[5] = temp1 + temp2;
131*fb1b10abSAndroid Build Coastguard Worker 
132*fb1b10abSAndroid Build Coastguard Worker   temp1 = output[5] * C6;
133*fb1b10abSAndroid Build Coastguard Worker   temp2 = output[6] * C10;
134*fb1b10abSAndroid Build Coastguard Worker   step[6] = temp2 - temp1;
135*fb1b10abSAndroid Build Coastguard Worker 
136*fb1b10abSAndroid Build Coastguard Worker   temp1 = output[4] * C2;
137*fb1b10abSAndroid Build Coastguard Worker   temp2 = output[7] * C14;
138*fb1b10abSAndroid Build Coastguard Worker   step[7] = temp2 - temp1;
139*fb1b10abSAndroid Build Coastguard Worker 
140*fb1b10abSAndroid Build Coastguard Worker   step[8] = output[8] + output[11];
141*fb1b10abSAndroid Build Coastguard Worker   step[9] = output[9] + output[10];
142*fb1b10abSAndroid Build Coastguard Worker   step[10] = output[9] - output[10];
143*fb1b10abSAndroid Build Coastguard Worker   step[11] = output[8] - output[11];
144*fb1b10abSAndroid Build Coastguard Worker 
145*fb1b10abSAndroid Build Coastguard Worker   step[12] = output[12] + output[15];
146*fb1b10abSAndroid Build Coastguard Worker   step[13] = output[13] + output[14];
147*fb1b10abSAndroid Build Coastguard Worker   step[14] = output[13] - output[14];
148*fb1b10abSAndroid Build Coastguard Worker   step[15] = output[12] - output[15];
149*fb1b10abSAndroid Build Coastguard Worker 
150*fb1b10abSAndroid Build Coastguard Worker   // step 4
151*fb1b10abSAndroid Build Coastguard Worker   output[0] = (step[0] + step[1]);
152*fb1b10abSAndroid Build Coastguard Worker   output[8] = (step[0] - step[1]);
153*fb1b10abSAndroid Build Coastguard Worker 
154*fb1b10abSAndroid Build Coastguard Worker   temp1 = step[2] * C12;
155*fb1b10abSAndroid Build Coastguard Worker   temp2 = step[3] * C4;
156*fb1b10abSAndroid Build Coastguard Worker   temp1 = temp1 + temp2;
157*fb1b10abSAndroid Build Coastguard Worker   output[4] = 2 * (temp1 * C8);
158*fb1b10abSAndroid Build Coastguard Worker 
159*fb1b10abSAndroid Build Coastguard Worker   temp1 = step[2] * C4;
160*fb1b10abSAndroid Build Coastguard Worker   temp2 = step[3] * C12;
161*fb1b10abSAndroid Build Coastguard Worker   temp1 = temp2 - temp1;
162*fb1b10abSAndroid Build Coastguard Worker   output[12] = 2 * (temp1 * C8);
163*fb1b10abSAndroid Build Coastguard Worker 
164*fb1b10abSAndroid Build Coastguard Worker   output[2] = 2 * ((step[4] + step[5]) * C8);
165*fb1b10abSAndroid Build Coastguard Worker   output[14] = 2 * ((step[7] - step[6]) * C8);
166*fb1b10abSAndroid Build Coastguard Worker 
167*fb1b10abSAndroid Build Coastguard Worker   temp1 = step[4] - step[5];
168*fb1b10abSAndroid Build Coastguard Worker   temp2 = step[6] + step[7];
169*fb1b10abSAndroid Build Coastguard Worker   output[6] = (temp1 + temp2);
170*fb1b10abSAndroid Build Coastguard Worker   output[10] = (temp1 - temp2);
171*fb1b10abSAndroid Build Coastguard Worker 
172*fb1b10abSAndroid Build Coastguard Worker   intermediate[8] = step[8] + step[14];
173*fb1b10abSAndroid Build Coastguard Worker   intermediate[9] = step[9] + step[15];
174*fb1b10abSAndroid Build Coastguard Worker 
175*fb1b10abSAndroid Build Coastguard Worker   temp1 = intermediate[8] * C12;
176*fb1b10abSAndroid Build Coastguard Worker   temp2 = intermediate[9] * C4;
177*fb1b10abSAndroid Build Coastguard Worker   temp1 = temp1 - temp2;
178*fb1b10abSAndroid Build Coastguard Worker   output[3] = 2 * (temp1 * C8);
179*fb1b10abSAndroid Build Coastguard Worker 
180*fb1b10abSAndroid Build Coastguard Worker   temp1 = intermediate[8] * C4;
181*fb1b10abSAndroid Build Coastguard Worker   temp2 = intermediate[9] * C12;
182*fb1b10abSAndroid Build Coastguard Worker   temp1 = temp2 + temp1;
183*fb1b10abSAndroid Build Coastguard Worker   output[13] = 2 * (temp1 * C8);
184*fb1b10abSAndroid Build Coastguard Worker 
185*fb1b10abSAndroid Build Coastguard Worker   output[9] = 2 * ((step[10] + step[11]) * C8);
186*fb1b10abSAndroid Build Coastguard Worker 
187*fb1b10abSAndroid Build Coastguard Worker   intermediate[11] = step[10] - step[11];
188*fb1b10abSAndroid Build Coastguard Worker   intermediate[12] = step[12] + step[13];
189*fb1b10abSAndroid Build Coastguard Worker   intermediate[13] = step[12] - step[13];
190*fb1b10abSAndroid Build Coastguard Worker   intermediate[14] = step[8] - step[14];
191*fb1b10abSAndroid Build Coastguard Worker   intermediate[15] = step[9] - step[15];
192*fb1b10abSAndroid Build Coastguard Worker 
193*fb1b10abSAndroid Build Coastguard Worker   output[15] = (intermediate[11] + intermediate[12]);
194*fb1b10abSAndroid Build Coastguard Worker   output[1] = -(intermediate[11] - intermediate[12]);
195*fb1b10abSAndroid Build Coastguard Worker 
196*fb1b10abSAndroid Build Coastguard Worker   output[7] = 2 * (intermediate[13] * C8);
197*fb1b10abSAndroid Build Coastguard Worker 
198*fb1b10abSAndroid Build Coastguard Worker   temp1 = intermediate[14] * C12;
199*fb1b10abSAndroid Build Coastguard Worker   temp2 = intermediate[15] * C4;
200*fb1b10abSAndroid Build Coastguard Worker   temp1 = temp1 - temp2;
201*fb1b10abSAndroid Build Coastguard Worker   output[11] = -2 * (temp1 * C8);
202*fb1b10abSAndroid Build Coastguard Worker 
203*fb1b10abSAndroid Build Coastguard Worker   temp1 = intermediate[14] * C4;
204*fb1b10abSAndroid Build Coastguard Worker   temp2 = intermediate[15] * C12;
205*fb1b10abSAndroid Build Coastguard Worker   temp1 = temp2 + temp1;
206*fb1b10abSAndroid Build Coastguard Worker   output[5] = 2 * (temp1 * C8);
207*fb1b10abSAndroid Build Coastguard Worker }
208*fb1b10abSAndroid Build Coastguard Worker 
reference_16x16_dct_2d(int16_t input[256],double output[256])209*fb1b10abSAndroid Build Coastguard Worker void reference_16x16_dct_2d(int16_t input[256], double output[256]) {
210*fb1b10abSAndroid Build Coastguard Worker   // First transform columns
211*fb1b10abSAndroid Build Coastguard Worker   for (int i = 0; i < 16; ++i) {
212*fb1b10abSAndroid Build Coastguard Worker     double temp_in[16], temp_out[16];
213*fb1b10abSAndroid Build Coastguard Worker     for (int j = 0; j < 16; ++j) temp_in[j] = input[j * 16 + i];
214*fb1b10abSAndroid Build Coastguard Worker     butterfly_16x16_dct_1d(temp_in, temp_out);
215*fb1b10abSAndroid Build Coastguard Worker     for (int j = 0; j < 16; ++j) output[j * 16 + i] = temp_out[j];
216*fb1b10abSAndroid Build Coastguard Worker   }
217*fb1b10abSAndroid Build Coastguard Worker   // Then transform rows
218*fb1b10abSAndroid Build Coastguard Worker   for (int i = 0; i < 16; ++i) {
219*fb1b10abSAndroid Build Coastguard Worker     double temp_in[16], temp_out[16];
220*fb1b10abSAndroid Build Coastguard Worker     for (int j = 0; j < 16; ++j) temp_in[j] = output[j + i * 16];
221*fb1b10abSAndroid Build Coastguard Worker     butterfly_16x16_dct_1d(temp_in, temp_out);
222*fb1b10abSAndroid Build Coastguard Worker     // Scale by some magic number
223*fb1b10abSAndroid Build Coastguard Worker     for (int j = 0; j < 16; ++j) output[j + i * 16] = temp_out[j] / 2;
224*fb1b10abSAndroid Build Coastguard Worker   }
225*fb1b10abSAndroid Build Coastguard Worker }
226*fb1b10abSAndroid Build Coastguard Worker 
227*fb1b10abSAndroid Build Coastguard Worker typedef void (*FdctFunc)(const int16_t *in, tran_low_t *out, int stride);
228*fb1b10abSAndroid Build Coastguard Worker typedef void (*IdctFunc)(const tran_low_t *in, uint8_t *out, int stride);
229*fb1b10abSAndroid Build Coastguard Worker typedef void (*FhtFunc)(const int16_t *in, tran_low_t *out, int stride,
230*fb1b10abSAndroid Build Coastguard Worker                         int tx_type);
231*fb1b10abSAndroid Build Coastguard Worker typedef void (*IhtFunc)(const tran_low_t *in, uint8_t *out, int stride,
232*fb1b10abSAndroid Build Coastguard Worker                         int tx_type);
233*fb1b10abSAndroid Build Coastguard Worker 
234*fb1b10abSAndroid Build Coastguard Worker typedef std::tuple<FdctFunc, IdctFunc, int, vpx_bit_depth_t> Dct16x16Param;
235*fb1b10abSAndroid Build Coastguard Worker typedef std::tuple<FhtFunc, IhtFunc, int, vpx_bit_depth_t> Ht16x16Param;
236*fb1b10abSAndroid Build Coastguard Worker typedef std::tuple<IdctFunc, IdctFunc, int, vpx_bit_depth_t> Idct16x16Param;
237*fb1b10abSAndroid Build Coastguard Worker 
fdct16x16_ref(const int16_t * in,tran_low_t * out,int stride,int)238*fb1b10abSAndroid Build Coastguard Worker void fdct16x16_ref(const int16_t *in, tran_low_t *out, int stride,
239*fb1b10abSAndroid Build Coastguard Worker                    int /*tx_type*/) {
240*fb1b10abSAndroid Build Coastguard Worker   vpx_fdct16x16_c(in, out, stride);
241*fb1b10abSAndroid Build Coastguard Worker }
242*fb1b10abSAndroid Build Coastguard Worker 
idct16x16_ref(const tran_low_t * in,uint8_t * dest,int stride,int)243*fb1b10abSAndroid Build Coastguard Worker void idct16x16_ref(const tran_low_t *in, uint8_t *dest, int stride,
244*fb1b10abSAndroid Build Coastguard Worker                    int /*tx_type*/) {
245*fb1b10abSAndroid Build Coastguard Worker   vpx_idct16x16_256_add_c(in, dest, stride);
246*fb1b10abSAndroid Build Coastguard Worker }
247*fb1b10abSAndroid Build Coastguard Worker 
fht16x16_ref(const int16_t * in,tran_low_t * out,int stride,int tx_type)248*fb1b10abSAndroid Build Coastguard Worker void fht16x16_ref(const int16_t *in, tran_low_t *out, int stride, int tx_type) {
249*fb1b10abSAndroid Build Coastguard Worker   vp9_fht16x16_c(in, out, stride, tx_type);
250*fb1b10abSAndroid Build Coastguard Worker }
251*fb1b10abSAndroid Build Coastguard Worker 
iht16x16_ref(const tran_low_t * in,uint8_t * dest,int stride,int tx_type)252*fb1b10abSAndroid Build Coastguard Worker void iht16x16_ref(const tran_low_t *in, uint8_t *dest, int stride,
253*fb1b10abSAndroid Build Coastguard Worker                   int tx_type) {
254*fb1b10abSAndroid Build Coastguard Worker   vp9_iht16x16_256_add_c(in, dest, stride, tx_type);
255*fb1b10abSAndroid Build Coastguard Worker }
256*fb1b10abSAndroid Build Coastguard Worker 
257*fb1b10abSAndroid Build Coastguard Worker #if CONFIG_VP9_HIGHBITDEPTH
idct16x16_10(const tran_low_t * in,uint8_t * out,int stride)258*fb1b10abSAndroid Build Coastguard Worker void idct16x16_10(const tran_low_t *in, uint8_t *out, int stride) {
259*fb1b10abSAndroid Build Coastguard Worker   vpx_highbd_idct16x16_256_add_c(in, CAST_TO_SHORTPTR(out), stride, 10);
260*fb1b10abSAndroid Build Coastguard Worker }
261*fb1b10abSAndroid Build Coastguard Worker 
idct16x16_12(const tran_low_t * in,uint8_t * out,int stride)262*fb1b10abSAndroid Build Coastguard Worker void idct16x16_12(const tran_low_t *in, uint8_t *out, int stride) {
263*fb1b10abSAndroid Build Coastguard Worker   vpx_highbd_idct16x16_256_add_c(in, CAST_TO_SHORTPTR(out), stride, 12);
264*fb1b10abSAndroid Build Coastguard Worker }
265*fb1b10abSAndroid Build Coastguard Worker 
idct16x16_10_ref(const tran_low_t * in,uint8_t * out,int stride,int)266*fb1b10abSAndroid Build Coastguard Worker void idct16x16_10_ref(const tran_low_t *in, uint8_t *out, int stride,
267*fb1b10abSAndroid Build Coastguard Worker                       int /*tx_type*/) {
268*fb1b10abSAndroid Build Coastguard Worker   idct16x16_10(in, out, stride);
269*fb1b10abSAndroid Build Coastguard Worker }
270*fb1b10abSAndroid Build Coastguard Worker 
idct16x16_12_ref(const tran_low_t * in,uint8_t * out,int stride,int)271*fb1b10abSAndroid Build Coastguard Worker void idct16x16_12_ref(const tran_low_t *in, uint8_t *out, int stride,
272*fb1b10abSAndroid Build Coastguard Worker                       int /*tx_type*/) {
273*fb1b10abSAndroid Build Coastguard Worker   idct16x16_12(in, out, stride);
274*fb1b10abSAndroid Build Coastguard Worker }
275*fb1b10abSAndroid Build Coastguard Worker 
iht16x16_10(const tran_low_t * in,uint8_t * out,int stride,int tx_type)276*fb1b10abSAndroid Build Coastguard Worker void iht16x16_10(const tran_low_t *in, uint8_t *out, int stride, int tx_type) {
277*fb1b10abSAndroid Build Coastguard Worker   vp9_highbd_iht16x16_256_add_c(in, CAST_TO_SHORTPTR(out), stride, tx_type, 10);
278*fb1b10abSAndroid Build Coastguard Worker }
279*fb1b10abSAndroid Build Coastguard Worker 
iht16x16_12(const tran_low_t * in,uint8_t * out,int stride,int tx_type)280*fb1b10abSAndroid Build Coastguard Worker void iht16x16_12(const tran_low_t *in, uint8_t *out, int stride, int tx_type) {
281*fb1b10abSAndroid Build Coastguard Worker   vp9_highbd_iht16x16_256_add_c(in, CAST_TO_SHORTPTR(out), stride, tx_type, 12);
282*fb1b10abSAndroid Build Coastguard Worker }
283*fb1b10abSAndroid Build Coastguard Worker 
284*fb1b10abSAndroid Build Coastguard Worker #if HAVE_SSE2
idct16x16_10_add_10_c(const tran_low_t * in,uint8_t * out,int stride)285*fb1b10abSAndroid Build Coastguard Worker void idct16x16_10_add_10_c(const tran_low_t *in, uint8_t *out, int stride) {
286*fb1b10abSAndroid Build Coastguard Worker   vpx_highbd_idct16x16_10_add_c(in, CAST_TO_SHORTPTR(out), stride, 10);
287*fb1b10abSAndroid Build Coastguard Worker }
288*fb1b10abSAndroid Build Coastguard Worker 
idct16x16_10_add_12_c(const tran_low_t * in,uint8_t * out,int stride)289*fb1b10abSAndroid Build Coastguard Worker void idct16x16_10_add_12_c(const tran_low_t *in, uint8_t *out, int stride) {
290*fb1b10abSAndroid Build Coastguard Worker   vpx_highbd_idct16x16_10_add_c(in, CAST_TO_SHORTPTR(out), stride, 12);
291*fb1b10abSAndroid Build Coastguard Worker }
292*fb1b10abSAndroid Build Coastguard Worker 
idct16x16_256_add_10_sse2(const tran_low_t * in,uint8_t * out,int stride)293*fb1b10abSAndroid Build Coastguard Worker void idct16x16_256_add_10_sse2(const tran_low_t *in, uint8_t *out, int stride) {
294*fb1b10abSAndroid Build Coastguard Worker   vpx_highbd_idct16x16_256_add_sse2(in, CAST_TO_SHORTPTR(out), stride, 10);
295*fb1b10abSAndroid Build Coastguard Worker }
296*fb1b10abSAndroid Build Coastguard Worker 
idct16x16_256_add_12_sse2(const tran_low_t * in,uint8_t * out,int stride)297*fb1b10abSAndroid Build Coastguard Worker void idct16x16_256_add_12_sse2(const tran_low_t *in, uint8_t *out, int stride) {
298*fb1b10abSAndroid Build Coastguard Worker   vpx_highbd_idct16x16_256_add_sse2(in, CAST_TO_SHORTPTR(out), stride, 12);
299*fb1b10abSAndroid Build Coastguard Worker }
300*fb1b10abSAndroid Build Coastguard Worker 
idct16x16_10_add_10_sse2(const tran_low_t * in,uint8_t * out,int stride)301*fb1b10abSAndroid Build Coastguard Worker void idct16x16_10_add_10_sse2(const tran_low_t *in, uint8_t *out, int stride) {
302*fb1b10abSAndroid Build Coastguard Worker   vpx_highbd_idct16x16_10_add_sse2(in, CAST_TO_SHORTPTR(out), stride, 10);
303*fb1b10abSAndroid Build Coastguard Worker }
304*fb1b10abSAndroid Build Coastguard Worker 
idct16x16_10_add_12_sse2(const tran_low_t * in,uint8_t * out,int stride)305*fb1b10abSAndroid Build Coastguard Worker void idct16x16_10_add_12_sse2(const tran_low_t *in, uint8_t *out, int stride) {
306*fb1b10abSAndroid Build Coastguard Worker   vpx_highbd_idct16x16_10_add_sse2(in, CAST_TO_SHORTPTR(out), stride, 12);
307*fb1b10abSAndroid Build Coastguard Worker }
308*fb1b10abSAndroid Build Coastguard Worker #endif  // HAVE_SSE2
309*fb1b10abSAndroid Build Coastguard Worker #endif  // CONFIG_VP9_HIGHBITDEPTH
310*fb1b10abSAndroid Build Coastguard Worker 
311*fb1b10abSAndroid Build Coastguard Worker class Trans16x16TestBase {
312*fb1b10abSAndroid Build Coastguard Worker  public:
313*fb1b10abSAndroid Build Coastguard Worker   virtual ~Trans16x16TestBase() = default;
314*fb1b10abSAndroid Build Coastguard Worker 
315*fb1b10abSAndroid Build Coastguard Worker  protected:
316*fb1b10abSAndroid Build Coastguard Worker   virtual void RunFwdTxfm(int16_t *in, tran_low_t *out, int stride) = 0;
317*fb1b10abSAndroid Build Coastguard Worker 
318*fb1b10abSAndroid Build Coastguard Worker   virtual void RunInvTxfm(tran_low_t *out, uint8_t *dst, int stride) = 0;
319*fb1b10abSAndroid Build Coastguard Worker 
RunAccuracyCheck()320*fb1b10abSAndroid Build Coastguard Worker   void RunAccuracyCheck() {
321*fb1b10abSAndroid Build Coastguard Worker     ACMRandom rnd(ACMRandom::DeterministicSeed());
322*fb1b10abSAndroid Build Coastguard Worker     uint32_t max_error = 0;
323*fb1b10abSAndroid Build Coastguard Worker     int64_t total_error = 0;
324*fb1b10abSAndroid Build Coastguard Worker     const int count_test_block = 10000;
325*fb1b10abSAndroid Build Coastguard Worker     for (int i = 0; i < count_test_block; ++i) {
326*fb1b10abSAndroid Build Coastguard Worker       DECLARE_ALIGNED(16, int16_t, test_input_block[kNumCoeffs]);
327*fb1b10abSAndroid Build Coastguard Worker       DECLARE_ALIGNED(16, tran_low_t, test_temp_block[kNumCoeffs]);
328*fb1b10abSAndroid Build Coastguard Worker       DECLARE_ALIGNED(16, uint8_t, dst[kNumCoeffs]);
329*fb1b10abSAndroid Build Coastguard Worker       DECLARE_ALIGNED(16, uint8_t, src[kNumCoeffs]);
330*fb1b10abSAndroid Build Coastguard Worker #if CONFIG_VP9_HIGHBITDEPTH
331*fb1b10abSAndroid Build Coastguard Worker       DECLARE_ALIGNED(16, uint16_t, dst16[kNumCoeffs]);
332*fb1b10abSAndroid Build Coastguard Worker       DECLARE_ALIGNED(16, uint16_t, src16[kNumCoeffs]);
333*fb1b10abSAndroid Build Coastguard Worker #endif
334*fb1b10abSAndroid Build Coastguard Worker 
335*fb1b10abSAndroid Build Coastguard Worker       // Initialize a test block with input range [-mask_, mask_].
336*fb1b10abSAndroid Build Coastguard Worker       for (int j = 0; j < kNumCoeffs; ++j) {
337*fb1b10abSAndroid Build Coastguard Worker         if (bit_depth_ == VPX_BITS_8) {
338*fb1b10abSAndroid Build Coastguard Worker           src[j] = rnd.Rand8();
339*fb1b10abSAndroid Build Coastguard Worker           dst[j] = rnd.Rand8();
340*fb1b10abSAndroid Build Coastguard Worker           test_input_block[j] = src[j] - dst[j];
341*fb1b10abSAndroid Build Coastguard Worker #if CONFIG_VP9_HIGHBITDEPTH
342*fb1b10abSAndroid Build Coastguard Worker         } else {
343*fb1b10abSAndroid Build Coastguard Worker           src16[j] = rnd.Rand16() & mask_;
344*fb1b10abSAndroid Build Coastguard Worker           dst16[j] = rnd.Rand16() & mask_;
345*fb1b10abSAndroid Build Coastguard Worker           test_input_block[j] = src16[j] - dst16[j];
346*fb1b10abSAndroid Build Coastguard Worker #endif
347*fb1b10abSAndroid Build Coastguard Worker         }
348*fb1b10abSAndroid Build Coastguard Worker       }
349*fb1b10abSAndroid Build Coastguard Worker 
350*fb1b10abSAndroid Build Coastguard Worker       ASM_REGISTER_STATE_CHECK(
351*fb1b10abSAndroid Build Coastguard Worker           RunFwdTxfm(test_input_block, test_temp_block, pitch_));
352*fb1b10abSAndroid Build Coastguard Worker       if (bit_depth_ == VPX_BITS_8) {
353*fb1b10abSAndroid Build Coastguard Worker         ASM_REGISTER_STATE_CHECK(RunInvTxfm(test_temp_block, dst, pitch_));
354*fb1b10abSAndroid Build Coastguard Worker #if CONFIG_VP9_HIGHBITDEPTH
355*fb1b10abSAndroid Build Coastguard Worker       } else {
356*fb1b10abSAndroid Build Coastguard Worker         ASM_REGISTER_STATE_CHECK(
357*fb1b10abSAndroid Build Coastguard Worker             RunInvTxfm(test_temp_block, CAST_TO_BYTEPTR(dst16), pitch_));
358*fb1b10abSAndroid Build Coastguard Worker #endif
359*fb1b10abSAndroid Build Coastguard Worker       }
360*fb1b10abSAndroid Build Coastguard Worker 
361*fb1b10abSAndroid Build Coastguard Worker       for (int j = 0; j < kNumCoeffs; ++j) {
362*fb1b10abSAndroid Build Coastguard Worker #if CONFIG_VP9_HIGHBITDEPTH
363*fb1b10abSAndroid Build Coastguard Worker         const int32_t diff =
364*fb1b10abSAndroid Build Coastguard Worker             bit_depth_ == VPX_BITS_8 ? dst[j] - src[j] : dst16[j] - src16[j];
365*fb1b10abSAndroid Build Coastguard Worker #else
366*fb1b10abSAndroid Build Coastguard Worker         const int32_t diff = dst[j] - src[j];
367*fb1b10abSAndroid Build Coastguard Worker #endif
368*fb1b10abSAndroid Build Coastguard Worker         const uint32_t error = diff * diff;
369*fb1b10abSAndroid Build Coastguard Worker         if (max_error < error) max_error = error;
370*fb1b10abSAndroid Build Coastguard Worker         total_error += error;
371*fb1b10abSAndroid Build Coastguard Worker       }
372*fb1b10abSAndroid Build Coastguard Worker     }
373*fb1b10abSAndroid Build Coastguard Worker 
374*fb1b10abSAndroid Build Coastguard Worker     EXPECT_GE(1u << 2 * (bit_depth_ - 8), max_error)
375*fb1b10abSAndroid Build Coastguard Worker         << "Error: 16x16 FHT/IHT has an individual round trip error > 1";
376*fb1b10abSAndroid Build Coastguard Worker 
377*fb1b10abSAndroid Build Coastguard Worker     EXPECT_GE(count_test_block << 2 * (bit_depth_ - 8), total_error)
378*fb1b10abSAndroid Build Coastguard Worker         << "Error: 16x16 FHT/IHT has average round trip error > 1 per block";
379*fb1b10abSAndroid Build Coastguard Worker   }
380*fb1b10abSAndroid Build Coastguard Worker 
RunCoeffCheck()381*fb1b10abSAndroid Build Coastguard Worker   void RunCoeffCheck() {
382*fb1b10abSAndroid Build Coastguard Worker     ACMRandom rnd(ACMRandom::DeterministicSeed());
383*fb1b10abSAndroid Build Coastguard Worker     const int count_test_block = 1000;
384*fb1b10abSAndroid Build Coastguard Worker     DECLARE_ALIGNED(16, int16_t, input_block[kNumCoeffs]);
385*fb1b10abSAndroid Build Coastguard Worker     DECLARE_ALIGNED(16, tran_low_t, output_ref_block[kNumCoeffs]);
386*fb1b10abSAndroid Build Coastguard Worker     DECLARE_ALIGNED(16, tran_low_t, output_block[kNumCoeffs]);
387*fb1b10abSAndroid Build Coastguard Worker 
388*fb1b10abSAndroid Build Coastguard Worker     for (int i = 0; i < count_test_block; ++i) {
389*fb1b10abSAndroid Build Coastguard Worker       // Initialize a test block with input range [-mask_, mask_].
390*fb1b10abSAndroid Build Coastguard Worker       for (int j = 0; j < kNumCoeffs; ++j) {
391*fb1b10abSAndroid Build Coastguard Worker         input_block[j] = (rnd.Rand16() & mask_) - (rnd.Rand16() & mask_);
392*fb1b10abSAndroid Build Coastguard Worker       }
393*fb1b10abSAndroid Build Coastguard Worker 
394*fb1b10abSAndroid Build Coastguard Worker       fwd_txfm_ref(input_block, output_ref_block, pitch_, tx_type_);
395*fb1b10abSAndroid Build Coastguard Worker       ASM_REGISTER_STATE_CHECK(RunFwdTxfm(input_block, output_block, pitch_));
396*fb1b10abSAndroid Build Coastguard Worker 
397*fb1b10abSAndroid Build Coastguard Worker       // The minimum quant value is 4.
398*fb1b10abSAndroid Build Coastguard Worker       for (int j = 0; j < kNumCoeffs; ++j)
399*fb1b10abSAndroid Build Coastguard Worker         EXPECT_EQ(output_block[j], output_ref_block[j]);
400*fb1b10abSAndroid Build Coastguard Worker     }
401*fb1b10abSAndroid Build Coastguard Worker   }
402*fb1b10abSAndroid Build Coastguard Worker 
RunMemCheck()403*fb1b10abSAndroid Build Coastguard Worker   void RunMemCheck() {
404*fb1b10abSAndroid Build Coastguard Worker     ACMRandom rnd(ACMRandom::DeterministicSeed());
405*fb1b10abSAndroid Build Coastguard Worker     const int count_test_block = 1000;
406*fb1b10abSAndroid Build Coastguard Worker     DECLARE_ALIGNED(16, int16_t, input_extreme_block[kNumCoeffs]);
407*fb1b10abSAndroid Build Coastguard Worker     DECLARE_ALIGNED(16, tran_low_t, output_ref_block[kNumCoeffs]);
408*fb1b10abSAndroid Build Coastguard Worker     DECLARE_ALIGNED(16, tran_low_t, output_block[kNumCoeffs]);
409*fb1b10abSAndroid Build Coastguard Worker 
410*fb1b10abSAndroid Build Coastguard Worker     for (int i = 0; i < count_test_block; ++i) {
411*fb1b10abSAndroid Build Coastguard Worker       // Initialize a test block with input range [-mask_, mask_].
412*fb1b10abSAndroid Build Coastguard Worker       for (int j = 0; j < kNumCoeffs; ++j) {
413*fb1b10abSAndroid Build Coastguard Worker         input_extreme_block[j] = rnd.Rand8() % 2 ? mask_ : -mask_;
414*fb1b10abSAndroid Build Coastguard Worker       }
415*fb1b10abSAndroid Build Coastguard Worker       if (i == 0) {
416*fb1b10abSAndroid Build Coastguard Worker         for (int j = 0; j < kNumCoeffs; ++j) input_extreme_block[j] = mask_;
417*fb1b10abSAndroid Build Coastguard Worker       } else if (i == 1) {
418*fb1b10abSAndroid Build Coastguard Worker         for (int j = 0; j < kNumCoeffs; ++j) input_extreme_block[j] = -mask_;
419*fb1b10abSAndroid Build Coastguard Worker       }
420*fb1b10abSAndroid Build Coastguard Worker 
421*fb1b10abSAndroid Build Coastguard Worker       fwd_txfm_ref(input_extreme_block, output_ref_block, pitch_, tx_type_);
422*fb1b10abSAndroid Build Coastguard Worker       ASM_REGISTER_STATE_CHECK(
423*fb1b10abSAndroid Build Coastguard Worker           RunFwdTxfm(input_extreme_block, output_block, pitch_));
424*fb1b10abSAndroid Build Coastguard Worker 
425*fb1b10abSAndroid Build Coastguard Worker       // The minimum quant value is 4.
426*fb1b10abSAndroid Build Coastguard Worker       for (int j = 0; j < kNumCoeffs; ++j) {
427*fb1b10abSAndroid Build Coastguard Worker         EXPECT_EQ(output_block[j], output_ref_block[j]);
428*fb1b10abSAndroid Build Coastguard Worker         EXPECT_GE(4 * DCT_MAX_VALUE << (bit_depth_ - 8), abs(output_block[j]))
429*fb1b10abSAndroid Build Coastguard Worker             << "Error: 16x16 FDCT has coefficient larger than 4*DCT_MAX_VALUE";
430*fb1b10abSAndroid Build Coastguard Worker       }
431*fb1b10abSAndroid Build Coastguard Worker     }
432*fb1b10abSAndroid Build Coastguard Worker   }
433*fb1b10abSAndroid Build Coastguard Worker 
RunQuantCheck(int dc_thred,int ac_thred)434*fb1b10abSAndroid Build Coastguard Worker   void RunQuantCheck(int dc_thred, int ac_thred) {
435*fb1b10abSAndroid Build Coastguard Worker     ACMRandom rnd(ACMRandom::DeterministicSeed());
436*fb1b10abSAndroid Build Coastguard Worker     const int count_test_block = 100000;
437*fb1b10abSAndroid Build Coastguard Worker     DECLARE_ALIGNED(16, int16_t, input_extreme_block[kNumCoeffs]);
438*fb1b10abSAndroid Build Coastguard Worker     DECLARE_ALIGNED(16, tran_low_t, output_ref_block[kNumCoeffs]);
439*fb1b10abSAndroid Build Coastguard Worker 
440*fb1b10abSAndroid Build Coastguard Worker     DECLARE_ALIGNED(16, uint8_t, dst[kNumCoeffs]);
441*fb1b10abSAndroid Build Coastguard Worker     DECLARE_ALIGNED(16, uint8_t, ref[kNumCoeffs]);
442*fb1b10abSAndroid Build Coastguard Worker #if CONFIG_VP9_HIGHBITDEPTH
443*fb1b10abSAndroid Build Coastguard Worker     DECLARE_ALIGNED(16, uint16_t, dst16[kNumCoeffs]);
444*fb1b10abSAndroid Build Coastguard Worker     DECLARE_ALIGNED(16, uint16_t, ref16[kNumCoeffs]);
445*fb1b10abSAndroid Build Coastguard Worker #endif
446*fb1b10abSAndroid Build Coastguard Worker 
447*fb1b10abSAndroid Build Coastguard Worker     for (int i = 0; i < count_test_block; ++i) {
448*fb1b10abSAndroid Build Coastguard Worker       // Initialize a test block with input range [-mask_, mask_].
449*fb1b10abSAndroid Build Coastguard Worker       for (int j = 0; j < kNumCoeffs; ++j) {
450*fb1b10abSAndroid Build Coastguard Worker         input_extreme_block[j] = rnd.Rand8() % 2 ? mask_ : -mask_;
451*fb1b10abSAndroid Build Coastguard Worker       }
452*fb1b10abSAndroid Build Coastguard Worker       if (i == 0) {
453*fb1b10abSAndroid Build Coastguard Worker         for (int j = 0; j < kNumCoeffs; ++j) input_extreme_block[j] = mask_;
454*fb1b10abSAndroid Build Coastguard Worker       }
455*fb1b10abSAndroid Build Coastguard Worker       if (i == 1) {
456*fb1b10abSAndroid Build Coastguard Worker         for (int j = 0; j < kNumCoeffs; ++j) input_extreme_block[j] = -mask_;
457*fb1b10abSAndroid Build Coastguard Worker       }
458*fb1b10abSAndroid Build Coastguard Worker 
459*fb1b10abSAndroid Build Coastguard Worker       fwd_txfm_ref(input_extreme_block, output_ref_block, pitch_, tx_type_);
460*fb1b10abSAndroid Build Coastguard Worker 
461*fb1b10abSAndroid Build Coastguard Worker       // clear reconstructed pixel buffers
462*fb1b10abSAndroid Build Coastguard Worker       memset(dst, 0, kNumCoeffs * sizeof(uint8_t));
463*fb1b10abSAndroid Build Coastguard Worker       memset(ref, 0, kNumCoeffs * sizeof(uint8_t));
464*fb1b10abSAndroid Build Coastguard Worker #if CONFIG_VP9_HIGHBITDEPTH
465*fb1b10abSAndroid Build Coastguard Worker       memset(dst16, 0, kNumCoeffs * sizeof(uint16_t));
466*fb1b10abSAndroid Build Coastguard Worker       memset(ref16, 0, kNumCoeffs * sizeof(uint16_t));
467*fb1b10abSAndroid Build Coastguard Worker #endif
468*fb1b10abSAndroid Build Coastguard Worker 
469*fb1b10abSAndroid Build Coastguard Worker       // quantization with maximum allowed step sizes
470*fb1b10abSAndroid Build Coastguard Worker       output_ref_block[0] = (output_ref_block[0] / dc_thred) * dc_thred;
471*fb1b10abSAndroid Build Coastguard Worker       for (int j = 1; j < kNumCoeffs; ++j) {
472*fb1b10abSAndroid Build Coastguard Worker         output_ref_block[j] = (output_ref_block[j] / ac_thred) * ac_thred;
473*fb1b10abSAndroid Build Coastguard Worker       }
474*fb1b10abSAndroid Build Coastguard Worker       if (bit_depth_ == VPX_BITS_8) {
475*fb1b10abSAndroid Build Coastguard Worker         inv_txfm_ref(output_ref_block, ref, pitch_, tx_type_);
476*fb1b10abSAndroid Build Coastguard Worker         ASM_REGISTER_STATE_CHECK(RunInvTxfm(output_ref_block, dst, pitch_));
477*fb1b10abSAndroid Build Coastguard Worker #if CONFIG_VP9_HIGHBITDEPTH
478*fb1b10abSAndroid Build Coastguard Worker       } else {
479*fb1b10abSAndroid Build Coastguard Worker         inv_txfm_ref(output_ref_block, CAST_TO_BYTEPTR(ref16), pitch_,
480*fb1b10abSAndroid Build Coastguard Worker                      tx_type_);
481*fb1b10abSAndroid Build Coastguard Worker         ASM_REGISTER_STATE_CHECK(
482*fb1b10abSAndroid Build Coastguard Worker             RunInvTxfm(output_ref_block, CAST_TO_BYTEPTR(dst16), pitch_));
483*fb1b10abSAndroid Build Coastguard Worker #endif
484*fb1b10abSAndroid Build Coastguard Worker       }
485*fb1b10abSAndroid Build Coastguard Worker       if (bit_depth_ == VPX_BITS_8) {
486*fb1b10abSAndroid Build Coastguard Worker         for (int j = 0; j < kNumCoeffs; ++j) EXPECT_EQ(ref[j], dst[j]);
487*fb1b10abSAndroid Build Coastguard Worker #if CONFIG_VP9_HIGHBITDEPTH
488*fb1b10abSAndroid Build Coastguard Worker       } else {
489*fb1b10abSAndroid Build Coastguard Worker         for (int j = 0; j < kNumCoeffs; ++j) EXPECT_EQ(ref16[j], dst16[j]);
490*fb1b10abSAndroid Build Coastguard Worker #endif
491*fb1b10abSAndroid Build Coastguard Worker       }
492*fb1b10abSAndroid Build Coastguard Worker     }
493*fb1b10abSAndroid Build Coastguard Worker   }
494*fb1b10abSAndroid Build Coastguard Worker 
RunInvAccuracyCheck()495*fb1b10abSAndroid Build Coastguard Worker   void RunInvAccuracyCheck() {
496*fb1b10abSAndroid Build Coastguard Worker     ACMRandom rnd(ACMRandom::DeterministicSeed());
497*fb1b10abSAndroid Build Coastguard Worker     const int count_test_block = 1000;
498*fb1b10abSAndroid Build Coastguard Worker     DECLARE_ALIGNED(16, int16_t, in[kNumCoeffs]);
499*fb1b10abSAndroid Build Coastguard Worker     DECLARE_ALIGNED(16, tran_low_t, coeff[kNumCoeffs]);
500*fb1b10abSAndroid Build Coastguard Worker     DECLARE_ALIGNED(16, uint8_t, dst[kNumCoeffs]);
501*fb1b10abSAndroid Build Coastguard Worker     DECLARE_ALIGNED(16, uint8_t, src[kNumCoeffs]);
502*fb1b10abSAndroid Build Coastguard Worker #if CONFIG_VP9_HIGHBITDEPTH
503*fb1b10abSAndroid Build Coastguard Worker     DECLARE_ALIGNED(16, uint16_t, dst16[kNumCoeffs]);
504*fb1b10abSAndroid Build Coastguard Worker     DECLARE_ALIGNED(16, uint16_t, src16[kNumCoeffs]);
505*fb1b10abSAndroid Build Coastguard Worker #endif  // CONFIG_VP9_HIGHBITDEPTH
506*fb1b10abSAndroid Build Coastguard Worker 
507*fb1b10abSAndroid Build Coastguard Worker     for (int i = 0; i < count_test_block; ++i) {
508*fb1b10abSAndroid Build Coastguard Worker       double out_r[kNumCoeffs];
509*fb1b10abSAndroid Build Coastguard Worker 
510*fb1b10abSAndroid Build Coastguard Worker       // Initialize a test block with input range [-255, 255].
511*fb1b10abSAndroid Build Coastguard Worker       for (int j = 0; j < kNumCoeffs; ++j) {
512*fb1b10abSAndroid Build Coastguard Worker         if (bit_depth_ == VPX_BITS_8) {
513*fb1b10abSAndroid Build Coastguard Worker           src[j] = rnd.Rand8();
514*fb1b10abSAndroid Build Coastguard Worker           dst[j] = rnd.Rand8();
515*fb1b10abSAndroid Build Coastguard Worker           in[j] = src[j] - dst[j];
516*fb1b10abSAndroid Build Coastguard Worker #if CONFIG_VP9_HIGHBITDEPTH
517*fb1b10abSAndroid Build Coastguard Worker         } else {
518*fb1b10abSAndroid Build Coastguard Worker           src16[j] = rnd.Rand16() & mask_;
519*fb1b10abSAndroid Build Coastguard Worker           dst16[j] = rnd.Rand16() & mask_;
520*fb1b10abSAndroid Build Coastguard Worker           in[j] = src16[j] - dst16[j];
521*fb1b10abSAndroid Build Coastguard Worker #endif  // CONFIG_VP9_HIGHBITDEPTH
522*fb1b10abSAndroid Build Coastguard Worker         }
523*fb1b10abSAndroid Build Coastguard Worker       }
524*fb1b10abSAndroid Build Coastguard Worker 
525*fb1b10abSAndroid Build Coastguard Worker       reference_16x16_dct_2d(in, out_r);
526*fb1b10abSAndroid Build Coastguard Worker       for (int j = 0; j < kNumCoeffs; ++j) {
527*fb1b10abSAndroid Build Coastguard Worker         coeff[j] = static_cast<tran_low_t>(round(out_r[j]));
528*fb1b10abSAndroid Build Coastguard Worker       }
529*fb1b10abSAndroid Build Coastguard Worker 
530*fb1b10abSAndroid Build Coastguard Worker       if (bit_depth_ == VPX_BITS_8) {
531*fb1b10abSAndroid Build Coastguard Worker         ASM_REGISTER_STATE_CHECK(RunInvTxfm(coeff, dst, 16));
532*fb1b10abSAndroid Build Coastguard Worker #if CONFIG_VP9_HIGHBITDEPTH
533*fb1b10abSAndroid Build Coastguard Worker       } else {
534*fb1b10abSAndroid Build Coastguard Worker         ASM_REGISTER_STATE_CHECK(RunInvTxfm(coeff, CAST_TO_BYTEPTR(dst16), 16));
535*fb1b10abSAndroid Build Coastguard Worker #endif  // CONFIG_VP9_HIGHBITDEPTH
536*fb1b10abSAndroid Build Coastguard Worker       }
537*fb1b10abSAndroid Build Coastguard Worker 
538*fb1b10abSAndroid Build Coastguard Worker       for (int j = 0; j < kNumCoeffs; ++j) {
539*fb1b10abSAndroid Build Coastguard Worker #if CONFIG_VP9_HIGHBITDEPTH
540*fb1b10abSAndroid Build Coastguard Worker         const uint32_t diff =
541*fb1b10abSAndroid Build Coastguard Worker             bit_depth_ == VPX_BITS_8 ? dst[j] - src[j] : dst16[j] - src16[j];
542*fb1b10abSAndroid Build Coastguard Worker #else
543*fb1b10abSAndroid Build Coastguard Worker         const uint32_t diff = dst[j] - src[j];
544*fb1b10abSAndroid Build Coastguard Worker #endif  // CONFIG_VP9_HIGHBITDEPTH
545*fb1b10abSAndroid Build Coastguard Worker         const uint32_t error = diff * diff;
546*fb1b10abSAndroid Build Coastguard Worker         EXPECT_GE(1u, error)
547*fb1b10abSAndroid Build Coastguard Worker             << "Error: 16x16 IDCT has error " << error << " at index " << j;
548*fb1b10abSAndroid Build Coastguard Worker       }
549*fb1b10abSAndroid Build Coastguard Worker     }
550*fb1b10abSAndroid Build Coastguard Worker   }
551*fb1b10abSAndroid Build Coastguard Worker 
RunSpeedTest()552*fb1b10abSAndroid Build Coastguard Worker   void RunSpeedTest() {
553*fb1b10abSAndroid Build Coastguard Worker     ACMRandom rnd(ACMRandom::DeterministicSeed());
554*fb1b10abSAndroid Build Coastguard Worker     const int count_test_block = 10000;
555*fb1b10abSAndroid Build Coastguard Worker     int c_sum_time = 0;
556*fb1b10abSAndroid Build Coastguard Worker     int simd_sum_time = 0;
557*fb1b10abSAndroid Build Coastguard Worker 
558*fb1b10abSAndroid Build Coastguard Worker     DECLARE_ALIGNED(32, int16_t, input_block[kNumCoeffs]);
559*fb1b10abSAndroid Build Coastguard Worker     DECLARE_ALIGNED(32, tran_low_t, output_ref_block[kNumCoeffs]);
560*fb1b10abSAndroid Build Coastguard Worker     DECLARE_ALIGNED(32, tran_low_t, output_block[kNumCoeffs]);
561*fb1b10abSAndroid Build Coastguard Worker 
562*fb1b10abSAndroid Build Coastguard Worker     // Initialize a test block with input range [-mask_, mask_].
563*fb1b10abSAndroid Build Coastguard Worker     for (int j = 0; j < kNumCoeffs; ++j) {
564*fb1b10abSAndroid Build Coastguard Worker       input_block[j] = (rnd.Rand16() & mask_) - (rnd.Rand16() & mask_);
565*fb1b10abSAndroid Build Coastguard Worker     }
566*fb1b10abSAndroid Build Coastguard Worker 
567*fb1b10abSAndroid Build Coastguard Worker     vpx_usec_timer timer_c;
568*fb1b10abSAndroid Build Coastguard Worker     vpx_usec_timer_start(&timer_c);
569*fb1b10abSAndroid Build Coastguard Worker     for (int i = 0; i < count_test_block; ++i) {
570*fb1b10abSAndroid Build Coastguard Worker       vpx_fdct16x16_c(input_block, output_ref_block, pitch_);
571*fb1b10abSAndroid Build Coastguard Worker     }
572*fb1b10abSAndroid Build Coastguard Worker     vpx_usec_timer_mark(&timer_c);
573*fb1b10abSAndroid Build Coastguard Worker     c_sum_time += static_cast<int>(vpx_usec_timer_elapsed(&timer_c));
574*fb1b10abSAndroid Build Coastguard Worker 
575*fb1b10abSAndroid Build Coastguard Worker     vpx_usec_timer timer_mod;
576*fb1b10abSAndroid Build Coastguard Worker     vpx_usec_timer_start(&timer_mod);
577*fb1b10abSAndroid Build Coastguard Worker     for (int i = 0; i < count_test_block; ++i) {
578*fb1b10abSAndroid Build Coastguard Worker       RunFwdTxfm(input_block, output_block, pitch_);
579*fb1b10abSAndroid Build Coastguard Worker     }
580*fb1b10abSAndroid Build Coastguard Worker 
581*fb1b10abSAndroid Build Coastguard Worker     vpx_usec_timer_mark(&timer_mod);
582*fb1b10abSAndroid Build Coastguard Worker     simd_sum_time += static_cast<int>(vpx_usec_timer_elapsed(&timer_mod));
583*fb1b10abSAndroid Build Coastguard Worker 
584*fb1b10abSAndroid Build Coastguard Worker     printf(
585*fb1b10abSAndroid Build Coastguard Worker         "c_time = %d \t simd_time = %d \t Gain = %4.2f \n", c_sum_time,
586*fb1b10abSAndroid Build Coastguard Worker         simd_sum_time,
587*fb1b10abSAndroid Build Coastguard Worker         (static_cast<float>(c_sum_time) / static_cast<float>(simd_sum_time)));
588*fb1b10abSAndroid Build Coastguard Worker   }
589*fb1b10abSAndroid Build Coastguard Worker 
CompareInvReference(IdctFunc ref_txfm,int thresh)590*fb1b10abSAndroid Build Coastguard Worker   void CompareInvReference(IdctFunc ref_txfm, int thresh) {
591*fb1b10abSAndroid Build Coastguard Worker     ACMRandom rnd(ACMRandom::DeterministicSeed());
592*fb1b10abSAndroid Build Coastguard Worker     const int count_test_block = 10000;
593*fb1b10abSAndroid Build Coastguard Worker     const int eob = 10;
594*fb1b10abSAndroid Build Coastguard Worker     const int16_t *scan = vp9_default_scan_orders[TX_16X16].scan;
595*fb1b10abSAndroid Build Coastguard Worker     DECLARE_ALIGNED(32, tran_low_t, coeff[kNumCoeffs]);
596*fb1b10abSAndroid Build Coastguard Worker     DECLARE_ALIGNED(16, uint8_t, dst[kNumCoeffs]);
597*fb1b10abSAndroid Build Coastguard Worker     DECLARE_ALIGNED(16, uint8_t, ref[kNumCoeffs]);
598*fb1b10abSAndroid Build Coastguard Worker #if CONFIG_VP9_HIGHBITDEPTH
599*fb1b10abSAndroid Build Coastguard Worker     DECLARE_ALIGNED(16, uint16_t, dst16[kNumCoeffs]);
600*fb1b10abSAndroid Build Coastguard Worker     DECLARE_ALIGNED(16, uint16_t, ref16[kNumCoeffs]);
601*fb1b10abSAndroid Build Coastguard Worker #endif  // CONFIG_VP9_HIGHBITDEPTH
602*fb1b10abSAndroid Build Coastguard Worker 
603*fb1b10abSAndroid Build Coastguard Worker     for (int i = 0; i < count_test_block; ++i) {
604*fb1b10abSAndroid Build Coastguard Worker       for (int j = 0; j < kNumCoeffs; ++j) {
605*fb1b10abSAndroid Build Coastguard Worker         if (j < eob) {
606*fb1b10abSAndroid Build Coastguard Worker           // Random values less than the threshold, either positive or negative
607*fb1b10abSAndroid Build Coastguard Worker           coeff[scan[j]] = rnd(thresh) * (1 - 2 * (i % 2));
608*fb1b10abSAndroid Build Coastguard Worker         } else {
609*fb1b10abSAndroid Build Coastguard Worker           coeff[scan[j]] = 0;
610*fb1b10abSAndroid Build Coastguard Worker         }
611*fb1b10abSAndroid Build Coastguard Worker         if (bit_depth_ == VPX_BITS_8) {
612*fb1b10abSAndroid Build Coastguard Worker           dst[j] = 0;
613*fb1b10abSAndroid Build Coastguard Worker           ref[j] = 0;
614*fb1b10abSAndroid Build Coastguard Worker #if CONFIG_VP9_HIGHBITDEPTH
615*fb1b10abSAndroid Build Coastguard Worker         } else {
616*fb1b10abSAndroid Build Coastguard Worker           dst16[j] = 0;
617*fb1b10abSAndroid Build Coastguard Worker           ref16[j] = 0;
618*fb1b10abSAndroid Build Coastguard Worker #endif  // CONFIG_VP9_HIGHBITDEPTH
619*fb1b10abSAndroid Build Coastguard Worker         }
620*fb1b10abSAndroid Build Coastguard Worker       }
621*fb1b10abSAndroid Build Coastguard Worker       if (bit_depth_ == VPX_BITS_8) {
622*fb1b10abSAndroid Build Coastguard Worker         ref_txfm(coeff, ref, pitch_);
623*fb1b10abSAndroid Build Coastguard Worker         ASM_REGISTER_STATE_CHECK(RunInvTxfm(coeff, dst, pitch_));
624*fb1b10abSAndroid Build Coastguard Worker       } else {
625*fb1b10abSAndroid Build Coastguard Worker #if CONFIG_VP9_HIGHBITDEPTH
626*fb1b10abSAndroid Build Coastguard Worker         ref_txfm(coeff, CAST_TO_BYTEPTR(ref16), pitch_);
627*fb1b10abSAndroid Build Coastguard Worker         ASM_REGISTER_STATE_CHECK(
628*fb1b10abSAndroid Build Coastguard Worker             RunInvTxfm(coeff, CAST_TO_BYTEPTR(dst16), pitch_));
629*fb1b10abSAndroid Build Coastguard Worker #endif  // CONFIG_VP9_HIGHBITDEPTH
630*fb1b10abSAndroid Build Coastguard Worker       }
631*fb1b10abSAndroid Build Coastguard Worker 
632*fb1b10abSAndroid Build Coastguard Worker       for (int j = 0; j < kNumCoeffs; ++j) {
633*fb1b10abSAndroid Build Coastguard Worker #if CONFIG_VP9_HIGHBITDEPTH
634*fb1b10abSAndroid Build Coastguard Worker         const uint32_t diff =
635*fb1b10abSAndroid Build Coastguard Worker             bit_depth_ == VPX_BITS_8 ? dst[j] - ref[j] : dst16[j] - ref16[j];
636*fb1b10abSAndroid Build Coastguard Worker #else
637*fb1b10abSAndroid Build Coastguard Worker         const uint32_t diff = dst[j] - ref[j];
638*fb1b10abSAndroid Build Coastguard Worker #endif  // CONFIG_VP9_HIGHBITDEPTH
639*fb1b10abSAndroid Build Coastguard Worker         const uint32_t error = diff * diff;
640*fb1b10abSAndroid Build Coastguard Worker         EXPECT_EQ(0u, error) << "Error: 16x16 IDCT Comparison has error "
641*fb1b10abSAndroid Build Coastguard Worker                              << error << " at index " << j;
642*fb1b10abSAndroid Build Coastguard Worker       }
643*fb1b10abSAndroid Build Coastguard Worker     }
644*fb1b10abSAndroid Build Coastguard Worker   }
645*fb1b10abSAndroid Build Coastguard Worker 
RunInvTrans16x16SpeedTest(IdctFunc ref_txfm,int thresh)646*fb1b10abSAndroid Build Coastguard Worker   void RunInvTrans16x16SpeedTest(IdctFunc ref_txfm, int thresh) {
647*fb1b10abSAndroid Build Coastguard Worker     ACMRandom rnd(ACMRandom::DeterministicSeed());
648*fb1b10abSAndroid Build Coastguard Worker     const int count_test_block = 10000;
649*fb1b10abSAndroid Build Coastguard Worker     const int eob = 10;
650*fb1b10abSAndroid Build Coastguard Worker     const int16_t *scan = vp9_default_scan_orders[TX_16X16].scan;
651*fb1b10abSAndroid Build Coastguard Worker     int64_t c_sum_time = 0;
652*fb1b10abSAndroid Build Coastguard Worker     int64_t simd_sum_time = 0;
653*fb1b10abSAndroid Build Coastguard Worker     DECLARE_ALIGNED(32, tran_low_t, coeff[kNumCoeffs]);
654*fb1b10abSAndroid Build Coastguard Worker     DECLARE_ALIGNED(16, uint8_t, dst[kNumCoeffs]);
655*fb1b10abSAndroid Build Coastguard Worker     DECLARE_ALIGNED(16, uint8_t, ref[kNumCoeffs]);
656*fb1b10abSAndroid Build Coastguard Worker #if CONFIG_VP9_HIGHBITDEPTH
657*fb1b10abSAndroid Build Coastguard Worker     DECLARE_ALIGNED(16, uint16_t, dst16[kNumCoeffs]);
658*fb1b10abSAndroid Build Coastguard Worker     DECLARE_ALIGNED(16, uint16_t, ref16[kNumCoeffs]);
659*fb1b10abSAndroid Build Coastguard Worker #endif  // CONFIG_VP9_HIGHBITDEPTH
660*fb1b10abSAndroid Build Coastguard Worker 
661*fb1b10abSAndroid Build Coastguard Worker     for (int j = 0; j < kNumCoeffs; ++j) {
662*fb1b10abSAndroid Build Coastguard Worker       if (j < eob) {
663*fb1b10abSAndroid Build Coastguard Worker         // Random values less than the threshold, either positive or negative
664*fb1b10abSAndroid Build Coastguard Worker         coeff[scan[j]] = rnd(thresh);
665*fb1b10abSAndroid Build Coastguard Worker       } else {
666*fb1b10abSAndroid Build Coastguard Worker         coeff[scan[j]] = 0;
667*fb1b10abSAndroid Build Coastguard Worker       }
668*fb1b10abSAndroid Build Coastguard Worker       if (bit_depth_ == VPX_BITS_8) {
669*fb1b10abSAndroid Build Coastguard Worker         dst[j] = 0;
670*fb1b10abSAndroid Build Coastguard Worker         ref[j] = 0;
671*fb1b10abSAndroid Build Coastguard Worker #if CONFIG_VP9_HIGHBITDEPTH
672*fb1b10abSAndroid Build Coastguard Worker       } else {
673*fb1b10abSAndroid Build Coastguard Worker         dst16[j] = 0;
674*fb1b10abSAndroid Build Coastguard Worker         ref16[j] = 0;
675*fb1b10abSAndroid Build Coastguard Worker #endif  // CONFIG_VP9_HIGHBITDEPTH
676*fb1b10abSAndroid Build Coastguard Worker       }
677*fb1b10abSAndroid Build Coastguard Worker     }
678*fb1b10abSAndroid Build Coastguard Worker 
679*fb1b10abSAndroid Build Coastguard Worker     if (bit_depth_ == VPX_BITS_8) {
680*fb1b10abSAndroid Build Coastguard Worker       vpx_usec_timer timer_c;
681*fb1b10abSAndroid Build Coastguard Worker       vpx_usec_timer_start(&timer_c);
682*fb1b10abSAndroid Build Coastguard Worker       for (int i = 0; i < count_test_block; ++i) {
683*fb1b10abSAndroid Build Coastguard Worker         ref_txfm(coeff, ref, pitch_);
684*fb1b10abSAndroid Build Coastguard Worker       }
685*fb1b10abSAndroid Build Coastguard Worker       vpx_usec_timer_mark(&timer_c);
686*fb1b10abSAndroid Build Coastguard Worker       c_sum_time += vpx_usec_timer_elapsed(&timer_c);
687*fb1b10abSAndroid Build Coastguard Worker 
688*fb1b10abSAndroid Build Coastguard Worker       vpx_usec_timer timer_mod;
689*fb1b10abSAndroid Build Coastguard Worker       vpx_usec_timer_start(&timer_mod);
690*fb1b10abSAndroid Build Coastguard Worker       for (int i = 0; i < count_test_block; ++i) {
691*fb1b10abSAndroid Build Coastguard Worker         RunInvTxfm(coeff, dst, pitch_);
692*fb1b10abSAndroid Build Coastguard Worker       }
693*fb1b10abSAndroid Build Coastguard Worker       vpx_usec_timer_mark(&timer_mod);
694*fb1b10abSAndroid Build Coastguard Worker       simd_sum_time += vpx_usec_timer_elapsed(&timer_mod);
695*fb1b10abSAndroid Build Coastguard Worker     } else {
696*fb1b10abSAndroid Build Coastguard Worker #if CONFIG_VP9_HIGHBITDEPTH
697*fb1b10abSAndroid Build Coastguard Worker       vpx_usec_timer timer_c;
698*fb1b10abSAndroid Build Coastguard Worker       vpx_usec_timer_start(&timer_c);
699*fb1b10abSAndroid Build Coastguard Worker       for (int i = 0; i < count_test_block; ++i) {
700*fb1b10abSAndroid Build Coastguard Worker         ref_txfm(coeff, CAST_TO_BYTEPTR(ref16), pitch_);
701*fb1b10abSAndroid Build Coastguard Worker       }
702*fb1b10abSAndroid Build Coastguard Worker       vpx_usec_timer_mark(&timer_c);
703*fb1b10abSAndroid Build Coastguard Worker       c_sum_time += vpx_usec_timer_elapsed(&timer_c);
704*fb1b10abSAndroid Build Coastguard Worker 
705*fb1b10abSAndroid Build Coastguard Worker       vpx_usec_timer timer_mod;
706*fb1b10abSAndroid Build Coastguard Worker       vpx_usec_timer_start(&timer_mod);
707*fb1b10abSAndroid Build Coastguard Worker       for (int i = 0; i < count_test_block; ++i) {
708*fb1b10abSAndroid Build Coastguard Worker         RunInvTxfm(coeff, CAST_TO_BYTEPTR(dst16), pitch_);
709*fb1b10abSAndroid Build Coastguard Worker       }
710*fb1b10abSAndroid Build Coastguard Worker       vpx_usec_timer_mark(&timer_mod);
711*fb1b10abSAndroid Build Coastguard Worker       simd_sum_time += vpx_usec_timer_elapsed(&timer_mod);
712*fb1b10abSAndroid Build Coastguard Worker #endif  // CONFIG_VP9_HIGHBITDEPTH
713*fb1b10abSAndroid Build Coastguard Worker     }
714*fb1b10abSAndroid Build Coastguard Worker     printf(
715*fb1b10abSAndroid Build Coastguard Worker         "c_time = %" PRId64 " \t simd_time = %" PRId64 " \t Gain = %4.2f \n",
716*fb1b10abSAndroid Build Coastguard Worker         c_sum_time, simd_sum_time,
717*fb1b10abSAndroid Build Coastguard Worker         (static_cast<float>(c_sum_time) / static_cast<float>(simd_sum_time)));
718*fb1b10abSAndroid Build Coastguard Worker   }
719*fb1b10abSAndroid Build Coastguard Worker 
720*fb1b10abSAndroid Build Coastguard Worker   int pitch_;
721*fb1b10abSAndroid Build Coastguard Worker   int tx_type_;
722*fb1b10abSAndroid Build Coastguard Worker   vpx_bit_depth_t bit_depth_;
723*fb1b10abSAndroid Build Coastguard Worker   int mask_;
724*fb1b10abSAndroid Build Coastguard Worker   FhtFunc fwd_txfm_ref;
725*fb1b10abSAndroid Build Coastguard Worker   IhtFunc inv_txfm_ref;
726*fb1b10abSAndroid Build Coastguard Worker };
727*fb1b10abSAndroid Build Coastguard Worker 
728*fb1b10abSAndroid Build Coastguard Worker class Trans16x16DCT : public Trans16x16TestBase,
729*fb1b10abSAndroid Build Coastguard Worker                       public ::testing::TestWithParam<Dct16x16Param> {
730*fb1b10abSAndroid Build Coastguard Worker  public:
731*fb1b10abSAndroid Build Coastguard Worker   ~Trans16x16DCT() override = default;
732*fb1b10abSAndroid Build Coastguard Worker 
SetUp()733*fb1b10abSAndroid Build Coastguard Worker   void SetUp() override {
734*fb1b10abSAndroid Build Coastguard Worker     fwd_txfm_ = GET_PARAM(0);
735*fb1b10abSAndroid Build Coastguard Worker     inv_txfm_ = GET_PARAM(1);
736*fb1b10abSAndroid Build Coastguard Worker     tx_type_ = GET_PARAM(2);
737*fb1b10abSAndroid Build Coastguard Worker     bit_depth_ = GET_PARAM(3);
738*fb1b10abSAndroid Build Coastguard Worker     pitch_ = 16;
739*fb1b10abSAndroid Build Coastguard Worker     fwd_txfm_ref = fdct16x16_ref;
740*fb1b10abSAndroid Build Coastguard Worker     inv_txfm_ref = idct16x16_ref;
741*fb1b10abSAndroid Build Coastguard Worker     mask_ = (1 << bit_depth_) - 1;
742*fb1b10abSAndroid Build Coastguard Worker #if CONFIG_VP9_HIGHBITDEPTH
743*fb1b10abSAndroid Build Coastguard Worker     switch (bit_depth_) {
744*fb1b10abSAndroid Build Coastguard Worker       case VPX_BITS_10: inv_txfm_ref = idct16x16_10_ref; break;
745*fb1b10abSAndroid Build Coastguard Worker       case VPX_BITS_12: inv_txfm_ref = idct16x16_12_ref; break;
746*fb1b10abSAndroid Build Coastguard Worker       default: inv_txfm_ref = idct16x16_ref; break;
747*fb1b10abSAndroid Build Coastguard Worker     }
748*fb1b10abSAndroid Build Coastguard Worker #else
749*fb1b10abSAndroid Build Coastguard Worker     inv_txfm_ref = idct16x16_ref;
750*fb1b10abSAndroid Build Coastguard Worker #endif
751*fb1b10abSAndroid Build Coastguard Worker   }
TearDown()752*fb1b10abSAndroid Build Coastguard Worker   void TearDown() override { libvpx_test::ClearSystemState(); }
753*fb1b10abSAndroid Build Coastguard Worker 
754*fb1b10abSAndroid Build Coastguard Worker  protected:
RunFwdTxfm(int16_t * in,tran_low_t * out,int stride)755*fb1b10abSAndroid Build Coastguard Worker   void RunFwdTxfm(int16_t *in, tran_low_t *out, int stride) override {
756*fb1b10abSAndroid Build Coastguard Worker     fwd_txfm_(in, out, stride);
757*fb1b10abSAndroid Build Coastguard Worker   }
RunInvTxfm(tran_low_t * out,uint8_t * dst,int stride)758*fb1b10abSAndroid Build Coastguard Worker   void RunInvTxfm(tran_low_t *out, uint8_t *dst, int stride) override {
759*fb1b10abSAndroid Build Coastguard Worker     inv_txfm_(out, dst, stride);
760*fb1b10abSAndroid Build Coastguard Worker   }
761*fb1b10abSAndroid Build Coastguard Worker 
762*fb1b10abSAndroid Build Coastguard Worker   FdctFunc fwd_txfm_;
763*fb1b10abSAndroid Build Coastguard Worker   IdctFunc inv_txfm_;
764*fb1b10abSAndroid Build Coastguard Worker };
765*fb1b10abSAndroid Build Coastguard Worker 
TEST_P(Trans16x16DCT,AccuracyCheck)766*fb1b10abSAndroid Build Coastguard Worker TEST_P(Trans16x16DCT, AccuracyCheck) { RunAccuracyCheck(); }
767*fb1b10abSAndroid Build Coastguard Worker 
TEST_P(Trans16x16DCT,CoeffCheck)768*fb1b10abSAndroid Build Coastguard Worker TEST_P(Trans16x16DCT, CoeffCheck) { RunCoeffCheck(); }
769*fb1b10abSAndroid Build Coastguard Worker 
TEST_P(Trans16x16DCT,MemCheck)770*fb1b10abSAndroid Build Coastguard Worker TEST_P(Trans16x16DCT, MemCheck) { RunMemCheck(); }
771*fb1b10abSAndroid Build Coastguard Worker 
TEST_P(Trans16x16DCT,QuantCheck)772*fb1b10abSAndroid Build Coastguard Worker TEST_P(Trans16x16DCT, QuantCheck) {
773*fb1b10abSAndroid Build Coastguard Worker   // Use maximally allowed quantization step sizes for DC and AC
774*fb1b10abSAndroid Build Coastguard Worker   // coefficients respectively.
775*fb1b10abSAndroid Build Coastguard Worker   RunQuantCheck(1336, 1828);
776*fb1b10abSAndroid Build Coastguard Worker }
777*fb1b10abSAndroid Build Coastguard Worker 
TEST_P(Trans16x16DCT,InvAccuracyCheck)778*fb1b10abSAndroid Build Coastguard Worker TEST_P(Trans16x16DCT, InvAccuracyCheck) { RunInvAccuracyCheck(); }
779*fb1b10abSAndroid Build Coastguard Worker 
TEST_P(Trans16x16DCT,DISABLED_Speed)780*fb1b10abSAndroid Build Coastguard Worker TEST_P(Trans16x16DCT, DISABLED_Speed) { RunSpeedTest(); }
781*fb1b10abSAndroid Build Coastguard Worker 
782*fb1b10abSAndroid Build Coastguard Worker class Trans16x16HT : public Trans16x16TestBase,
783*fb1b10abSAndroid Build Coastguard Worker                      public ::testing::TestWithParam<Ht16x16Param> {
784*fb1b10abSAndroid Build Coastguard Worker  public:
785*fb1b10abSAndroid Build Coastguard Worker   ~Trans16x16HT() override = default;
786*fb1b10abSAndroid Build Coastguard Worker 
SetUp()787*fb1b10abSAndroid Build Coastguard Worker   void SetUp() override {
788*fb1b10abSAndroid Build Coastguard Worker     fwd_txfm_ = GET_PARAM(0);
789*fb1b10abSAndroid Build Coastguard Worker     inv_txfm_ = GET_PARAM(1);
790*fb1b10abSAndroid Build Coastguard Worker     tx_type_ = GET_PARAM(2);
791*fb1b10abSAndroid Build Coastguard Worker     bit_depth_ = GET_PARAM(3);
792*fb1b10abSAndroid Build Coastguard Worker     pitch_ = 16;
793*fb1b10abSAndroid Build Coastguard Worker     fwd_txfm_ref = fht16x16_ref;
794*fb1b10abSAndroid Build Coastguard Worker     inv_txfm_ref = iht16x16_ref;
795*fb1b10abSAndroid Build Coastguard Worker     mask_ = (1 << bit_depth_) - 1;
796*fb1b10abSAndroid Build Coastguard Worker #if CONFIG_VP9_HIGHBITDEPTH
797*fb1b10abSAndroid Build Coastguard Worker     switch (bit_depth_) {
798*fb1b10abSAndroid Build Coastguard Worker       case VPX_BITS_10: inv_txfm_ref = iht16x16_10; break;
799*fb1b10abSAndroid Build Coastguard Worker       case VPX_BITS_12: inv_txfm_ref = iht16x16_12; break;
800*fb1b10abSAndroid Build Coastguard Worker       default: inv_txfm_ref = iht16x16_ref; break;
801*fb1b10abSAndroid Build Coastguard Worker     }
802*fb1b10abSAndroid Build Coastguard Worker #else
803*fb1b10abSAndroid Build Coastguard Worker     inv_txfm_ref = iht16x16_ref;
804*fb1b10abSAndroid Build Coastguard Worker #endif
805*fb1b10abSAndroid Build Coastguard Worker   }
TearDown()806*fb1b10abSAndroid Build Coastguard Worker   void TearDown() override { libvpx_test::ClearSystemState(); }
807*fb1b10abSAndroid Build Coastguard Worker 
808*fb1b10abSAndroid Build Coastguard Worker  protected:
RunFwdTxfm(int16_t * in,tran_low_t * out,int stride)809*fb1b10abSAndroid Build Coastguard Worker   void RunFwdTxfm(int16_t *in, tran_low_t *out, int stride) override {
810*fb1b10abSAndroid Build Coastguard Worker     fwd_txfm_(in, out, stride, tx_type_);
811*fb1b10abSAndroid Build Coastguard Worker   }
RunInvTxfm(tran_low_t * out,uint8_t * dst,int stride)812*fb1b10abSAndroid Build Coastguard Worker   void RunInvTxfm(tran_low_t *out, uint8_t *dst, int stride) override {
813*fb1b10abSAndroid Build Coastguard Worker     inv_txfm_(out, dst, stride, tx_type_);
814*fb1b10abSAndroid Build Coastguard Worker   }
815*fb1b10abSAndroid Build Coastguard Worker 
816*fb1b10abSAndroid Build Coastguard Worker   FhtFunc fwd_txfm_;
817*fb1b10abSAndroid Build Coastguard Worker   IhtFunc inv_txfm_;
818*fb1b10abSAndroid Build Coastguard Worker };
819*fb1b10abSAndroid Build Coastguard Worker 
TEST_P(Trans16x16HT,AccuracyCheck)820*fb1b10abSAndroid Build Coastguard Worker TEST_P(Trans16x16HT, AccuracyCheck) { RunAccuracyCheck(); }
821*fb1b10abSAndroid Build Coastguard Worker 
TEST_P(Trans16x16HT,CoeffCheck)822*fb1b10abSAndroid Build Coastguard Worker TEST_P(Trans16x16HT, CoeffCheck) { RunCoeffCheck(); }
823*fb1b10abSAndroid Build Coastguard Worker 
TEST_P(Trans16x16HT,MemCheck)824*fb1b10abSAndroid Build Coastguard Worker TEST_P(Trans16x16HT, MemCheck) { RunMemCheck(); }
825*fb1b10abSAndroid Build Coastguard Worker 
TEST_P(Trans16x16HT,QuantCheck)826*fb1b10abSAndroid Build Coastguard Worker TEST_P(Trans16x16HT, QuantCheck) {
827*fb1b10abSAndroid Build Coastguard Worker   // The encoder skips any non-DC intra prediction modes,
828*fb1b10abSAndroid Build Coastguard Worker   // when the quantization step size goes beyond 988.
829*fb1b10abSAndroid Build Coastguard Worker   RunQuantCheck(429, 729);
830*fb1b10abSAndroid Build Coastguard Worker }
831*fb1b10abSAndroid Build Coastguard Worker 
832*fb1b10abSAndroid Build Coastguard Worker class InvTrans16x16DCT : public Trans16x16TestBase,
833*fb1b10abSAndroid Build Coastguard Worker                          public ::testing::TestWithParam<Idct16x16Param> {
834*fb1b10abSAndroid Build Coastguard Worker  public:
835*fb1b10abSAndroid Build Coastguard Worker   ~InvTrans16x16DCT() override = default;
836*fb1b10abSAndroid Build Coastguard Worker 
SetUp()837*fb1b10abSAndroid Build Coastguard Worker   void SetUp() override {
838*fb1b10abSAndroid Build Coastguard Worker     ref_txfm_ = GET_PARAM(0);
839*fb1b10abSAndroid Build Coastguard Worker     inv_txfm_ = GET_PARAM(1);
840*fb1b10abSAndroid Build Coastguard Worker     thresh_ = GET_PARAM(2);
841*fb1b10abSAndroid Build Coastguard Worker     bit_depth_ = GET_PARAM(3);
842*fb1b10abSAndroid Build Coastguard Worker     pitch_ = 16;
843*fb1b10abSAndroid Build Coastguard Worker     mask_ = (1 << bit_depth_) - 1;
844*fb1b10abSAndroid Build Coastguard Worker   }
TearDown()845*fb1b10abSAndroid Build Coastguard Worker   void TearDown() override { libvpx_test::ClearSystemState(); }
846*fb1b10abSAndroid Build Coastguard Worker 
847*fb1b10abSAndroid Build Coastguard Worker  protected:
RunFwdTxfm(int16_t *,tran_low_t *,int)848*fb1b10abSAndroid Build Coastguard Worker   void RunFwdTxfm(int16_t * /*in*/, tran_low_t * /*out*/,
849*fb1b10abSAndroid Build Coastguard Worker                   int /*stride*/) override {}
RunInvTxfm(tran_low_t * out,uint8_t * dst,int stride)850*fb1b10abSAndroid Build Coastguard Worker   void RunInvTxfm(tran_low_t *out, uint8_t *dst, int stride) override {
851*fb1b10abSAndroid Build Coastguard Worker     inv_txfm_(out, dst, stride);
852*fb1b10abSAndroid Build Coastguard Worker   }
853*fb1b10abSAndroid Build Coastguard Worker 
854*fb1b10abSAndroid Build Coastguard Worker   IdctFunc ref_txfm_;
855*fb1b10abSAndroid Build Coastguard Worker   IdctFunc inv_txfm_;
856*fb1b10abSAndroid Build Coastguard Worker   int thresh_;
857*fb1b10abSAndroid Build Coastguard Worker };
858*fb1b10abSAndroid Build Coastguard Worker GTEST_ALLOW_UNINSTANTIATED_PARAMETERIZED_TEST(InvTrans16x16DCT);
859*fb1b10abSAndroid Build Coastguard Worker 
TEST_P(InvTrans16x16DCT,CompareReference)860*fb1b10abSAndroid Build Coastguard Worker TEST_P(InvTrans16x16DCT, CompareReference) {
861*fb1b10abSAndroid Build Coastguard Worker   CompareInvReference(ref_txfm_, thresh_);
862*fb1b10abSAndroid Build Coastguard Worker }
863*fb1b10abSAndroid Build Coastguard Worker 
TEST_P(InvTrans16x16DCT,DISABLED_Speed)864*fb1b10abSAndroid Build Coastguard Worker TEST_P(InvTrans16x16DCT, DISABLED_Speed) {
865*fb1b10abSAndroid Build Coastguard Worker   RunInvTrans16x16SpeedTest(ref_txfm_, thresh_);
866*fb1b10abSAndroid Build Coastguard Worker }
867*fb1b10abSAndroid Build Coastguard Worker 
868*fb1b10abSAndroid Build Coastguard Worker using std::make_tuple;
869*fb1b10abSAndroid Build Coastguard Worker 
870*fb1b10abSAndroid Build Coastguard Worker #if CONFIG_VP9_HIGHBITDEPTH
871*fb1b10abSAndroid Build Coastguard Worker INSTANTIATE_TEST_SUITE_P(
872*fb1b10abSAndroid Build Coastguard Worker     C, Trans16x16DCT,
873*fb1b10abSAndroid Build Coastguard Worker     ::testing::Values(
874*fb1b10abSAndroid Build Coastguard Worker         make_tuple(&vpx_highbd_fdct16x16_c, &idct16x16_10, 0, VPX_BITS_10),
875*fb1b10abSAndroid Build Coastguard Worker         make_tuple(&vpx_highbd_fdct16x16_c, &idct16x16_12, 0, VPX_BITS_12),
876*fb1b10abSAndroid Build Coastguard Worker         make_tuple(&vpx_fdct16x16_c, &vpx_idct16x16_256_add_c, 0, VPX_BITS_8)));
877*fb1b10abSAndroid Build Coastguard Worker #else
878*fb1b10abSAndroid Build Coastguard Worker INSTANTIATE_TEST_SUITE_P(C, Trans16x16DCT,
879*fb1b10abSAndroid Build Coastguard Worker                          ::testing::Values(make_tuple(&vpx_fdct16x16_c,
880*fb1b10abSAndroid Build Coastguard Worker                                                       &vpx_idct16x16_256_add_c,
881*fb1b10abSAndroid Build Coastguard Worker                                                       0, VPX_BITS_8)));
882*fb1b10abSAndroid Build Coastguard Worker #endif  // CONFIG_VP9_HIGHBITDEPTH
883*fb1b10abSAndroid Build Coastguard Worker 
884*fb1b10abSAndroid Build Coastguard Worker #if CONFIG_VP9_HIGHBITDEPTH
885*fb1b10abSAndroid Build Coastguard Worker INSTANTIATE_TEST_SUITE_P(
886*fb1b10abSAndroid Build Coastguard Worker     C, Trans16x16HT,
887*fb1b10abSAndroid Build Coastguard Worker     ::testing::Values(
888*fb1b10abSAndroid Build Coastguard Worker         make_tuple(&vp9_highbd_fht16x16_c, &iht16x16_10, 0, VPX_BITS_10),
889*fb1b10abSAndroid Build Coastguard Worker         make_tuple(&vp9_highbd_fht16x16_c, &iht16x16_10, 1, VPX_BITS_10),
890*fb1b10abSAndroid Build Coastguard Worker         make_tuple(&vp9_highbd_fht16x16_c, &iht16x16_10, 2, VPX_BITS_10),
891*fb1b10abSAndroid Build Coastguard Worker         make_tuple(&vp9_highbd_fht16x16_c, &iht16x16_10, 3, VPX_BITS_10),
892*fb1b10abSAndroid Build Coastguard Worker         make_tuple(&vp9_highbd_fht16x16_c, &iht16x16_12, 0, VPX_BITS_12),
893*fb1b10abSAndroid Build Coastguard Worker         make_tuple(&vp9_highbd_fht16x16_c, &iht16x16_12, 1, VPX_BITS_12),
894*fb1b10abSAndroid Build Coastguard Worker         make_tuple(&vp9_highbd_fht16x16_c, &iht16x16_12, 2, VPX_BITS_12),
895*fb1b10abSAndroid Build Coastguard Worker         make_tuple(&vp9_highbd_fht16x16_c, &iht16x16_12, 3, VPX_BITS_12),
896*fb1b10abSAndroid Build Coastguard Worker         make_tuple(&vp9_fht16x16_c, &vp9_iht16x16_256_add_c, 0, VPX_BITS_8),
897*fb1b10abSAndroid Build Coastguard Worker         make_tuple(&vp9_fht16x16_c, &vp9_iht16x16_256_add_c, 1, VPX_BITS_8),
898*fb1b10abSAndroid Build Coastguard Worker         make_tuple(&vp9_fht16x16_c, &vp9_iht16x16_256_add_c, 2, VPX_BITS_8),
899*fb1b10abSAndroid Build Coastguard Worker         make_tuple(&vp9_fht16x16_c, &vp9_iht16x16_256_add_c, 3, VPX_BITS_8)));
900*fb1b10abSAndroid Build Coastguard Worker #else
901*fb1b10abSAndroid Build Coastguard Worker INSTANTIATE_TEST_SUITE_P(
902*fb1b10abSAndroid Build Coastguard Worker     C, Trans16x16HT,
903*fb1b10abSAndroid Build Coastguard Worker     ::testing::Values(
904*fb1b10abSAndroid Build Coastguard Worker         make_tuple(&vp9_fht16x16_c, &vp9_iht16x16_256_add_c, 0, VPX_BITS_8),
905*fb1b10abSAndroid Build Coastguard Worker         make_tuple(&vp9_fht16x16_c, &vp9_iht16x16_256_add_c, 1, VPX_BITS_8),
906*fb1b10abSAndroid Build Coastguard Worker         make_tuple(&vp9_fht16x16_c, &vp9_iht16x16_256_add_c, 2, VPX_BITS_8),
907*fb1b10abSAndroid Build Coastguard Worker         make_tuple(&vp9_fht16x16_c, &vp9_iht16x16_256_add_c, 3, VPX_BITS_8)));
908*fb1b10abSAndroid Build Coastguard Worker 
909*fb1b10abSAndroid Build Coastguard Worker INSTANTIATE_TEST_SUITE_P(C, InvTrans16x16DCT,
910*fb1b10abSAndroid Build Coastguard Worker                          ::testing::Values(make_tuple(&vpx_idct16x16_256_add_c,
911*fb1b10abSAndroid Build Coastguard Worker                                                       &vpx_idct16x16_256_add_c,
912*fb1b10abSAndroid Build Coastguard Worker                                                       6225, VPX_BITS_8)));
913*fb1b10abSAndroid Build Coastguard Worker 
914*fb1b10abSAndroid Build Coastguard Worker #endif  // CONFIG_VP9_HIGHBITDEPTH
915*fb1b10abSAndroid Build Coastguard Worker 
916*fb1b10abSAndroid Build Coastguard Worker #if HAVE_NEON && !CONFIG_VP9_HIGHBITDEPTH && !CONFIG_EMULATE_HARDWARE
917*fb1b10abSAndroid Build Coastguard Worker INSTANTIATE_TEST_SUITE_P(
918*fb1b10abSAndroid Build Coastguard Worker     NEON, Trans16x16DCT,
919*fb1b10abSAndroid Build Coastguard Worker     ::testing::Values(make_tuple(&vpx_fdct16x16_neon,
920*fb1b10abSAndroid Build Coastguard Worker                                  &vpx_idct16x16_256_add_neon, 0, VPX_BITS_8)));
921*fb1b10abSAndroid Build Coastguard Worker #endif  // HAVE_NEON && !CONFIG_EMULATE_HARDWARE
922*fb1b10abSAndroid Build Coastguard Worker 
923*fb1b10abSAndroid Build Coastguard Worker #if HAVE_NEON && CONFIG_VP9_HIGHBITDEPTH && !CONFIG_EMULATE_HARDWARE
924*fb1b10abSAndroid Build Coastguard Worker INSTANTIATE_TEST_SUITE_P(
925*fb1b10abSAndroid Build Coastguard Worker     NEON, Trans16x16DCT,
926*fb1b10abSAndroid Build Coastguard Worker     ::testing::Values(
927*fb1b10abSAndroid Build Coastguard Worker         make_tuple(&vpx_highbd_fdct16x16_neon, &idct16x16_10, 0, VPX_BITS_10),
928*fb1b10abSAndroid Build Coastguard Worker         make_tuple(&vpx_highbd_fdct16x16_neon, &idct16x16_12, 0, VPX_BITS_12),
929*fb1b10abSAndroid Build Coastguard Worker         make_tuple(&vpx_fdct16x16_neon, &vpx_idct16x16_256_add_c, 0,
930*fb1b10abSAndroid Build Coastguard Worker                    VPX_BITS_8)));
931*fb1b10abSAndroid Build Coastguard Worker #endif  // HAVE_NEON && CONFIG_VP9_HIGHBITDEPTH && !CONFIG_EMULATE_HARDWARE
932*fb1b10abSAndroid Build Coastguard Worker 
933*fb1b10abSAndroid Build Coastguard Worker #if HAVE_SSE2 && !CONFIG_VP9_HIGHBITDEPTH && !CONFIG_EMULATE_HARDWARE
934*fb1b10abSAndroid Build Coastguard Worker INSTANTIATE_TEST_SUITE_P(
935*fb1b10abSAndroid Build Coastguard Worker     SSE2, Trans16x16DCT,
936*fb1b10abSAndroid Build Coastguard Worker     ::testing::Values(make_tuple(&vpx_fdct16x16_sse2,
937*fb1b10abSAndroid Build Coastguard Worker                                  &vpx_idct16x16_256_add_sse2, 0, VPX_BITS_8)));
938*fb1b10abSAndroid Build Coastguard Worker INSTANTIATE_TEST_SUITE_P(
939*fb1b10abSAndroid Build Coastguard Worker     SSE2, Trans16x16HT,
940*fb1b10abSAndroid Build Coastguard Worker     ::testing::Values(make_tuple(&vp9_fht16x16_sse2, &vp9_iht16x16_256_add_sse2,
941*fb1b10abSAndroid Build Coastguard Worker                                  0, VPX_BITS_8),
942*fb1b10abSAndroid Build Coastguard Worker                       make_tuple(&vp9_fht16x16_sse2, &vp9_iht16x16_256_add_sse2,
943*fb1b10abSAndroid Build Coastguard Worker                                  1, VPX_BITS_8),
944*fb1b10abSAndroid Build Coastguard Worker                       make_tuple(&vp9_fht16x16_sse2, &vp9_iht16x16_256_add_sse2,
945*fb1b10abSAndroid Build Coastguard Worker                                  2, VPX_BITS_8),
946*fb1b10abSAndroid Build Coastguard Worker                       make_tuple(&vp9_fht16x16_sse2, &vp9_iht16x16_256_add_sse2,
947*fb1b10abSAndroid Build Coastguard Worker                                  3, VPX_BITS_8)));
948*fb1b10abSAndroid Build Coastguard Worker 
949*fb1b10abSAndroid Build Coastguard Worker INSTANTIATE_TEST_SUITE_P(SSE2, InvTrans16x16DCT,
950*fb1b10abSAndroid Build Coastguard Worker                          ::testing::Values(make_tuple(
951*fb1b10abSAndroid Build Coastguard Worker                              &vpx_idct16x16_256_add_c,
952*fb1b10abSAndroid Build Coastguard Worker                              &vpx_idct16x16_256_add_sse2, 6225, VPX_BITS_8)));
953*fb1b10abSAndroid Build Coastguard Worker #endif  // HAVE_SSE2 && !CONFIG_VP9_HIGHBITDEPTH && !CONFIG_EMULATE_HARDWARE
954*fb1b10abSAndroid Build Coastguard Worker 
955*fb1b10abSAndroid Build Coastguard Worker #if HAVE_AVX2 && !CONFIG_VP9_HIGHBITDEPTH && !CONFIG_EMULATE_HARDWARE
956*fb1b10abSAndroid Build Coastguard Worker INSTANTIATE_TEST_SUITE_P(
957*fb1b10abSAndroid Build Coastguard Worker     AVX2, Trans16x16DCT,
958*fb1b10abSAndroid Build Coastguard Worker     ::testing::Values(make_tuple(&vpx_fdct16x16_avx2,
959*fb1b10abSAndroid Build Coastguard Worker                                  &vpx_idct16x16_256_add_sse2, 0, VPX_BITS_8)));
960*fb1b10abSAndroid Build Coastguard Worker 
961*fb1b10abSAndroid Build Coastguard Worker INSTANTIATE_TEST_SUITE_P(AVX2, InvTrans16x16DCT,
962*fb1b10abSAndroid Build Coastguard Worker                          ::testing::Values(make_tuple(
963*fb1b10abSAndroid Build Coastguard Worker                              &vpx_idct16x16_256_add_c,
964*fb1b10abSAndroid Build Coastguard Worker                              &vpx_idct16x16_256_add_avx2, 6225, VPX_BITS_8)));
965*fb1b10abSAndroid Build Coastguard Worker #endif  // HAVE_AVX2 && !CONFIG_VP9_HIGHBITDEPTH && !CONFIG_EMULATE_HARDWARE
966*fb1b10abSAndroid Build Coastguard Worker 
967*fb1b10abSAndroid Build Coastguard Worker #if HAVE_SSE2 && CONFIG_VP9_HIGHBITDEPTH && !CONFIG_EMULATE_HARDWARE
968*fb1b10abSAndroid Build Coastguard Worker INSTANTIATE_TEST_SUITE_P(
969*fb1b10abSAndroid Build Coastguard Worker     SSE2, Trans16x16DCT,
970*fb1b10abSAndroid Build Coastguard Worker     ::testing::Values(
971*fb1b10abSAndroid Build Coastguard Worker         make_tuple(&vpx_highbd_fdct16x16_sse2, &idct16x16_10, 0, VPX_BITS_10),
972*fb1b10abSAndroid Build Coastguard Worker         make_tuple(&vpx_highbd_fdct16x16_c, &idct16x16_256_add_10_sse2, 0,
973*fb1b10abSAndroid Build Coastguard Worker                    VPX_BITS_10),
974*fb1b10abSAndroid Build Coastguard Worker         make_tuple(&vpx_highbd_fdct16x16_sse2, &idct16x16_12, 0, VPX_BITS_12),
975*fb1b10abSAndroid Build Coastguard Worker         make_tuple(&vpx_highbd_fdct16x16_c, &idct16x16_256_add_12_sse2, 0,
976*fb1b10abSAndroid Build Coastguard Worker                    VPX_BITS_12),
977*fb1b10abSAndroid Build Coastguard Worker         make_tuple(&vpx_fdct16x16_sse2, &vpx_idct16x16_256_add_c, 0,
978*fb1b10abSAndroid Build Coastguard Worker                    VPX_BITS_8)));
979*fb1b10abSAndroid Build Coastguard Worker INSTANTIATE_TEST_SUITE_P(
980*fb1b10abSAndroid Build Coastguard Worker     SSE2, Trans16x16HT,
981*fb1b10abSAndroid Build Coastguard Worker     ::testing::Values(
982*fb1b10abSAndroid Build Coastguard Worker         make_tuple(&vp9_fht16x16_sse2, &vp9_iht16x16_256_add_c, 0, VPX_BITS_8),
983*fb1b10abSAndroid Build Coastguard Worker         make_tuple(&vp9_fht16x16_sse2, &vp9_iht16x16_256_add_c, 1, VPX_BITS_8),
984*fb1b10abSAndroid Build Coastguard Worker         make_tuple(&vp9_fht16x16_sse2, &vp9_iht16x16_256_add_c, 2, VPX_BITS_8),
985*fb1b10abSAndroid Build Coastguard Worker         make_tuple(&vp9_fht16x16_sse2, &vp9_iht16x16_256_add_c, 3,
986*fb1b10abSAndroid Build Coastguard Worker                    VPX_BITS_8)));
987*fb1b10abSAndroid Build Coastguard Worker // Optimizations take effect at a threshold of 3155, so we use a value close to
988*fb1b10abSAndroid Build Coastguard Worker // that to test both branches.
989*fb1b10abSAndroid Build Coastguard Worker INSTANTIATE_TEST_SUITE_P(
990*fb1b10abSAndroid Build Coastguard Worker     SSE2, InvTrans16x16DCT,
991*fb1b10abSAndroid Build Coastguard Worker     ::testing::Values(make_tuple(&idct16x16_10_add_10_c,
992*fb1b10abSAndroid Build Coastguard Worker                                  &idct16x16_10_add_10_sse2, 3167, VPX_BITS_10),
993*fb1b10abSAndroid Build Coastguard Worker                       make_tuple(&idct16x16_10, &idct16x16_256_add_10_sse2,
994*fb1b10abSAndroid Build Coastguard Worker                                  3167, VPX_BITS_10),
995*fb1b10abSAndroid Build Coastguard Worker                       make_tuple(&idct16x16_10_add_12_c,
996*fb1b10abSAndroid Build Coastguard Worker                                  &idct16x16_10_add_12_sse2, 3167, VPX_BITS_12),
997*fb1b10abSAndroid Build Coastguard Worker                       make_tuple(&idct16x16_12, &idct16x16_256_add_12_sse2,
998*fb1b10abSAndroid Build Coastguard Worker                                  3167, VPX_BITS_12)));
999*fb1b10abSAndroid Build Coastguard Worker #endif  // HAVE_SSE2 && CONFIG_VP9_HIGHBITDEPTH && !CONFIG_EMULATE_HARDWARE
1000*fb1b10abSAndroid Build Coastguard Worker 
1001*fb1b10abSAndroid Build Coastguard Worker #if HAVE_MSA && !CONFIG_VP9_HIGHBITDEPTH && !CONFIG_EMULATE_HARDWARE
1002*fb1b10abSAndroid Build Coastguard Worker INSTANTIATE_TEST_SUITE_P(
1003*fb1b10abSAndroid Build Coastguard Worker     MSA, Trans16x16DCT,
1004*fb1b10abSAndroid Build Coastguard Worker     ::testing::Values(make_tuple(&vpx_fdct16x16_msa, &vpx_idct16x16_256_add_msa,
1005*fb1b10abSAndroid Build Coastguard Worker                                  0, VPX_BITS_8)));
1006*fb1b10abSAndroid Build Coastguard Worker INSTANTIATE_TEST_SUITE_P(
1007*fb1b10abSAndroid Build Coastguard Worker     MSA, Trans16x16HT,
1008*fb1b10abSAndroid Build Coastguard Worker     ::testing::Values(
1009*fb1b10abSAndroid Build Coastguard Worker         make_tuple(&vp9_fht16x16_msa, &vp9_iht16x16_256_add_msa, 0, VPX_BITS_8),
1010*fb1b10abSAndroid Build Coastguard Worker         make_tuple(&vp9_fht16x16_msa, &vp9_iht16x16_256_add_msa, 1, VPX_BITS_8),
1011*fb1b10abSAndroid Build Coastguard Worker         make_tuple(&vp9_fht16x16_msa, &vp9_iht16x16_256_add_msa, 2, VPX_BITS_8),
1012*fb1b10abSAndroid Build Coastguard Worker         make_tuple(&vp9_fht16x16_msa, &vp9_iht16x16_256_add_msa, 3,
1013*fb1b10abSAndroid Build Coastguard Worker                    VPX_BITS_8)));
1014*fb1b10abSAndroid Build Coastguard Worker #endif  // HAVE_MSA && !CONFIG_VP9_HIGHBITDEPTH && !CONFIG_EMULATE_HARDWARE
1015*fb1b10abSAndroid Build Coastguard Worker 
1016*fb1b10abSAndroid Build Coastguard Worker #if HAVE_VSX && !CONFIG_VP9_HIGHBITDEPTH && !CONFIG_EMULATE_HARDWARE
1017*fb1b10abSAndroid Build Coastguard Worker INSTANTIATE_TEST_SUITE_P(
1018*fb1b10abSAndroid Build Coastguard Worker     VSX, Trans16x16DCT,
1019*fb1b10abSAndroid Build Coastguard Worker     ::testing::Values(make_tuple(&vpx_fdct16x16_c, &vpx_idct16x16_256_add_vsx,
1020*fb1b10abSAndroid Build Coastguard Worker                                  0, VPX_BITS_8)));
1021*fb1b10abSAndroid Build Coastguard Worker #endif  // HAVE_VSX && !CONFIG_VP9_HIGHBITDEPTH && !CONFIG_EMULATE_HARDWARE
1022*fb1b10abSAndroid Build Coastguard Worker 
1023*fb1b10abSAndroid Build Coastguard Worker #if HAVE_LSX && !CONFIG_VP9_HIGHBITDEPTH && !CONFIG_EMULATE_HARDWARE
1024*fb1b10abSAndroid Build Coastguard Worker INSTANTIATE_TEST_SUITE_P(LSX, Trans16x16DCT,
1025*fb1b10abSAndroid Build Coastguard Worker                          ::testing::Values(make_tuple(&vpx_fdct16x16_lsx,
1026*fb1b10abSAndroid Build Coastguard Worker                                                       &vpx_idct16x16_256_add_c,
1027*fb1b10abSAndroid Build Coastguard Worker                                                       0, VPX_BITS_8)));
1028*fb1b10abSAndroid Build Coastguard Worker #endif  // HAVE_LSX && !CONFIG_VP9_HIGHBITDEPTH && !CONFIG_EMULATE_HARDWARE
1029*fb1b10abSAndroid Build Coastguard Worker }  // namespace
1030