1*fb1b10abSAndroid Build Coastguard Worker /*
2*fb1b10abSAndroid Build Coastguard Worker * Copyright (c) 2012 The WebM project authors. All Rights Reserved.
3*fb1b10abSAndroid Build Coastguard Worker *
4*fb1b10abSAndroid Build Coastguard Worker * Use of this source code is governed by a BSD-style license
5*fb1b10abSAndroid Build Coastguard Worker * that can be found in the LICENSE file in the root of the source
6*fb1b10abSAndroid Build Coastguard Worker * tree. An additional intellectual property rights grant can be found
7*fb1b10abSAndroid Build Coastguard Worker * in the file PATENTS. All contributing project authors may
8*fb1b10abSAndroid Build Coastguard Worker * be found in the AUTHORS file in the root of the source tree.
9*fb1b10abSAndroid Build Coastguard Worker */
10*fb1b10abSAndroid Build Coastguard Worker
11*fb1b10abSAndroid Build Coastguard Worker #include <math.h>
12*fb1b10abSAndroid Build Coastguard Worker #include <stdlib.h>
13*fb1b10abSAndroid Build Coastguard Worker #include <string.h>
14*fb1b10abSAndroid Build Coastguard Worker #include <tuple>
15*fb1b10abSAndroid Build Coastguard Worker
16*fb1b10abSAndroid Build Coastguard Worker #include "gtest/gtest.h"
17*fb1b10abSAndroid Build Coastguard Worker
18*fb1b10abSAndroid Build Coastguard Worker #include "./vp9_rtcd.h"
19*fb1b10abSAndroid Build Coastguard Worker #include "./vpx_dsp_rtcd.h"
20*fb1b10abSAndroid Build Coastguard Worker #include "test/acm_random.h"
21*fb1b10abSAndroid Build Coastguard Worker #include "test/clear_system_state.h"
22*fb1b10abSAndroid Build Coastguard Worker #include "test/register_state_check.h"
23*fb1b10abSAndroid Build Coastguard Worker #include "test/util.h"
24*fb1b10abSAndroid Build Coastguard Worker #include "vp9/common/vp9_entropy.h"
25*fb1b10abSAndroid Build Coastguard Worker #include "vp9/common/vp9_scan.h"
26*fb1b10abSAndroid Build Coastguard Worker #include "vpx_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
33*fb1b10abSAndroid Build Coastguard Worker namespace {
34*fb1b10abSAndroid Build Coastguard Worker
35*fb1b10abSAndroid Build Coastguard Worker const int kNumCoeffs = 64;
36*fb1b10abSAndroid Build Coastguard Worker const double kPi = 3.141592653589793238462643383279502884;
37*fb1b10abSAndroid Build Coastguard Worker
38*fb1b10abSAndroid Build Coastguard Worker const int kSignBiasMaxDiff255 = 1500;
39*fb1b10abSAndroid Build Coastguard Worker const int kSignBiasMaxDiff15 = 10000;
40*fb1b10abSAndroid Build Coastguard Worker
41*fb1b10abSAndroid Build Coastguard Worker typedef void (*FdctFunc)(const int16_t *in, tran_low_t *out, int stride);
42*fb1b10abSAndroid Build Coastguard Worker typedef void (*IdctFunc)(const tran_low_t *in, uint8_t *out, int stride);
43*fb1b10abSAndroid Build Coastguard Worker typedef void (*FhtFunc)(const int16_t *in, tran_low_t *out, int stride,
44*fb1b10abSAndroid Build Coastguard Worker int tx_type);
45*fb1b10abSAndroid Build Coastguard Worker typedef void (*IhtFunc)(const tran_low_t *in, uint8_t *out, int stride,
46*fb1b10abSAndroid Build Coastguard Worker int tx_type);
47*fb1b10abSAndroid Build Coastguard Worker
48*fb1b10abSAndroid Build Coastguard Worker typedef std::tuple<FdctFunc, IdctFunc, int, vpx_bit_depth_t> Dct8x8Param;
49*fb1b10abSAndroid Build Coastguard Worker typedef std::tuple<FhtFunc, IhtFunc, int, vpx_bit_depth_t> Ht8x8Param;
50*fb1b10abSAndroid Build Coastguard Worker typedef std::tuple<IdctFunc, IdctFunc, int, vpx_bit_depth_t> Idct8x8Param;
51*fb1b10abSAndroid Build Coastguard Worker
reference_8x8_dct_1d(const double in[8],double out[8])52*fb1b10abSAndroid Build Coastguard Worker void reference_8x8_dct_1d(const double in[8], double out[8]) {
53*fb1b10abSAndroid Build Coastguard Worker const double kInvSqrt2 = 0.707106781186547524400844362104;
54*fb1b10abSAndroid Build Coastguard Worker for (int k = 0; k < 8; k++) {
55*fb1b10abSAndroid Build Coastguard Worker out[k] = 0.0;
56*fb1b10abSAndroid Build Coastguard Worker for (int n = 0; n < 8; n++) {
57*fb1b10abSAndroid Build Coastguard Worker out[k] += in[n] * cos(kPi * (2 * n + 1) * k / 16.0);
58*fb1b10abSAndroid Build Coastguard Worker }
59*fb1b10abSAndroid Build Coastguard Worker if (k == 0) out[k] = out[k] * kInvSqrt2;
60*fb1b10abSAndroid Build Coastguard Worker }
61*fb1b10abSAndroid Build Coastguard Worker }
62*fb1b10abSAndroid Build Coastguard Worker
reference_8x8_dct_2d(const int16_t input[kNumCoeffs],double output[kNumCoeffs])63*fb1b10abSAndroid Build Coastguard Worker void reference_8x8_dct_2d(const int16_t input[kNumCoeffs],
64*fb1b10abSAndroid Build Coastguard Worker double output[kNumCoeffs]) {
65*fb1b10abSAndroid Build Coastguard Worker // First transform columns
66*fb1b10abSAndroid Build Coastguard Worker for (int i = 0; i < 8; ++i) {
67*fb1b10abSAndroid Build Coastguard Worker double temp_in[8], temp_out[8];
68*fb1b10abSAndroid Build Coastguard Worker for (int j = 0; j < 8; ++j) temp_in[j] = input[j * 8 + i];
69*fb1b10abSAndroid Build Coastguard Worker reference_8x8_dct_1d(temp_in, temp_out);
70*fb1b10abSAndroid Build Coastguard Worker for (int j = 0; j < 8; ++j) output[j * 8 + i] = temp_out[j];
71*fb1b10abSAndroid Build Coastguard Worker }
72*fb1b10abSAndroid Build Coastguard Worker // Then transform rows
73*fb1b10abSAndroid Build Coastguard Worker for (int i = 0; i < 8; ++i) {
74*fb1b10abSAndroid Build Coastguard Worker double temp_in[8], temp_out[8];
75*fb1b10abSAndroid Build Coastguard Worker for (int j = 0; j < 8; ++j) temp_in[j] = output[j + i * 8];
76*fb1b10abSAndroid Build Coastguard Worker reference_8x8_dct_1d(temp_in, temp_out);
77*fb1b10abSAndroid Build Coastguard Worker // Scale by some magic number
78*fb1b10abSAndroid Build Coastguard Worker for (int j = 0; j < 8; ++j) output[j + i * 8] = temp_out[j] * 2;
79*fb1b10abSAndroid Build Coastguard Worker }
80*fb1b10abSAndroid Build Coastguard Worker }
81*fb1b10abSAndroid Build Coastguard Worker
fdct8x8_ref(const int16_t * in,tran_low_t * out,int stride,int)82*fb1b10abSAndroid Build Coastguard Worker void fdct8x8_ref(const int16_t *in, tran_low_t *out, int stride,
83*fb1b10abSAndroid Build Coastguard Worker int /*tx_type*/) {
84*fb1b10abSAndroid Build Coastguard Worker vpx_fdct8x8_c(in, out, stride);
85*fb1b10abSAndroid Build Coastguard Worker }
86*fb1b10abSAndroid Build Coastguard Worker
fht8x8_ref(const int16_t * in,tran_low_t * out,int stride,int tx_type)87*fb1b10abSAndroid Build Coastguard Worker void fht8x8_ref(const int16_t *in, tran_low_t *out, int stride, int tx_type) {
88*fb1b10abSAndroid Build Coastguard Worker vp9_fht8x8_c(in, out, stride, tx_type);
89*fb1b10abSAndroid Build Coastguard Worker }
90*fb1b10abSAndroid Build Coastguard Worker
91*fb1b10abSAndroid Build Coastguard Worker #if CONFIG_VP9_HIGHBITDEPTH
idct8x8_10(const tran_low_t * in,uint8_t * out,int stride)92*fb1b10abSAndroid Build Coastguard Worker void idct8x8_10(const tran_low_t *in, uint8_t *out, int stride) {
93*fb1b10abSAndroid Build Coastguard Worker vpx_highbd_idct8x8_64_add_c(in, CAST_TO_SHORTPTR(out), stride, 10);
94*fb1b10abSAndroid Build Coastguard Worker }
95*fb1b10abSAndroid Build Coastguard Worker
idct8x8_12(const tran_low_t * in,uint8_t * out,int stride)96*fb1b10abSAndroid Build Coastguard Worker void idct8x8_12(const tran_low_t *in, uint8_t *out, int stride) {
97*fb1b10abSAndroid Build Coastguard Worker vpx_highbd_idct8x8_64_add_c(in, CAST_TO_SHORTPTR(out), stride, 12);
98*fb1b10abSAndroid Build Coastguard Worker }
99*fb1b10abSAndroid Build Coastguard Worker
iht8x8_10(const tran_low_t * in,uint8_t * out,int stride,int tx_type)100*fb1b10abSAndroid Build Coastguard Worker void iht8x8_10(const tran_low_t *in, uint8_t *out, int stride, int tx_type) {
101*fb1b10abSAndroid Build Coastguard Worker vp9_highbd_iht8x8_64_add_c(in, CAST_TO_SHORTPTR(out), stride, tx_type, 10);
102*fb1b10abSAndroid Build Coastguard Worker }
103*fb1b10abSAndroid Build Coastguard Worker
iht8x8_12(const tran_low_t * in,uint8_t * out,int stride,int tx_type)104*fb1b10abSAndroid Build Coastguard Worker void iht8x8_12(const tran_low_t *in, uint8_t *out, int stride, int tx_type) {
105*fb1b10abSAndroid Build Coastguard Worker vp9_highbd_iht8x8_64_add_c(in, CAST_TO_SHORTPTR(out), stride, tx_type, 12);
106*fb1b10abSAndroid Build Coastguard Worker }
107*fb1b10abSAndroid Build Coastguard Worker
108*fb1b10abSAndroid Build Coastguard Worker #if HAVE_SSE2
109*fb1b10abSAndroid Build Coastguard Worker
idct8x8_12_add_10_c(const tran_low_t * in,uint8_t * out,int stride)110*fb1b10abSAndroid Build Coastguard Worker void idct8x8_12_add_10_c(const tran_low_t *in, uint8_t *out, int stride) {
111*fb1b10abSAndroid Build Coastguard Worker vpx_highbd_idct8x8_12_add_c(in, CAST_TO_SHORTPTR(out), stride, 10);
112*fb1b10abSAndroid Build Coastguard Worker }
113*fb1b10abSAndroid Build Coastguard Worker
idct8x8_12_add_12_c(const tran_low_t * in,uint8_t * out,int stride)114*fb1b10abSAndroid Build Coastguard Worker void idct8x8_12_add_12_c(const tran_low_t *in, uint8_t *out, int stride) {
115*fb1b10abSAndroid Build Coastguard Worker vpx_highbd_idct8x8_12_add_c(in, CAST_TO_SHORTPTR(out), stride, 12);
116*fb1b10abSAndroid Build Coastguard Worker }
117*fb1b10abSAndroid Build Coastguard Worker
idct8x8_12_add_10_sse2(const tran_low_t * in,uint8_t * out,int stride)118*fb1b10abSAndroid Build Coastguard Worker void idct8x8_12_add_10_sse2(const tran_low_t *in, uint8_t *out, int stride) {
119*fb1b10abSAndroid Build Coastguard Worker vpx_highbd_idct8x8_12_add_sse2(in, CAST_TO_SHORTPTR(out), stride, 10);
120*fb1b10abSAndroid Build Coastguard Worker }
121*fb1b10abSAndroid Build Coastguard Worker
idct8x8_12_add_12_sse2(const tran_low_t * in,uint8_t * out,int stride)122*fb1b10abSAndroid Build Coastguard Worker void idct8x8_12_add_12_sse2(const tran_low_t *in, uint8_t *out, int stride) {
123*fb1b10abSAndroid Build Coastguard Worker vpx_highbd_idct8x8_12_add_sse2(in, CAST_TO_SHORTPTR(out), stride, 12);
124*fb1b10abSAndroid Build Coastguard Worker }
125*fb1b10abSAndroid Build Coastguard Worker
idct8x8_64_add_10_sse2(const tran_low_t * in,uint8_t * out,int stride)126*fb1b10abSAndroid Build Coastguard Worker void idct8x8_64_add_10_sse2(const tran_low_t *in, uint8_t *out, int stride) {
127*fb1b10abSAndroid Build Coastguard Worker vpx_highbd_idct8x8_64_add_sse2(in, CAST_TO_SHORTPTR(out), stride, 10);
128*fb1b10abSAndroid Build Coastguard Worker }
129*fb1b10abSAndroid Build Coastguard Worker
idct8x8_64_add_12_sse2(const tran_low_t * in,uint8_t * out,int stride)130*fb1b10abSAndroid Build Coastguard Worker void idct8x8_64_add_12_sse2(const tran_low_t *in, uint8_t *out, int stride) {
131*fb1b10abSAndroid Build Coastguard Worker vpx_highbd_idct8x8_64_add_sse2(in, CAST_TO_SHORTPTR(out), stride, 12);
132*fb1b10abSAndroid Build Coastguard Worker }
133*fb1b10abSAndroid Build Coastguard Worker #endif // HAVE_SSE2
134*fb1b10abSAndroid Build Coastguard Worker #endif // CONFIG_VP9_HIGHBITDEPTH
135*fb1b10abSAndroid Build Coastguard Worker
136*fb1b10abSAndroid Build Coastguard Worker // Visual Studio 2022 (cl.exe) targeting AArch64 with optimizations enabled
137*fb1b10abSAndroid Build Coastguard Worker // produces invalid code in RunExtremalCheck() and RunInvAccuracyCheck().
138*fb1b10abSAndroid Build Coastguard Worker // See:
139*fb1b10abSAndroid Build Coastguard Worker // https://developercommunity.visualstudio.com/t/1770-preview-1:-Misoptimization-for-AR/10369786
140*fb1b10abSAndroid Build Coastguard Worker // TODO(jzern): check the compiler version after a fix for the issue is
141*fb1b10abSAndroid Build Coastguard Worker // released.
142*fb1b10abSAndroid Build Coastguard Worker #if defined(_MSC_VER) && defined(_M_ARM64) && !defined(__clang__)
143*fb1b10abSAndroid Build Coastguard Worker #pragma optimize("", off)
144*fb1b10abSAndroid Build Coastguard Worker #endif
145*fb1b10abSAndroid Build Coastguard Worker class FwdTrans8x8TestBase {
146*fb1b10abSAndroid Build Coastguard Worker public:
147*fb1b10abSAndroid Build Coastguard Worker virtual ~FwdTrans8x8TestBase() = default;
148*fb1b10abSAndroid Build Coastguard Worker
149*fb1b10abSAndroid Build Coastguard Worker protected:
150*fb1b10abSAndroid Build Coastguard Worker virtual void RunFwdTxfm(int16_t *in, tran_low_t *out, int stride) = 0;
151*fb1b10abSAndroid Build Coastguard Worker virtual void RunInvTxfm(tran_low_t *out, uint8_t *dst, int stride) = 0;
152*fb1b10abSAndroid Build Coastguard Worker
RunSignBiasCheck()153*fb1b10abSAndroid Build Coastguard Worker void RunSignBiasCheck() {
154*fb1b10abSAndroid Build Coastguard Worker ACMRandom rnd(ACMRandom::DeterministicSeed());
155*fb1b10abSAndroid Build Coastguard Worker DECLARE_ALIGNED(16, int16_t, test_input_block[64]);
156*fb1b10abSAndroid Build Coastguard Worker DECLARE_ALIGNED(16, tran_low_t, test_output_block[64]);
157*fb1b10abSAndroid Build Coastguard Worker int count_sign_block[64][2];
158*fb1b10abSAndroid Build Coastguard Worker const int count_test_block = 100000;
159*fb1b10abSAndroid Build Coastguard Worker
160*fb1b10abSAndroid Build Coastguard Worker memset(count_sign_block, 0, sizeof(count_sign_block));
161*fb1b10abSAndroid Build Coastguard Worker
162*fb1b10abSAndroid Build Coastguard Worker for (int i = 0; i < count_test_block; ++i) {
163*fb1b10abSAndroid Build Coastguard Worker // Initialize a test block with input range [-255, 255].
164*fb1b10abSAndroid Build Coastguard Worker for (int j = 0; j < 64; ++j) {
165*fb1b10abSAndroid Build Coastguard Worker test_input_block[j] = ((rnd.Rand16() >> (16 - bit_depth_)) & mask_) -
166*fb1b10abSAndroid Build Coastguard Worker ((rnd.Rand16() >> (16 - bit_depth_)) & mask_);
167*fb1b10abSAndroid Build Coastguard Worker }
168*fb1b10abSAndroid Build Coastguard Worker ASM_REGISTER_STATE_CHECK(
169*fb1b10abSAndroid Build Coastguard Worker RunFwdTxfm(test_input_block, test_output_block, pitch_));
170*fb1b10abSAndroid Build Coastguard Worker
171*fb1b10abSAndroid Build Coastguard Worker for (int j = 0; j < 64; ++j) {
172*fb1b10abSAndroid Build Coastguard Worker if (test_output_block[j] < 0) {
173*fb1b10abSAndroid Build Coastguard Worker ++count_sign_block[j][0];
174*fb1b10abSAndroid Build Coastguard Worker } else if (test_output_block[j] > 0) {
175*fb1b10abSAndroid Build Coastguard Worker ++count_sign_block[j][1];
176*fb1b10abSAndroid Build Coastguard Worker }
177*fb1b10abSAndroid Build Coastguard Worker }
178*fb1b10abSAndroid Build Coastguard Worker }
179*fb1b10abSAndroid Build Coastguard Worker
180*fb1b10abSAndroid Build Coastguard Worker for (int j = 0; j < 64; ++j) {
181*fb1b10abSAndroid Build Coastguard Worker const int diff = abs(count_sign_block[j][0] - count_sign_block[j][1]);
182*fb1b10abSAndroid Build Coastguard Worker const int max_diff = kSignBiasMaxDiff255;
183*fb1b10abSAndroid Build Coastguard Worker ASSERT_LT(diff, max_diff << (bit_depth_ - 8))
184*fb1b10abSAndroid Build Coastguard Worker << "Error: 8x8 FDCT/FHT has a sign bias > "
185*fb1b10abSAndroid Build Coastguard Worker << 1. * max_diff / count_test_block * 100 << "%"
186*fb1b10abSAndroid Build Coastguard Worker << " for input range [-255, 255] at index " << j
187*fb1b10abSAndroid Build Coastguard Worker << " count0: " << count_sign_block[j][0]
188*fb1b10abSAndroid Build Coastguard Worker << " count1: " << count_sign_block[j][1] << " diff: " << diff;
189*fb1b10abSAndroid Build Coastguard Worker }
190*fb1b10abSAndroid Build Coastguard Worker
191*fb1b10abSAndroid Build Coastguard Worker memset(count_sign_block, 0, sizeof(count_sign_block));
192*fb1b10abSAndroid Build Coastguard Worker
193*fb1b10abSAndroid Build Coastguard Worker for (int i = 0; i < count_test_block; ++i) {
194*fb1b10abSAndroid Build Coastguard Worker // Initialize a test block with input range [-mask_ / 16, mask_ / 16].
195*fb1b10abSAndroid Build Coastguard Worker for (int j = 0; j < 64; ++j) {
196*fb1b10abSAndroid Build Coastguard Worker test_input_block[j] =
197*fb1b10abSAndroid Build Coastguard Worker ((rnd.Rand16() & mask_) >> 4) - ((rnd.Rand16() & mask_) >> 4);
198*fb1b10abSAndroid Build Coastguard Worker }
199*fb1b10abSAndroid Build Coastguard Worker ASM_REGISTER_STATE_CHECK(
200*fb1b10abSAndroid Build Coastguard Worker RunFwdTxfm(test_input_block, test_output_block, pitch_));
201*fb1b10abSAndroid Build Coastguard Worker
202*fb1b10abSAndroid Build Coastguard Worker for (int j = 0; j < 64; ++j) {
203*fb1b10abSAndroid Build Coastguard Worker if (test_output_block[j] < 0) {
204*fb1b10abSAndroid Build Coastguard Worker ++count_sign_block[j][0];
205*fb1b10abSAndroid Build Coastguard Worker } else if (test_output_block[j] > 0) {
206*fb1b10abSAndroid Build Coastguard Worker ++count_sign_block[j][1];
207*fb1b10abSAndroid Build Coastguard Worker }
208*fb1b10abSAndroid Build Coastguard Worker }
209*fb1b10abSAndroid Build Coastguard Worker }
210*fb1b10abSAndroid Build Coastguard Worker
211*fb1b10abSAndroid Build Coastguard Worker for (int j = 0; j < 64; ++j) {
212*fb1b10abSAndroid Build Coastguard Worker const int diff = abs(count_sign_block[j][0] - count_sign_block[j][1]);
213*fb1b10abSAndroid Build Coastguard Worker const int max_diff = kSignBiasMaxDiff15;
214*fb1b10abSAndroid Build Coastguard Worker ASSERT_LT(diff, max_diff << (bit_depth_ - 8))
215*fb1b10abSAndroid Build Coastguard Worker << "Error: 8x8 FDCT/FHT has a sign bias > "
216*fb1b10abSAndroid Build Coastguard Worker << 1. * max_diff / count_test_block * 100 << "%"
217*fb1b10abSAndroid Build Coastguard Worker << " for input range [-15, 15] at index " << j
218*fb1b10abSAndroid Build Coastguard Worker << " count0: " << count_sign_block[j][0]
219*fb1b10abSAndroid Build Coastguard Worker << " count1: " << count_sign_block[j][1] << " diff: " << diff;
220*fb1b10abSAndroid Build Coastguard Worker }
221*fb1b10abSAndroid Build Coastguard Worker }
222*fb1b10abSAndroid Build Coastguard Worker
RunRoundTripErrorCheck()223*fb1b10abSAndroid Build Coastguard Worker void RunRoundTripErrorCheck() {
224*fb1b10abSAndroid Build Coastguard Worker ACMRandom rnd(ACMRandom::DeterministicSeed());
225*fb1b10abSAndroid Build Coastguard Worker int max_error = 0;
226*fb1b10abSAndroid Build Coastguard Worker int total_error = 0;
227*fb1b10abSAndroid Build Coastguard Worker const int count_test_block = 100000;
228*fb1b10abSAndroid Build Coastguard Worker DECLARE_ALIGNED(16, int16_t, test_input_block[64]);
229*fb1b10abSAndroid Build Coastguard Worker DECLARE_ALIGNED(16, tran_low_t, test_temp_block[64]);
230*fb1b10abSAndroid Build Coastguard Worker DECLARE_ALIGNED(16, uint8_t, dst[64]);
231*fb1b10abSAndroid Build Coastguard Worker DECLARE_ALIGNED(16, uint8_t, src[64]);
232*fb1b10abSAndroid Build Coastguard Worker #if CONFIG_VP9_HIGHBITDEPTH
233*fb1b10abSAndroid Build Coastguard Worker DECLARE_ALIGNED(16, uint16_t, dst16[64]);
234*fb1b10abSAndroid Build Coastguard Worker DECLARE_ALIGNED(16, uint16_t, src16[64]);
235*fb1b10abSAndroid Build Coastguard Worker #endif
236*fb1b10abSAndroid Build Coastguard Worker
237*fb1b10abSAndroid Build Coastguard Worker for (int i = 0; i < count_test_block; ++i) {
238*fb1b10abSAndroid Build Coastguard Worker // Initialize a test block with input range [-mask_, mask_].
239*fb1b10abSAndroid Build Coastguard Worker for (int j = 0; j < 64; ++j) {
240*fb1b10abSAndroid Build Coastguard Worker if (bit_depth_ == VPX_BITS_8) {
241*fb1b10abSAndroid Build Coastguard Worker src[j] = rnd.Rand8();
242*fb1b10abSAndroid Build Coastguard Worker dst[j] = rnd.Rand8();
243*fb1b10abSAndroid Build Coastguard Worker test_input_block[j] = src[j] - dst[j];
244*fb1b10abSAndroid Build Coastguard Worker #if CONFIG_VP9_HIGHBITDEPTH
245*fb1b10abSAndroid Build Coastguard Worker } else {
246*fb1b10abSAndroid Build Coastguard Worker src16[j] = rnd.Rand16() & mask_;
247*fb1b10abSAndroid Build Coastguard Worker dst16[j] = rnd.Rand16() & mask_;
248*fb1b10abSAndroid Build Coastguard Worker test_input_block[j] = src16[j] - dst16[j];
249*fb1b10abSAndroid Build Coastguard Worker #endif
250*fb1b10abSAndroid Build Coastguard Worker }
251*fb1b10abSAndroid Build Coastguard Worker }
252*fb1b10abSAndroid Build Coastguard Worker
253*fb1b10abSAndroid Build Coastguard Worker ASM_REGISTER_STATE_CHECK(
254*fb1b10abSAndroid Build Coastguard Worker RunFwdTxfm(test_input_block, test_temp_block, pitch_));
255*fb1b10abSAndroid Build Coastguard Worker for (int j = 0; j < 64; ++j) {
256*fb1b10abSAndroid Build Coastguard Worker if (test_temp_block[j] > 0) {
257*fb1b10abSAndroid Build Coastguard Worker test_temp_block[j] += 2;
258*fb1b10abSAndroid Build Coastguard Worker test_temp_block[j] /= 4;
259*fb1b10abSAndroid Build Coastguard Worker test_temp_block[j] *= 4;
260*fb1b10abSAndroid Build Coastguard Worker } else {
261*fb1b10abSAndroid Build Coastguard Worker test_temp_block[j] -= 2;
262*fb1b10abSAndroid Build Coastguard Worker test_temp_block[j] /= 4;
263*fb1b10abSAndroid Build Coastguard Worker test_temp_block[j] *= 4;
264*fb1b10abSAndroid Build Coastguard Worker }
265*fb1b10abSAndroid Build Coastguard Worker }
266*fb1b10abSAndroid Build Coastguard Worker if (bit_depth_ == VPX_BITS_8) {
267*fb1b10abSAndroid Build Coastguard Worker ASM_REGISTER_STATE_CHECK(RunInvTxfm(test_temp_block, dst, pitch_));
268*fb1b10abSAndroid Build Coastguard Worker #if CONFIG_VP9_HIGHBITDEPTH
269*fb1b10abSAndroid Build Coastguard Worker } else {
270*fb1b10abSAndroid Build Coastguard Worker ASM_REGISTER_STATE_CHECK(
271*fb1b10abSAndroid Build Coastguard Worker RunInvTxfm(test_temp_block, CAST_TO_BYTEPTR(dst16), pitch_));
272*fb1b10abSAndroid Build Coastguard Worker #endif
273*fb1b10abSAndroid Build Coastguard Worker }
274*fb1b10abSAndroid Build Coastguard Worker
275*fb1b10abSAndroid Build Coastguard Worker for (int j = 0; j < 64; ++j) {
276*fb1b10abSAndroid Build Coastguard Worker #if CONFIG_VP9_HIGHBITDEPTH
277*fb1b10abSAndroid Build Coastguard Worker const int diff =
278*fb1b10abSAndroid Build Coastguard Worker bit_depth_ == VPX_BITS_8 ? dst[j] - src[j] : dst16[j] - src16[j];
279*fb1b10abSAndroid Build Coastguard Worker #else
280*fb1b10abSAndroid Build Coastguard Worker const int diff = dst[j] - src[j];
281*fb1b10abSAndroid Build Coastguard Worker #endif
282*fb1b10abSAndroid Build Coastguard Worker const int error = diff * diff;
283*fb1b10abSAndroid Build Coastguard Worker if (max_error < error) max_error = error;
284*fb1b10abSAndroid Build Coastguard Worker total_error += error;
285*fb1b10abSAndroid Build Coastguard Worker }
286*fb1b10abSAndroid Build Coastguard Worker }
287*fb1b10abSAndroid Build Coastguard Worker
288*fb1b10abSAndroid Build Coastguard Worker ASSERT_GE(1 << 2 * (bit_depth_ - 8), max_error)
289*fb1b10abSAndroid Build Coastguard Worker << "Error: 8x8 FDCT/IDCT or FHT/IHT has an individual"
290*fb1b10abSAndroid Build Coastguard Worker << " roundtrip error > 1";
291*fb1b10abSAndroid Build Coastguard Worker
292*fb1b10abSAndroid Build Coastguard Worker ASSERT_GE((count_test_block << 2 * (bit_depth_ - 8)) / 5, total_error)
293*fb1b10abSAndroid Build Coastguard Worker << "Error: 8x8 FDCT/IDCT or FHT/IHT has average roundtrip "
294*fb1b10abSAndroid Build Coastguard Worker << "error > 1/5 per block";
295*fb1b10abSAndroid Build Coastguard Worker }
296*fb1b10abSAndroid Build Coastguard Worker
RunExtremalCheck()297*fb1b10abSAndroid Build Coastguard Worker void RunExtremalCheck() {
298*fb1b10abSAndroid Build Coastguard Worker ACMRandom rnd(ACMRandom::DeterministicSeed());
299*fb1b10abSAndroid Build Coastguard Worker int max_error = 0;
300*fb1b10abSAndroid Build Coastguard Worker int total_error = 0;
301*fb1b10abSAndroid Build Coastguard Worker int total_coeff_error = 0;
302*fb1b10abSAndroid Build Coastguard Worker const int count_test_block = 100000;
303*fb1b10abSAndroid Build Coastguard Worker DECLARE_ALIGNED(16, int16_t, test_input_block[64]);
304*fb1b10abSAndroid Build Coastguard Worker DECLARE_ALIGNED(16, tran_low_t, test_temp_block[64]);
305*fb1b10abSAndroid Build Coastguard Worker DECLARE_ALIGNED(16, tran_low_t, ref_temp_block[64]);
306*fb1b10abSAndroid Build Coastguard Worker DECLARE_ALIGNED(16, uint8_t, dst[64]);
307*fb1b10abSAndroid Build Coastguard Worker DECLARE_ALIGNED(16, uint8_t, src[64]);
308*fb1b10abSAndroid Build Coastguard Worker #if CONFIG_VP9_HIGHBITDEPTH
309*fb1b10abSAndroid Build Coastguard Worker DECLARE_ALIGNED(16, uint16_t, dst16[64]);
310*fb1b10abSAndroid Build Coastguard Worker DECLARE_ALIGNED(16, uint16_t, src16[64]);
311*fb1b10abSAndroid Build Coastguard Worker #endif
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 input range [-mask_, mask_].
315*fb1b10abSAndroid Build Coastguard Worker for (int j = 0; j < 64; ++j) {
316*fb1b10abSAndroid Build Coastguard Worker if (bit_depth_ == VPX_BITS_8) {
317*fb1b10abSAndroid Build Coastguard Worker if (i == 0) {
318*fb1b10abSAndroid Build Coastguard Worker src[j] = 255;
319*fb1b10abSAndroid Build Coastguard Worker dst[j] = 0;
320*fb1b10abSAndroid Build Coastguard Worker } else if (i == 1) {
321*fb1b10abSAndroid Build Coastguard Worker src[j] = 0;
322*fb1b10abSAndroid Build Coastguard Worker dst[j] = 255;
323*fb1b10abSAndroid Build Coastguard Worker } else {
324*fb1b10abSAndroid Build Coastguard Worker src[j] = rnd.Rand8() % 2 ? 255 : 0;
325*fb1b10abSAndroid Build Coastguard Worker dst[j] = rnd.Rand8() % 2 ? 255 : 0;
326*fb1b10abSAndroid Build Coastguard Worker }
327*fb1b10abSAndroid Build Coastguard Worker test_input_block[j] = src[j] - dst[j];
328*fb1b10abSAndroid Build Coastguard Worker #if CONFIG_VP9_HIGHBITDEPTH
329*fb1b10abSAndroid Build Coastguard Worker } else {
330*fb1b10abSAndroid Build Coastguard Worker if (i == 0) {
331*fb1b10abSAndroid Build Coastguard Worker src16[j] = mask_;
332*fb1b10abSAndroid Build Coastguard Worker dst16[j] = 0;
333*fb1b10abSAndroid Build Coastguard Worker } else if (i == 1) {
334*fb1b10abSAndroid Build Coastguard Worker src16[j] = 0;
335*fb1b10abSAndroid Build Coastguard Worker dst16[j] = mask_;
336*fb1b10abSAndroid Build Coastguard Worker } else {
337*fb1b10abSAndroid Build Coastguard Worker src16[j] = rnd.Rand8() % 2 ? mask_ : 0;
338*fb1b10abSAndroid Build Coastguard Worker dst16[j] = rnd.Rand8() % 2 ? mask_ : 0;
339*fb1b10abSAndroid Build Coastguard Worker }
340*fb1b10abSAndroid Build Coastguard Worker test_input_block[j] = src16[j] - dst16[j];
341*fb1b10abSAndroid Build Coastguard Worker #endif
342*fb1b10abSAndroid Build Coastguard Worker }
343*fb1b10abSAndroid Build Coastguard Worker }
344*fb1b10abSAndroid Build Coastguard Worker
345*fb1b10abSAndroid Build Coastguard Worker ASM_REGISTER_STATE_CHECK(
346*fb1b10abSAndroid Build Coastguard Worker RunFwdTxfm(test_input_block, test_temp_block, pitch_));
347*fb1b10abSAndroid Build Coastguard Worker ASM_REGISTER_STATE_CHECK(
348*fb1b10abSAndroid Build Coastguard Worker fwd_txfm_ref(test_input_block, ref_temp_block, pitch_, tx_type_));
349*fb1b10abSAndroid Build Coastguard Worker if (bit_depth_ == VPX_BITS_8) {
350*fb1b10abSAndroid Build Coastguard Worker ASM_REGISTER_STATE_CHECK(RunInvTxfm(test_temp_block, dst, pitch_));
351*fb1b10abSAndroid Build Coastguard Worker #if CONFIG_VP9_HIGHBITDEPTH
352*fb1b10abSAndroid Build Coastguard Worker } else {
353*fb1b10abSAndroid Build Coastguard Worker ASM_REGISTER_STATE_CHECK(
354*fb1b10abSAndroid Build Coastguard Worker RunInvTxfm(test_temp_block, CAST_TO_BYTEPTR(dst16), pitch_));
355*fb1b10abSAndroid Build Coastguard Worker #endif
356*fb1b10abSAndroid Build Coastguard Worker }
357*fb1b10abSAndroid Build Coastguard Worker
358*fb1b10abSAndroid Build Coastguard Worker for (int j = 0; j < 64; ++j) {
359*fb1b10abSAndroid Build Coastguard Worker #if CONFIG_VP9_HIGHBITDEPTH
360*fb1b10abSAndroid Build Coastguard Worker const int diff =
361*fb1b10abSAndroid Build Coastguard Worker bit_depth_ == VPX_BITS_8 ? dst[j] - src[j] : dst16[j] - src16[j];
362*fb1b10abSAndroid Build Coastguard Worker #else
363*fb1b10abSAndroid Build Coastguard Worker const int diff = dst[j] - src[j];
364*fb1b10abSAndroid Build Coastguard Worker #endif
365*fb1b10abSAndroid Build Coastguard Worker const int error = diff * diff;
366*fb1b10abSAndroid Build Coastguard Worker if (max_error < error) max_error = error;
367*fb1b10abSAndroid Build Coastguard Worker total_error += error;
368*fb1b10abSAndroid Build Coastguard Worker
369*fb1b10abSAndroid Build Coastguard Worker const int coeff_diff = test_temp_block[j] - ref_temp_block[j];
370*fb1b10abSAndroid Build Coastguard Worker total_coeff_error += abs(coeff_diff);
371*fb1b10abSAndroid Build Coastguard Worker }
372*fb1b10abSAndroid Build Coastguard Worker
373*fb1b10abSAndroid Build Coastguard Worker ASSERT_GE(1 << 2 * (bit_depth_ - 8), max_error)
374*fb1b10abSAndroid Build Coastguard Worker << "Error: Extremal 8x8 FDCT/IDCT or FHT/IHT has"
375*fb1b10abSAndroid Build Coastguard Worker << " an individual roundtrip error > 1";
376*fb1b10abSAndroid Build Coastguard Worker
377*fb1b10abSAndroid Build Coastguard Worker ASSERT_GE((count_test_block << 2 * (bit_depth_ - 8)) / 5, total_error)
378*fb1b10abSAndroid Build Coastguard Worker << "Error: Extremal 8x8 FDCT/IDCT or FHT/IHT has average"
379*fb1b10abSAndroid Build Coastguard Worker << " roundtrip error > 1/5 per block";
380*fb1b10abSAndroid Build Coastguard Worker
381*fb1b10abSAndroid Build Coastguard Worker ASSERT_EQ(0, total_coeff_error)
382*fb1b10abSAndroid Build Coastguard Worker << "Error: Extremal 8x8 FDCT/FHT has"
383*fb1b10abSAndroid Build Coastguard Worker << " overflow issues in the intermediate steps > 1";
384*fb1b10abSAndroid Build Coastguard Worker }
385*fb1b10abSAndroid Build Coastguard Worker }
386*fb1b10abSAndroid Build Coastguard Worker
RunInvAccuracyCheck()387*fb1b10abSAndroid Build Coastguard Worker void RunInvAccuracyCheck() {
388*fb1b10abSAndroid Build Coastguard Worker ACMRandom rnd(ACMRandom::DeterministicSeed());
389*fb1b10abSAndroid Build Coastguard Worker const int count_test_block = 1000;
390*fb1b10abSAndroid Build Coastguard Worker DECLARE_ALIGNED(16, int16_t, in[kNumCoeffs]);
391*fb1b10abSAndroid Build Coastguard Worker DECLARE_ALIGNED(16, tran_low_t, coeff[kNumCoeffs]);
392*fb1b10abSAndroid Build Coastguard Worker DECLARE_ALIGNED(16, uint8_t, dst[kNumCoeffs]);
393*fb1b10abSAndroid Build Coastguard Worker DECLARE_ALIGNED(16, uint8_t, src[kNumCoeffs]);
394*fb1b10abSAndroid Build Coastguard Worker #if CONFIG_VP9_HIGHBITDEPTH
395*fb1b10abSAndroid Build Coastguard Worker DECLARE_ALIGNED(16, uint16_t, src16[kNumCoeffs]);
396*fb1b10abSAndroid Build Coastguard Worker DECLARE_ALIGNED(16, uint16_t, dst16[kNumCoeffs]);
397*fb1b10abSAndroid Build Coastguard Worker #endif
398*fb1b10abSAndroid Build Coastguard Worker
399*fb1b10abSAndroid Build Coastguard Worker for (int i = 0; i < count_test_block; ++i) {
400*fb1b10abSAndroid Build Coastguard Worker double out_r[kNumCoeffs];
401*fb1b10abSAndroid Build Coastguard Worker
402*fb1b10abSAndroid Build Coastguard Worker // Initialize a test block with input range [-255, 255].
403*fb1b10abSAndroid Build Coastguard Worker for (int j = 0; j < kNumCoeffs; ++j) {
404*fb1b10abSAndroid Build Coastguard Worker if (bit_depth_ == VPX_BITS_8) {
405*fb1b10abSAndroid Build Coastguard Worker src[j] = rnd.Rand8() % 2 ? 255 : 0;
406*fb1b10abSAndroid Build Coastguard Worker dst[j] = src[j] > 0 ? 0 : 255;
407*fb1b10abSAndroid Build Coastguard Worker in[j] = src[j] - dst[j];
408*fb1b10abSAndroid Build Coastguard Worker #if CONFIG_VP9_HIGHBITDEPTH
409*fb1b10abSAndroid Build Coastguard Worker } else {
410*fb1b10abSAndroid Build Coastguard Worker src16[j] = rnd.Rand8() % 2 ? mask_ : 0;
411*fb1b10abSAndroid Build Coastguard Worker dst16[j] = src16[j] > 0 ? 0 : mask_;
412*fb1b10abSAndroid Build Coastguard Worker in[j] = src16[j] - dst16[j];
413*fb1b10abSAndroid Build Coastguard Worker #endif
414*fb1b10abSAndroid Build Coastguard Worker }
415*fb1b10abSAndroid Build Coastguard Worker }
416*fb1b10abSAndroid Build Coastguard Worker
417*fb1b10abSAndroid Build Coastguard Worker reference_8x8_dct_2d(in, out_r);
418*fb1b10abSAndroid Build Coastguard Worker for (int j = 0; j < kNumCoeffs; ++j) {
419*fb1b10abSAndroid Build Coastguard Worker coeff[j] = static_cast<tran_low_t>(round(out_r[j]));
420*fb1b10abSAndroid Build Coastguard Worker }
421*fb1b10abSAndroid Build Coastguard Worker
422*fb1b10abSAndroid Build Coastguard Worker if (bit_depth_ == VPX_BITS_8) {
423*fb1b10abSAndroid Build Coastguard Worker ASM_REGISTER_STATE_CHECK(RunInvTxfm(coeff, dst, pitch_));
424*fb1b10abSAndroid Build Coastguard Worker #if CONFIG_VP9_HIGHBITDEPTH
425*fb1b10abSAndroid Build Coastguard Worker } else {
426*fb1b10abSAndroid Build Coastguard Worker ASM_REGISTER_STATE_CHECK(
427*fb1b10abSAndroid Build Coastguard Worker RunInvTxfm(coeff, CAST_TO_BYTEPTR(dst16), pitch_));
428*fb1b10abSAndroid Build Coastguard Worker #endif
429*fb1b10abSAndroid Build Coastguard Worker }
430*fb1b10abSAndroid Build Coastguard Worker
431*fb1b10abSAndroid Build Coastguard Worker for (int j = 0; j < kNumCoeffs; ++j) {
432*fb1b10abSAndroid Build Coastguard Worker #if CONFIG_VP9_HIGHBITDEPTH
433*fb1b10abSAndroid Build Coastguard Worker const int diff =
434*fb1b10abSAndroid Build Coastguard Worker bit_depth_ == VPX_BITS_8 ? dst[j] - src[j] : dst16[j] - src16[j];
435*fb1b10abSAndroid Build Coastguard Worker #else
436*fb1b10abSAndroid Build Coastguard Worker const int diff = dst[j] - src[j];
437*fb1b10abSAndroid Build Coastguard Worker #endif
438*fb1b10abSAndroid Build Coastguard Worker const uint32_t error = diff * diff;
439*fb1b10abSAndroid Build Coastguard Worker ASSERT_GE(1u << 2 * (bit_depth_ - 8), error)
440*fb1b10abSAndroid Build Coastguard Worker << "Error: 8x8 IDCT has error " << error << " at index " << j;
441*fb1b10abSAndroid Build Coastguard Worker }
442*fb1b10abSAndroid Build Coastguard Worker }
443*fb1b10abSAndroid Build Coastguard Worker }
444*fb1b10abSAndroid Build Coastguard Worker
RunFwdAccuracyCheck()445*fb1b10abSAndroid Build Coastguard Worker void RunFwdAccuracyCheck() {
446*fb1b10abSAndroid Build Coastguard Worker ACMRandom rnd(ACMRandom::DeterministicSeed());
447*fb1b10abSAndroid Build Coastguard Worker const int count_test_block = 1000;
448*fb1b10abSAndroid Build Coastguard Worker DECLARE_ALIGNED(16, int16_t, in[kNumCoeffs]);
449*fb1b10abSAndroid Build Coastguard Worker DECLARE_ALIGNED(16, tran_low_t, coeff_r[kNumCoeffs]);
450*fb1b10abSAndroid Build Coastguard Worker DECLARE_ALIGNED(16, tran_low_t, coeff[kNumCoeffs]);
451*fb1b10abSAndroid Build Coastguard Worker
452*fb1b10abSAndroid Build Coastguard Worker for (int i = 0; i < count_test_block; ++i) {
453*fb1b10abSAndroid Build Coastguard Worker double out_r[kNumCoeffs];
454*fb1b10abSAndroid Build Coastguard Worker
455*fb1b10abSAndroid Build Coastguard Worker // Initialize a test block with input range [-mask_, mask_].
456*fb1b10abSAndroid Build Coastguard Worker for (int j = 0; j < kNumCoeffs; ++j) {
457*fb1b10abSAndroid Build Coastguard Worker in[j] = rnd.Rand8() % 2 == 0 ? mask_ : -mask_;
458*fb1b10abSAndroid Build Coastguard Worker }
459*fb1b10abSAndroid Build Coastguard Worker
460*fb1b10abSAndroid Build Coastguard Worker RunFwdTxfm(in, coeff, pitch_);
461*fb1b10abSAndroid Build Coastguard Worker reference_8x8_dct_2d(in, out_r);
462*fb1b10abSAndroid Build Coastguard Worker for (int j = 0; j < kNumCoeffs; ++j) {
463*fb1b10abSAndroid Build Coastguard Worker coeff_r[j] = static_cast<tran_low_t>(round(out_r[j]));
464*fb1b10abSAndroid Build Coastguard Worker }
465*fb1b10abSAndroid Build Coastguard Worker
466*fb1b10abSAndroid Build Coastguard Worker for (int j = 0; j < kNumCoeffs; ++j) {
467*fb1b10abSAndroid Build Coastguard Worker const int32_t diff = coeff[j] - coeff_r[j];
468*fb1b10abSAndroid Build Coastguard Worker const uint32_t error = diff * diff;
469*fb1b10abSAndroid Build Coastguard Worker ASSERT_GE(9u << 2 * (bit_depth_ - 8), error)
470*fb1b10abSAndroid Build Coastguard Worker << "Error: 8x8 DCT has error " << error << " at index " << j;
471*fb1b10abSAndroid Build Coastguard Worker }
472*fb1b10abSAndroid Build Coastguard Worker }
473*fb1b10abSAndroid Build Coastguard Worker }
474*fb1b10abSAndroid Build Coastguard Worker
CompareInvReference(IdctFunc ref_txfm,int thresh)475*fb1b10abSAndroid Build Coastguard Worker void CompareInvReference(IdctFunc ref_txfm, int thresh) {
476*fb1b10abSAndroid Build Coastguard Worker ACMRandom rnd(ACMRandom::DeterministicSeed());
477*fb1b10abSAndroid Build Coastguard Worker const int count_test_block = 10000;
478*fb1b10abSAndroid Build Coastguard Worker const int eob = 12;
479*fb1b10abSAndroid Build Coastguard Worker DECLARE_ALIGNED(16, tran_low_t, coeff[kNumCoeffs]);
480*fb1b10abSAndroid Build Coastguard Worker DECLARE_ALIGNED(16, uint8_t, dst[kNumCoeffs]);
481*fb1b10abSAndroid Build Coastguard Worker DECLARE_ALIGNED(16, uint8_t, ref[kNumCoeffs]);
482*fb1b10abSAndroid Build Coastguard Worker #if CONFIG_VP9_HIGHBITDEPTH
483*fb1b10abSAndroid Build Coastguard Worker DECLARE_ALIGNED(16, uint16_t, dst16[kNumCoeffs]);
484*fb1b10abSAndroid Build Coastguard Worker DECLARE_ALIGNED(16, uint16_t, ref16[kNumCoeffs]);
485*fb1b10abSAndroid Build Coastguard Worker #endif
486*fb1b10abSAndroid Build Coastguard Worker const int16_t *scan = vp9_default_scan_orders[TX_8X8].scan;
487*fb1b10abSAndroid Build Coastguard Worker
488*fb1b10abSAndroid Build Coastguard Worker for (int i = 0; i < count_test_block; ++i) {
489*fb1b10abSAndroid Build Coastguard Worker for (int j = 0; j < kNumCoeffs; ++j) {
490*fb1b10abSAndroid Build Coastguard Worker if (j < eob) {
491*fb1b10abSAndroid Build Coastguard Worker // Random values less than the threshold, either positive or negative
492*fb1b10abSAndroid Build Coastguard Worker coeff[scan[j]] = rnd(thresh) * (1 - 2 * (i % 2));
493*fb1b10abSAndroid Build Coastguard Worker } else {
494*fb1b10abSAndroid Build Coastguard Worker coeff[scan[j]] = 0;
495*fb1b10abSAndroid Build Coastguard Worker }
496*fb1b10abSAndroid Build Coastguard Worker if (bit_depth_ == VPX_BITS_8) {
497*fb1b10abSAndroid Build Coastguard Worker dst[j] = 0;
498*fb1b10abSAndroid Build Coastguard Worker ref[j] = 0;
499*fb1b10abSAndroid Build Coastguard Worker #if CONFIG_VP9_HIGHBITDEPTH
500*fb1b10abSAndroid Build Coastguard Worker } else {
501*fb1b10abSAndroid Build Coastguard Worker dst16[j] = 0;
502*fb1b10abSAndroid Build Coastguard Worker ref16[j] = 0;
503*fb1b10abSAndroid Build Coastguard Worker #endif
504*fb1b10abSAndroid Build Coastguard Worker }
505*fb1b10abSAndroid Build Coastguard Worker }
506*fb1b10abSAndroid Build Coastguard Worker if (bit_depth_ == VPX_BITS_8) {
507*fb1b10abSAndroid Build Coastguard Worker ref_txfm(coeff, ref, pitch_);
508*fb1b10abSAndroid Build Coastguard Worker ASM_REGISTER_STATE_CHECK(RunInvTxfm(coeff, dst, pitch_));
509*fb1b10abSAndroid Build Coastguard Worker #if CONFIG_VP9_HIGHBITDEPTH
510*fb1b10abSAndroid Build Coastguard Worker } else {
511*fb1b10abSAndroid Build Coastguard Worker ref_txfm(coeff, CAST_TO_BYTEPTR(ref16), pitch_);
512*fb1b10abSAndroid Build Coastguard Worker ASM_REGISTER_STATE_CHECK(
513*fb1b10abSAndroid Build Coastguard Worker RunInvTxfm(coeff, CAST_TO_BYTEPTR(dst16), pitch_));
514*fb1b10abSAndroid Build Coastguard Worker #endif
515*fb1b10abSAndroid Build Coastguard Worker }
516*fb1b10abSAndroid Build Coastguard Worker
517*fb1b10abSAndroid Build Coastguard Worker for (int j = 0; j < kNumCoeffs; ++j) {
518*fb1b10abSAndroid Build Coastguard Worker #if CONFIG_VP9_HIGHBITDEPTH
519*fb1b10abSAndroid Build Coastguard Worker const int diff =
520*fb1b10abSAndroid Build Coastguard Worker bit_depth_ == VPX_BITS_8 ? dst[j] - ref[j] : dst16[j] - ref16[j];
521*fb1b10abSAndroid Build Coastguard Worker #else
522*fb1b10abSAndroid Build Coastguard Worker const int diff = dst[j] - ref[j];
523*fb1b10abSAndroid Build Coastguard Worker #endif
524*fb1b10abSAndroid Build Coastguard Worker const uint32_t error = diff * diff;
525*fb1b10abSAndroid Build Coastguard Worker ASSERT_EQ(0u, error)
526*fb1b10abSAndroid Build Coastguard Worker << "Error: 8x8 IDCT has error " << error << " at index " << j;
527*fb1b10abSAndroid Build Coastguard Worker }
528*fb1b10abSAndroid Build Coastguard Worker }
529*fb1b10abSAndroid Build Coastguard Worker }
530*fb1b10abSAndroid Build Coastguard Worker int pitch_;
531*fb1b10abSAndroid Build Coastguard Worker int tx_type_;
532*fb1b10abSAndroid Build Coastguard Worker FhtFunc fwd_txfm_ref;
533*fb1b10abSAndroid Build Coastguard Worker vpx_bit_depth_t bit_depth_;
534*fb1b10abSAndroid Build Coastguard Worker int mask_;
535*fb1b10abSAndroid Build Coastguard Worker };
536*fb1b10abSAndroid Build Coastguard Worker #if defined(_MSC_VER) && defined(_M_ARM64) && !defined(__clang__)
537*fb1b10abSAndroid Build Coastguard Worker #pragma optimize("", on)
538*fb1b10abSAndroid Build Coastguard Worker #endif
539*fb1b10abSAndroid Build Coastguard Worker
540*fb1b10abSAndroid Build Coastguard Worker class FwdTrans8x8DCT : public FwdTrans8x8TestBase,
541*fb1b10abSAndroid Build Coastguard Worker public ::testing::TestWithParam<Dct8x8Param> {
542*fb1b10abSAndroid Build Coastguard Worker public:
543*fb1b10abSAndroid Build Coastguard Worker ~FwdTrans8x8DCT() override = default;
544*fb1b10abSAndroid Build Coastguard Worker
SetUp()545*fb1b10abSAndroid Build Coastguard Worker void SetUp() override {
546*fb1b10abSAndroid Build Coastguard Worker fwd_txfm_ = GET_PARAM(0);
547*fb1b10abSAndroid Build Coastguard Worker inv_txfm_ = GET_PARAM(1);
548*fb1b10abSAndroid Build Coastguard Worker tx_type_ = GET_PARAM(2);
549*fb1b10abSAndroid Build Coastguard Worker pitch_ = 8;
550*fb1b10abSAndroid Build Coastguard Worker fwd_txfm_ref = fdct8x8_ref;
551*fb1b10abSAndroid Build Coastguard Worker bit_depth_ = GET_PARAM(3);
552*fb1b10abSAndroid Build Coastguard Worker mask_ = (1 << bit_depth_) - 1;
553*fb1b10abSAndroid Build Coastguard Worker }
554*fb1b10abSAndroid Build Coastguard Worker
TearDown()555*fb1b10abSAndroid Build Coastguard Worker void TearDown() override { libvpx_test::ClearSystemState(); }
556*fb1b10abSAndroid Build Coastguard Worker
557*fb1b10abSAndroid Build Coastguard Worker protected:
RunFwdTxfm(int16_t * in,tran_low_t * out,int stride)558*fb1b10abSAndroid Build Coastguard Worker void RunFwdTxfm(int16_t *in, tran_low_t *out, int stride) override {
559*fb1b10abSAndroid Build Coastguard Worker fwd_txfm_(in, out, stride);
560*fb1b10abSAndroid Build Coastguard Worker }
RunInvTxfm(tran_low_t * out,uint8_t * dst,int stride)561*fb1b10abSAndroid Build Coastguard Worker void RunInvTxfm(tran_low_t *out, uint8_t *dst, int stride) override {
562*fb1b10abSAndroid Build Coastguard Worker inv_txfm_(out, dst, stride);
563*fb1b10abSAndroid Build Coastguard Worker }
564*fb1b10abSAndroid Build Coastguard Worker
565*fb1b10abSAndroid Build Coastguard Worker FdctFunc fwd_txfm_;
566*fb1b10abSAndroid Build Coastguard Worker IdctFunc inv_txfm_;
567*fb1b10abSAndroid Build Coastguard Worker };
568*fb1b10abSAndroid Build Coastguard Worker
TEST_P(FwdTrans8x8DCT,SignBiasCheck)569*fb1b10abSAndroid Build Coastguard Worker TEST_P(FwdTrans8x8DCT, SignBiasCheck) { RunSignBiasCheck(); }
570*fb1b10abSAndroid Build Coastguard Worker
TEST_P(FwdTrans8x8DCT,RoundTripErrorCheck)571*fb1b10abSAndroid Build Coastguard Worker TEST_P(FwdTrans8x8DCT, RoundTripErrorCheck) { RunRoundTripErrorCheck(); }
572*fb1b10abSAndroid Build Coastguard Worker
TEST_P(FwdTrans8x8DCT,ExtremalCheck)573*fb1b10abSAndroid Build Coastguard Worker TEST_P(FwdTrans8x8DCT, ExtremalCheck) { RunExtremalCheck(); }
574*fb1b10abSAndroid Build Coastguard Worker
TEST_P(FwdTrans8x8DCT,FwdAccuracyCheck)575*fb1b10abSAndroid Build Coastguard Worker TEST_P(FwdTrans8x8DCT, FwdAccuracyCheck) { RunFwdAccuracyCheck(); }
576*fb1b10abSAndroid Build Coastguard Worker
TEST_P(FwdTrans8x8DCT,InvAccuracyCheck)577*fb1b10abSAndroid Build Coastguard Worker TEST_P(FwdTrans8x8DCT, InvAccuracyCheck) { RunInvAccuracyCheck(); }
578*fb1b10abSAndroid Build Coastguard Worker
579*fb1b10abSAndroid Build Coastguard Worker class FwdTrans8x8HT : public FwdTrans8x8TestBase,
580*fb1b10abSAndroid Build Coastguard Worker public ::testing::TestWithParam<Ht8x8Param> {
581*fb1b10abSAndroid Build Coastguard Worker public:
582*fb1b10abSAndroid Build Coastguard Worker ~FwdTrans8x8HT() override = default;
583*fb1b10abSAndroid Build Coastguard Worker
SetUp()584*fb1b10abSAndroid Build Coastguard Worker void SetUp() override {
585*fb1b10abSAndroid Build Coastguard Worker fwd_txfm_ = GET_PARAM(0);
586*fb1b10abSAndroid Build Coastguard Worker inv_txfm_ = GET_PARAM(1);
587*fb1b10abSAndroid Build Coastguard Worker tx_type_ = GET_PARAM(2);
588*fb1b10abSAndroid Build Coastguard Worker pitch_ = 8;
589*fb1b10abSAndroid Build Coastguard Worker fwd_txfm_ref = fht8x8_ref;
590*fb1b10abSAndroid Build Coastguard Worker bit_depth_ = GET_PARAM(3);
591*fb1b10abSAndroid Build Coastguard Worker mask_ = (1 << bit_depth_) - 1;
592*fb1b10abSAndroid Build Coastguard Worker }
593*fb1b10abSAndroid Build Coastguard Worker
TearDown()594*fb1b10abSAndroid Build Coastguard Worker void TearDown() override { libvpx_test::ClearSystemState(); }
595*fb1b10abSAndroid Build Coastguard Worker
596*fb1b10abSAndroid Build Coastguard Worker protected:
RunFwdTxfm(int16_t * in,tran_low_t * out,int stride)597*fb1b10abSAndroid Build Coastguard Worker void RunFwdTxfm(int16_t *in, tran_low_t *out, int stride) override {
598*fb1b10abSAndroid Build Coastguard Worker fwd_txfm_(in, out, stride, tx_type_);
599*fb1b10abSAndroid Build Coastguard Worker }
RunInvTxfm(tran_low_t * out,uint8_t * dst,int stride)600*fb1b10abSAndroid Build Coastguard Worker void RunInvTxfm(tran_low_t *out, uint8_t *dst, int stride) override {
601*fb1b10abSAndroid Build Coastguard Worker inv_txfm_(out, dst, stride, tx_type_);
602*fb1b10abSAndroid Build Coastguard Worker }
603*fb1b10abSAndroid Build Coastguard Worker
604*fb1b10abSAndroid Build Coastguard Worker FhtFunc fwd_txfm_;
605*fb1b10abSAndroid Build Coastguard Worker IhtFunc inv_txfm_;
606*fb1b10abSAndroid Build Coastguard Worker };
607*fb1b10abSAndroid Build Coastguard Worker
TEST_P(FwdTrans8x8HT,SignBiasCheck)608*fb1b10abSAndroid Build Coastguard Worker TEST_P(FwdTrans8x8HT, SignBiasCheck) { RunSignBiasCheck(); }
609*fb1b10abSAndroid Build Coastguard Worker
TEST_P(FwdTrans8x8HT,RoundTripErrorCheck)610*fb1b10abSAndroid Build Coastguard Worker TEST_P(FwdTrans8x8HT, RoundTripErrorCheck) { RunRoundTripErrorCheck(); }
611*fb1b10abSAndroid Build Coastguard Worker
TEST_P(FwdTrans8x8HT,ExtremalCheck)612*fb1b10abSAndroid Build Coastguard Worker TEST_P(FwdTrans8x8HT, ExtremalCheck) { RunExtremalCheck(); }
613*fb1b10abSAndroid Build Coastguard Worker
614*fb1b10abSAndroid Build Coastguard Worker #if HAVE_SSE2 && CONFIG_VP9_HIGHBITDEPTH && !CONFIG_EMULATE_HARDWARE
615*fb1b10abSAndroid Build Coastguard Worker class InvTrans8x8DCT : public FwdTrans8x8TestBase,
616*fb1b10abSAndroid Build Coastguard Worker public ::testing::TestWithParam<Idct8x8Param> {
617*fb1b10abSAndroid Build Coastguard Worker public:
618*fb1b10abSAndroid Build Coastguard Worker ~InvTrans8x8DCT() override = default;
619*fb1b10abSAndroid Build Coastguard Worker
SetUp()620*fb1b10abSAndroid Build Coastguard Worker void SetUp() override {
621*fb1b10abSAndroid Build Coastguard Worker ref_txfm_ = GET_PARAM(0);
622*fb1b10abSAndroid Build Coastguard Worker inv_txfm_ = GET_PARAM(1);
623*fb1b10abSAndroid Build Coastguard Worker thresh_ = GET_PARAM(2);
624*fb1b10abSAndroid Build Coastguard Worker pitch_ = 8;
625*fb1b10abSAndroid Build Coastguard Worker bit_depth_ = GET_PARAM(3);
626*fb1b10abSAndroid Build Coastguard Worker mask_ = (1 << bit_depth_) - 1;
627*fb1b10abSAndroid Build Coastguard Worker }
628*fb1b10abSAndroid Build Coastguard Worker
TearDown()629*fb1b10abSAndroid Build Coastguard Worker void TearDown() override { libvpx_test::ClearSystemState(); }
630*fb1b10abSAndroid Build Coastguard Worker
631*fb1b10abSAndroid Build Coastguard Worker protected:
RunInvTxfm(tran_low_t * out,uint8_t * dst,int stride)632*fb1b10abSAndroid Build Coastguard Worker void RunInvTxfm(tran_low_t *out, uint8_t *dst, int stride) override {
633*fb1b10abSAndroid Build Coastguard Worker inv_txfm_(out, dst, stride);
634*fb1b10abSAndroid Build Coastguard Worker }
RunFwdTxfm(int16_t *,tran_low_t *,int)635*fb1b10abSAndroid Build Coastguard Worker void RunFwdTxfm(int16_t * /*out*/, tran_low_t * /*dst*/,
636*fb1b10abSAndroid Build Coastguard Worker int /*stride*/) override {}
637*fb1b10abSAndroid Build Coastguard Worker
638*fb1b10abSAndroid Build Coastguard Worker IdctFunc ref_txfm_;
639*fb1b10abSAndroid Build Coastguard Worker IdctFunc inv_txfm_;
640*fb1b10abSAndroid Build Coastguard Worker int thresh_;
641*fb1b10abSAndroid Build Coastguard Worker };
642*fb1b10abSAndroid Build Coastguard Worker GTEST_ALLOW_UNINSTANTIATED_PARAMETERIZED_TEST(InvTrans8x8DCT);
643*fb1b10abSAndroid Build Coastguard Worker
TEST_P(InvTrans8x8DCT,CompareReference)644*fb1b10abSAndroid Build Coastguard Worker TEST_P(InvTrans8x8DCT, CompareReference) {
645*fb1b10abSAndroid Build Coastguard Worker CompareInvReference(ref_txfm_, thresh_);
646*fb1b10abSAndroid Build Coastguard Worker }
647*fb1b10abSAndroid Build Coastguard Worker #endif // HAVE_SSE2 && CONFIG_VP9_HIGHBITDEPTH && !CONFIG_EMULATE_HARDWARE
648*fb1b10abSAndroid Build Coastguard Worker
649*fb1b10abSAndroid Build Coastguard Worker using std::make_tuple;
650*fb1b10abSAndroid Build Coastguard Worker
651*fb1b10abSAndroid Build Coastguard Worker #if CONFIG_VP9_HIGHBITDEPTH
652*fb1b10abSAndroid Build Coastguard Worker INSTANTIATE_TEST_SUITE_P(
653*fb1b10abSAndroid Build Coastguard Worker C, FwdTrans8x8DCT,
654*fb1b10abSAndroid Build Coastguard Worker ::testing::Values(
655*fb1b10abSAndroid Build Coastguard Worker make_tuple(&vpx_fdct8x8_c, &vpx_idct8x8_64_add_c, 0, VPX_BITS_8),
656*fb1b10abSAndroid Build Coastguard Worker make_tuple(&vpx_highbd_fdct8x8_c, &idct8x8_10, 0, VPX_BITS_10),
657*fb1b10abSAndroid Build Coastguard Worker make_tuple(&vpx_highbd_fdct8x8_c, &idct8x8_12, 0, VPX_BITS_12)));
658*fb1b10abSAndroid Build Coastguard Worker #else
659*fb1b10abSAndroid Build Coastguard Worker INSTANTIATE_TEST_SUITE_P(C, FwdTrans8x8DCT,
660*fb1b10abSAndroid Build Coastguard Worker ::testing::Values(make_tuple(&vpx_fdct8x8_c,
661*fb1b10abSAndroid Build Coastguard Worker &vpx_idct8x8_64_add_c, 0,
662*fb1b10abSAndroid Build Coastguard Worker VPX_BITS_8)));
663*fb1b10abSAndroid Build Coastguard Worker #endif // CONFIG_VP9_HIGHBITDEPTH
664*fb1b10abSAndroid Build Coastguard Worker
665*fb1b10abSAndroid Build Coastguard Worker #if CONFIG_VP9_HIGHBITDEPTH
666*fb1b10abSAndroid Build Coastguard Worker INSTANTIATE_TEST_SUITE_P(
667*fb1b10abSAndroid Build Coastguard Worker C, FwdTrans8x8HT,
668*fb1b10abSAndroid Build Coastguard Worker ::testing::Values(
669*fb1b10abSAndroid Build Coastguard Worker make_tuple(&vp9_fht8x8_c, &vp9_iht8x8_64_add_c, 0, VPX_BITS_8),
670*fb1b10abSAndroid Build Coastguard Worker make_tuple(&vp9_highbd_fht8x8_c, &iht8x8_10, 0, VPX_BITS_10),
671*fb1b10abSAndroid Build Coastguard Worker make_tuple(&vp9_highbd_fht8x8_c, &iht8x8_10, 1, VPX_BITS_10),
672*fb1b10abSAndroid Build Coastguard Worker make_tuple(&vp9_highbd_fht8x8_c, &iht8x8_10, 2, VPX_BITS_10),
673*fb1b10abSAndroid Build Coastguard Worker make_tuple(&vp9_highbd_fht8x8_c, &iht8x8_10, 3, VPX_BITS_10),
674*fb1b10abSAndroid Build Coastguard Worker make_tuple(&vp9_highbd_fht8x8_c, &iht8x8_12, 0, VPX_BITS_12),
675*fb1b10abSAndroid Build Coastguard Worker make_tuple(&vp9_highbd_fht8x8_c, &iht8x8_12, 1, VPX_BITS_12),
676*fb1b10abSAndroid Build Coastguard Worker make_tuple(&vp9_highbd_fht8x8_c, &iht8x8_12, 2, VPX_BITS_12),
677*fb1b10abSAndroid Build Coastguard Worker make_tuple(&vp9_highbd_fht8x8_c, &iht8x8_12, 3, VPX_BITS_12),
678*fb1b10abSAndroid Build Coastguard Worker make_tuple(&vp9_fht8x8_c, &vp9_iht8x8_64_add_c, 1, VPX_BITS_8),
679*fb1b10abSAndroid Build Coastguard Worker make_tuple(&vp9_fht8x8_c, &vp9_iht8x8_64_add_c, 2, VPX_BITS_8),
680*fb1b10abSAndroid Build Coastguard Worker make_tuple(&vp9_fht8x8_c, &vp9_iht8x8_64_add_c, 3, VPX_BITS_8)));
681*fb1b10abSAndroid Build Coastguard Worker #else
682*fb1b10abSAndroid Build Coastguard Worker INSTANTIATE_TEST_SUITE_P(
683*fb1b10abSAndroid Build Coastguard Worker C, FwdTrans8x8HT,
684*fb1b10abSAndroid Build Coastguard Worker ::testing::Values(
685*fb1b10abSAndroid Build Coastguard Worker make_tuple(&vp9_fht8x8_c, &vp9_iht8x8_64_add_c, 0, VPX_BITS_8),
686*fb1b10abSAndroid Build Coastguard Worker make_tuple(&vp9_fht8x8_c, &vp9_iht8x8_64_add_c, 1, VPX_BITS_8),
687*fb1b10abSAndroid Build Coastguard Worker make_tuple(&vp9_fht8x8_c, &vp9_iht8x8_64_add_c, 2, VPX_BITS_8),
688*fb1b10abSAndroid Build Coastguard Worker make_tuple(&vp9_fht8x8_c, &vp9_iht8x8_64_add_c, 3, VPX_BITS_8)));
689*fb1b10abSAndroid Build Coastguard Worker #endif // CONFIG_VP9_HIGHBITDEPTH
690*fb1b10abSAndroid Build Coastguard Worker
691*fb1b10abSAndroid Build Coastguard Worker #if HAVE_NEON && !CONFIG_EMULATE_HARDWARE
692*fb1b10abSAndroid Build Coastguard Worker INSTANTIATE_TEST_SUITE_P(NEON, FwdTrans8x8DCT,
693*fb1b10abSAndroid Build Coastguard Worker ::testing::Values(make_tuple(&vpx_fdct8x8_neon,
694*fb1b10abSAndroid Build Coastguard Worker &vpx_idct8x8_64_add_neon,
695*fb1b10abSAndroid Build Coastguard Worker 0, VPX_BITS_8)));
696*fb1b10abSAndroid Build Coastguard Worker
697*fb1b10abSAndroid Build Coastguard Worker #if !CONFIG_VP9_HIGHBITDEPTH
698*fb1b10abSAndroid Build Coastguard Worker INSTANTIATE_TEST_SUITE_P(
699*fb1b10abSAndroid Build Coastguard Worker NEON, FwdTrans8x8HT,
700*fb1b10abSAndroid Build Coastguard Worker ::testing::Values(
701*fb1b10abSAndroid Build Coastguard Worker make_tuple(&vp9_fht8x8_c, &vp9_iht8x8_64_add_neon, 0, VPX_BITS_8),
702*fb1b10abSAndroid Build Coastguard Worker make_tuple(&vp9_fht8x8_c, &vp9_iht8x8_64_add_neon, 1, VPX_BITS_8),
703*fb1b10abSAndroid Build Coastguard Worker make_tuple(&vp9_fht8x8_c, &vp9_iht8x8_64_add_neon, 2, VPX_BITS_8),
704*fb1b10abSAndroid Build Coastguard Worker make_tuple(&vp9_fht8x8_c, &vp9_iht8x8_64_add_neon, 3, VPX_BITS_8)));
705*fb1b10abSAndroid Build Coastguard Worker #endif // !CONFIG_VP9_HIGHBITDEPTH
706*fb1b10abSAndroid Build Coastguard Worker #endif // HAVE_NEON && !CONFIG_EMULATE_HARDWARE
707*fb1b10abSAndroid Build Coastguard Worker
708*fb1b10abSAndroid Build Coastguard Worker #if HAVE_SSE2 && !CONFIG_VP9_HIGHBITDEPTH && !CONFIG_EMULATE_HARDWARE
709*fb1b10abSAndroid Build Coastguard Worker INSTANTIATE_TEST_SUITE_P(SSE2, FwdTrans8x8DCT,
710*fb1b10abSAndroid Build Coastguard Worker ::testing::Values(make_tuple(&vpx_fdct8x8_sse2,
711*fb1b10abSAndroid Build Coastguard Worker &vpx_idct8x8_64_add_sse2,
712*fb1b10abSAndroid Build Coastguard Worker 0, VPX_BITS_8)));
713*fb1b10abSAndroid Build Coastguard Worker INSTANTIATE_TEST_SUITE_P(
714*fb1b10abSAndroid Build Coastguard Worker SSE2, FwdTrans8x8HT,
715*fb1b10abSAndroid Build Coastguard Worker ::testing::Values(
716*fb1b10abSAndroid Build Coastguard Worker make_tuple(&vp9_fht8x8_sse2, &vp9_iht8x8_64_add_sse2, 0, VPX_BITS_8),
717*fb1b10abSAndroid Build Coastguard Worker make_tuple(&vp9_fht8x8_sse2, &vp9_iht8x8_64_add_sse2, 1, VPX_BITS_8),
718*fb1b10abSAndroid Build Coastguard Worker make_tuple(&vp9_fht8x8_sse2, &vp9_iht8x8_64_add_sse2, 2, VPX_BITS_8),
719*fb1b10abSAndroid Build Coastguard Worker make_tuple(&vp9_fht8x8_sse2, &vp9_iht8x8_64_add_sse2, 3, VPX_BITS_8)));
720*fb1b10abSAndroid Build Coastguard Worker #endif // HAVE_SSE2 && !CONFIG_VP9_HIGHBITDEPTH && !CONFIG_EMULATE_HARDWARE
721*fb1b10abSAndroid Build Coastguard Worker
722*fb1b10abSAndroid Build Coastguard Worker #if HAVE_SSE2 && CONFIG_VP9_HIGHBITDEPTH && !CONFIG_EMULATE_HARDWARE
723*fb1b10abSAndroid Build Coastguard Worker INSTANTIATE_TEST_SUITE_P(
724*fb1b10abSAndroid Build Coastguard Worker SSE2, FwdTrans8x8DCT,
725*fb1b10abSAndroid Build Coastguard Worker ::testing::Values(make_tuple(&vpx_fdct8x8_sse2, &vpx_idct8x8_64_add_c, 0,
726*fb1b10abSAndroid Build Coastguard Worker VPX_BITS_8),
727*fb1b10abSAndroid Build Coastguard Worker make_tuple(&vpx_highbd_fdct8x8_c, &idct8x8_64_add_10_sse2,
728*fb1b10abSAndroid Build Coastguard Worker 12, VPX_BITS_10),
729*fb1b10abSAndroid Build Coastguard Worker make_tuple(&vpx_highbd_fdct8x8_sse2,
730*fb1b10abSAndroid Build Coastguard Worker &idct8x8_64_add_10_sse2, 12, VPX_BITS_10),
731*fb1b10abSAndroid Build Coastguard Worker make_tuple(&vpx_highbd_fdct8x8_c, &idct8x8_64_add_12_sse2,
732*fb1b10abSAndroid Build Coastguard Worker 12, VPX_BITS_12),
733*fb1b10abSAndroid Build Coastguard Worker make_tuple(&vpx_highbd_fdct8x8_sse2,
734*fb1b10abSAndroid Build Coastguard Worker &idct8x8_64_add_12_sse2, 12, VPX_BITS_12)));
735*fb1b10abSAndroid Build Coastguard Worker
736*fb1b10abSAndroid Build Coastguard Worker INSTANTIATE_TEST_SUITE_P(
737*fb1b10abSAndroid Build Coastguard Worker SSE2, FwdTrans8x8HT,
738*fb1b10abSAndroid Build Coastguard Worker ::testing::Values(
739*fb1b10abSAndroid Build Coastguard Worker make_tuple(&vp9_fht8x8_sse2, &vp9_iht8x8_64_add_c, 0, VPX_BITS_8),
740*fb1b10abSAndroid Build Coastguard Worker make_tuple(&vp9_fht8x8_sse2, &vp9_iht8x8_64_add_c, 1, VPX_BITS_8),
741*fb1b10abSAndroid Build Coastguard Worker make_tuple(&vp9_fht8x8_sse2, &vp9_iht8x8_64_add_c, 2, VPX_BITS_8),
742*fb1b10abSAndroid Build Coastguard Worker make_tuple(&vp9_fht8x8_sse2, &vp9_iht8x8_64_add_c, 3, VPX_BITS_8)));
743*fb1b10abSAndroid Build Coastguard Worker
744*fb1b10abSAndroid Build Coastguard Worker // Optimizations take effect at a threshold of 6201, so we use a value close to
745*fb1b10abSAndroid Build Coastguard Worker // that to test both branches.
746*fb1b10abSAndroid Build Coastguard Worker INSTANTIATE_TEST_SUITE_P(
747*fb1b10abSAndroid Build Coastguard Worker SSE2, InvTrans8x8DCT,
748*fb1b10abSAndroid Build Coastguard Worker ::testing::Values(
749*fb1b10abSAndroid Build Coastguard Worker make_tuple(&idct8x8_12_add_10_c, &idct8x8_12_add_10_sse2, 6225,
750*fb1b10abSAndroid Build Coastguard Worker VPX_BITS_10),
751*fb1b10abSAndroid Build Coastguard Worker make_tuple(&idct8x8_10, &idct8x8_64_add_10_sse2, 6225, VPX_BITS_10),
752*fb1b10abSAndroid Build Coastguard Worker make_tuple(&idct8x8_12_add_12_c, &idct8x8_12_add_12_sse2, 6225,
753*fb1b10abSAndroid Build Coastguard Worker VPX_BITS_12),
754*fb1b10abSAndroid Build Coastguard Worker make_tuple(&idct8x8_12, &idct8x8_64_add_12_sse2, 6225, VPX_BITS_12)));
755*fb1b10abSAndroid Build Coastguard Worker #endif // HAVE_SSE2 && CONFIG_VP9_HIGHBITDEPTH && !CONFIG_EMULATE_HARDWARE
756*fb1b10abSAndroid Build Coastguard Worker
757*fb1b10abSAndroid Build Coastguard Worker #if HAVE_SSSE3 && VPX_ARCH_X86_64 && !CONFIG_VP9_HIGHBITDEPTH && \
758*fb1b10abSAndroid Build Coastguard Worker !CONFIG_EMULATE_HARDWARE
759*fb1b10abSAndroid Build Coastguard Worker INSTANTIATE_TEST_SUITE_P(SSSE3, FwdTrans8x8DCT,
760*fb1b10abSAndroid Build Coastguard Worker ::testing::Values(make_tuple(&vpx_fdct8x8_ssse3,
761*fb1b10abSAndroid Build Coastguard Worker &vpx_idct8x8_64_add_sse2,
762*fb1b10abSAndroid Build Coastguard Worker 0, VPX_BITS_8)));
763*fb1b10abSAndroid Build Coastguard Worker #endif
764*fb1b10abSAndroid Build Coastguard Worker
765*fb1b10abSAndroid Build Coastguard Worker #if HAVE_MSA && !CONFIG_VP9_HIGHBITDEPTH && !CONFIG_EMULATE_HARDWARE
766*fb1b10abSAndroid Build Coastguard Worker INSTANTIATE_TEST_SUITE_P(MSA, FwdTrans8x8DCT,
767*fb1b10abSAndroid Build Coastguard Worker ::testing::Values(make_tuple(&vpx_fdct8x8_msa,
768*fb1b10abSAndroid Build Coastguard Worker &vpx_idct8x8_64_add_msa,
769*fb1b10abSAndroid Build Coastguard Worker 0, VPX_BITS_8)));
770*fb1b10abSAndroid Build Coastguard Worker INSTANTIATE_TEST_SUITE_P(
771*fb1b10abSAndroid Build Coastguard Worker MSA, FwdTrans8x8HT,
772*fb1b10abSAndroid Build Coastguard Worker ::testing::Values(
773*fb1b10abSAndroid Build Coastguard Worker make_tuple(&vp9_fht8x8_msa, &vp9_iht8x8_64_add_msa, 0, VPX_BITS_8),
774*fb1b10abSAndroid Build Coastguard Worker make_tuple(&vp9_fht8x8_msa, &vp9_iht8x8_64_add_msa, 1, VPX_BITS_8),
775*fb1b10abSAndroid Build Coastguard Worker make_tuple(&vp9_fht8x8_msa, &vp9_iht8x8_64_add_msa, 2, VPX_BITS_8),
776*fb1b10abSAndroid Build Coastguard Worker make_tuple(&vp9_fht8x8_msa, &vp9_iht8x8_64_add_msa, 3, VPX_BITS_8)));
777*fb1b10abSAndroid Build Coastguard Worker #endif // HAVE_MSA && !CONFIG_VP9_HIGHBITDEPTH && !CONFIG_EMULATE_HARDWARE
778*fb1b10abSAndroid Build Coastguard Worker
779*fb1b10abSAndroid Build Coastguard Worker #if HAVE_VSX && !CONFIG_VP9_HIGHBITDEPTH && !CONFIG_EMULATE_HARDWARE
780*fb1b10abSAndroid Build Coastguard Worker INSTANTIATE_TEST_SUITE_P(VSX, FwdTrans8x8DCT,
781*fb1b10abSAndroid Build Coastguard Worker ::testing::Values(make_tuple(&vpx_fdct8x8_c,
782*fb1b10abSAndroid Build Coastguard Worker &vpx_idct8x8_64_add_vsx,
783*fb1b10abSAndroid Build Coastguard Worker 0, VPX_BITS_8)));
784*fb1b10abSAndroid Build Coastguard Worker #endif // HAVE_VSX && !CONFIG_VP9_HIGHBITDEPTH && !CONFIG_EMULATE_HARDWARE
785*fb1b10abSAndroid Build Coastguard Worker
786*fb1b10abSAndroid Build Coastguard Worker #if HAVE_LSX && !CONFIG_VP9_HIGHBITDEPTH && !CONFIG_EMULATE_HARDWARE
787*fb1b10abSAndroid Build Coastguard Worker INSTANTIATE_TEST_SUITE_P(LSX, FwdTrans8x8DCT,
788*fb1b10abSAndroid Build Coastguard Worker ::testing::Values(make_tuple(&vpx_fdct8x8_lsx,
789*fb1b10abSAndroid Build Coastguard Worker &vpx_idct8x8_64_add_c, 0,
790*fb1b10abSAndroid Build Coastguard Worker VPX_BITS_8)));
791*fb1b10abSAndroid Build Coastguard Worker #endif // HAVE_LSX && !CONFIG_VP9_HIGHBITDEPTH && !CONFIG_EMULATE_HARDWARE
792*fb1b10abSAndroid Build Coastguard Worker } // namespace
793