xref: /aosp_15_r20/external/libvpx/test/dct_test.cc (revision fb1b10ab9aebc7c7068eedab379b749d7e3900be)
1*fb1b10abSAndroid Build Coastguard Worker /*
2*fb1b10abSAndroid Build Coastguard Worker  *  Copyright (c) 2017 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/buffer.h"
22*fb1b10abSAndroid Build Coastguard Worker #include "test/clear_system_state.h"
23*fb1b10abSAndroid Build Coastguard Worker #include "test/register_state_check.h"
24*fb1b10abSAndroid Build Coastguard Worker #include "test/util.h"
25*fb1b10abSAndroid Build Coastguard Worker #include "vp9/common/vp9_entropy.h"
26*fb1b10abSAndroid Build Coastguard Worker #include "vpx_config.h"
27*fb1b10abSAndroid Build Coastguard Worker #include "vpx/vpx_codec.h"
28*fb1b10abSAndroid Build Coastguard Worker #include "vpx/vpx_integer.h"
29*fb1b10abSAndroid Build Coastguard Worker #include "vpx_ports/mem.h"
30*fb1b10abSAndroid Build Coastguard Worker 
31*fb1b10abSAndroid Build Coastguard Worker using libvpx_test::ACMRandom;
32*fb1b10abSAndroid Build Coastguard Worker using libvpx_test::Buffer;
33*fb1b10abSAndroid Build Coastguard Worker using std::make_tuple;
34*fb1b10abSAndroid Build Coastguard Worker using std::tuple;
35*fb1b10abSAndroid Build Coastguard Worker 
36*fb1b10abSAndroid Build Coastguard Worker namespace {
37*fb1b10abSAndroid Build Coastguard Worker typedef void (*FdctFunc)(const int16_t *in, tran_low_t *out, int stride);
38*fb1b10abSAndroid Build Coastguard Worker typedef void (*IdctFunc)(const tran_low_t *in, uint8_t *out, int stride);
39*fb1b10abSAndroid Build Coastguard Worker typedef void (*FhtFunc)(const int16_t *in, tran_low_t *out, int stride,
40*fb1b10abSAndroid Build Coastguard Worker                         int tx_type);
41*fb1b10abSAndroid Build Coastguard Worker typedef void (*FhtFuncRef)(const Buffer<int16_t> &in, Buffer<tran_low_t> *out,
42*fb1b10abSAndroid Build Coastguard Worker                            int size, int tx_type);
43*fb1b10abSAndroid Build Coastguard Worker typedef void (*IhtFunc)(const tran_low_t *in, uint8_t *out, int stride,
44*fb1b10abSAndroid Build Coastguard Worker                         int tx_type);
45*fb1b10abSAndroid Build Coastguard Worker typedef void (*IhtWithBdFunc)(const tran_low_t *in, uint8_t *out, int stride,
46*fb1b10abSAndroid Build Coastguard Worker                               int tx_type, int bd);
47*fb1b10abSAndroid Build Coastguard Worker 
48*fb1b10abSAndroid Build Coastguard Worker template <FdctFunc fn>
fdct_wrapper(const int16_t * in,tran_low_t * out,int stride,int tx_type)49*fb1b10abSAndroid Build Coastguard Worker void fdct_wrapper(const int16_t *in, tran_low_t *out, int stride, int tx_type) {
50*fb1b10abSAndroid Build Coastguard Worker   (void)tx_type;
51*fb1b10abSAndroid Build Coastguard Worker   fn(in, out, stride);
52*fb1b10abSAndroid Build Coastguard Worker }
53*fb1b10abSAndroid Build Coastguard Worker 
54*fb1b10abSAndroid Build Coastguard Worker template <IdctFunc fn>
idct_wrapper(const tran_low_t * in,uint8_t * out,int stride,int tx_type,int bd)55*fb1b10abSAndroid Build Coastguard Worker void idct_wrapper(const tran_low_t *in, uint8_t *out, int stride, int tx_type,
56*fb1b10abSAndroid Build Coastguard Worker                   int bd) {
57*fb1b10abSAndroid Build Coastguard Worker   (void)tx_type;
58*fb1b10abSAndroid Build Coastguard Worker   (void)bd;
59*fb1b10abSAndroid Build Coastguard Worker   fn(in, out, stride);
60*fb1b10abSAndroid Build Coastguard Worker }
61*fb1b10abSAndroid Build Coastguard Worker 
62*fb1b10abSAndroid Build Coastguard Worker template <IhtFunc fn>
iht_wrapper(const tran_low_t * in,uint8_t * out,int stride,int tx_type,int bd)63*fb1b10abSAndroid Build Coastguard Worker void iht_wrapper(const tran_low_t *in, uint8_t *out, int stride, int tx_type,
64*fb1b10abSAndroid Build Coastguard Worker                  int bd) {
65*fb1b10abSAndroid Build Coastguard Worker   (void)bd;
66*fb1b10abSAndroid Build Coastguard Worker   fn(in, out, stride, tx_type);
67*fb1b10abSAndroid Build Coastguard Worker }
68*fb1b10abSAndroid Build Coastguard Worker 
69*fb1b10abSAndroid Build Coastguard Worker #if CONFIG_VP9_HIGHBITDEPTH
70*fb1b10abSAndroid Build Coastguard Worker typedef void (*HighbdIdctFunc)(const tran_low_t *in, uint16_t *out, int stride,
71*fb1b10abSAndroid Build Coastguard Worker                                int bd);
72*fb1b10abSAndroid Build Coastguard Worker 
73*fb1b10abSAndroid Build Coastguard Worker typedef void (*HighbdIhtFunc)(const tran_low_t *in, uint16_t *out, int stride,
74*fb1b10abSAndroid Build Coastguard Worker                               int tx_type, int bd);
75*fb1b10abSAndroid Build Coastguard Worker 
76*fb1b10abSAndroid Build Coastguard Worker template <HighbdIdctFunc fn>
highbd_idct_wrapper(const tran_low_t * in,uint8_t * out,int stride,int tx_type,int bd)77*fb1b10abSAndroid Build Coastguard Worker void highbd_idct_wrapper(const tran_low_t *in, uint8_t *out, int stride,
78*fb1b10abSAndroid Build Coastguard Worker                          int tx_type, int bd) {
79*fb1b10abSAndroid Build Coastguard Worker   (void)tx_type;
80*fb1b10abSAndroid Build Coastguard Worker   fn(in, CAST_TO_SHORTPTR(out), stride, bd);
81*fb1b10abSAndroid Build Coastguard Worker }
82*fb1b10abSAndroid Build Coastguard Worker 
83*fb1b10abSAndroid Build Coastguard Worker template <HighbdIhtFunc fn>
highbd_iht_wrapper(const tran_low_t * in,uint8_t * out,int stride,int tx_type,int bd)84*fb1b10abSAndroid Build Coastguard Worker void highbd_iht_wrapper(const tran_low_t *in, uint8_t *out, int stride,
85*fb1b10abSAndroid Build Coastguard Worker                         int tx_type, int bd) {
86*fb1b10abSAndroid Build Coastguard Worker   fn(in, CAST_TO_SHORTPTR(out), stride, tx_type, bd);
87*fb1b10abSAndroid Build Coastguard Worker }
88*fb1b10abSAndroid Build Coastguard Worker #endif  // CONFIG_VP9_HIGHBITDEPTH
89*fb1b10abSAndroid Build Coastguard Worker 
90*fb1b10abSAndroid Build Coastguard Worker struct FuncInfo {
91*fb1b10abSAndroid Build Coastguard Worker   FhtFunc ft_func;
92*fb1b10abSAndroid Build Coastguard Worker   IhtWithBdFunc it_func;
93*fb1b10abSAndroid Build Coastguard Worker   int size;
94*fb1b10abSAndroid Build Coastguard Worker   int pixel_size;
95*fb1b10abSAndroid Build Coastguard Worker };
96*fb1b10abSAndroid Build Coastguard Worker 
97*fb1b10abSAndroid Build Coastguard Worker /* forward transform, inverse transform, size, transform type, bit depth */
98*fb1b10abSAndroid Build Coastguard Worker typedef tuple<int, const FuncInfo *, int, vpx_bit_depth_t> DctParam;
99*fb1b10abSAndroid Build Coastguard Worker 
fdct_ref(const Buffer<int16_t> & in,Buffer<tran_low_t> * out,int size,int)100*fb1b10abSAndroid Build Coastguard Worker void fdct_ref(const Buffer<int16_t> &in, Buffer<tran_low_t> *out, int size,
101*fb1b10abSAndroid Build Coastguard Worker               int /*tx_type*/) {
102*fb1b10abSAndroid Build Coastguard Worker   const int16_t *i = in.TopLeftPixel();
103*fb1b10abSAndroid Build Coastguard Worker   const int i_stride = in.stride();
104*fb1b10abSAndroid Build Coastguard Worker   tran_low_t *o = out->TopLeftPixel();
105*fb1b10abSAndroid Build Coastguard Worker   if (size == 4) {
106*fb1b10abSAndroid Build Coastguard Worker     vpx_fdct4x4_c(i, o, i_stride);
107*fb1b10abSAndroid Build Coastguard Worker   } else if (size == 8) {
108*fb1b10abSAndroid Build Coastguard Worker     vpx_fdct8x8_c(i, o, i_stride);
109*fb1b10abSAndroid Build Coastguard Worker   } else if (size == 16) {
110*fb1b10abSAndroid Build Coastguard Worker     vpx_fdct16x16_c(i, o, i_stride);
111*fb1b10abSAndroid Build Coastguard Worker   } else if (size == 32) {
112*fb1b10abSAndroid Build Coastguard Worker     vpx_fdct32x32_c(i, o, i_stride);
113*fb1b10abSAndroid Build Coastguard Worker   }
114*fb1b10abSAndroid Build Coastguard Worker }
115*fb1b10abSAndroid Build Coastguard Worker 
fht_ref(const Buffer<int16_t> & in,Buffer<tran_low_t> * out,int size,int tx_type)116*fb1b10abSAndroid Build Coastguard Worker void fht_ref(const Buffer<int16_t> &in, Buffer<tran_low_t> *out, int size,
117*fb1b10abSAndroid Build Coastguard Worker              int tx_type) {
118*fb1b10abSAndroid Build Coastguard Worker   const int16_t *i = in.TopLeftPixel();
119*fb1b10abSAndroid Build Coastguard Worker   const int i_stride = in.stride();
120*fb1b10abSAndroid Build Coastguard Worker   tran_low_t *o = out->TopLeftPixel();
121*fb1b10abSAndroid Build Coastguard Worker   if (size == 4) {
122*fb1b10abSAndroid Build Coastguard Worker     vp9_fht4x4_c(i, o, i_stride, tx_type);
123*fb1b10abSAndroid Build Coastguard Worker   } else if (size == 8) {
124*fb1b10abSAndroid Build Coastguard Worker     vp9_fht8x8_c(i, o, i_stride, tx_type);
125*fb1b10abSAndroid Build Coastguard Worker   } else if (size == 16) {
126*fb1b10abSAndroid Build Coastguard Worker     vp9_fht16x16_c(i, o, i_stride, tx_type);
127*fb1b10abSAndroid Build Coastguard Worker   }
128*fb1b10abSAndroid Build Coastguard Worker }
129*fb1b10abSAndroid Build Coastguard Worker 
fwht_ref(const Buffer<int16_t> & in,Buffer<tran_low_t> * out,int size,int)130*fb1b10abSAndroid Build Coastguard Worker void fwht_ref(const Buffer<int16_t> &in, Buffer<tran_low_t> *out, int size,
131*fb1b10abSAndroid Build Coastguard Worker               int /*tx_type*/) {
132*fb1b10abSAndroid Build Coastguard Worker   ASSERT_EQ(size, 4);
133*fb1b10abSAndroid Build Coastguard Worker   vp9_fwht4x4_c(in.TopLeftPixel(), out->TopLeftPixel(), in.stride());
134*fb1b10abSAndroid Build Coastguard Worker }
135*fb1b10abSAndroid Build Coastguard Worker 
136*fb1b10abSAndroid Build Coastguard Worker class TransTestBase : public ::testing::TestWithParam<DctParam> {
137*fb1b10abSAndroid Build Coastguard Worker  public:
SetUp()138*fb1b10abSAndroid Build Coastguard Worker   void SetUp() override {
139*fb1b10abSAndroid Build Coastguard Worker     rnd_.Reset(ACMRandom::DeterministicSeed());
140*fb1b10abSAndroid Build Coastguard Worker     const int idx = GET_PARAM(0);
141*fb1b10abSAndroid Build Coastguard Worker     const FuncInfo *func_info = &(GET_PARAM(1)[idx]);
142*fb1b10abSAndroid Build Coastguard Worker     tx_type_ = GET_PARAM(2);
143*fb1b10abSAndroid Build Coastguard Worker     bit_depth_ = GET_PARAM(3);
144*fb1b10abSAndroid Build Coastguard Worker     fwd_txfm_ = func_info->ft_func;
145*fb1b10abSAndroid Build Coastguard Worker     inv_txfm_ = func_info->it_func;
146*fb1b10abSAndroid Build Coastguard Worker     size_ = func_info->size;
147*fb1b10abSAndroid Build Coastguard Worker     pixel_size_ = func_info->pixel_size;
148*fb1b10abSAndroid Build Coastguard Worker     max_pixel_value_ = (1 << bit_depth_) - 1;
149*fb1b10abSAndroid Build Coastguard Worker 
150*fb1b10abSAndroid Build Coastguard Worker     // Randomize stride_ to a value less than or equal to 1024
151*fb1b10abSAndroid Build Coastguard Worker     stride_ = rnd_(1024) + 1;
152*fb1b10abSAndroid Build Coastguard Worker     if (stride_ < size_) {
153*fb1b10abSAndroid Build Coastguard Worker       stride_ = size_;
154*fb1b10abSAndroid Build Coastguard Worker     }
155*fb1b10abSAndroid Build Coastguard Worker     // Align stride_ to 16 if it's bigger than 16.
156*fb1b10abSAndroid Build Coastguard Worker     if (stride_ > 16) {
157*fb1b10abSAndroid Build Coastguard Worker       stride_ &= ~15;
158*fb1b10abSAndroid Build Coastguard Worker     }
159*fb1b10abSAndroid Build Coastguard Worker 
160*fb1b10abSAndroid Build Coastguard Worker     block_size_ = size_ * stride_;
161*fb1b10abSAndroid Build Coastguard Worker 
162*fb1b10abSAndroid Build Coastguard Worker     src_ = reinterpret_cast<uint8_t *>(
163*fb1b10abSAndroid Build Coastguard Worker         vpx_memalign(16, pixel_size_ * block_size_));
164*fb1b10abSAndroid Build Coastguard Worker     ASSERT_NE(src_, nullptr);
165*fb1b10abSAndroid Build Coastguard Worker     dst_ = reinterpret_cast<uint8_t *>(
166*fb1b10abSAndroid Build Coastguard Worker         vpx_memalign(16, pixel_size_ * block_size_));
167*fb1b10abSAndroid Build Coastguard Worker     ASSERT_NE(dst_, nullptr);
168*fb1b10abSAndroid Build Coastguard Worker   }
169*fb1b10abSAndroid Build Coastguard Worker 
TearDown()170*fb1b10abSAndroid Build Coastguard Worker   void TearDown() override {
171*fb1b10abSAndroid Build Coastguard Worker     vpx_free(src_);
172*fb1b10abSAndroid Build Coastguard Worker     src_ = nullptr;
173*fb1b10abSAndroid Build Coastguard Worker     vpx_free(dst_);
174*fb1b10abSAndroid Build Coastguard Worker     dst_ = nullptr;
175*fb1b10abSAndroid Build Coastguard Worker     libvpx_test::ClearSystemState();
176*fb1b10abSAndroid Build Coastguard Worker   }
177*fb1b10abSAndroid Build Coastguard Worker 
InitMem()178*fb1b10abSAndroid Build Coastguard Worker   void InitMem() {
179*fb1b10abSAndroid Build Coastguard Worker     if (pixel_size_ == 1 && bit_depth_ > VPX_BITS_8) return;
180*fb1b10abSAndroid Build Coastguard Worker     if (pixel_size_ == 1) {
181*fb1b10abSAndroid Build Coastguard Worker       for (int j = 0; j < block_size_; ++j) {
182*fb1b10abSAndroid Build Coastguard Worker         src_[j] = rnd_.Rand16() & max_pixel_value_;
183*fb1b10abSAndroid Build Coastguard Worker       }
184*fb1b10abSAndroid Build Coastguard Worker       for (int j = 0; j < block_size_; ++j) {
185*fb1b10abSAndroid Build Coastguard Worker         dst_[j] = rnd_.Rand16() & max_pixel_value_;
186*fb1b10abSAndroid Build Coastguard Worker       }
187*fb1b10abSAndroid Build Coastguard Worker     } else {
188*fb1b10abSAndroid Build Coastguard Worker       ASSERT_EQ(pixel_size_, 2);
189*fb1b10abSAndroid Build Coastguard Worker       uint16_t *const src = reinterpret_cast<uint16_t *>(src_);
190*fb1b10abSAndroid Build Coastguard Worker       uint16_t *const dst = reinterpret_cast<uint16_t *>(dst_);
191*fb1b10abSAndroid Build Coastguard Worker       for (int j = 0; j < block_size_; ++j) {
192*fb1b10abSAndroid Build Coastguard Worker         src[j] = rnd_.Rand16() & max_pixel_value_;
193*fb1b10abSAndroid Build Coastguard Worker       }
194*fb1b10abSAndroid Build Coastguard Worker       for (int j = 0; j < block_size_; ++j) {
195*fb1b10abSAndroid Build Coastguard Worker         dst[j] = rnd_.Rand16() & max_pixel_value_;
196*fb1b10abSAndroid Build Coastguard Worker       }
197*fb1b10abSAndroid Build Coastguard Worker     }
198*fb1b10abSAndroid Build Coastguard Worker   }
199*fb1b10abSAndroid Build Coastguard Worker 
RunFwdTxfm(const Buffer<int16_t> & in,Buffer<tran_low_t> * out)200*fb1b10abSAndroid Build Coastguard Worker   void RunFwdTxfm(const Buffer<int16_t> &in, Buffer<tran_low_t> *out) {
201*fb1b10abSAndroid Build Coastguard Worker     fwd_txfm_(in.TopLeftPixel(), out->TopLeftPixel(), in.stride(), tx_type_);
202*fb1b10abSAndroid Build Coastguard Worker   }
203*fb1b10abSAndroid Build Coastguard Worker 
RunInvTxfm(const Buffer<tran_low_t> & in,uint8_t * out)204*fb1b10abSAndroid Build Coastguard Worker   void RunInvTxfm(const Buffer<tran_low_t> &in, uint8_t *out) {
205*fb1b10abSAndroid Build Coastguard Worker     inv_txfm_(in.TopLeftPixel(), out, stride_, tx_type_, bit_depth_);
206*fb1b10abSAndroid Build Coastguard Worker   }
207*fb1b10abSAndroid Build Coastguard Worker 
208*fb1b10abSAndroid Build Coastguard Worker  protected:
RunAccuracyCheck(int limit)209*fb1b10abSAndroid Build Coastguard Worker   void RunAccuracyCheck(int limit) {
210*fb1b10abSAndroid Build Coastguard Worker     if (pixel_size_ == 1 && bit_depth_ > VPX_BITS_8) return;
211*fb1b10abSAndroid Build Coastguard Worker     ACMRandom rnd(ACMRandom::DeterministicSeed());
212*fb1b10abSAndroid Build Coastguard Worker     Buffer<int16_t> test_input_block =
213*fb1b10abSAndroid Build Coastguard Worker         Buffer<int16_t>(size_, size_, 8, size_ == 4 ? 0 : 16);
214*fb1b10abSAndroid Build Coastguard Worker     ASSERT_TRUE(test_input_block.Init());
215*fb1b10abSAndroid Build Coastguard Worker     ASSERT_NE(test_input_block.TopLeftPixel(), nullptr);
216*fb1b10abSAndroid Build Coastguard Worker     Buffer<tran_low_t> test_temp_block =
217*fb1b10abSAndroid Build Coastguard Worker         Buffer<tran_low_t>(size_, size_, 0, 16);
218*fb1b10abSAndroid Build Coastguard Worker     ASSERT_TRUE(test_temp_block.Init());
219*fb1b10abSAndroid Build Coastguard Worker     uint32_t max_error = 0;
220*fb1b10abSAndroid Build Coastguard Worker     int64_t total_error = 0;
221*fb1b10abSAndroid Build Coastguard Worker     const int count_test_block = 10000;
222*fb1b10abSAndroid Build Coastguard Worker     for (int i = 0; i < count_test_block; ++i) {
223*fb1b10abSAndroid Build Coastguard Worker       InitMem();
224*fb1b10abSAndroid Build Coastguard Worker       for (int h = 0; h < size_; ++h) {
225*fb1b10abSAndroid Build Coastguard Worker         for (int w = 0; w < size_; ++w) {
226*fb1b10abSAndroid Build Coastguard Worker           if (pixel_size_ == 1) {
227*fb1b10abSAndroid Build Coastguard Worker             test_input_block.TopLeftPixel()[h * test_input_block.stride() + w] =
228*fb1b10abSAndroid Build Coastguard Worker                 src_[h * stride_ + w] - dst_[h * stride_ + w];
229*fb1b10abSAndroid Build Coastguard Worker           } else {
230*fb1b10abSAndroid Build Coastguard Worker             ASSERT_EQ(pixel_size_, 2);
231*fb1b10abSAndroid Build Coastguard Worker             const uint16_t *const src = reinterpret_cast<uint16_t *>(src_);
232*fb1b10abSAndroid Build Coastguard Worker             const uint16_t *const dst = reinterpret_cast<uint16_t *>(dst_);
233*fb1b10abSAndroid Build Coastguard Worker             test_input_block.TopLeftPixel()[h * test_input_block.stride() + w] =
234*fb1b10abSAndroid Build Coastguard Worker                 src[h * stride_ + w] - dst[h * stride_ + w];
235*fb1b10abSAndroid Build Coastguard Worker           }
236*fb1b10abSAndroid Build Coastguard Worker         }
237*fb1b10abSAndroid Build Coastguard Worker       }
238*fb1b10abSAndroid Build Coastguard Worker 
239*fb1b10abSAndroid Build Coastguard Worker       ASM_REGISTER_STATE_CHECK(RunFwdTxfm(test_input_block, &test_temp_block));
240*fb1b10abSAndroid Build Coastguard Worker       ASM_REGISTER_STATE_CHECK(RunInvTxfm(test_temp_block, dst_));
241*fb1b10abSAndroid Build Coastguard Worker 
242*fb1b10abSAndroid Build Coastguard Worker       for (int h = 0; h < size_; ++h) {
243*fb1b10abSAndroid Build Coastguard Worker         for (int w = 0; w < size_; ++w) {
244*fb1b10abSAndroid Build Coastguard Worker           int diff;
245*fb1b10abSAndroid Build Coastguard Worker           if (pixel_size_ == 1) {
246*fb1b10abSAndroid Build Coastguard Worker             diff = dst_[h * stride_ + w] - src_[h * stride_ + w];
247*fb1b10abSAndroid Build Coastguard Worker           } else {
248*fb1b10abSAndroid Build Coastguard Worker             ASSERT_EQ(pixel_size_, 2);
249*fb1b10abSAndroid Build Coastguard Worker             const uint16_t *const src = reinterpret_cast<uint16_t *>(src_);
250*fb1b10abSAndroid Build Coastguard Worker             const uint16_t *const dst = reinterpret_cast<uint16_t *>(dst_);
251*fb1b10abSAndroid Build Coastguard Worker             diff = dst[h * stride_ + w] - src[h * stride_ + w];
252*fb1b10abSAndroid Build Coastguard Worker           }
253*fb1b10abSAndroid Build Coastguard Worker           const uint32_t error = diff * diff;
254*fb1b10abSAndroid Build Coastguard Worker           if (max_error < error) max_error = error;
255*fb1b10abSAndroid Build Coastguard Worker           total_error += error;
256*fb1b10abSAndroid Build Coastguard Worker         }
257*fb1b10abSAndroid Build Coastguard Worker       }
258*fb1b10abSAndroid Build Coastguard Worker     }
259*fb1b10abSAndroid Build Coastguard Worker 
260*fb1b10abSAndroid Build Coastguard Worker     EXPECT_GE(static_cast<uint32_t>(limit), max_error)
261*fb1b10abSAndroid Build Coastguard Worker         << "Error: " << size_ << "x" << size_
262*fb1b10abSAndroid Build Coastguard Worker         << " transform/inverse transform has an individual round trip error > "
263*fb1b10abSAndroid Build Coastguard Worker         << limit;
264*fb1b10abSAndroid Build Coastguard Worker 
265*fb1b10abSAndroid Build Coastguard Worker     EXPECT_GE(count_test_block * limit, total_error)
266*fb1b10abSAndroid Build Coastguard Worker         << "Error: " << size_ << "x" << size_
267*fb1b10abSAndroid Build Coastguard Worker         << " transform/inverse transform has average round trip error > "
268*fb1b10abSAndroid Build Coastguard Worker         << limit << " per block";
269*fb1b10abSAndroid Build Coastguard Worker   }
270*fb1b10abSAndroid Build Coastguard Worker 
RunCoeffCheck()271*fb1b10abSAndroid Build Coastguard Worker   void RunCoeffCheck() {
272*fb1b10abSAndroid Build Coastguard Worker     if (pixel_size_ == 1 && bit_depth_ > VPX_BITS_8) return;
273*fb1b10abSAndroid Build Coastguard Worker     ACMRandom rnd(ACMRandom::DeterministicSeed());
274*fb1b10abSAndroid Build Coastguard Worker     const int count_test_block = 5000;
275*fb1b10abSAndroid Build Coastguard Worker     Buffer<int16_t> input_block =
276*fb1b10abSAndroid Build Coastguard Worker         Buffer<int16_t>(size_, size_, 8, size_ == 4 ? 0 : 16);
277*fb1b10abSAndroid Build Coastguard Worker     ASSERT_TRUE(input_block.Init());
278*fb1b10abSAndroid Build Coastguard Worker     Buffer<tran_low_t> output_ref_block = Buffer<tran_low_t>(size_, size_, 0);
279*fb1b10abSAndroid Build Coastguard Worker     ASSERT_TRUE(output_ref_block.Init());
280*fb1b10abSAndroid Build Coastguard Worker     Buffer<tran_low_t> output_block = Buffer<tran_low_t>(size_, size_, 0, 16);
281*fb1b10abSAndroid Build Coastguard Worker     ASSERT_TRUE(output_block.Init());
282*fb1b10abSAndroid Build Coastguard Worker 
283*fb1b10abSAndroid Build Coastguard Worker     for (int i = 0; i < count_test_block; ++i) {
284*fb1b10abSAndroid Build Coastguard Worker       // Initialize a test block with input range [-max_pixel_value_,
285*fb1b10abSAndroid Build Coastguard Worker       // max_pixel_value_].
286*fb1b10abSAndroid Build Coastguard Worker       input_block.Set(&rnd, -max_pixel_value_, max_pixel_value_);
287*fb1b10abSAndroid Build Coastguard Worker 
288*fb1b10abSAndroid Build Coastguard Worker       fwd_txfm_ref(input_block, &output_ref_block, size_, tx_type_);
289*fb1b10abSAndroid Build Coastguard Worker       ASM_REGISTER_STATE_CHECK(RunFwdTxfm(input_block, &output_block));
290*fb1b10abSAndroid Build Coastguard Worker 
291*fb1b10abSAndroid Build Coastguard Worker       // The minimum quant value is 4.
292*fb1b10abSAndroid Build Coastguard Worker       EXPECT_TRUE(output_block.CheckValues(output_ref_block));
293*fb1b10abSAndroid Build Coastguard Worker       if (::testing::Test::HasFailure()) {
294*fb1b10abSAndroid Build Coastguard Worker         printf("Size: %d Transform type: %d\n", size_, tx_type_);
295*fb1b10abSAndroid Build Coastguard Worker         output_block.PrintDifference(output_ref_block);
296*fb1b10abSAndroid Build Coastguard Worker         return;
297*fb1b10abSAndroid Build Coastguard Worker       }
298*fb1b10abSAndroid Build Coastguard Worker     }
299*fb1b10abSAndroid Build Coastguard Worker   }
300*fb1b10abSAndroid Build Coastguard Worker 
RunMemCheck()301*fb1b10abSAndroid Build Coastguard Worker   void RunMemCheck() {
302*fb1b10abSAndroid Build Coastguard Worker     if (pixel_size_ == 1 && bit_depth_ > VPX_BITS_8) return;
303*fb1b10abSAndroid Build Coastguard Worker     ACMRandom rnd(ACMRandom::DeterministicSeed());
304*fb1b10abSAndroid Build Coastguard Worker     const int count_test_block = 5000;
305*fb1b10abSAndroid Build Coastguard Worker     Buffer<int16_t> input_extreme_block =
306*fb1b10abSAndroid Build Coastguard Worker         Buffer<int16_t>(size_, size_, 8, size_ == 4 ? 0 : 16);
307*fb1b10abSAndroid Build Coastguard Worker     ASSERT_TRUE(input_extreme_block.Init());
308*fb1b10abSAndroid Build Coastguard Worker     Buffer<tran_low_t> output_ref_block = Buffer<tran_low_t>(size_, size_, 0);
309*fb1b10abSAndroid Build Coastguard Worker     ASSERT_TRUE(output_ref_block.Init());
310*fb1b10abSAndroid Build Coastguard Worker     Buffer<tran_low_t> output_block = Buffer<tran_low_t>(size_, size_, 0, 16);
311*fb1b10abSAndroid Build Coastguard Worker     ASSERT_TRUE(output_block.Init());
312*fb1b10abSAndroid Build Coastguard Worker 
313*fb1b10abSAndroid Build Coastguard Worker     for (int i = 0; i < count_test_block; ++i) {
314*fb1b10abSAndroid Build Coastguard Worker       // Initialize a test block with -max_pixel_value_ or max_pixel_value_.
315*fb1b10abSAndroid Build Coastguard Worker       if (i == 0) {
316*fb1b10abSAndroid Build Coastguard Worker         input_extreme_block.Set(max_pixel_value_);
317*fb1b10abSAndroid Build Coastguard Worker       } else if (i == 1) {
318*fb1b10abSAndroid Build Coastguard Worker         input_extreme_block.Set(-max_pixel_value_);
319*fb1b10abSAndroid Build Coastguard Worker       } else {
320*fb1b10abSAndroid Build Coastguard Worker         ASSERT_NE(input_extreme_block.TopLeftPixel(), nullptr);
321*fb1b10abSAndroid Build Coastguard Worker         for (int h = 0; h < size_; ++h) {
322*fb1b10abSAndroid Build Coastguard Worker           for (int w = 0; w < size_; ++w) {
323*fb1b10abSAndroid Build Coastguard Worker             input_extreme_block
324*fb1b10abSAndroid Build Coastguard Worker                 .TopLeftPixel()[h * input_extreme_block.stride() + w] =
325*fb1b10abSAndroid Build Coastguard Worker                 rnd.Rand8() % 2 ? max_pixel_value_ : -max_pixel_value_;
326*fb1b10abSAndroid Build Coastguard Worker           }
327*fb1b10abSAndroid Build Coastguard Worker         }
328*fb1b10abSAndroid Build Coastguard Worker       }
329*fb1b10abSAndroid Build Coastguard Worker 
330*fb1b10abSAndroid Build Coastguard Worker       fwd_txfm_ref(input_extreme_block, &output_ref_block, size_, tx_type_);
331*fb1b10abSAndroid Build Coastguard Worker       ASM_REGISTER_STATE_CHECK(RunFwdTxfm(input_extreme_block, &output_block));
332*fb1b10abSAndroid Build Coastguard Worker 
333*fb1b10abSAndroid Build Coastguard Worker       // The minimum quant value is 4.
334*fb1b10abSAndroid Build Coastguard Worker       EXPECT_TRUE(output_block.CheckValues(output_ref_block));
335*fb1b10abSAndroid Build Coastguard Worker       ASSERT_NE(output_block.TopLeftPixel(), nullptr);
336*fb1b10abSAndroid Build Coastguard Worker       for (int h = 0; h < size_; ++h) {
337*fb1b10abSAndroid Build Coastguard Worker         for (int w = 0; w < size_; ++w) {
338*fb1b10abSAndroid Build Coastguard Worker           EXPECT_GE(
339*fb1b10abSAndroid Build Coastguard Worker               4 * DCT_MAX_VALUE << (bit_depth_ - 8),
340*fb1b10abSAndroid Build Coastguard Worker               abs(output_block.TopLeftPixel()[h * output_block.stride() + w]))
341*fb1b10abSAndroid Build Coastguard Worker               << "Error: " << size_ << "x" << size_
342*fb1b10abSAndroid Build Coastguard Worker               << " transform has coefficient larger than 4*DCT_MAX_VALUE"
343*fb1b10abSAndroid Build Coastguard Worker               << " at " << w << "," << h;
344*fb1b10abSAndroid Build Coastguard Worker           if (::testing::Test::HasFailure()) {
345*fb1b10abSAndroid Build Coastguard Worker             printf("Size: %d Transform type: %d\n", size_, tx_type_);
346*fb1b10abSAndroid Build Coastguard Worker             output_block.DumpBuffer();
347*fb1b10abSAndroid Build Coastguard Worker             return;
348*fb1b10abSAndroid Build Coastguard Worker           }
349*fb1b10abSAndroid Build Coastguard Worker         }
350*fb1b10abSAndroid Build Coastguard Worker       }
351*fb1b10abSAndroid Build Coastguard Worker     }
352*fb1b10abSAndroid Build Coastguard Worker   }
353*fb1b10abSAndroid Build Coastguard Worker 
RunInvAccuracyCheck(int limit)354*fb1b10abSAndroid Build Coastguard Worker   void RunInvAccuracyCheck(int limit) {
355*fb1b10abSAndroid Build Coastguard Worker     if (pixel_size_ == 1 && bit_depth_ > VPX_BITS_8) return;
356*fb1b10abSAndroid Build Coastguard Worker     ACMRandom rnd(ACMRandom::DeterministicSeed());
357*fb1b10abSAndroid Build Coastguard Worker     const int count_test_block = 1000;
358*fb1b10abSAndroid Build Coastguard Worker     Buffer<int16_t> in = Buffer<int16_t>(size_, size_, 4);
359*fb1b10abSAndroid Build Coastguard Worker     ASSERT_TRUE(in.Init());
360*fb1b10abSAndroid Build Coastguard Worker     Buffer<tran_low_t> coeff = Buffer<tran_low_t>(size_, size_, 0, 16);
361*fb1b10abSAndroid Build Coastguard Worker     ASSERT_TRUE(coeff.Init());
362*fb1b10abSAndroid Build Coastguard Worker 
363*fb1b10abSAndroid Build Coastguard Worker     for (int i = 0; i < count_test_block; ++i) {
364*fb1b10abSAndroid Build Coastguard Worker       InitMem();
365*fb1b10abSAndroid Build Coastguard Worker       ASSERT_NE(in.TopLeftPixel(), nullptr);
366*fb1b10abSAndroid Build Coastguard Worker       // Initialize a test block with input range [-max_pixel_value_,
367*fb1b10abSAndroid Build Coastguard Worker       // max_pixel_value_].
368*fb1b10abSAndroid Build Coastguard Worker       for (int h = 0; h < size_; ++h) {
369*fb1b10abSAndroid Build Coastguard Worker         for (int w = 0; w < size_; ++w) {
370*fb1b10abSAndroid Build Coastguard Worker           if (pixel_size_ == 1) {
371*fb1b10abSAndroid Build Coastguard Worker             in.TopLeftPixel()[h * in.stride() + w] =
372*fb1b10abSAndroid Build Coastguard Worker                 src_[h * stride_ + w] - dst_[h * stride_ + w];
373*fb1b10abSAndroid Build Coastguard Worker           } else {
374*fb1b10abSAndroid Build Coastguard Worker             ASSERT_EQ(pixel_size_, 2);
375*fb1b10abSAndroid Build Coastguard Worker             const uint16_t *const src = reinterpret_cast<uint16_t *>(src_);
376*fb1b10abSAndroid Build Coastguard Worker             const uint16_t *const dst = reinterpret_cast<uint16_t *>(dst_);
377*fb1b10abSAndroid Build Coastguard Worker             in.TopLeftPixel()[h * in.stride() + w] =
378*fb1b10abSAndroid Build Coastguard Worker                 src[h * stride_ + w] - dst[h * stride_ + w];
379*fb1b10abSAndroid Build Coastguard Worker           }
380*fb1b10abSAndroid Build Coastguard Worker         }
381*fb1b10abSAndroid Build Coastguard Worker       }
382*fb1b10abSAndroid Build Coastguard Worker 
383*fb1b10abSAndroid Build Coastguard Worker       fwd_txfm_ref(in, &coeff, size_, tx_type_);
384*fb1b10abSAndroid Build Coastguard Worker 
385*fb1b10abSAndroid Build Coastguard Worker       ASM_REGISTER_STATE_CHECK(RunInvTxfm(coeff, dst_));
386*fb1b10abSAndroid Build Coastguard Worker 
387*fb1b10abSAndroid Build Coastguard Worker       for (int h = 0; h < size_; ++h) {
388*fb1b10abSAndroid Build Coastguard Worker         for (int w = 0; w < size_; ++w) {
389*fb1b10abSAndroid Build Coastguard Worker           int diff;
390*fb1b10abSAndroid Build Coastguard Worker           if (pixel_size_ == 1) {
391*fb1b10abSAndroid Build Coastguard Worker             diff = dst_[h * stride_ + w] - src_[h * stride_ + w];
392*fb1b10abSAndroid Build Coastguard Worker           } else {
393*fb1b10abSAndroid Build Coastguard Worker             ASSERT_EQ(pixel_size_, 2);
394*fb1b10abSAndroid Build Coastguard Worker             const uint16_t *const src = reinterpret_cast<uint16_t *>(src_);
395*fb1b10abSAndroid Build Coastguard Worker             const uint16_t *const dst = reinterpret_cast<uint16_t *>(dst_);
396*fb1b10abSAndroid Build Coastguard Worker             diff = dst[h * stride_ + w] - src[h * stride_ + w];
397*fb1b10abSAndroid Build Coastguard Worker           }
398*fb1b10abSAndroid Build Coastguard Worker           const uint32_t error = diff * diff;
399*fb1b10abSAndroid Build Coastguard Worker           EXPECT_GE(static_cast<uint32_t>(limit), error)
400*fb1b10abSAndroid Build Coastguard Worker               << "Error: " << size_ << "x" << size_
401*fb1b10abSAndroid Build Coastguard Worker               << " inverse transform has error " << error << " at " << w << ","
402*fb1b10abSAndroid Build Coastguard Worker               << h;
403*fb1b10abSAndroid Build Coastguard Worker           if (::testing::Test::HasFailure()) {
404*fb1b10abSAndroid Build Coastguard Worker             printf("Size: %d Transform type: %d\n", size_, tx_type_);
405*fb1b10abSAndroid Build Coastguard Worker             return;
406*fb1b10abSAndroid Build Coastguard Worker           }
407*fb1b10abSAndroid Build Coastguard Worker         }
408*fb1b10abSAndroid Build Coastguard Worker       }
409*fb1b10abSAndroid Build Coastguard Worker     }
410*fb1b10abSAndroid Build Coastguard Worker   }
411*fb1b10abSAndroid Build Coastguard Worker 
412*fb1b10abSAndroid Build Coastguard Worker   FhtFunc fwd_txfm_;
413*fb1b10abSAndroid Build Coastguard Worker   FhtFuncRef fwd_txfm_ref;
414*fb1b10abSAndroid Build Coastguard Worker   IhtWithBdFunc inv_txfm_;
415*fb1b10abSAndroid Build Coastguard Worker   ACMRandom rnd_;
416*fb1b10abSAndroid Build Coastguard Worker   uint8_t *src_;
417*fb1b10abSAndroid Build Coastguard Worker   uint8_t *dst_;
418*fb1b10abSAndroid Build Coastguard Worker   vpx_bit_depth_t bit_depth_;
419*fb1b10abSAndroid Build Coastguard Worker   int tx_type_;
420*fb1b10abSAndroid Build Coastguard Worker   int max_pixel_value_;
421*fb1b10abSAndroid Build Coastguard Worker   int size_;
422*fb1b10abSAndroid Build Coastguard Worker   int stride_;
423*fb1b10abSAndroid Build Coastguard Worker   int pixel_size_;
424*fb1b10abSAndroid Build Coastguard Worker   int block_size_;
425*fb1b10abSAndroid Build Coastguard Worker };
426*fb1b10abSAndroid Build Coastguard Worker 
427*fb1b10abSAndroid Build Coastguard Worker /* -------------------------------------------------------------------------- */
428*fb1b10abSAndroid Build Coastguard Worker 
429*fb1b10abSAndroid Build Coastguard Worker class TransDCT : public TransTestBase {
430*fb1b10abSAndroid Build Coastguard Worker  public:
TransDCT()431*fb1b10abSAndroid Build Coastguard Worker   TransDCT() { fwd_txfm_ref = fdct_ref; }
432*fb1b10abSAndroid Build Coastguard Worker };
433*fb1b10abSAndroid Build Coastguard Worker 
TEST_P(TransDCT,AccuracyCheck)434*fb1b10abSAndroid Build Coastguard Worker TEST_P(TransDCT, AccuracyCheck) {
435*fb1b10abSAndroid Build Coastguard Worker   int t = 1;
436*fb1b10abSAndroid Build Coastguard Worker   if (size_ == 16 && bit_depth_ > 10 && pixel_size_ == 2) {
437*fb1b10abSAndroid Build Coastguard Worker     t = 2;
438*fb1b10abSAndroid Build Coastguard Worker   } else if (size_ == 32 && bit_depth_ > 10 && pixel_size_ == 2) {
439*fb1b10abSAndroid Build Coastguard Worker     t = 7;
440*fb1b10abSAndroid Build Coastguard Worker   }
441*fb1b10abSAndroid Build Coastguard Worker   RunAccuracyCheck(t);
442*fb1b10abSAndroid Build Coastguard Worker }
443*fb1b10abSAndroid Build Coastguard Worker 
TEST_P(TransDCT,CoeffCheck)444*fb1b10abSAndroid Build Coastguard Worker TEST_P(TransDCT, CoeffCheck) { RunCoeffCheck(); }
445*fb1b10abSAndroid Build Coastguard Worker 
TEST_P(TransDCT,MemCheck)446*fb1b10abSAndroid Build Coastguard Worker TEST_P(TransDCT, MemCheck) { RunMemCheck(); }
447*fb1b10abSAndroid Build Coastguard Worker 
TEST_P(TransDCT,InvAccuracyCheck)448*fb1b10abSAndroid Build Coastguard Worker TEST_P(TransDCT, InvAccuracyCheck) { RunInvAccuracyCheck(1); }
449*fb1b10abSAndroid Build Coastguard Worker 
450*fb1b10abSAndroid Build Coastguard Worker static const FuncInfo dct_c_func_info[] = {
451*fb1b10abSAndroid Build Coastguard Worker #if CONFIG_VP9_HIGHBITDEPTH
452*fb1b10abSAndroid Build Coastguard Worker   { &fdct_wrapper<vpx_highbd_fdct4x4_c>,
453*fb1b10abSAndroid Build Coastguard Worker     &highbd_idct_wrapper<vpx_highbd_idct4x4_16_add_c>, 4, 2 },
454*fb1b10abSAndroid Build Coastguard Worker   { &fdct_wrapper<vpx_highbd_fdct8x8_c>,
455*fb1b10abSAndroid Build Coastguard Worker     &highbd_idct_wrapper<vpx_highbd_idct8x8_64_add_c>, 8, 2 },
456*fb1b10abSAndroid Build Coastguard Worker   { &fdct_wrapper<vpx_highbd_fdct16x16_c>,
457*fb1b10abSAndroid Build Coastguard Worker     &highbd_idct_wrapper<vpx_highbd_idct16x16_256_add_c>, 16, 2 },
458*fb1b10abSAndroid Build Coastguard Worker   { &fdct_wrapper<vpx_highbd_fdct32x32_c>,
459*fb1b10abSAndroid Build Coastguard Worker     &highbd_idct_wrapper<vpx_highbd_idct32x32_1024_add_c>, 32, 2 },
460*fb1b10abSAndroid Build Coastguard Worker #endif
461*fb1b10abSAndroid Build Coastguard Worker   { &fdct_wrapper<vpx_fdct4x4_c>, &idct_wrapper<vpx_idct4x4_16_add_c>, 4, 1 },
462*fb1b10abSAndroid Build Coastguard Worker   { &fdct_wrapper<vpx_fdct8x8_c>, &idct_wrapper<vpx_idct8x8_64_add_c>, 8, 1 },
463*fb1b10abSAndroid Build Coastguard Worker   { &fdct_wrapper<vpx_fdct16x16_c>, &idct_wrapper<vpx_idct16x16_256_add_c>, 16,
464*fb1b10abSAndroid Build Coastguard Worker     1 },
465*fb1b10abSAndroid Build Coastguard Worker   { &fdct_wrapper<vpx_fdct32x32_c>, &idct_wrapper<vpx_idct32x32_1024_add_c>, 32,
466*fb1b10abSAndroid Build Coastguard Worker     1 }
467*fb1b10abSAndroid Build Coastguard Worker };
468*fb1b10abSAndroid Build Coastguard Worker 
469*fb1b10abSAndroid Build Coastguard Worker INSTANTIATE_TEST_SUITE_P(
470*fb1b10abSAndroid Build Coastguard Worker     C, TransDCT,
471*fb1b10abSAndroid Build Coastguard Worker     ::testing::Combine(
472*fb1b10abSAndroid Build Coastguard Worker         ::testing::Range(0, static_cast<int>(sizeof(dct_c_func_info) /
473*fb1b10abSAndroid Build Coastguard Worker                                              sizeof(dct_c_func_info[0]))),
474*fb1b10abSAndroid Build Coastguard Worker         ::testing::Values(dct_c_func_info), ::testing::Values(0),
475*fb1b10abSAndroid Build Coastguard Worker         ::testing::Values(VPX_BITS_8, VPX_BITS_10, VPX_BITS_12)));
476*fb1b10abSAndroid Build Coastguard Worker 
477*fb1b10abSAndroid Build Coastguard Worker #if !CONFIG_EMULATE_HARDWARE
478*fb1b10abSAndroid Build Coastguard Worker 
479*fb1b10abSAndroid Build Coastguard Worker #if HAVE_SSE2
480*fb1b10abSAndroid Build Coastguard Worker static const FuncInfo dct_sse2_func_info[] = {
481*fb1b10abSAndroid Build Coastguard Worker #if CONFIG_VP9_HIGHBITDEPTH
482*fb1b10abSAndroid Build Coastguard Worker   { &fdct_wrapper<vpx_highbd_fdct4x4_sse2>,
483*fb1b10abSAndroid Build Coastguard Worker     &highbd_idct_wrapper<vpx_highbd_idct4x4_16_add_sse2>, 4, 2 },
484*fb1b10abSAndroid Build Coastguard Worker   { &fdct_wrapper<vpx_highbd_fdct8x8_sse2>,
485*fb1b10abSAndroid Build Coastguard Worker     &highbd_idct_wrapper<vpx_highbd_idct8x8_64_add_sse2>, 8, 2 },
486*fb1b10abSAndroid Build Coastguard Worker   { &fdct_wrapper<vpx_highbd_fdct16x16_sse2>,
487*fb1b10abSAndroid Build Coastguard Worker     &highbd_idct_wrapper<vpx_highbd_idct16x16_256_add_sse2>, 16, 2 },
488*fb1b10abSAndroid Build Coastguard Worker   { &fdct_wrapper<vpx_highbd_fdct32x32_sse2>,
489*fb1b10abSAndroid Build Coastguard Worker     &highbd_idct_wrapper<vpx_highbd_idct32x32_1024_add_sse2>, 32, 2 },
490*fb1b10abSAndroid Build Coastguard Worker #endif
491*fb1b10abSAndroid Build Coastguard Worker   { &fdct_wrapper<vpx_fdct4x4_sse2>, &idct_wrapper<vpx_idct4x4_16_add_sse2>, 4,
492*fb1b10abSAndroid Build Coastguard Worker     1 },
493*fb1b10abSAndroid Build Coastguard Worker   { &fdct_wrapper<vpx_fdct8x8_sse2>, &idct_wrapper<vpx_idct8x8_64_add_sse2>, 8,
494*fb1b10abSAndroid Build Coastguard Worker     1 },
495*fb1b10abSAndroid Build Coastguard Worker   { &fdct_wrapper<vpx_fdct16x16_sse2>,
496*fb1b10abSAndroid Build Coastguard Worker     &idct_wrapper<vpx_idct16x16_256_add_sse2>, 16, 1 },
497*fb1b10abSAndroid Build Coastguard Worker   { &fdct_wrapper<vpx_fdct32x32_sse2>,
498*fb1b10abSAndroid Build Coastguard Worker     &idct_wrapper<vpx_idct32x32_1024_add_sse2>, 32, 1 }
499*fb1b10abSAndroid Build Coastguard Worker };
500*fb1b10abSAndroid Build Coastguard Worker 
501*fb1b10abSAndroid Build Coastguard Worker INSTANTIATE_TEST_SUITE_P(
502*fb1b10abSAndroid Build Coastguard Worker     SSE2, TransDCT,
503*fb1b10abSAndroid Build Coastguard Worker     ::testing::Combine(
504*fb1b10abSAndroid Build Coastguard Worker         ::testing::Range(0, static_cast<int>(sizeof(dct_sse2_func_info) /
505*fb1b10abSAndroid Build Coastguard Worker                                              sizeof(dct_sse2_func_info[0]))),
506*fb1b10abSAndroid Build Coastguard Worker         ::testing::Values(dct_sse2_func_info), ::testing::Values(0),
507*fb1b10abSAndroid Build Coastguard Worker         ::testing::Values(VPX_BITS_8, VPX_BITS_10, VPX_BITS_12)));
508*fb1b10abSAndroid Build Coastguard Worker #endif  // HAVE_SSE2
509*fb1b10abSAndroid Build Coastguard Worker 
510*fb1b10abSAndroid Build Coastguard Worker #if HAVE_SSSE3 && !CONFIG_VP9_HIGHBITDEPTH && VPX_ARCH_X86_64
511*fb1b10abSAndroid Build Coastguard Worker // vpx_fdct8x8_ssse3 is only available in 64 bit builds.
512*fb1b10abSAndroid Build Coastguard Worker static const FuncInfo dct_ssse3_func_info = {
513*fb1b10abSAndroid Build Coastguard Worker   &fdct_wrapper<vpx_fdct8x8_ssse3>, &idct_wrapper<vpx_idct8x8_64_add_sse2>, 8, 1
514*fb1b10abSAndroid Build Coastguard Worker };
515*fb1b10abSAndroid Build Coastguard Worker 
516*fb1b10abSAndroid Build Coastguard Worker // TODO(johannkoenig): high bit depth fdct8x8.
517*fb1b10abSAndroid Build Coastguard Worker INSTANTIATE_TEST_SUITE_P(SSSE3, TransDCT,
518*fb1b10abSAndroid Build Coastguard Worker                          ::testing::Values(make_tuple(0, &dct_ssse3_func_info,
519*fb1b10abSAndroid Build Coastguard Worker                                                       0, VPX_BITS_8)));
520*fb1b10abSAndroid Build Coastguard Worker #endif  // HAVE_SSSE3 && !CONFIG_VP9_HIGHBITDEPTH && VPX_ARCH_X86_64
521*fb1b10abSAndroid Build Coastguard Worker 
522*fb1b10abSAndroid Build Coastguard Worker #if HAVE_AVX2 && !CONFIG_VP9_HIGHBITDEPTH
523*fb1b10abSAndroid Build Coastguard Worker static const FuncInfo dct_avx2_func_info = {
524*fb1b10abSAndroid Build Coastguard Worker   &fdct_wrapper<vpx_fdct32x32_avx2>, &idct_wrapper<vpx_idct32x32_1024_add_sse2>,
525*fb1b10abSAndroid Build Coastguard Worker   32, 1
526*fb1b10abSAndroid Build Coastguard Worker };
527*fb1b10abSAndroid Build Coastguard Worker 
528*fb1b10abSAndroid Build Coastguard Worker // TODO(johannkoenig): high bit depth fdct32x32.
529*fb1b10abSAndroid Build Coastguard Worker INSTANTIATE_TEST_SUITE_P(AVX2, TransDCT,
530*fb1b10abSAndroid Build Coastguard Worker                          ::testing::Values(make_tuple(0, &dct_avx2_func_info, 0,
531*fb1b10abSAndroid Build Coastguard Worker                                                       VPX_BITS_8)));
532*fb1b10abSAndroid Build Coastguard Worker #endif  // HAVE_AVX2 && !CONFIG_VP9_HIGHBITDEPTH
533*fb1b10abSAndroid Build Coastguard Worker 
534*fb1b10abSAndroid Build Coastguard Worker #if HAVE_NEON
535*fb1b10abSAndroid Build Coastguard Worker #if CONFIG_VP9_HIGHBITDEPTH
536*fb1b10abSAndroid Build Coastguard Worker static const FuncInfo dct_neon_func_info[] = {
537*fb1b10abSAndroid Build Coastguard Worker   { &fdct_wrapper<vpx_highbd_fdct4x4_neon>,
538*fb1b10abSAndroid Build Coastguard Worker     &highbd_idct_wrapper<vpx_highbd_idct4x4_16_add_neon>, 4, 2 },
539*fb1b10abSAndroid Build Coastguard Worker   { &fdct_wrapper<vpx_highbd_fdct8x8_neon>,
540*fb1b10abSAndroid Build Coastguard Worker     &highbd_idct_wrapper<vpx_highbd_idct8x8_64_add_neon>, 8, 2 },
541*fb1b10abSAndroid Build Coastguard Worker   { &fdct_wrapper<vpx_highbd_fdct16x16_neon>,
542*fb1b10abSAndroid Build Coastguard Worker     &highbd_idct_wrapper<vpx_highbd_idct16x16_256_add_neon>, 16, 2 },
543*fb1b10abSAndroid Build Coastguard Worker   /* { &fdct_wrapper<vpx_highbd_fdct32x32_neon>,
544*fb1b10abSAndroid Build Coastguard Worker        &highbd_idct_wrapper<vpx_highbd_idct32x32_1024_add_neon>, 32, 2 },*/
545*fb1b10abSAndroid Build Coastguard Worker };
546*fb1b10abSAndroid Build Coastguard Worker #else
547*fb1b10abSAndroid Build Coastguard Worker static const FuncInfo dct_neon_func_info[4] = {
548*fb1b10abSAndroid Build Coastguard Worker   { &fdct_wrapper<vpx_fdct4x4_neon>, &idct_wrapper<vpx_idct4x4_16_add_neon>, 4,
549*fb1b10abSAndroid Build Coastguard Worker     1 },
550*fb1b10abSAndroid Build Coastguard Worker   { &fdct_wrapper<vpx_fdct8x8_neon>, &idct_wrapper<vpx_idct8x8_64_add_neon>, 8,
551*fb1b10abSAndroid Build Coastguard Worker     1 },
552*fb1b10abSAndroid Build Coastguard Worker   { &fdct_wrapper<vpx_fdct16x16_neon>,
553*fb1b10abSAndroid Build Coastguard Worker     &idct_wrapper<vpx_idct16x16_256_add_neon>, 16, 1 },
554*fb1b10abSAndroid Build Coastguard Worker   { &fdct_wrapper<vpx_fdct32x32_neon>,
555*fb1b10abSAndroid Build Coastguard Worker     &idct_wrapper<vpx_idct32x32_1024_add_neon>, 32, 1 }
556*fb1b10abSAndroid Build Coastguard Worker };
557*fb1b10abSAndroid Build Coastguard Worker #endif  // CONFIG_VP9_HIGHBITDEPTH
558*fb1b10abSAndroid Build Coastguard Worker 
559*fb1b10abSAndroid Build Coastguard Worker INSTANTIATE_TEST_SUITE_P(
560*fb1b10abSAndroid Build Coastguard Worker     NEON, TransDCT,
561*fb1b10abSAndroid Build Coastguard Worker     ::testing::Combine(
562*fb1b10abSAndroid Build Coastguard Worker         ::testing::Range(0, static_cast<int>(sizeof(dct_neon_func_info) /
563*fb1b10abSAndroid Build Coastguard Worker                                              sizeof(dct_neon_func_info[0]))),
564*fb1b10abSAndroid Build Coastguard Worker         ::testing::Values(dct_neon_func_info), ::testing::Values(0),
565*fb1b10abSAndroid Build Coastguard Worker         ::testing::Values(VPX_BITS_8, VPX_BITS_10, VPX_BITS_12)));
566*fb1b10abSAndroid Build Coastguard Worker #endif  // HAVE_NEON
567*fb1b10abSAndroid Build Coastguard Worker 
568*fb1b10abSAndroid Build Coastguard Worker #if HAVE_MSA && !CONFIG_VP9_HIGHBITDEPTH
569*fb1b10abSAndroid Build Coastguard Worker static const FuncInfo dct_msa_func_info[4] = {
570*fb1b10abSAndroid Build Coastguard Worker   { &fdct_wrapper<vpx_fdct4x4_msa>, &idct_wrapper<vpx_idct4x4_16_add_msa>, 4,
571*fb1b10abSAndroid Build Coastguard Worker     1 },
572*fb1b10abSAndroid Build Coastguard Worker   { &fdct_wrapper<vpx_fdct8x8_msa>, &idct_wrapper<vpx_idct8x8_64_add_msa>, 8,
573*fb1b10abSAndroid Build Coastguard Worker     1 },
574*fb1b10abSAndroid Build Coastguard Worker   { &fdct_wrapper<vpx_fdct16x16_msa>, &idct_wrapper<vpx_idct16x16_256_add_msa>,
575*fb1b10abSAndroid Build Coastguard Worker     16, 1 },
576*fb1b10abSAndroid Build Coastguard Worker   { &fdct_wrapper<vpx_fdct32x32_msa>, &idct_wrapper<vpx_idct32x32_1024_add_msa>,
577*fb1b10abSAndroid Build Coastguard Worker     32, 1 }
578*fb1b10abSAndroid Build Coastguard Worker };
579*fb1b10abSAndroid Build Coastguard Worker 
580*fb1b10abSAndroid Build Coastguard Worker INSTANTIATE_TEST_SUITE_P(
581*fb1b10abSAndroid Build Coastguard Worker     MSA, TransDCT,
582*fb1b10abSAndroid Build Coastguard Worker     ::testing::Combine(::testing::Range(0, 4),
583*fb1b10abSAndroid Build Coastguard Worker                        ::testing::Values(dct_msa_func_info),
584*fb1b10abSAndroid Build Coastguard Worker                        ::testing::Values(0), ::testing::Values(VPX_BITS_8)));
585*fb1b10abSAndroid Build Coastguard Worker #endif  // HAVE_MSA && !CONFIG_VP9_HIGHBITDEPTH
586*fb1b10abSAndroid Build Coastguard Worker 
587*fb1b10abSAndroid Build Coastguard Worker #if HAVE_VSX && !CONFIG_VP9_HIGHBITDEPTH
588*fb1b10abSAndroid Build Coastguard Worker static const FuncInfo dct_vsx_func_info = {
589*fb1b10abSAndroid Build Coastguard Worker   &fdct_wrapper<vpx_fdct4x4_c>, &idct_wrapper<vpx_idct4x4_16_add_vsx>, 4, 1
590*fb1b10abSAndroid Build Coastguard Worker };
591*fb1b10abSAndroid Build Coastguard Worker 
592*fb1b10abSAndroid Build Coastguard Worker INSTANTIATE_TEST_SUITE_P(VSX, TransDCT,
593*fb1b10abSAndroid Build Coastguard Worker                          ::testing::Values(make_tuple(0, &dct_vsx_func_info, 0,
594*fb1b10abSAndroid Build Coastguard Worker                                                       VPX_BITS_8)));
595*fb1b10abSAndroid Build Coastguard Worker #endif  // HAVE_VSX && !CONFIG_VP9_HIGHBITDEPTH &&
596*fb1b10abSAndroid Build Coastguard Worker 
597*fb1b10abSAndroid Build Coastguard Worker #if HAVE_LSX && !CONFIG_VP9_HIGHBITDEPTH
598*fb1b10abSAndroid Build Coastguard Worker static const FuncInfo dct_lsx_func_info[4] = {
599*fb1b10abSAndroid Build Coastguard Worker   { &fdct_wrapper<vpx_fdct4x4_lsx>, &idct_wrapper<vpx_idct4x4_16_add_c>, 4, 1 },
600*fb1b10abSAndroid Build Coastguard Worker   { &fdct_wrapper<vpx_fdct8x8_lsx>, &idct_wrapper<vpx_idct8x8_64_add_c>, 8, 1 },
601*fb1b10abSAndroid Build Coastguard Worker   { &fdct_wrapper<vpx_fdct16x16_lsx>, &idct_wrapper<vpx_idct16x16_256_add_c>,
602*fb1b10abSAndroid Build Coastguard Worker     16, 1 },
603*fb1b10abSAndroid Build Coastguard Worker   { &fdct_wrapper<vpx_fdct32x32_lsx>, &idct_wrapper<vpx_idct32x32_1024_add_lsx>,
604*fb1b10abSAndroid Build Coastguard Worker     32, 1 }
605*fb1b10abSAndroid Build Coastguard Worker };
606*fb1b10abSAndroid Build Coastguard Worker 
607*fb1b10abSAndroid Build Coastguard Worker INSTANTIATE_TEST_SUITE_P(
608*fb1b10abSAndroid Build Coastguard Worker     LSX, TransDCT,
609*fb1b10abSAndroid Build Coastguard Worker     ::testing::Combine(::testing::Range(0, 4),
610*fb1b10abSAndroid Build Coastguard Worker                        ::testing::Values(dct_lsx_func_info),
611*fb1b10abSAndroid Build Coastguard Worker                        ::testing::Values(0), ::testing::Values(VPX_BITS_8)));
612*fb1b10abSAndroid Build Coastguard Worker #endif  // HAVE_LSX && !CONFIG_VP9_HIGHBITDEPTH
613*fb1b10abSAndroid Build Coastguard Worker 
614*fb1b10abSAndroid Build Coastguard Worker #endif  // !CONFIG_EMULATE_HARDWARE
615*fb1b10abSAndroid Build Coastguard Worker 
616*fb1b10abSAndroid Build Coastguard Worker /* -------------------------------------------------------------------------- */
617*fb1b10abSAndroid Build Coastguard Worker 
618*fb1b10abSAndroid Build Coastguard Worker class TransHT : public TransTestBase {
619*fb1b10abSAndroid Build Coastguard Worker  public:
TransHT()620*fb1b10abSAndroid Build Coastguard Worker   TransHT() { fwd_txfm_ref = fht_ref; }
621*fb1b10abSAndroid Build Coastguard Worker };
622*fb1b10abSAndroid Build Coastguard Worker 
TEST_P(TransHT,AccuracyCheck)623*fb1b10abSAndroid Build Coastguard Worker TEST_P(TransHT, AccuracyCheck) {
624*fb1b10abSAndroid Build Coastguard Worker   RunAccuracyCheck(size_ == 16 && bit_depth_ > 10 && pixel_size_ == 2 ? 2 : 1);
625*fb1b10abSAndroid Build Coastguard Worker }
626*fb1b10abSAndroid Build Coastguard Worker 
TEST_P(TransHT,CoeffCheck)627*fb1b10abSAndroid Build Coastguard Worker TEST_P(TransHT, CoeffCheck) { RunCoeffCheck(); }
628*fb1b10abSAndroid Build Coastguard Worker 
TEST_P(TransHT,MemCheck)629*fb1b10abSAndroid Build Coastguard Worker TEST_P(TransHT, MemCheck) { RunMemCheck(); }
630*fb1b10abSAndroid Build Coastguard Worker 
TEST_P(TransHT,InvAccuracyCheck)631*fb1b10abSAndroid Build Coastguard Worker TEST_P(TransHT, InvAccuracyCheck) { RunInvAccuracyCheck(1); }
632*fb1b10abSAndroid Build Coastguard Worker 
633*fb1b10abSAndroid Build Coastguard Worker static const FuncInfo ht_c_func_info[] = {
634*fb1b10abSAndroid Build Coastguard Worker #if CONFIG_VP9_HIGHBITDEPTH
635*fb1b10abSAndroid Build Coastguard Worker   { &vp9_highbd_fht4x4_c, &highbd_iht_wrapper<vp9_highbd_iht4x4_16_add_c>, 4,
636*fb1b10abSAndroid Build Coastguard Worker     2 },
637*fb1b10abSAndroid Build Coastguard Worker   { &vp9_highbd_fht8x8_c, &highbd_iht_wrapper<vp9_highbd_iht8x8_64_add_c>, 8,
638*fb1b10abSAndroid Build Coastguard Worker     2 },
639*fb1b10abSAndroid Build Coastguard Worker   { &vp9_highbd_fht16x16_c, &highbd_iht_wrapper<vp9_highbd_iht16x16_256_add_c>,
640*fb1b10abSAndroid Build Coastguard Worker     16, 2 },
641*fb1b10abSAndroid Build Coastguard Worker #endif
642*fb1b10abSAndroid Build Coastguard Worker   { &vp9_fht4x4_c, &iht_wrapper<vp9_iht4x4_16_add_c>, 4, 1 },
643*fb1b10abSAndroid Build Coastguard Worker   { &vp9_fht8x8_c, &iht_wrapper<vp9_iht8x8_64_add_c>, 8, 1 },
644*fb1b10abSAndroid Build Coastguard Worker   { &vp9_fht16x16_c, &iht_wrapper<vp9_iht16x16_256_add_c>, 16, 1 }
645*fb1b10abSAndroid Build Coastguard Worker };
646*fb1b10abSAndroid Build Coastguard Worker 
647*fb1b10abSAndroid Build Coastguard Worker INSTANTIATE_TEST_SUITE_P(
648*fb1b10abSAndroid Build Coastguard Worker     C, TransHT,
649*fb1b10abSAndroid Build Coastguard Worker     ::testing::Combine(
650*fb1b10abSAndroid Build Coastguard Worker         ::testing::Range(0, static_cast<int>(sizeof(ht_c_func_info) /
651*fb1b10abSAndroid Build Coastguard Worker                                              sizeof(ht_c_func_info[0]))),
652*fb1b10abSAndroid Build Coastguard Worker         ::testing::Values(ht_c_func_info), ::testing::Range(0, 4),
653*fb1b10abSAndroid Build Coastguard Worker         ::testing::Values(VPX_BITS_8, VPX_BITS_10, VPX_BITS_12)));
654*fb1b10abSAndroid Build Coastguard Worker 
655*fb1b10abSAndroid Build Coastguard Worker #if !CONFIG_EMULATE_HARDWARE
656*fb1b10abSAndroid Build Coastguard Worker 
657*fb1b10abSAndroid Build Coastguard Worker #if HAVE_NEON
658*fb1b10abSAndroid Build Coastguard Worker 
659*fb1b10abSAndroid Build Coastguard Worker static const FuncInfo ht_neon_func_info[] = {
660*fb1b10abSAndroid Build Coastguard Worker #if CONFIG_VP9_HIGHBITDEPTH
661*fb1b10abSAndroid Build Coastguard Worker   { &vp9_highbd_fht4x4_c, &highbd_iht_wrapper<vp9_highbd_iht4x4_16_add_neon>, 4,
662*fb1b10abSAndroid Build Coastguard Worker     2 },
663*fb1b10abSAndroid Build Coastguard Worker   { &vp9_highbd_fht4x4_neon, &highbd_iht_wrapper<vp9_highbd_iht4x4_16_add_neon>,
664*fb1b10abSAndroid Build Coastguard Worker     4, 2 },
665*fb1b10abSAndroid Build Coastguard Worker   { &vp9_highbd_fht8x8_c, &highbd_iht_wrapper<vp9_highbd_iht8x8_64_add_neon>, 8,
666*fb1b10abSAndroid Build Coastguard Worker     2 },
667*fb1b10abSAndroid Build Coastguard Worker   { &vp9_highbd_fht8x8_neon, &highbd_iht_wrapper<vp9_highbd_iht8x8_64_add_neon>,
668*fb1b10abSAndroid Build Coastguard Worker     8, 2 },
669*fb1b10abSAndroid Build Coastguard Worker   { &vp9_highbd_fht16x16_c,
670*fb1b10abSAndroid Build Coastguard Worker     &highbd_iht_wrapper<vp9_highbd_iht16x16_256_add_neon>, 16, 2 },
671*fb1b10abSAndroid Build Coastguard Worker   { &vp9_highbd_fht16x16_neon,
672*fb1b10abSAndroid Build Coastguard Worker     &highbd_iht_wrapper<vp9_highbd_iht16x16_256_add_neon>, 16, 2 },
673*fb1b10abSAndroid Build Coastguard Worker #endif
674*fb1b10abSAndroid Build Coastguard Worker   { &vp9_fht4x4_c, &iht_wrapper<vp9_iht4x4_16_add_neon>, 4, 1 },
675*fb1b10abSAndroid Build Coastguard Worker   { &vp9_fht4x4_neon, &iht_wrapper<vp9_iht4x4_16_add_neon>, 4, 1 },
676*fb1b10abSAndroid Build Coastguard Worker   { &vp9_fht8x8_c, &iht_wrapper<vp9_iht8x8_64_add_neon>, 8, 1 },
677*fb1b10abSAndroid Build Coastguard Worker   { &vp9_fht8x8_neon, &iht_wrapper<vp9_iht8x8_64_add_neon>, 8, 1 },
678*fb1b10abSAndroid Build Coastguard Worker   { &vp9_fht16x16_c, &iht_wrapper<vp9_iht16x16_256_add_neon>, 16, 1 },
679*fb1b10abSAndroid Build Coastguard Worker   { &vp9_fht16x16_neon, &iht_wrapper<vp9_iht16x16_256_add_neon>, 16, 1 }
680*fb1b10abSAndroid Build Coastguard Worker };
681*fb1b10abSAndroid Build Coastguard Worker 
682*fb1b10abSAndroid Build Coastguard Worker INSTANTIATE_TEST_SUITE_P(
683*fb1b10abSAndroid Build Coastguard Worker     NEON, TransHT,
684*fb1b10abSAndroid Build Coastguard Worker     ::testing::Combine(
685*fb1b10abSAndroid Build Coastguard Worker         ::testing::Range(0, static_cast<int>(sizeof(ht_neon_func_info) /
686*fb1b10abSAndroid Build Coastguard Worker                                              sizeof(ht_neon_func_info[0]))),
687*fb1b10abSAndroid Build Coastguard Worker         ::testing::Values(ht_neon_func_info), ::testing::Range(0, 4),
688*fb1b10abSAndroid Build Coastguard Worker         ::testing::Values(VPX_BITS_8, VPX_BITS_10, VPX_BITS_12)));
689*fb1b10abSAndroid Build Coastguard Worker #endif  // HAVE_NEON
690*fb1b10abSAndroid Build Coastguard Worker 
691*fb1b10abSAndroid Build Coastguard Worker #if HAVE_SSE2
692*fb1b10abSAndroid Build Coastguard Worker 
693*fb1b10abSAndroid Build Coastguard Worker static const FuncInfo ht_sse2_func_info[3] = {
694*fb1b10abSAndroid Build Coastguard Worker   { &vp9_fht4x4_sse2, &iht_wrapper<vp9_iht4x4_16_add_sse2>, 4, 1 },
695*fb1b10abSAndroid Build Coastguard Worker   { &vp9_fht8x8_sse2, &iht_wrapper<vp9_iht8x8_64_add_sse2>, 8, 1 },
696*fb1b10abSAndroid Build Coastguard Worker   { &vp9_fht16x16_sse2, &iht_wrapper<vp9_iht16x16_256_add_sse2>, 16, 1 }
697*fb1b10abSAndroid Build Coastguard Worker };
698*fb1b10abSAndroid Build Coastguard Worker 
699*fb1b10abSAndroid Build Coastguard Worker INSTANTIATE_TEST_SUITE_P(
700*fb1b10abSAndroid Build Coastguard Worker     SSE2, TransHT,
701*fb1b10abSAndroid Build Coastguard Worker     ::testing::Combine(::testing::Range(0, 3),
702*fb1b10abSAndroid Build Coastguard Worker                        ::testing::Values(ht_sse2_func_info),
703*fb1b10abSAndroid Build Coastguard Worker                        ::testing::Range(0, 4), ::testing::Values(VPX_BITS_8)));
704*fb1b10abSAndroid Build Coastguard Worker #endif  // HAVE_SSE2
705*fb1b10abSAndroid Build Coastguard Worker 
706*fb1b10abSAndroid Build Coastguard Worker #if HAVE_SSE4_1 && CONFIG_VP9_HIGHBITDEPTH
707*fb1b10abSAndroid Build Coastguard Worker static const FuncInfo ht_sse4_1_func_info[3] = {
708*fb1b10abSAndroid Build Coastguard Worker   { &vp9_highbd_fht4x4_c, &highbd_iht_wrapper<vp9_highbd_iht4x4_16_add_sse4_1>,
709*fb1b10abSAndroid Build Coastguard Worker     4, 2 },
710*fb1b10abSAndroid Build Coastguard Worker   { vp9_highbd_fht8x8_c, &highbd_iht_wrapper<vp9_highbd_iht8x8_64_add_sse4_1>,
711*fb1b10abSAndroid Build Coastguard Worker     8, 2 },
712*fb1b10abSAndroid Build Coastguard Worker   { &vp9_highbd_fht16x16_c,
713*fb1b10abSAndroid Build Coastguard Worker     &highbd_iht_wrapper<vp9_highbd_iht16x16_256_add_sse4_1>, 16, 2 }
714*fb1b10abSAndroid Build Coastguard Worker };
715*fb1b10abSAndroid Build Coastguard Worker 
716*fb1b10abSAndroid Build Coastguard Worker INSTANTIATE_TEST_SUITE_P(
717*fb1b10abSAndroid Build Coastguard Worker     SSE4_1, TransHT,
718*fb1b10abSAndroid Build Coastguard Worker     ::testing::Combine(::testing::Range(0, 3),
719*fb1b10abSAndroid Build Coastguard Worker                        ::testing::Values(ht_sse4_1_func_info),
720*fb1b10abSAndroid Build Coastguard Worker                        ::testing::Range(0, 4),
721*fb1b10abSAndroid Build Coastguard Worker                        ::testing::Values(VPX_BITS_8, VPX_BITS_10,
722*fb1b10abSAndroid Build Coastguard Worker                                          VPX_BITS_12)));
723*fb1b10abSAndroid Build Coastguard Worker #endif  // HAVE_SSE4_1 && CONFIG_VP9_HIGHBITDEPTH
724*fb1b10abSAndroid Build Coastguard Worker 
725*fb1b10abSAndroid Build Coastguard Worker #if HAVE_VSX && !CONFIG_EMULATE_HARDWARE && !CONFIG_VP9_HIGHBITDEPTH
726*fb1b10abSAndroid Build Coastguard Worker static const FuncInfo ht_vsx_func_info[3] = {
727*fb1b10abSAndroid Build Coastguard Worker   { &vp9_fht4x4_c, &iht_wrapper<vp9_iht4x4_16_add_vsx>, 4, 1 },
728*fb1b10abSAndroid Build Coastguard Worker   { &vp9_fht8x8_c, &iht_wrapper<vp9_iht8x8_64_add_vsx>, 8, 1 },
729*fb1b10abSAndroid Build Coastguard Worker   { &vp9_fht16x16_c, &iht_wrapper<vp9_iht16x16_256_add_vsx>, 16, 1 }
730*fb1b10abSAndroid Build Coastguard Worker };
731*fb1b10abSAndroid Build Coastguard Worker 
732*fb1b10abSAndroid Build Coastguard Worker INSTANTIATE_TEST_SUITE_P(VSX, TransHT,
733*fb1b10abSAndroid Build Coastguard Worker                          ::testing::Combine(::testing::Range(0, 3),
734*fb1b10abSAndroid Build Coastguard Worker                                             ::testing::Values(ht_vsx_func_info),
735*fb1b10abSAndroid Build Coastguard Worker                                             ::testing::Range(0, 4),
736*fb1b10abSAndroid Build Coastguard Worker                                             ::testing::Values(VPX_BITS_8)));
737*fb1b10abSAndroid Build Coastguard Worker #endif  // HAVE_VSX
738*fb1b10abSAndroid Build Coastguard Worker #endif  // !CONFIG_EMULATE_HARDWARE
739*fb1b10abSAndroid Build Coastguard Worker 
740*fb1b10abSAndroid Build Coastguard Worker /* -------------------------------------------------------------------------- */
741*fb1b10abSAndroid Build Coastguard Worker 
742*fb1b10abSAndroid Build Coastguard Worker class TransWHT : public TransTestBase {
743*fb1b10abSAndroid Build Coastguard Worker  public:
TransWHT()744*fb1b10abSAndroid Build Coastguard Worker   TransWHT() { fwd_txfm_ref = fwht_ref; }
745*fb1b10abSAndroid Build Coastguard Worker };
746*fb1b10abSAndroid Build Coastguard Worker 
TEST_P(TransWHT,AccuracyCheck)747*fb1b10abSAndroid Build Coastguard Worker TEST_P(TransWHT, AccuracyCheck) { RunAccuracyCheck(0); }
748*fb1b10abSAndroid Build Coastguard Worker 
TEST_P(TransWHT,CoeffCheck)749*fb1b10abSAndroid Build Coastguard Worker TEST_P(TransWHT, CoeffCheck) { RunCoeffCheck(); }
750*fb1b10abSAndroid Build Coastguard Worker 
TEST_P(TransWHT,MemCheck)751*fb1b10abSAndroid Build Coastguard Worker TEST_P(TransWHT, MemCheck) { RunMemCheck(); }
752*fb1b10abSAndroid Build Coastguard Worker 
TEST_P(TransWHT,InvAccuracyCheck)753*fb1b10abSAndroid Build Coastguard Worker TEST_P(TransWHT, InvAccuracyCheck) { RunInvAccuracyCheck(0); }
754*fb1b10abSAndroid Build Coastguard Worker 
755*fb1b10abSAndroid Build Coastguard Worker static const FuncInfo wht_c_func_info[] = {
756*fb1b10abSAndroid Build Coastguard Worker #if CONFIG_VP9_HIGHBITDEPTH
757*fb1b10abSAndroid Build Coastguard Worker   { &fdct_wrapper<vp9_highbd_fwht4x4_c>,
758*fb1b10abSAndroid Build Coastguard Worker     &highbd_idct_wrapper<vpx_highbd_iwht4x4_16_add_c>, 4, 2 },
759*fb1b10abSAndroid Build Coastguard Worker #endif
760*fb1b10abSAndroid Build Coastguard Worker   { &fdct_wrapper<vp9_fwht4x4_c>, &idct_wrapper<vpx_iwht4x4_16_add_c>, 4, 1 }
761*fb1b10abSAndroid Build Coastguard Worker };
762*fb1b10abSAndroid Build Coastguard Worker 
763*fb1b10abSAndroid Build Coastguard Worker INSTANTIATE_TEST_SUITE_P(
764*fb1b10abSAndroid Build Coastguard Worker     C, TransWHT,
765*fb1b10abSAndroid Build Coastguard Worker     ::testing::Combine(
766*fb1b10abSAndroid Build Coastguard Worker         ::testing::Range(0, static_cast<int>(sizeof(wht_c_func_info) /
767*fb1b10abSAndroid Build Coastguard Worker                                              sizeof(wht_c_func_info[0]))),
768*fb1b10abSAndroid Build Coastguard Worker         ::testing::Values(wht_c_func_info), ::testing::Values(0),
769*fb1b10abSAndroid Build Coastguard Worker         ::testing::Values(VPX_BITS_8, VPX_BITS_10, VPX_BITS_12)));
770*fb1b10abSAndroid Build Coastguard Worker 
771*fb1b10abSAndroid Build Coastguard Worker #if HAVE_SSE2 && !CONFIG_EMULATE_HARDWARE
772*fb1b10abSAndroid Build Coastguard Worker static const FuncInfo wht_sse2_func_info = {
773*fb1b10abSAndroid Build Coastguard Worker   &fdct_wrapper<vp9_fwht4x4_sse2>, &idct_wrapper<vpx_iwht4x4_16_add_sse2>, 4, 1
774*fb1b10abSAndroid Build Coastguard Worker };
775*fb1b10abSAndroid Build Coastguard Worker 
776*fb1b10abSAndroid Build Coastguard Worker INSTANTIATE_TEST_SUITE_P(SSE2, TransWHT,
777*fb1b10abSAndroid Build Coastguard Worker                          ::testing::Values(make_tuple(0, &wht_sse2_func_info, 0,
778*fb1b10abSAndroid Build Coastguard Worker                                                       VPX_BITS_8)));
779*fb1b10abSAndroid Build Coastguard Worker #endif  // HAVE_SSE2 && !CONFIG_EMULATE_HARDWARE
780*fb1b10abSAndroid Build Coastguard Worker 
781*fb1b10abSAndroid Build Coastguard Worker #if HAVE_VSX && !CONFIG_EMULATE_HARDWARE && !CONFIG_VP9_HIGHBITDEPTH
782*fb1b10abSAndroid Build Coastguard Worker static const FuncInfo wht_vsx_func_info = {
783*fb1b10abSAndroid Build Coastguard Worker   &fdct_wrapper<vp9_fwht4x4_c>, &idct_wrapper<vpx_iwht4x4_16_add_vsx>, 4, 1
784*fb1b10abSAndroid Build Coastguard Worker };
785*fb1b10abSAndroid Build Coastguard Worker 
786*fb1b10abSAndroid Build Coastguard Worker INSTANTIATE_TEST_SUITE_P(VSX, TransWHT,
787*fb1b10abSAndroid Build Coastguard Worker                          ::testing::Values(make_tuple(0, &wht_vsx_func_info, 0,
788*fb1b10abSAndroid Build Coastguard Worker                                                       VPX_BITS_8)));
789*fb1b10abSAndroid Build Coastguard Worker #endif  // HAVE_VSX && !CONFIG_EMULATE_HARDWARE
790*fb1b10abSAndroid Build Coastguard Worker 
791*fb1b10abSAndroid Build Coastguard Worker }  // namespace
792