xref: /aosp_15_r20/external/libvpx/test/dct32x32_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_config.h"
20*fb1b10abSAndroid Build Coastguard Worker #include "./vpx_dsp_rtcd.h"
21*fb1b10abSAndroid Build Coastguard Worker #include "test/acm_random.h"
22*fb1b10abSAndroid Build Coastguard Worker #include "test/bench.h"
23*fb1b10abSAndroid Build Coastguard Worker #include "test/clear_system_state.h"
24*fb1b10abSAndroid Build Coastguard Worker #include "test/register_state_check.h"
25*fb1b10abSAndroid Build Coastguard Worker #include "test/util.h"
26*fb1b10abSAndroid Build Coastguard Worker #include "vp9/common/vp9_entropy.h"
27*fb1b10abSAndroid Build Coastguard Worker #include "vp9/common/vp9_scan.h"
28*fb1b10abSAndroid Build Coastguard Worker #include "vpx/vpx_codec.h"
29*fb1b10abSAndroid Build Coastguard Worker #include "vpx/vpx_integer.h"
30*fb1b10abSAndroid Build Coastguard Worker #include "vpx_ports/mem.h"
31*fb1b10abSAndroid Build Coastguard Worker #include "vpx_ports/vpx_timer.h"
32*fb1b10abSAndroid Build Coastguard Worker 
33*fb1b10abSAndroid Build Coastguard Worker using libvpx_test::ACMRandom;
34*fb1b10abSAndroid Build Coastguard Worker 
35*fb1b10abSAndroid Build Coastguard Worker namespace {
36*fb1b10abSAndroid Build Coastguard Worker 
37*fb1b10abSAndroid Build Coastguard Worker const int kNumCoeffs = 1024;
38*fb1b10abSAndroid Build Coastguard Worker const double kPi = 3.141592653589793238462643383279502884;
reference_32x32_dct_1d(const double in[32],double out[32])39*fb1b10abSAndroid Build Coastguard Worker void reference_32x32_dct_1d(const double in[32], double out[32]) {
40*fb1b10abSAndroid Build Coastguard Worker   const double kInvSqrt2 = 0.707106781186547524400844362104;
41*fb1b10abSAndroid Build Coastguard Worker   for (int k = 0; k < 32; k++) {
42*fb1b10abSAndroid Build Coastguard Worker     out[k] = 0.0;
43*fb1b10abSAndroid Build Coastguard Worker     for (int n = 0; n < 32; n++) {
44*fb1b10abSAndroid Build Coastguard Worker       out[k] += in[n] * cos(kPi * (2 * n + 1) * k / 64.0);
45*fb1b10abSAndroid Build Coastguard Worker     }
46*fb1b10abSAndroid Build Coastguard Worker     if (k == 0) out[k] = out[k] * kInvSqrt2;
47*fb1b10abSAndroid Build Coastguard Worker   }
48*fb1b10abSAndroid Build Coastguard Worker }
49*fb1b10abSAndroid Build Coastguard Worker 
reference_32x32_dct_2d(const int16_t input[kNumCoeffs],double output[kNumCoeffs])50*fb1b10abSAndroid Build Coastguard Worker void reference_32x32_dct_2d(const int16_t input[kNumCoeffs],
51*fb1b10abSAndroid Build Coastguard Worker                             double output[kNumCoeffs]) {
52*fb1b10abSAndroid Build Coastguard Worker   // First transform columns
53*fb1b10abSAndroid Build Coastguard Worker   for (int i = 0; i < 32; ++i) {
54*fb1b10abSAndroid Build Coastguard Worker     double temp_in[32], temp_out[32];
55*fb1b10abSAndroid Build Coastguard Worker     for (int j = 0; j < 32; ++j) temp_in[j] = input[j * 32 + i];
56*fb1b10abSAndroid Build Coastguard Worker     reference_32x32_dct_1d(temp_in, temp_out);
57*fb1b10abSAndroid Build Coastguard Worker     for (int j = 0; j < 32; ++j) output[j * 32 + i] = temp_out[j];
58*fb1b10abSAndroid Build Coastguard Worker   }
59*fb1b10abSAndroid Build Coastguard Worker   // Then transform rows
60*fb1b10abSAndroid Build Coastguard Worker   for (int i = 0; i < 32; ++i) {
61*fb1b10abSAndroid Build Coastguard Worker     double temp_in[32], temp_out[32];
62*fb1b10abSAndroid Build Coastguard Worker     for (int j = 0; j < 32; ++j) temp_in[j] = output[j + i * 32];
63*fb1b10abSAndroid Build Coastguard Worker     reference_32x32_dct_1d(temp_in, temp_out);
64*fb1b10abSAndroid Build Coastguard Worker     // Scale by some magic number
65*fb1b10abSAndroid Build Coastguard Worker     for (int j = 0; j < 32; ++j) output[j + i * 32] = temp_out[j] / 4;
66*fb1b10abSAndroid Build Coastguard Worker   }
67*fb1b10abSAndroid Build Coastguard Worker }
68*fb1b10abSAndroid Build Coastguard Worker 
69*fb1b10abSAndroid Build Coastguard Worker typedef void (*FwdTxfmFunc)(const int16_t *in, tran_low_t *out, int stride);
70*fb1b10abSAndroid Build Coastguard Worker typedef void (*InvTxfmFunc)(const tran_low_t *in, uint8_t *out, int stride);
71*fb1b10abSAndroid Build Coastguard Worker 
72*fb1b10abSAndroid Build Coastguard Worker typedef std::tuple<FwdTxfmFunc, InvTxfmFunc, int, vpx_bit_depth_t>
73*fb1b10abSAndroid Build Coastguard Worker     Trans32x32Param;
74*fb1b10abSAndroid Build Coastguard Worker 
75*fb1b10abSAndroid Build Coastguard Worker typedef std::tuple<InvTxfmFunc, InvTxfmFunc, int, vpx_bit_depth_t, int, int>
76*fb1b10abSAndroid Build Coastguard Worker     InvTrans32x32Param;
77*fb1b10abSAndroid Build Coastguard Worker 
78*fb1b10abSAndroid Build Coastguard Worker #if CONFIG_VP9_HIGHBITDEPTH
idct32x32_10(const tran_low_t * in,uint8_t * out,int stride)79*fb1b10abSAndroid Build Coastguard Worker void idct32x32_10(const tran_low_t *in, uint8_t *out, int stride) {
80*fb1b10abSAndroid Build Coastguard Worker   vpx_highbd_idct32x32_1024_add_c(in, CAST_TO_SHORTPTR(out), stride, 10);
81*fb1b10abSAndroid Build Coastguard Worker }
82*fb1b10abSAndroid Build Coastguard Worker 
idct32x32_12(const tran_low_t * in,uint8_t * out,int stride)83*fb1b10abSAndroid Build Coastguard Worker void idct32x32_12(const tran_low_t *in, uint8_t *out, int stride) {
84*fb1b10abSAndroid Build Coastguard Worker   vpx_highbd_idct32x32_1024_add_c(in, CAST_TO_SHORTPTR(out), stride, 12);
85*fb1b10abSAndroid Build Coastguard Worker }
86*fb1b10abSAndroid Build Coastguard Worker #endif  // CONFIG_VP9_HIGHBITDEPTH
87*fb1b10abSAndroid Build Coastguard Worker 
88*fb1b10abSAndroid Build Coastguard Worker class Trans32x32Test : public AbstractBench,
89*fb1b10abSAndroid Build Coastguard Worker                        public ::testing::TestWithParam<Trans32x32Param> {
90*fb1b10abSAndroid Build Coastguard Worker  public:
91*fb1b10abSAndroid Build Coastguard Worker   ~Trans32x32Test() override = default;
SetUp()92*fb1b10abSAndroid Build Coastguard Worker   void SetUp() override {
93*fb1b10abSAndroid Build Coastguard Worker     fwd_txfm_ = GET_PARAM(0);
94*fb1b10abSAndroid Build Coastguard Worker     inv_txfm_ = GET_PARAM(1);
95*fb1b10abSAndroid Build Coastguard Worker     version_ = GET_PARAM(2);  // 0: high precision forward transform
96*fb1b10abSAndroid Build Coastguard Worker                               // 1: low precision version for rd loop
97*fb1b10abSAndroid Build Coastguard Worker     bit_depth_ = GET_PARAM(3);
98*fb1b10abSAndroid Build Coastguard Worker     mask_ = (1 << bit_depth_) - 1;
99*fb1b10abSAndroid Build Coastguard Worker   }
100*fb1b10abSAndroid Build Coastguard Worker 
TearDown()101*fb1b10abSAndroid Build Coastguard Worker   void TearDown() override { libvpx_test::ClearSystemState(); }
102*fb1b10abSAndroid Build Coastguard Worker 
103*fb1b10abSAndroid Build Coastguard Worker  protected:
104*fb1b10abSAndroid Build Coastguard Worker   int version_;
105*fb1b10abSAndroid Build Coastguard Worker   vpx_bit_depth_t bit_depth_;
106*fb1b10abSAndroid Build Coastguard Worker   int mask_;
107*fb1b10abSAndroid Build Coastguard Worker   FwdTxfmFunc fwd_txfm_;
108*fb1b10abSAndroid Build Coastguard Worker   InvTxfmFunc inv_txfm_;
109*fb1b10abSAndroid Build Coastguard Worker 
110*fb1b10abSAndroid Build Coastguard Worker   int16_t *bench_in_;
111*fb1b10abSAndroid Build Coastguard Worker   tran_low_t *bench_out_;
112*fb1b10abSAndroid Build Coastguard Worker   void Run() override;
113*fb1b10abSAndroid Build Coastguard Worker };
114*fb1b10abSAndroid Build Coastguard Worker 
Run()115*fb1b10abSAndroid Build Coastguard Worker void Trans32x32Test::Run() { fwd_txfm_(bench_in_, bench_out_, 32); }
116*fb1b10abSAndroid Build Coastguard Worker 
TEST_P(Trans32x32Test,AccuracyCheck)117*fb1b10abSAndroid Build Coastguard Worker TEST_P(Trans32x32Test, AccuracyCheck) {
118*fb1b10abSAndroid Build Coastguard Worker   ACMRandom rnd(ACMRandom::DeterministicSeed());
119*fb1b10abSAndroid Build Coastguard Worker   uint32_t max_error = 0;
120*fb1b10abSAndroid Build Coastguard Worker   int64_t total_error = 0;
121*fb1b10abSAndroid Build Coastguard Worker   const int count_test_block = 10000;
122*fb1b10abSAndroid Build Coastguard Worker   DECLARE_ALIGNED(16, int16_t, test_input_block[kNumCoeffs]);
123*fb1b10abSAndroid Build Coastguard Worker   DECLARE_ALIGNED(16, tran_low_t, test_temp_block[kNumCoeffs]);
124*fb1b10abSAndroid Build Coastguard Worker   DECLARE_ALIGNED(16, uint8_t, dst[kNumCoeffs]);
125*fb1b10abSAndroid Build Coastguard Worker   DECLARE_ALIGNED(16, uint8_t, src[kNumCoeffs]);
126*fb1b10abSAndroid Build Coastguard Worker #if CONFIG_VP9_HIGHBITDEPTH
127*fb1b10abSAndroid Build Coastguard Worker   DECLARE_ALIGNED(16, uint16_t, dst16[kNumCoeffs]);
128*fb1b10abSAndroid Build Coastguard Worker   DECLARE_ALIGNED(16, uint16_t, src16[kNumCoeffs]);
129*fb1b10abSAndroid Build Coastguard Worker #endif
130*fb1b10abSAndroid Build Coastguard Worker 
131*fb1b10abSAndroid Build Coastguard Worker   for (int i = 0; i < count_test_block; ++i) {
132*fb1b10abSAndroid Build Coastguard Worker     // Initialize a test block with input range [-mask_, mask_].
133*fb1b10abSAndroid Build Coastguard Worker     for (int j = 0; j < kNumCoeffs; ++j) {
134*fb1b10abSAndroid Build Coastguard Worker       if (bit_depth_ == VPX_BITS_8) {
135*fb1b10abSAndroid Build Coastguard Worker         src[j] = rnd.Rand8();
136*fb1b10abSAndroid Build Coastguard Worker         dst[j] = rnd.Rand8();
137*fb1b10abSAndroid Build Coastguard Worker         test_input_block[j] = src[j] - dst[j];
138*fb1b10abSAndroid Build Coastguard Worker #if CONFIG_VP9_HIGHBITDEPTH
139*fb1b10abSAndroid Build Coastguard Worker       } else {
140*fb1b10abSAndroid Build Coastguard Worker         src16[j] = rnd.Rand16() & mask_;
141*fb1b10abSAndroid Build Coastguard Worker         dst16[j] = rnd.Rand16() & mask_;
142*fb1b10abSAndroid Build Coastguard Worker         test_input_block[j] = src16[j] - dst16[j];
143*fb1b10abSAndroid Build Coastguard Worker #endif
144*fb1b10abSAndroid Build Coastguard Worker       }
145*fb1b10abSAndroid Build Coastguard Worker     }
146*fb1b10abSAndroid Build Coastguard Worker 
147*fb1b10abSAndroid Build Coastguard Worker     ASM_REGISTER_STATE_CHECK(fwd_txfm_(test_input_block, test_temp_block, 32));
148*fb1b10abSAndroid Build Coastguard Worker     if (bit_depth_ == VPX_BITS_8) {
149*fb1b10abSAndroid Build Coastguard Worker       ASM_REGISTER_STATE_CHECK(inv_txfm_(test_temp_block, dst, 32));
150*fb1b10abSAndroid Build Coastguard Worker #if CONFIG_VP9_HIGHBITDEPTH
151*fb1b10abSAndroid Build Coastguard Worker     } else {
152*fb1b10abSAndroid Build Coastguard Worker       ASM_REGISTER_STATE_CHECK(
153*fb1b10abSAndroid Build Coastguard Worker           inv_txfm_(test_temp_block, CAST_TO_BYTEPTR(dst16), 32));
154*fb1b10abSAndroid Build Coastguard Worker #endif
155*fb1b10abSAndroid Build Coastguard Worker     }
156*fb1b10abSAndroid Build Coastguard Worker 
157*fb1b10abSAndroid Build Coastguard Worker     for (int j = 0; j < kNumCoeffs; ++j) {
158*fb1b10abSAndroid Build Coastguard Worker #if CONFIG_VP9_HIGHBITDEPTH
159*fb1b10abSAndroid Build Coastguard Worker       const int32_t diff =
160*fb1b10abSAndroid Build Coastguard Worker           bit_depth_ == VPX_BITS_8 ? dst[j] - src[j] : dst16[j] - src16[j];
161*fb1b10abSAndroid Build Coastguard Worker #else
162*fb1b10abSAndroid Build Coastguard Worker       const int32_t diff = dst[j] - src[j];
163*fb1b10abSAndroid Build Coastguard Worker #endif
164*fb1b10abSAndroid Build Coastguard Worker       const uint32_t error = diff * diff;
165*fb1b10abSAndroid Build Coastguard Worker       if (max_error < error) max_error = error;
166*fb1b10abSAndroid Build Coastguard Worker       total_error += error;
167*fb1b10abSAndroid Build Coastguard Worker     }
168*fb1b10abSAndroid Build Coastguard Worker   }
169*fb1b10abSAndroid Build Coastguard Worker 
170*fb1b10abSAndroid Build Coastguard Worker   if (version_ == 1) {
171*fb1b10abSAndroid Build Coastguard Worker     max_error /= 2;
172*fb1b10abSAndroid Build Coastguard Worker     total_error /= 45;
173*fb1b10abSAndroid Build Coastguard Worker   }
174*fb1b10abSAndroid Build Coastguard Worker 
175*fb1b10abSAndroid Build Coastguard Worker   EXPECT_GE(1u << 2 * (bit_depth_ - 8), max_error)
176*fb1b10abSAndroid Build Coastguard Worker       << "Error: 32x32 FDCT/IDCT has an individual round-trip error > 1";
177*fb1b10abSAndroid Build Coastguard Worker 
178*fb1b10abSAndroid Build Coastguard Worker   EXPECT_GE(count_test_block << 2 * (bit_depth_ - 8), total_error)
179*fb1b10abSAndroid Build Coastguard Worker       << "Error: 32x32 FDCT/IDCT has average round-trip error > 1 per block";
180*fb1b10abSAndroid Build Coastguard Worker }
181*fb1b10abSAndroid Build Coastguard Worker 
TEST_P(Trans32x32Test,CoeffCheck)182*fb1b10abSAndroid Build Coastguard Worker TEST_P(Trans32x32Test, CoeffCheck) {
183*fb1b10abSAndroid Build Coastguard Worker   ACMRandom rnd(ACMRandom::DeterministicSeed());
184*fb1b10abSAndroid Build Coastguard Worker   const int count_test_block = 1000;
185*fb1b10abSAndroid Build Coastguard Worker 
186*fb1b10abSAndroid Build Coastguard Worker   DECLARE_ALIGNED(16, int16_t, input_block[kNumCoeffs]);
187*fb1b10abSAndroid Build Coastguard Worker   DECLARE_ALIGNED(16, tran_low_t, output_ref_block[kNumCoeffs]);
188*fb1b10abSAndroid Build Coastguard Worker   DECLARE_ALIGNED(16, tran_low_t, output_block[kNumCoeffs]);
189*fb1b10abSAndroid Build Coastguard Worker 
190*fb1b10abSAndroid Build Coastguard Worker   for (int i = 0; i < count_test_block; ++i) {
191*fb1b10abSAndroid Build Coastguard Worker     for (int j = 0; j < kNumCoeffs; ++j) {
192*fb1b10abSAndroid Build Coastguard Worker       input_block[j] = (rnd.Rand16() & mask_) - (rnd.Rand16() & mask_);
193*fb1b10abSAndroid Build Coastguard Worker     }
194*fb1b10abSAndroid Build Coastguard Worker 
195*fb1b10abSAndroid Build Coastguard Worker     const int stride = 32;
196*fb1b10abSAndroid Build Coastguard Worker     vpx_fdct32x32_c(input_block, output_ref_block, stride);
197*fb1b10abSAndroid Build Coastguard Worker     ASM_REGISTER_STATE_CHECK(fwd_txfm_(input_block, output_block, stride));
198*fb1b10abSAndroid Build Coastguard Worker 
199*fb1b10abSAndroid Build Coastguard Worker     if (version_ == 0) {
200*fb1b10abSAndroid Build Coastguard Worker       for (int j = 0; j < kNumCoeffs; ++j)
201*fb1b10abSAndroid Build Coastguard Worker         EXPECT_EQ(output_block[j], output_ref_block[j])
202*fb1b10abSAndroid Build Coastguard Worker             << "Error: 32x32 FDCT versions have mismatched coefficients";
203*fb1b10abSAndroid Build Coastguard Worker     } else {
204*fb1b10abSAndroid Build Coastguard Worker       for (int j = 0; j < kNumCoeffs; ++j)
205*fb1b10abSAndroid Build Coastguard Worker         EXPECT_GE(6, abs(output_block[j] - output_ref_block[j]))
206*fb1b10abSAndroid Build Coastguard Worker             << "Error: 32x32 FDCT rd has mismatched coefficients";
207*fb1b10abSAndroid Build Coastguard Worker     }
208*fb1b10abSAndroid Build Coastguard Worker   }
209*fb1b10abSAndroid Build Coastguard Worker }
210*fb1b10abSAndroid Build Coastguard Worker 
TEST_P(Trans32x32Test,MemCheck)211*fb1b10abSAndroid Build Coastguard Worker TEST_P(Trans32x32Test, MemCheck) {
212*fb1b10abSAndroid Build Coastguard Worker   ACMRandom rnd(ACMRandom::DeterministicSeed());
213*fb1b10abSAndroid Build Coastguard Worker   const int count_test_block = 2000;
214*fb1b10abSAndroid Build Coastguard Worker 
215*fb1b10abSAndroid Build Coastguard Worker   DECLARE_ALIGNED(16, int16_t, input_extreme_block[kNumCoeffs]);
216*fb1b10abSAndroid Build Coastguard Worker   DECLARE_ALIGNED(16, tran_low_t, output_ref_block[kNumCoeffs]);
217*fb1b10abSAndroid Build Coastguard Worker   DECLARE_ALIGNED(16, tran_low_t, output_block[kNumCoeffs]);
218*fb1b10abSAndroid Build Coastguard Worker 
219*fb1b10abSAndroid Build Coastguard Worker   for (int i = 0; i < count_test_block; ++i) {
220*fb1b10abSAndroid Build Coastguard Worker     // Initialize a test block with input range [-mask_, mask_].
221*fb1b10abSAndroid Build Coastguard Worker     for (int j = 0; j < kNumCoeffs; ++j) {
222*fb1b10abSAndroid Build Coastguard Worker       input_extreme_block[j] = rnd.Rand8() & 1 ? mask_ : -mask_;
223*fb1b10abSAndroid Build Coastguard Worker     }
224*fb1b10abSAndroid Build Coastguard Worker     if (i == 0) {
225*fb1b10abSAndroid Build Coastguard Worker       for (int j = 0; j < kNumCoeffs; ++j) input_extreme_block[j] = mask_;
226*fb1b10abSAndroid Build Coastguard Worker     } else if (i == 1) {
227*fb1b10abSAndroid Build Coastguard Worker       for (int j = 0; j < kNumCoeffs; ++j) input_extreme_block[j] = -mask_;
228*fb1b10abSAndroid Build Coastguard Worker     }
229*fb1b10abSAndroid Build Coastguard Worker 
230*fb1b10abSAndroid Build Coastguard Worker     const int stride = 32;
231*fb1b10abSAndroid Build Coastguard Worker     vpx_fdct32x32_c(input_extreme_block, output_ref_block, stride);
232*fb1b10abSAndroid Build Coastguard Worker     ASM_REGISTER_STATE_CHECK(
233*fb1b10abSAndroid Build Coastguard Worker         fwd_txfm_(input_extreme_block, output_block, stride));
234*fb1b10abSAndroid Build Coastguard Worker 
235*fb1b10abSAndroid Build Coastguard Worker     // The minimum quant value is 4.
236*fb1b10abSAndroid Build Coastguard Worker     for (int j = 0; j < kNumCoeffs; ++j) {
237*fb1b10abSAndroid Build Coastguard Worker       if (version_ == 0) {
238*fb1b10abSAndroid Build Coastguard Worker         EXPECT_EQ(output_block[j], output_ref_block[j])
239*fb1b10abSAndroid Build Coastguard Worker             << "Error: 32x32 FDCT versions have mismatched coefficients";
240*fb1b10abSAndroid Build Coastguard Worker       } else {
241*fb1b10abSAndroid Build Coastguard Worker         EXPECT_GE(6, abs(output_block[j] - output_ref_block[j]))
242*fb1b10abSAndroid Build Coastguard Worker             << "Error: 32x32 FDCT rd has mismatched coefficients";
243*fb1b10abSAndroid Build Coastguard Worker       }
244*fb1b10abSAndroid Build Coastguard Worker       EXPECT_GE(4 * DCT_MAX_VALUE << (bit_depth_ - 8), abs(output_ref_block[j]))
245*fb1b10abSAndroid Build Coastguard Worker           << "Error: 32x32 FDCT C has coefficient larger than 4*DCT_MAX_VALUE";
246*fb1b10abSAndroid Build Coastguard Worker       EXPECT_GE(4 * DCT_MAX_VALUE << (bit_depth_ - 8), abs(output_block[j]))
247*fb1b10abSAndroid Build Coastguard Worker           << "Error: 32x32 FDCT has coefficient larger than "
248*fb1b10abSAndroid Build Coastguard Worker           << "4*DCT_MAX_VALUE";
249*fb1b10abSAndroid Build Coastguard Worker     }
250*fb1b10abSAndroid Build Coastguard Worker   }
251*fb1b10abSAndroid Build Coastguard Worker }
252*fb1b10abSAndroid Build Coastguard Worker 
TEST_P(Trans32x32Test,DISABLED_Speed)253*fb1b10abSAndroid Build Coastguard Worker TEST_P(Trans32x32Test, DISABLED_Speed) {
254*fb1b10abSAndroid Build Coastguard Worker   ACMRandom rnd(ACMRandom::DeterministicSeed());
255*fb1b10abSAndroid Build Coastguard Worker 
256*fb1b10abSAndroid Build Coastguard Worker   DECLARE_ALIGNED(16, int16_t, input_extreme_block[kNumCoeffs]);
257*fb1b10abSAndroid Build Coastguard Worker   DECLARE_ALIGNED(16, tran_low_t, output_block[kNumCoeffs]);
258*fb1b10abSAndroid Build Coastguard Worker 
259*fb1b10abSAndroid Build Coastguard Worker   bench_in_ = input_extreme_block;
260*fb1b10abSAndroid Build Coastguard Worker   bench_out_ = output_block;
261*fb1b10abSAndroid Build Coastguard Worker 
262*fb1b10abSAndroid Build Coastguard Worker   RunNTimes(INT16_MAX);
263*fb1b10abSAndroid Build Coastguard Worker   PrintMedian("32x32");
264*fb1b10abSAndroid Build Coastguard Worker }
265*fb1b10abSAndroid Build Coastguard Worker 
TEST_P(Trans32x32Test,InverseAccuracy)266*fb1b10abSAndroid Build Coastguard Worker TEST_P(Trans32x32Test, InverseAccuracy) {
267*fb1b10abSAndroid Build Coastguard Worker   ACMRandom rnd(ACMRandom::DeterministicSeed());
268*fb1b10abSAndroid Build Coastguard Worker   const int count_test_block = 1000;
269*fb1b10abSAndroid Build Coastguard Worker   DECLARE_ALIGNED(16, int16_t, in[kNumCoeffs]);
270*fb1b10abSAndroid Build Coastguard Worker   DECLARE_ALIGNED(16, tran_low_t, coeff[kNumCoeffs]);
271*fb1b10abSAndroid Build Coastguard Worker   DECLARE_ALIGNED(16, uint8_t, dst[kNumCoeffs]);
272*fb1b10abSAndroid Build Coastguard Worker   DECLARE_ALIGNED(16, uint8_t, src[kNumCoeffs]);
273*fb1b10abSAndroid Build Coastguard Worker #if CONFIG_VP9_HIGHBITDEPTH
274*fb1b10abSAndroid Build Coastguard Worker   DECLARE_ALIGNED(16, uint16_t, dst16[kNumCoeffs]);
275*fb1b10abSAndroid Build Coastguard Worker   DECLARE_ALIGNED(16, uint16_t, src16[kNumCoeffs]);
276*fb1b10abSAndroid Build Coastguard Worker #endif
277*fb1b10abSAndroid Build Coastguard Worker 
278*fb1b10abSAndroid Build Coastguard Worker   for (int i = 0; i < count_test_block; ++i) {
279*fb1b10abSAndroid Build Coastguard Worker     double out_r[kNumCoeffs];
280*fb1b10abSAndroid Build Coastguard Worker 
281*fb1b10abSAndroid Build Coastguard Worker     // Initialize a test block with input range [-255, 255]
282*fb1b10abSAndroid Build Coastguard Worker     for (int j = 0; j < kNumCoeffs; ++j) {
283*fb1b10abSAndroid Build Coastguard Worker       if (bit_depth_ == VPX_BITS_8) {
284*fb1b10abSAndroid Build Coastguard Worker         src[j] = rnd.Rand8();
285*fb1b10abSAndroid Build Coastguard Worker         dst[j] = rnd.Rand8();
286*fb1b10abSAndroid Build Coastguard Worker         in[j] = src[j] - dst[j];
287*fb1b10abSAndroid Build Coastguard Worker #if CONFIG_VP9_HIGHBITDEPTH
288*fb1b10abSAndroid Build Coastguard Worker       } else {
289*fb1b10abSAndroid Build Coastguard Worker         src16[j] = rnd.Rand16() & mask_;
290*fb1b10abSAndroid Build Coastguard Worker         dst16[j] = rnd.Rand16() & mask_;
291*fb1b10abSAndroid Build Coastguard Worker         in[j] = src16[j] - dst16[j];
292*fb1b10abSAndroid Build Coastguard Worker #endif
293*fb1b10abSAndroid Build Coastguard Worker       }
294*fb1b10abSAndroid Build Coastguard Worker     }
295*fb1b10abSAndroid Build Coastguard Worker 
296*fb1b10abSAndroid Build Coastguard Worker     reference_32x32_dct_2d(in, out_r);
297*fb1b10abSAndroid Build Coastguard Worker     for (int j = 0; j < kNumCoeffs; ++j) {
298*fb1b10abSAndroid Build Coastguard Worker       coeff[j] = static_cast<tran_low_t>(round(out_r[j]));
299*fb1b10abSAndroid Build Coastguard Worker     }
300*fb1b10abSAndroid Build Coastguard Worker     if (bit_depth_ == VPX_BITS_8) {
301*fb1b10abSAndroid Build Coastguard Worker       ASM_REGISTER_STATE_CHECK(inv_txfm_(coeff, dst, 32));
302*fb1b10abSAndroid Build Coastguard Worker #if CONFIG_VP9_HIGHBITDEPTH
303*fb1b10abSAndroid Build Coastguard Worker     } else {
304*fb1b10abSAndroid Build Coastguard Worker       ASM_REGISTER_STATE_CHECK(inv_txfm_(coeff, CAST_TO_BYTEPTR(dst16), 32));
305*fb1b10abSAndroid Build Coastguard Worker #endif
306*fb1b10abSAndroid Build Coastguard Worker     }
307*fb1b10abSAndroid Build Coastguard Worker     for (int j = 0; j < kNumCoeffs; ++j) {
308*fb1b10abSAndroid Build Coastguard Worker #if CONFIG_VP9_HIGHBITDEPTH
309*fb1b10abSAndroid Build Coastguard Worker       const int diff =
310*fb1b10abSAndroid Build Coastguard Worker           bit_depth_ == VPX_BITS_8 ? dst[j] - src[j] : dst16[j] - src16[j];
311*fb1b10abSAndroid Build Coastguard Worker #else
312*fb1b10abSAndroid Build Coastguard Worker       const int diff = dst[j] - src[j];
313*fb1b10abSAndroid Build Coastguard Worker #endif
314*fb1b10abSAndroid Build Coastguard Worker       const int error = diff * diff;
315*fb1b10abSAndroid Build Coastguard Worker       EXPECT_GE(1, error) << "Error: 32x32 IDCT has error " << error
316*fb1b10abSAndroid Build Coastguard Worker                           << " at index " << j;
317*fb1b10abSAndroid Build Coastguard Worker     }
318*fb1b10abSAndroid Build Coastguard Worker   }
319*fb1b10abSAndroid Build Coastguard Worker }
320*fb1b10abSAndroid Build Coastguard Worker 
321*fb1b10abSAndroid Build Coastguard Worker class InvTrans32x32Test : public ::testing::TestWithParam<InvTrans32x32Param> {
322*fb1b10abSAndroid Build Coastguard Worker  public:
323*fb1b10abSAndroid Build Coastguard Worker   ~InvTrans32x32Test() override = default;
SetUp()324*fb1b10abSAndroid Build Coastguard Worker   void SetUp() override {
325*fb1b10abSAndroid Build Coastguard Worker     ref_txfm_ = GET_PARAM(0);
326*fb1b10abSAndroid Build Coastguard Worker     inv_txfm_ = GET_PARAM(1);
327*fb1b10abSAndroid Build Coastguard Worker     version_ = GET_PARAM(2);  // 0: high precision forward transform
328*fb1b10abSAndroid Build Coastguard Worker                               // 1: low precision version for rd loop
329*fb1b10abSAndroid Build Coastguard Worker     bit_depth_ = GET_PARAM(3);
330*fb1b10abSAndroid Build Coastguard Worker     eob_ = GET_PARAM(4);
331*fb1b10abSAndroid Build Coastguard Worker     thresh_ = GET_PARAM(4);
332*fb1b10abSAndroid Build Coastguard Worker     mask_ = (1 << bit_depth_) - 1;
333*fb1b10abSAndroid Build Coastguard Worker     pitch_ = 32;
334*fb1b10abSAndroid Build Coastguard Worker   }
335*fb1b10abSAndroid Build Coastguard Worker 
TearDown()336*fb1b10abSAndroid Build Coastguard Worker   void TearDown() override { libvpx_test::ClearSystemState(); }
337*fb1b10abSAndroid Build Coastguard Worker 
338*fb1b10abSAndroid Build Coastguard Worker  protected:
RunRefTxfm(tran_low_t * out,uint8_t * dst,int stride)339*fb1b10abSAndroid Build Coastguard Worker   void RunRefTxfm(tran_low_t *out, uint8_t *dst, int stride) {
340*fb1b10abSAndroid Build Coastguard Worker     ref_txfm_(out, dst, stride);
341*fb1b10abSAndroid Build Coastguard Worker   }
RunInvTxfm(tran_low_t * out,uint8_t * dst,int stride)342*fb1b10abSAndroid Build Coastguard Worker   void RunInvTxfm(tran_low_t *out, uint8_t *dst, int stride) {
343*fb1b10abSAndroid Build Coastguard Worker     inv_txfm_(out, dst, stride);
344*fb1b10abSAndroid Build Coastguard Worker   }
345*fb1b10abSAndroid Build Coastguard Worker   int version_;
346*fb1b10abSAndroid Build Coastguard Worker   vpx_bit_depth_t bit_depth_;
347*fb1b10abSAndroid Build Coastguard Worker   int mask_;
348*fb1b10abSAndroid Build Coastguard Worker   int eob_;
349*fb1b10abSAndroid Build Coastguard Worker   int thresh_;
350*fb1b10abSAndroid Build Coastguard Worker 
351*fb1b10abSAndroid Build Coastguard Worker   InvTxfmFunc ref_txfm_;
352*fb1b10abSAndroid Build Coastguard Worker   InvTxfmFunc inv_txfm_;
353*fb1b10abSAndroid Build Coastguard Worker   int pitch_;
354*fb1b10abSAndroid Build Coastguard Worker 
RunInvTrans32x32SpeedTest()355*fb1b10abSAndroid Build Coastguard Worker   void RunInvTrans32x32SpeedTest() {
356*fb1b10abSAndroid Build Coastguard Worker     ACMRandom rnd(ACMRandom::DeterministicSeed());
357*fb1b10abSAndroid Build Coastguard Worker     const int count_test_block = 10000;
358*fb1b10abSAndroid Build Coastguard Worker     int64_t c_sum_time = 0;
359*fb1b10abSAndroid Build Coastguard Worker     int64_t simd_sum_time = 0;
360*fb1b10abSAndroid Build Coastguard Worker     const int16_t *scan = vp9_default_scan_orders[TX_32X32].scan;
361*fb1b10abSAndroid Build Coastguard Worker     DECLARE_ALIGNED(32, tran_low_t, coeff[kNumCoeffs]);
362*fb1b10abSAndroid Build Coastguard Worker     DECLARE_ALIGNED(16, uint8_t, dst[kNumCoeffs]);
363*fb1b10abSAndroid Build Coastguard Worker     DECLARE_ALIGNED(16, uint8_t, ref[kNumCoeffs]);
364*fb1b10abSAndroid Build Coastguard Worker #if CONFIG_VP9_HIGHBITDEPTH
365*fb1b10abSAndroid Build Coastguard Worker     DECLARE_ALIGNED(16, uint16_t, dst16[kNumCoeffs]);
366*fb1b10abSAndroid Build Coastguard Worker     DECLARE_ALIGNED(16, uint16_t, ref16[kNumCoeffs]);
367*fb1b10abSAndroid Build Coastguard Worker #endif  // CONFIG_VP9_HIGHBITDEPTH
368*fb1b10abSAndroid Build Coastguard Worker 
369*fb1b10abSAndroid Build Coastguard Worker     for (int j = 0; j < kNumCoeffs; ++j) {
370*fb1b10abSAndroid Build Coastguard Worker       if (j < eob_) {
371*fb1b10abSAndroid Build Coastguard Worker         // Random values less than the threshold, either positive or negative
372*fb1b10abSAndroid Build Coastguard Worker         coeff[scan[j]] = rnd(thresh_);
373*fb1b10abSAndroid Build Coastguard Worker       } else {
374*fb1b10abSAndroid Build Coastguard Worker         coeff[scan[j]] = 0;
375*fb1b10abSAndroid Build Coastguard Worker       }
376*fb1b10abSAndroid Build Coastguard Worker       if (bit_depth_ == VPX_BITS_8) {
377*fb1b10abSAndroid Build Coastguard Worker         dst[j] = 0;
378*fb1b10abSAndroid Build Coastguard Worker         ref[j] = 0;
379*fb1b10abSAndroid Build Coastguard Worker #if CONFIG_VP9_HIGHBITDEPTH
380*fb1b10abSAndroid Build Coastguard Worker       } else {
381*fb1b10abSAndroid Build Coastguard Worker         dst16[j] = 0;
382*fb1b10abSAndroid Build Coastguard Worker         ref16[j] = 0;
383*fb1b10abSAndroid Build Coastguard Worker #endif  // CONFIG_VP9_HIGHBITDEPTH
384*fb1b10abSAndroid Build Coastguard Worker       }
385*fb1b10abSAndroid Build Coastguard Worker     }
386*fb1b10abSAndroid Build Coastguard Worker 
387*fb1b10abSAndroid Build Coastguard Worker     if (bit_depth_ == VPX_BITS_8) {
388*fb1b10abSAndroid Build Coastguard Worker       vpx_usec_timer timer_c;
389*fb1b10abSAndroid Build Coastguard Worker       vpx_usec_timer_start(&timer_c);
390*fb1b10abSAndroid Build Coastguard Worker       for (int i = 0; i < count_test_block; ++i) {
391*fb1b10abSAndroid Build Coastguard Worker         RunRefTxfm(coeff, ref, pitch_);
392*fb1b10abSAndroid Build Coastguard Worker       }
393*fb1b10abSAndroid Build Coastguard Worker       vpx_usec_timer_mark(&timer_c);
394*fb1b10abSAndroid Build Coastguard Worker       c_sum_time += vpx_usec_timer_elapsed(&timer_c);
395*fb1b10abSAndroid Build Coastguard Worker 
396*fb1b10abSAndroid Build Coastguard Worker       vpx_usec_timer timer_mod;
397*fb1b10abSAndroid Build Coastguard Worker       vpx_usec_timer_start(&timer_mod);
398*fb1b10abSAndroid Build Coastguard Worker       for (int i = 0; i < count_test_block; ++i) {
399*fb1b10abSAndroid Build Coastguard Worker         RunInvTxfm(coeff, dst, pitch_);
400*fb1b10abSAndroid Build Coastguard Worker       }
401*fb1b10abSAndroid Build Coastguard Worker       vpx_usec_timer_mark(&timer_mod);
402*fb1b10abSAndroid Build Coastguard Worker       simd_sum_time += vpx_usec_timer_elapsed(&timer_mod);
403*fb1b10abSAndroid Build Coastguard Worker     } else {
404*fb1b10abSAndroid Build Coastguard Worker #if CONFIG_VP9_HIGHBITDEPTH
405*fb1b10abSAndroid Build Coastguard Worker       vpx_usec_timer timer_c;
406*fb1b10abSAndroid Build Coastguard Worker       vpx_usec_timer_start(&timer_c);
407*fb1b10abSAndroid Build Coastguard Worker       for (int i = 0; i < count_test_block; ++i) {
408*fb1b10abSAndroid Build Coastguard Worker         RunRefTxfm(coeff, CAST_TO_BYTEPTR(ref16), pitch_);
409*fb1b10abSAndroid Build Coastguard Worker       }
410*fb1b10abSAndroid Build Coastguard Worker       vpx_usec_timer_mark(&timer_c);
411*fb1b10abSAndroid Build Coastguard Worker       c_sum_time += vpx_usec_timer_elapsed(&timer_c);
412*fb1b10abSAndroid Build Coastguard Worker 
413*fb1b10abSAndroid Build Coastguard Worker       vpx_usec_timer timer_mod;
414*fb1b10abSAndroid Build Coastguard Worker       vpx_usec_timer_start(&timer_mod);
415*fb1b10abSAndroid Build Coastguard Worker       for (int i = 0; i < count_test_block; ++i) {
416*fb1b10abSAndroid Build Coastguard Worker         RunInvTxfm(coeff, CAST_TO_BYTEPTR(dst16), pitch_);
417*fb1b10abSAndroid Build Coastguard Worker       }
418*fb1b10abSAndroid Build Coastguard Worker       vpx_usec_timer_mark(&timer_mod);
419*fb1b10abSAndroid Build Coastguard Worker       simd_sum_time += vpx_usec_timer_elapsed(&timer_mod);
420*fb1b10abSAndroid Build Coastguard Worker #endif  // CONFIG_VP9_HIGHBITDEPTH
421*fb1b10abSAndroid Build Coastguard Worker     }
422*fb1b10abSAndroid Build Coastguard Worker     printf(
423*fb1b10abSAndroid Build Coastguard Worker         "c_time = %" PRId64 " \t simd_time = %" PRId64 " \t Gain = %4.2f \n",
424*fb1b10abSAndroid Build Coastguard Worker         c_sum_time, simd_sum_time,
425*fb1b10abSAndroid Build Coastguard Worker         (static_cast<float>(c_sum_time) / static_cast<float>(simd_sum_time)));
426*fb1b10abSAndroid Build Coastguard Worker   }
427*fb1b10abSAndroid Build Coastguard Worker 
CompareInvReference32x32()428*fb1b10abSAndroid Build Coastguard Worker   void CompareInvReference32x32() {
429*fb1b10abSAndroid Build Coastguard Worker     ACMRandom rnd(ACMRandom::DeterministicSeed());
430*fb1b10abSAndroid Build Coastguard Worker     const int count_test_block = 10000;
431*fb1b10abSAndroid Build Coastguard Worker     const int eob = 31;
432*fb1b10abSAndroid Build Coastguard Worker     const int16_t *scan = vp9_default_scan_orders[TX_32X32].scan;
433*fb1b10abSAndroid Build Coastguard Worker     DECLARE_ALIGNED(32, tran_low_t, coeff[kNumCoeffs]);
434*fb1b10abSAndroid Build Coastguard Worker     DECLARE_ALIGNED(16, uint8_t, dst[kNumCoeffs]);
435*fb1b10abSAndroid Build Coastguard Worker     DECLARE_ALIGNED(16, uint8_t, ref[kNumCoeffs]);
436*fb1b10abSAndroid Build Coastguard Worker #if CONFIG_VP9_HIGHBITDEPTH
437*fb1b10abSAndroid Build Coastguard Worker     DECLARE_ALIGNED(16, uint16_t, dst16[kNumCoeffs]);
438*fb1b10abSAndroid Build Coastguard Worker     DECLARE_ALIGNED(16, uint16_t, ref16[kNumCoeffs]);
439*fb1b10abSAndroid Build Coastguard Worker #endif  // CONFIG_VP9_HIGHBITDEPTH
440*fb1b10abSAndroid Build Coastguard Worker 
441*fb1b10abSAndroid Build Coastguard Worker     for (int i = 0; i < count_test_block; ++i) {
442*fb1b10abSAndroid Build Coastguard Worker       for (int j = 0; j < kNumCoeffs; ++j) {
443*fb1b10abSAndroid Build Coastguard Worker         if (j < eob) {
444*fb1b10abSAndroid Build Coastguard Worker           coeff[scan[j]] = rnd.Rand8Extremes();
445*fb1b10abSAndroid Build Coastguard Worker         } else {
446*fb1b10abSAndroid Build Coastguard Worker           coeff[scan[j]] = 0;
447*fb1b10abSAndroid Build Coastguard Worker         }
448*fb1b10abSAndroid Build Coastguard Worker         if (bit_depth_ == VPX_BITS_8) {
449*fb1b10abSAndroid Build Coastguard Worker           dst[j] = 0;
450*fb1b10abSAndroid Build Coastguard Worker           ref[j] = 0;
451*fb1b10abSAndroid Build Coastguard Worker #if CONFIG_VP9_HIGHBITDEPTH
452*fb1b10abSAndroid Build Coastguard Worker         } else {
453*fb1b10abSAndroid Build Coastguard Worker           dst16[j] = 0;
454*fb1b10abSAndroid Build Coastguard Worker           ref16[j] = 0;
455*fb1b10abSAndroid Build Coastguard Worker #endif  // CONFIG_VP9_HIGHBITDEPTH
456*fb1b10abSAndroid Build Coastguard Worker         }
457*fb1b10abSAndroid Build Coastguard Worker       }
458*fb1b10abSAndroid Build Coastguard Worker       if (bit_depth_ == VPX_BITS_8) {
459*fb1b10abSAndroid Build Coastguard Worker         RunRefTxfm(coeff, ref, pitch_);
460*fb1b10abSAndroid Build Coastguard Worker         RunInvTxfm(coeff, dst, pitch_);
461*fb1b10abSAndroid Build Coastguard Worker       } else {
462*fb1b10abSAndroid Build Coastguard Worker #if CONFIG_VP9_HIGHBITDEPTH
463*fb1b10abSAndroid Build Coastguard Worker         RunRefTxfm(coeff, CAST_TO_BYTEPTR(ref16), pitch_);
464*fb1b10abSAndroid Build Coastguard Worker         ASM_REGISTER_STATE_CHECK(
465*fb1b10abSAndroid Build Coastguard Worker             RunInvTxfm(coeff, CAST_TO_BYTEPTR(dst16), pitch_));
466*fb1b10abSAndroid Build Coastguard Worker #endif  // CONFIG_VP9_HIGHBITDEPTH
467*fb1b10abSAndroid Build Coastguard Worker       }
468*fb1b10abSAndroid Build Coastguard Worker 
469*fb1b10abSAndroid Build Coastguard Worker       for (int j = 0; j < kNumCoeffs; ++j) {
470*fb1b10abSAndroid Build Coastguard Worker #if CONFIG_VP9_HIGHBITDEPTH
471*fb1b10abSAndroid Build Coastguard Worker         const uint32_t diff =
472*fb1b10abSAndroid Build Coastguard Worker             bit_depth_ == VPX_BITS_8 ? dst[j] - ref[j] : dst16[j] - ref16[j];
473*fb1b10abSAndroid Build Coastguard Worker #else
474*fb1b10abSAndroid Build Coastguard Worker         const uint32_t diff = dst[j] - ref[j];
475*fb1b10abSAndroid Build Coastguard Worker #endif  // CONFIG_VP9_HIGHBITDEPTH
476*fb1b10abSAndroid Build Coastguard Worker         const uint32_t error = diff * diff;
477*fb1b10abSAndroid Build Coastguard Worker         EXPECT_EQ(0u, error) << "Error: 32x32 IDCT Comparison has error "
478*fb1b10abSAndroid Build Coastguard Worker                              << error << " at index " << j;
479*fb1b10abSAndroid Build Coastguard Worker       }
480*fb1b10abSAndroid Build Coastguard Worker     }
481*fb1b10abSAndroid Build Coastguard Worker   }
482*fb1b10abSAndroid Build Coastguard Worker };
483*fb1b10abSAndroid Build Coastguard Worker 
484*fb1b10abSAndroid Build Coastguard Worker GTEST_ALLOW_UNINSTANTIATED_PARAMETERIZED_TEST(InvTrans32x32Test);
485*fb1b10abSAndroid Build Coastguard Worker 
TEST_P(InvTrans32x32Test,DISABLED_Speed)486*fb1b10abSAndroid Build Coastguard Worker TEST_P(InvTrans32x32Test, DISABLED_Speed) { RunInvTrans32x32SpeedTest(); }
TEST_P(InvTrans32x32Test,CompareReference)487*fb1b10abSAndroid Build Coastguard Worker TEST_P(InvTrans32x32Test, CompareReference) { CompareInvReference32x32(); }
488*fb1b10abSAndroid Build Coastguard Worker 
489*fb1b10abSAndroid Build Coastguard Worker using std::make_tuple;
490*fb1b10abSAndroid Build Coastguard Worker 
491*fb1b10abSAndroid Build Coastguard Worker #if CONFIG_VP9_HIGHBITDEPTH
492*fb1b10abSAndroid Build Coastguard Worker INSTANTIATE_TEST_SUITE_P(
493*fb1b10abSAndroid Build Coastguard Worker     C, Trans32x32Test,
494*fb1b10abSAndroid Build Coastguard Worker     ::testing::Values(
495*fb1b10abSAndroid Build Coastguard Worker         make_tuple(&vpx_highbd_fdct32x32_c, &idct32x32_10, 0, VPX_BITS_10),
496*fb1b10abSAndroid Build Coastguard Worker         make_tuple(&vpx_highbd_fdct32x32_rd_c, &idct32x32_10, 1, VPX_BITS_10),
497*fb1b10abSAndroid Build Coastguard Worker         make_tuple(&vpx_highbd_fdct32x32_c, &idct32x32_12, 0, VPX_BITS_12),
498*fb1b10abSAndroid Build Coastguard Worker         make_tuple(&vpx_highbd_fdct32x32_rd_c, &idct32x32_12, 1, VPX_BITS_12),
499*fb1b10abSAndroid Build Coastguard Worker         make_tuple(&vpx_fdct32x32_c, &vpx_idct32x32_1024_add_c, 0, VPX_BITS_8),
500*fb1b10abSAndroid Build Coastguard Worker         make_tuple(&vpx_fdct32x32_rd_c, &vpx_idct32x32_1024_add_c, 1,
501*fb1b10abSAndroid Build Coastguard Worker                    VPX_BITS_8)));
502*fb1b10abSAndroid Build Coastguard Worker #else
503*fb1b10abSAndroid Build Coastguard Worker INSTANTIATE_TEST_SUITE_P(
504*fb1b10abSAndroid Build Coastguard Worker     C, Trans32x32Test,
505*fb1b10abSAndroid Build Coastguard Worker     ::testing::Values(make_tuple(&vpx_fdct32x32_c, &vpx_idct32x32_1024_add_c, 0,
506*fb1b10abSAndroid Build Coastguard Worker                                  VPX_BITS_8),
507*fb1b10abSAndroid Build Coastguard Worker                       make_tuple(&vpx_fdct32x32_rd_c, &vpx_idct32x32_1024_add_c,
508*fb1b10abSAndroid Build Coastguard Worker                                  1, VPX_BITS_8)));
509*fb1b10abSAndroid Build Coastguard Worker 
510*fb1b10abSAndroid Build Coastguard Worker INSTANTIATE_TEST_SUITE_P(
511*fb1b10abSAndroid Build Coastguard Worker     C, InvTrans32x32Test,
512*fb1b10abSAndroid Build Coastguard Worker     ::testing::Values(
513*fb1b10abSAndroid Build Coastguard Worker         (make_tuple(&vpx_idct32x32_1024_add_c, &vpx_idct32x32_1024_add_c, 0,
514*fb1b10abSAndroid Build Coastguard Worker                     VPX_BITS_8, 32, 6225)),
515*fb1b10abSAndroid Build Coastguard Worker         make_tuple(&vpx_idct32x32_135_add_c, &vpx_idct32x32_135_add_c, 0,
516*fb1b10abSAndroid Build Coastguard Worker                    VPX_BITS_8, 16, 6255)));
517*fb1b10abSAndroid Build Coastguard Worker #endif  // CONFIG_VP9_HIGHBITDEPTH
518*fb1b10abSAndroid Build Coastguard Worker 
519*fb1b10abSAndroid Build Coastguard Worker #if HAVE_NEON && !CONFIG_EMULATE_HARDWARE
520*fb1b10abSAndroid Build Coastguard Worker INSTANTIATE_TEST_SUITE_P(
521*fb1b10abSAndroid Build Coastguard Worker     NEON, Trans32x32Test,
522*fb1b10abSAndroid Build Coastguard Worker     ::testing::Values(make_tuple(&vpx_fdct32x32_neon,
523*fb1b10abSAndroid Build Coastguard Worker                                  &vpx_idct32x32_1024_add_neon, 0, VPX_BITS_8),
524*fb1b10abSAndroid Build Coastguard Worker                       make_tuple(&vpx_fdct32x32_rd_neon,
525*fb1b10abSAndroid Build Coastguard Worker                                  &vpx_idct32x32_1024_add_neon, 1, VPX_BITS_8)));
526*fb1b10abSAndroid Build Coastguard Worker #endif  // HAVE_NEON && !CONFIG_EMULATE_HARDWARE
527*fb1b10abSAndroid Build Coastguard Worker 
528*fb1b10abSAndroid Build Coastguard Worker #if HAVE_SSE2 && !CONFIG_VP9_HIGHBITDEPTH && !CONFIG_EMULATE_HARDWARE
529*fb1b10abSAndroid Build Coastguard Worker INSTANTIATE_TEST_SUITE_P(
530*fb1b10abSAndroid Build Coastguard Worker     SSE2, Trans32x32Test,
531*fb1b10abSAndroid Build Coastguard Worker     ::testing::Values(make_tuple(&vpx_fdct32x32_sse2,
532*fb1b10abSAndroid Build Coastguard Worker                                  &vpx_idct32x32_1024_add_sse2, 0, VPX_BITS_8),
533*fb1b10abSAndroid Build Coastguard Worker                       make_tuple(&vpx_fdct32x32_rd_sse2,
534*fb1b10abSAndroid Build Coastguard Worker                                  &vpx_idct32x32_1024_add_sse2, 1, VPX_BITS_8)));
535*fb1b10abSAndroid Build Coastguard Worker 
536*fb1b10abSAndroid Build Coastguard Worker INSTANTIATE_TEST_SUITE_P(
537*fb1b10abSAndroid Build Coastguard Worker     SSE2, InvTrans32x32Test,
538*fb1b10abSAndroid Build Coastguard Worker     ::testing::Values(
539*fb1b10abSAndroid Build Coastguard Worker         (make_tuple(&vpx_idct32x32_1024_add_c, &vpx_idct32x32_1024_add_sse2, 0,
540*fb1b10abSAndroid Build Coastguard Worker                     VPX_BITS_8, 32, 6225)),
541*fb1b10abSAndroid Build Coastguard Worker         make_tuple(&vpx_idct32x32_135_add_c, &vpx_idct32x32_135_add_sse2, 0,
542*fb1b10abSAndroid Build Coastguard Worker                    VPX_BITS_8, 16, 6225)));
543*fb1b10abSAndroid Build Coastguard Worker #endif  // HAVE_SSE2 && !CONFIG_VP9_HIGHBITDEPTH && !CONFIG_EMULATE_HARDWARE
544*fb1b10abSAndroid Build Coastguard Worker 
545*fb1b10abSAndroid Build Coastguard Worker #if HAVE_SSE2 && CONFIG_VP9_HIGHBITDEPTH && !CONFIG_EMULATE_HARDWARE
546*fb1b10abSAndroid Build Coastguard Worker INSTANTIATE_TEST_SUITE_P(
547*fb1b10abSAndroid Build Coastguard Worker     SSE2, Trans32x32Test,
548*fb1b10abSAndroid Build Coastguard Worker     ::testing::Values(
549*fb1b10abSAndroid Build Coastguard Worker         make_tuple(&vpx_highbd_fdct32x32_sse2, &idct32x32_10, 0, VPX_BITS_10),
550*fb1b10abSAndroid Build Coastguard Worker         make_tuple(&vpx_highbd_fdct32x32_rd_sse2, &idct32x32_10, 1,
551*fb1b10abSAndroid Build Coastguard Worker                    VPX_BITS_10),
552*fb1b10abSAndroid Build Coastguard Worker         make_tuple(&vpx_highbd_fdct32x32_sse2, &idct32x32_12, 0, VPX_BITS_12),
553*fb1b10abSAndroid Build Coastguard Worker         make_tuple(&vpx_highbd_fdct32x32_rd_sse2, &idct32x32_12, 1,
554*fb1b10abSAndroid Build Coastguard Worker                    VPX_BITS_12),
555*fb1b10abSAndroid Build Coastguard Worker         make_tuple(&vpx_fdct32x32_sse2, &vpx_idct32x32_1024_add_c, 0,
556*fb1b10abSAndroid Build Coastguard Worker                    VPX_BITS_8),
557*fb1b10abSAndroid Build Coastguard Worker         make_tuple(&vpx_fdct32x32_rd_sse2, &vpx_idct32x32_1024_add_c, 1,
558*fb1b10abSAndroid Build Coastguard Worker                    VPX_BITS_8)));
559*fb1b10abSAndroid Build Coastguard Worker #endif  // HAVE_SSE2 && CONFIG_VP9_HIGHBITDEPTH && !CONFIG_EMULATE_HARDWARE
560*fb1b10abSAndroid Build Coastguard Worker 
561*fb1b10abSAndroid Build Coastguard Worker #if HAVE_AVX2 && !CONFIG_VP9_HIGHBITDEPTH && !CONFIG_EMULATE_HARDWARE
562*fb1b10abSAndroid Build Coastguard Worker INSTANTIATE_TEST_SUITE_P(
563*fb1b10abSAndroid Build Coastguard Worker     AVX2, Trans32x32Test,
564*fb1b10abSAndroid Build Coastguard Worker     ::testing::Values(make_tuple(&vpx_fdct32x32_avx2,
565*fb1b10abSAndroid Build Coastguard Worker                                  &vpx_idct32x32_1024_add_sse2, 0, VPX_BITS_8),
566*fb1b10abSAndroid Build Coastguard Worker                       make_tuple(&vpx_fdct32x32_rd_avx2,
567*fb1b10abSAndroid Build Coastguard Worker                                  &vpx_idct32x32_1024_add_sse2, 1, VPX_BITS_8)));
568*fb1b10abSAndroid Build Coastguard Worker 
569*fb1b10abSAndroid Build Coastguard Worker INSTANTIATE_TEST_SUITE_P(
570*fb1b10abSAndroid Build Coastguard Worker     AVX2, InvTrans32x32Test,
571*fb1b10abSAndroid Build Coastguard Worker     ::testing::Values(
572*fb1b10abSAndroid Build Coastguard Worker         (make_tuple(&vpx_idct32x32_1024_add_c, &vpx_idct32x32_1024_add_avx2, 0,
573*fb1b10abSAndroid Build Coastguard Worker                     VPX_BITS_8, 32, 6225)),
574*fb1b10abSAndroid Build Coastguard Worker         make_tuple(&vpx_idct32x32_135_add_c, &vpx_idct32x32_135_add_avx2, 0,
575*fb1b10abSAndroid Build Coastguard Worker                    VPX_BITS_8, 16, 6225)));
576*fb1b10abSAndroid Build Coastguard Worker #endif  // HAVE_AVX2 && !CONFIG_VP9_HIGHBITDEPTH && !CONFIG_EMULATE_HARDWARE
577*fb1b10abSAndroid Build Coastguard Worker 
578*fb1b10abSAndroid Build Coastguard Worker #if HAVE_MSA && !CONFIG_VP9_HIGHBITDEPTH && !CONFIG_EMULATE_HARDWARE
579*fb1b10abSAndroid Build Coastguard Worker INSTANTIATE_TEST_SUITE_P(
580*fb1b10abSAndroid Build Coastguard Worker     MSA, Trans32x32Test,
581*fb1b10abSAndroid Build Coastguard Worker     ::testing::Values(make_tuple(&vpx_fdct32x32_msa,
582*fb1b10abSAndroid Build Coastguard Worker                                  &vpx_idct32x32_1024_add_msa, 0, VPX_BITS_8),
583*fb1b10abSAndroid Build Coastguard Worker                       make_tuple(&vpx_fdct32x32_rd_msa,
584*fb1b10abSAndroid Build Coastguard Worker                                  &vpx_idct32x32_1024_add_msa, 1, VPX_BITS_8)));
585*fb1b10abSAndroid Build Coastguard Worker #endif  // HAVE_MSA && !CONFIG_VP9_HIGHBITDEPTH && !CONFIG_EMULATE_HARDWARE
586*fb1b10abSAndroid Build Coastguard Worker 
587*fb1b10abSAndroid Build Coastguard Worker #if HAVE_VSX && !CONFIG_VP9_HIGHBITDEPTH && !CONFIG_EMULATE_HARDWARE
588*fb1b10abSAndroid Build Coastguard Worker INSTANTIATE_TEST_SUITE_P(
589*fb1b10abSAndroid Build Coastguard Worker     VSX, Trans32x32Test,
590*fb1b10abSAndroid Build Coastguard Worker     ::testing::Values(make_tuple(&vpx_fdct32x32_c, &vpx_idct32x32_1024_add_vsx,
591*fb1b10abSAndroid Build Coastguard Worker                                  0, VPX_BITS_8),
592*fb1b10abSAndroid Build Coastguard Worker                       make_tuple(&vpx_fdct32x32_rd_vsx,
593*fb1b10abSAndroid Build Coastguard Worker                                  &vpx_idct32x32_1024_add_vsx, 1, VPX_BITS_8)));
594*fb1b10abSAndroid Build Coastguard Worker #endif  // HAVE_VSX && !CONFIG_VP9_HIGHBITDEPTH && !CONFIG_EMULATE_HARDWARE
595*fb1b10abSAndroid Build Coastguard Worker 
596*fb1b10abSAndroid Build Coastguard Worker #if HAVE_LSX && !CONFIG_VP9_HIGHBITDEPTH && !CONFIG_EMULATE_HARDWARE
597*fb1b10abSAndroid Build Coastguard Worker INSTANTIATE_TEST_SUITE_P(
598*fb1b10abSAndroid Build Coastguard Worker     LSX, Trans32x32Test,
599*fb1b10abSAndroid Build Coastguard Worker     ::testing::Values(make_tuple(&vpx_fdct32x32_lsx,
600*fb1b10abSAndroid Build Coastguard Worker                                  &vpx_idct32x32_1024_add_lsx, 0, VPX_BITS_8),
601*fb1b10abSAndroid Build Coastguard Worker                       make_tuple(&vpx_fdct32x32_rd_lsx,
602*fb1b10abSAndroid Build Coastguard Worker                                  &vpx_idct32x32_1024_add_lsx, 1, VPX_BITS_8)));
603*fb1b10abSAndroid Build Coastguard Worker #endif  // HAVE_LSX && !CONFIG_VP9_HIGHBITDEPTH && !CONFIG_EMULATE_HARDWARE
604*fb1b10abSAndroid Build Coastguard Worker }  // namespace
605