1ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang/*
2ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang *  Copyright (c) 2012 The WebM project authors. All Rights Reserved.
3ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang *
4ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang *  Use of this source code is governed by a BSD-style license
5ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang *  that can be found in the LICENSE file in the root of the source
6ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang *  tree. An additional intellectual property rights grant can be found
7ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang *  in the file PATENTS.  All contributing project authors may
8ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang *  be found in the AUTHORS file in the root of the source tree.
9ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang */
10ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang
11ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang#include <math.h>
12ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang#include <stdlib.h>
13ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang#include <string.h>
14ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang
15ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang#include "third_party/googletest/src/include/gtest/gtest.h"
16da49e34c1fb5e99681f4ad99c21d9cfd83eddb96Vignesh Venkatasubramanian
17da49e34c1fb5e99681f4ad99c21d9cfd83eddb96Vignesh Venkatasubramanian#include "./vp9_rtcd.h"
18da49e34c1fb5e99681f4ad99c21d9cfd83eddb96Vignesh Venkatasubramanian#include "./vpx_dsp_rtcd.h"
195ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang#include "test/acm_random.h"
201184aebb761cbeac9124c37189a80a1a58f04b6bhkuang#include "test/clear_system_state.h"
211184aebb761cbeac9124c37189a80a1a58f04b6bhkuang#include "test/register_state_check.h"
225ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang#include "test/util.h"
232ec72e65689c948e92b826ae1e867bf369e72f13Vignesh Venkatasubramanian#include "vp9/common/vp9_entropy.h"
24da49e34c1fb5e99681f4ad99c21d9cfd83eddb96Vignesh Venkatasubramanian#include "vp9/common/vp9_scan.h"
25da49e34c1fb5e99681f4ad99c21d9cfd83eddb96Vignesh Venkatasubramanian#include "vpx/vpx_codec.h"
262ec72e65689c948e92b826ae1e867bf369e72f13Vignesh Venkatasubramanian#include "vpx/vpx_integer.h"
27da49e34c1fb5e99681f4ad99c21d9cfd83eddb96Vignesh Venkatasubramanian#include "vpx_ports/mem.h"
28ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang
29ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuangusing libvpx_test::ACMRandom;
30ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang
31ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuangnamespace {
32da49e34c1fb5e99681f4ad99c21d9cfd83eddb96Vignesh Venkatasubramanian
33da49e34c1fb5e99681f4ad99c21d9cfd83eddb96Vignesh Venkatasubramanianconst int kNumCoeffs = 64;
34da49e34c1fb5e99681f4ad99c21d9cfd83eddb96Vignesh Venkatasubramanianconst double kPi = 3.141592653589793238462643383279502884;
35da49e34c1fb5e99681f4ad99c21d9cfd83eddb96Vignesh Venkatasubramanian
36da49e34c1fb5e99681f4ad99c21d9cfd83eddb96Vignesh Venkatasubramanianconst int kSignBiasMaxDiff255 = 1500;
37da49e34c1fb5e99681f4ad99c21d9cfd83eddb96Vignesh Venkatasubramanianconst int kSignBiasMaxDiff15 = 10000;
38da49e34c1fb5e99681f4ad99c21d9cfd83eddb96Vignesh Venkatasubramanian
39da49e34c1fb5e99681f4ad99c21d9cfd83eddb96Vignesh Venkatasubramaniantypedef void (*FdctFunc)(const int16_t *in, tran_low_t *out, int stride);
40da49e34c1fb5e99681f4ad99c21d9cfd83eddb96Vignesh Venkatasubramaniantypedef void (*IdctFunc)(const tran_low_t *in, uint8_t *out, int stride);
41da49e34c1fb5e99681f4ad99c21d9cfd83eddb96Vignesh Venkatasubramaniantypedef void (*FhtFunc)(const int16_t *in, tran_low_t *out, int stride,
42ba6c59e9d7d7013b3906b6f4230b663422681848Vignesh Venkatasubramanian                        int tx_type);
43da49e34c1fb5e99681f4ad99c21d9cfd83eddb96Vignesh Venkatasubramaniantypedef void (*IhtFunc)(const tran_low_t *in, uint8_t *out, int stride,
44ba6c59e9d7d7013b3906b6f4230b663422681848Vignesh Venkatasubramanian                        int tx_type);
455ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
46da49e34c1fb5e99681f4ad99c21d9cfd83eddb96Vignesh Venkatasubramaniantypedef std::tr1::tuple<FdctFunc, IdctFunc, int, vpx_bit_depth_t> Dct8x8Param;
47da49e34c1fb5e99681f4ad99c21d9cfd83eddb96Vignesh Venkatasubramaniantypedef std::tr1::tuple<FhtFunc, IhtFunc, int, vpx_bit_depth_t> Ht8x8Param;
48da49e34c1fb5e99681f4ad99c21d9cfd83eddb96Vignesh Venkatasubramaniantypedef std::tr1::tuple<IdctFunc, IdctFunc, int, vpx_bit_depth_t> Idct8x8Param;
49da49e34c1fb5e99681f4ad99c21d9cfd83eddb96Vignesh Venkatasubramanian
50da49e34c1fb5e99681f4ad99c21d9cfd83eddb96Vignesh Venkatasubramanianvoid reference_8x8_dct_1d(const double in[8], double out[8], int stride) {
51da49e34c1fb5e99681f4ad99c21d9cfd83eddb96Vignesh Venkatasubramanian  const double kInvSqrt2 = 0.707106781186547524400844362104;
52da49e34c1fb5e99681f4ad99c21d9cfd83eddb96Vignesh Venkatasubramanian  for (int k = 0; k < 8; k++) {
53da49e34c1fb5e99681f4ad99c21d9cfd83eddb96Vignesh Venkatasubramanian    out[k] = 0.0;
54da49e34c1fb5e99681f4ad99c21d9cfd83eddb96Vignesh Venkatasubramanian    for (int n = 0; n < 8; n++)
55da49e34c1fb5e99681f4ad99c21d9cfd83eddb96Vignesh Venkatasubramanian      out[k] += in[n] * cos(kPi * (2 * n + 1) * k / 16.0);
56da49e34c1fb5e99681f4ad99c21d9cfd83eddb96Vignesh Venkatasubramanian    if (k == 0)
57da49e34c1fb5e99681f4ad99c21d9cfd83eddb96Vignesh Venkatasubramanian      out[k] = out[k] * kInvSqrt2;
58da49e34c1fb5e99681f4ad99c21d9cfd83eddb96Vignesh Venkatasubramanian  }
59da49e34c1fb5e99681f4ad99c21d9cfd83eddb96Vignesh Venkatasubramanian}
60da49e34c1fb5e99681f4ad99c21d9cfd83eddb96Vignesh Venkatasubramanian
61da49e34c1fb5e99681f4ad99c21d9cfd83eddb96Vignesh Venkatasubramanianvoid reference_8x8_dct_2d(const int16_t input[kNumCoeffs],
62da49e34c1fb5e99681f4ad99c21d9cfd83eddb96Vignesh Venkatasubramanian                          double output[kNumCoeffs]) {
63da49e34c1fb5e99681f4ad99c21d9cfd83eddb96Vignesh Venkatasubramanian  // First transform columns
64da49e34c1fb5e99681f4ad99c21d9cfd83eddb96Vignesh Venkatasubramanian  for (int i = 0; i < 8; ++i) {
65da49e34c1fb5e99681f4ad99c21d9cfd83eddb96Vignesh Venkatasubramanian    double temp_in[8], temp_out[8];
66da49e34c1fb5e99681f4ad99c21d9cfd83eddb96Vignesh Venkatasubramanian    for (int j = 0; j < 8; ++j)
67da49e34c1fb5e99681f4ad99c21d9cfd83eddb96Vignesh Venkatasubramanian      temp_in[j] = input[j*8 + i];
68da49e34c1fb5e99681f4ad99c21d9cfd83eddb96Vignesh Venkatasubramanian    reference_8x8_dct_1d(temp_in, temp_out, 1);
69da49e34c1fb5e99681f4ad99c21d9cfd83eddb96Vignesh Venkatasubramanian    for (int j = 0; j < 8; ++j)
70da49e34c1fb5e99681f4ad99c21d9cfd83eddb96Vignesh Venkatasubramanian      output[j * 8 + i] = temp_out[j];
71da49e34c1fb5e99681f4ad99c21d9cfd83eddb96Vignesh Venkatasubramanian  }
72da49e34c1fb5e99681f4ad99c21d9cfd83eddb96Vignesh Venkatasubramanian  // Then transform rows
73da49e34c1fb5e99681f4ad99c21d9cfd83eddb96Vignesh Venkatasubramanian  for (int i = 0; i < 8; ++i) {
74da49e34c1fb5e99681f4ad99c21d9cfd83eddb96Vignesh Venkatasubramanian    double temp_in[8], temp_out[8];
75da49e34c1fb5e99681f4ad99c21d9cfd83eddb96Vignesh Venkatasubramanian    for (int j = 0; j < 8; ++j)
76da49e34c1fb5e99681f4ad99c21d9cfd83eddb96Vignesh Venkatasubramanian      temp_in[j] = output[j + i*8];
77da49e34c1fb5e99681f4ad99c21d9cfd83eddb96Vignesh Venkatasubramanian    reference_8x8_dct_1d(temp_in, temp_out, 1);
78da49e34c1fb5e99681f4ad99c21d9cfd83eddb96Vignesh Venkatasubramanian    // Scale by some magic number
79da49e34c1fb5e99681f4ad99c21d9cfd83eddb96Vignesh Venkatasubramanian    for (int j = 0; j < 8; ++j)
80da49e34c1fb5e99681f4ad99c21d9cfd83eddb96Vignesh Venkatasubramanian      output[j + i * 8] = temp_out[j] * 2;
81da49e34c1fb5e99681f4ad99c21d9cfd83eddb96Vignesh Venkatasubramanian  }
82da49e34c1fb5e99681f4ad99c21d9cfd83eddb96Vignesh Venkatasubramanian}
83da49e34c1fb5e99681f4ad99c21d9cfd83eddb96Vignesh Venkatasubramanian
842ec72e65689c948e92b826ae1e867bf369e72f13Vignesh Venkatasubramanian
85da49e34c1fb5e99681f4ad99c21d9cfd83eddb96Vignesh Venkatasubramanianvoid fdct8x8_ref(const int16_t *in, tran_low_t *out, int stride, int tx_type) {
86da49e34c1fb5e99681f4ad99c21d9cfd83eddb96Vignesh Venkatasubramanian  vpx_fdct8x8_c(in, out, stride);
8791037db265ecdd914a26e056cf69207b4f50924ehkuang}
885ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
89da49e34c1fb5e99681f4ad99c21d9cfd83eddb96Vignesh Venkatasubramanianvoid fht8x8_ref(const int16_t *in, tran_low_t *out, int stride, int tx_type) {
902ec72e65689c948e92b826ae1e867bf369e72f13Vignesh Venkatasubramanian  vp9_fht8x8_c(in, out, stride, tx_type);
9191037db265ecdd914a26e056cf69207b4f50924ehkuang}
9291037db265ecdd914a26e056cf69207b4f50924ehkuang
93da49e34c1fb5e99681f4ad99c21d9cfd83eddb96Vignesh Venkatasubramanian#if CONFIG_VP9_HIGHBITDEPTH
94da49e34c1fb5e99681f4ad99c21d9cfd83eddb96Vignesh Venkatasubramanianvoid idct8x8_10(const tran_low_t *in, uint8_t *out, int stride) {
95da49e34c1fb5e99681f4ad99c21d9cfd83eddb96Vignesh Venkatasubramanian  vpx_highbd_idct8x8_64_add_c(in, out, stride, 10);
96da49e34c1fb5e99681f4ad99c21d9cfd83eddb96Vignesh Venkatasubramanian}
97da49e34c1fb5e99681f4ad99c21d9cfd83eddb96Vignesh Venkatasubramanian
98da49e34c1fb5e99681f4ad99c21d9cfd83eddb96Vignesh Venkatasubramanianvoid idct8x8_12(const tran_low_t *in, uint8_t *out, int stride) {
99da49e34c1fb5e99681f4ad99c21d9cfd83eddb96Vignesh Venkatasubramanian  vpx_highbd_idct8x8_64_add_c(in, out, stride, 12);
100da49e34c1fb5e99681f4ad99c21d9cfd83eddb96Vignesh Venkatasubramanian}
101da49e34c1fb5e99681f4ad99c21d9cfd83eddb96Vignesh Venkatasubramanian
102da49e34c1fb5e99681f4ad99c21d9cfd83eddb96Vignesh Venkatasubramanianvoid iht8x8_10(const tran_low_t *in, uint8_t *out, int stride, int tx_type) {
103da49e34c1fb5e99681f4ad99c21d9cfd83eddb96Vignesh Venkatasubramanian  vp9_highbd_iht8x8_64_add_c(in, out, stride, tx_type, 10);
104da49e34c1fb5e99681f4ad99c21d9cfd83eddb96Vignesh Venkatasubramanian}
105da49e34c1fb5e99681f4ad99c21d9cfd83eddb96Vignesh Venkatasubramanian
106da49e34c1fb5e99681f4ad99c21d9cfd83eddb96Vignesh Venkatasubramanianvoid iht8x8_12(const tran_low_t *in, uint8_t *out, int stride, int tx_type) {
107da49e34c1fb5e99681f4ad99c21d9cfd83eddb96Vignesh Venkatasubramanian  vp9_highbd_iht8x8_64_add_c(in, out, stride, tx_type, 12);
108da49e34c1fb5e99681f4ad99c21d9cfd83eddb96Vignesh Venkatasubramanian}
109da49e34c1fb5e99681f4ad99c21d9cfd83eddb96Vignesh Venkatasubramanian
110da49e34c1fb5e99681f4ad99c21d9cfd83eddb96Vignesh Venkatasubramanianvoid idct8x8_10_add_10_c(const tran_low_t *in, uint8_t *out, int stride) {
111da49e34c1fb5e99681f4ad99c21d9cfd83eddb96Vignesh Venkatasubramanian  vpx_highbd_idct8x8_10_add_c(in, out, stride, 10);
112da49e34c1fb5e99681f4ad99c21d9cfd83eddb96Vignesh Venkatasubramanian}
113da49e34c1fb5e99681f4ad99c21d9cfd83eddb96Vignesh Venkatasubramanian
114da49e34c1fb5e99681f4ad99c21d9cfd83eddb96Vignesh Venkatasubramanianvoid idct8x8_10_add_12_c(const tran_low_t *in, uint8_t *out, int stride) {
115da49e34c1fb5e99681f4ad99c21d9cfd83eddb96Vignesh Venkatasubramanian  vpx_highbd_idct8x8_10_add_c(in, out, stride, 12);
116da49e34c1fb5e99681f4ad99c21d9cfd83eddb96Vignesh Venkatasubramanian}
117da49e34c1fb5e99681f4ad99c21d9cfd83eddb96Vignesh Venkatasubramanian
118da49e34c1fb5e99681f4ad99c21d9cfd83eddb96Vignesh Venkatasubramanian#if HAVE_SSE2
119da49e34c1fb5e99681f4ad99c21d9cfd83eddb96Vignesh Venkatasubramanianvoid idct8x8_10_add_10_sse2(const tran_low_t *in, uint8_t *out, int stride) {
120da49e34c1fb5e99681f4ad99c21d9cfd83eddb96Vignesh Venkatasubramanian  vpx_highbd_idct8x8_10_add_sse2(in, out, stride, 10);
121da49e34c1fb5e99681f4ad99c21d9cfd83eddb96Vignesh Venkatasubramanian}
122da49e34c1fb5e99681f4ad99c21d9cfd83eddb96Vignesh Venkatasubramanian
123da49e34c1fb5e99681f4ad99c21d9cfd83eddb96Vignesh Venkatasubramanianvoid idct8x8_10_add_12_sse2(const tran_low_t *in, uint8_t *out, int stride) {
124da49e34c1fb5e99681f4ad99c21d9cfd83eddb96Vignesh Venkatasubramanian  vpx_highbd_idct8x8_10_add_sse2(in, out, stride, 12);
125da49e34c1fb5e99681f4ad99c21d9cfd83eddb96Vignesh Venkatasubramanian}
126da49e34c1fb5e99681f4ad99c21d9cfd83eddb96Vignesh Venkatasubramanian
127da49e34c1fb5e99681f4ad99c21d9cfd83eddb96Vignesh Venkatasubramanianvoid idct8x8_64_add_10_sse2(const tran_low_t *in, uint8_t *out, int stride) {
128da49e34c1fb5e99681f4ad99c21d9cfd83eddb96Vignesh Venkatasubramanian  vpx_highbd_idct8x8_64_add_sse2(in, out, stride, 10);
129da49e34c1fb5e99681f4ad99c21d9cfd83eddb96Vignesh Venkatasubramanian}
130da49e34c1fb5e99681f4ad99c21d9cfd83eddb96Vignesh Venkatasubramanian
131da49e34c1fb5e99681f4ad99c21d9cfd83eddb96Vignesh Venkatasubramanianvoid idct8x8_64_add_12_sse2(const tran_low_t *in, uint8_t *out, int stride) {
132da49e34c1fb5e99681f4ad99c21d9cfd83eddb96Vignesh Venkatasubramanian  vpx_highbd_idct8x8_64_add_sse2(in, out, stride, 12);
133da49e34c1fb5e99681f4ad99c21d9cfd83eddb96Vignesh Venkatasubramanian}
134da49e34c1fb5e99681f4ad99c21d9cfd83eddb96Vignesh Venkatasubramanian#endif  // HAVE_SSE2
135da49e34c1fb5e99681f4ad99c21d9cfd83eddb96Vignesh Venkatasubramanian#endif  // CONFIG_VP9_HIGHBITDEPTH
136da49e34c1fb5e99681f4ad99c21d9cfd83eddb96Vignesh Venkatasubramanian
1375ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuangclass FwdTrans8x8TestBase {
13891037db265ecdd914a26e056cf69207b4f50924ehkuang public:
1395ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  virtual ~FwdTrans8x8TestBase() {}
14091037db265ecdd914a26e056cf69207b4f50924ehkuang
14191037db265ecdd914a26e056cf69207b4f50924ehkuang protected:
142da49e34c1fb5e99681f4ad99c21d9cfd83eddb96Vignesh Venkatasubramanian  virtual void RunFwdTxfm(int16_t *in, tran_low_t *out, int stride) = 0;
143da49e34c1fb5e99681f4ad99c21d9cfd83eddb96Vignesh Venkatasubramanian  virtual void RunInvTxfm(tran_low_t *out, uint8_t *dst, int stride) = 0;
14491037db265ecdd914a26e056cf69207b4f50924ehkuang
1455ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  void RunSignBiasCheck() {
1465ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    ACMRandom rnd(ACMRandom::DeterministicSeed());
147da49e34c1fb5e99681f4ad99c21d9cfd83eddb96Vignesh Venkatasubramanian    DECLARE_ALIGNED(16, int16_t, test_input_block[64]);
148da49e34c1fb5e99681f4ad99c21d9cfd83eddb96Vignesh Venkatasubramanian    DECLARE_ALIGNED(16, tran_low_t, test_output_block[64]);
1495ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    int count_sign_block[64][2];
1505ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    const int count_test_block = 100000;
151ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang
1525ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    memset(count_sign_block, 0, sizeof(count_sign_block));
153ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang
1545ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    for (int i = 0; i < count_test_block; ++i) {
1555ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang      // Initialize a test block with input range [-255, 255].
1565ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang      for (int j = 0; j < 64; ++j)
157da49e34c1fb5e99681f4ad99c21d9cfd83eddb96Vignesh Venkatasubramanian        test_input_block[j] = ((rnd.Rand16() >> (16 - bit_depth_)) & mask_) -
158da49e34c1fb5e99681f4ad99c21d9cfd83eddb96Vignesh Venkatasubramanian                              ((rnd.Rand16() >> (16 - bit_depth_)) & mask_);
159ba6c59e9d7d7013b3906b6f4230b663422681848Vignesh Venkatasubramanian      ASM_REGISTER_STATE_CHECK(
1605ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang          RunFwdTxfm(test_input_block, test_output_block, pitch_));
161ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang
1625ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang      for (int j = 0; j < 64; ++j) {
1635ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang        if (test_output_block[j] < 0)
1645ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang          ++count_sign_block[j][0];
1655ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang        else if (test_output_block[j] > 0)
1665ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang          ++count_sign_block[j][1];
1675ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang      }
1685ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    }
169ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang
170ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang    for (int j = 0; j < 64; ++j) {
1715ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang      const int diff = abs(count_sign_block[j][0] - count_sign_block[j][1]);
172da49e34c1fb5e99681f4ad99c21d9cfd83eddb96Vignesh Venkatasubramanian      const int max_diff = kSignBiasMaxDiff255;
173da49e34c1fb5e99681f4ad99c21d9cfd83eddb96Vignesh Venkatasubramanian      EXPECT_LT(diff, max_diff << (bit_depth_ - 8))
1745ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang          << "Error: 8x8 FDCT/FHT has a sign bias > "
1755ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang          << 1. * max_diff / count_test_block * 100 << "%"
1765ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang          << " for input range [-255, 255] at index " << j
1775ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang          << " count0: " << count_sign_block[j][0]
1785ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang          << " count1: " << count_sign_block[j][1]
1795ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang          << " diff: " << diff;
180ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang    }
181ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang
1825ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    memset(count_sign_block, 0, sizeof(count_sign_block));
183ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang
1845ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    for (int i = 0; i < count_test_block; ++i) {
185da49e34c1fb5e99681f4ad99c21d9cfd83eddb96Vignesh Venkatasubramanian      // Initialize a test block with input range [-mask_ / 16, mask_ / 16].
1865ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang      for (int j = 0; j < 64; ++j)
187da49e34c1fb5e99681f4ad99c21d9cfd83eddb96Vignesh Venkatasubramanian        test_input_block[j] = ((rnd.Rand16() & mask_) >> 4) -
188da49e34c1fb5e99681f4ad99c21d9cfd83eddb96Vignesh Venkatasubramanian                              ((rnd.Rand16() & mask_) >> 4);
189ba6c59e9d7d7013b3906b6f4230b663422681848Vignesh Venkatasubramanian      ASM_REGISTER_STATE_CHECK(
1905ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang          RunFwdTxfm(test_input_block, test_output_block, pitch_));
191ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang
1925ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang      for (int j = 0; j < 64; ++j) {
1935ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang        if (test_output_block[j] < 0)
1945ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang          ++count_sign_block[j][0];
1955ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang        else if (test_output_block[j] > 0)
1965ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang          ++count_sign_block[j][1];
1975ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang      }
1985ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    }
199ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang
200ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang    for (int j = 0; j < 64; ++j) {
2015ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang      const int diff = abs(count_sign_block[j][0] - count_sign_block[j][1]);
202da49e34c1fb5e99681f4ad99c21d9cfd83eddb96Vignesh Venkatasubramanian      const int max_diff = kSignBiasMaxDiff15;
203da49e34c1fb5e99681f4ad99c21d9cfd83eddb96Vignesh Venkatasubramanian      EXPECT_LT(diff, max_diff << (bit_depth_ - 8))
204da49e34c1fb5e99681f4ad99c21d9cfd83eddb96Vignesh Venkatasubramanian          << "Error: 8x8 FDCT/FHT has a sign bias > "
2055ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang          << 1. * max_diff / count_test_block * 100 << "%"
2065ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang          << " for input range [-15, 15] at index " << j
2075ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang          << " count0: " << count_sign_block[j][0]
2085ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang          << " count1: " << count_sign_block[j][1]
2095ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang          << " diff: " << diff;
210ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang    }
211ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang  }
212ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang
2135ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  void RunRoundTripErrorCheck() {
2145ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    ACMRandom rnd(ACMRandom::DeterministicSeed());
2155ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    int max_error = 0;
2165ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    int total_error = 0;
2175ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    const int count_test_block = 100000;
218da49e34c1fb5e99681f4ad99c21d9cfd83eddb96Vignesh Venkatasubramanian    DECLARE_ALIGNED(16, int16_t, test_input_block[64]);
219da49e34c1fb5e99681f4ad99c21d9cfd83eddb96Vignesh Venkatasubramanian    DECLARE_ALIGNED(16, tran_low_t, test_temp_block[64]);
220da49e34c1fb5e99681f4ad99c21d9cfd83eddb96Vignesh Venkatasubramanian    DECLARE_ALIGNED(16, uint8_t, dst[64]);
221da49e34c1fb5e99681f4ad99c21d9cfd83eddb96Vignesh Venkatasubramanian    DECLARE_ALIGNED(16, uint8_t, src[64]);
222da49e34c1fb5e99681f4ad99c21d9cfd83eddb96Vignesh Venkatasubramanian#if CONFIG_VP9_HIGHBITDEPTH
223da49e34c1fb5e99681f4ad99c21d9cfd83eddb96Vignesh Venkatasubramanian    DECLARE_ALIGNED(16, uint16_t, dst16[64]);
224da49e34c1fb5e99681f4ad99c21d9cfd83eddb96Vignesh Venkatasubramanian    DECLARE_ALIGNED(16, uint16_t, src16[64]);
225da49e34c1fb5e99681f4ad99c21d9cfd83eddb96Vignesh Venkatasubramanian#endif
226ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang
2275ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    for (int i = 0; i < count_test_block; ++i) {
228da49e34c1fb5e99681f4ad99c21d9cfd83eddb96Vignesh Venkatasubramanian      // Initialize a test block with input range [-mask_, mask_].
2295ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang      for (int j = 0; j < 64; ++j) {
230da49e34c1fb5e99681f4ad99c21d9cfd83eddb96Vignesh Venkatasubramanian        if (bit_depth_ == VPX_BITS_8) {
231da49e34c1fb5e99681f4ad99c21d9cfd83eddb96Vignesh Venkatasubramanian          src[j] = rnd.Rand8();
232da49e34c1fb5e99681f4ad99c21d9cfd83eddb96Vignesh Venkatasubramanian          dst[j] = rnd.Rand8();
233da49e34c1fb5e99681f4ad99c21d9cfd83eddb96Vignesh Venkatasubramanian          test_input_block[j] = src[j] - dst[j];
234da49e34c1fb5e99681f4ad99c21d9cfd83eddb96Vignesh Venkatasubramanian#if CONFIG_VP9_HIGHBITDEPTH
235da49e34c1fb5e99681f4ad99c21d9cfd83eddb96Vignesh Venkatasubramanian        } else {
236da49e34c1fb5e99681f4ad99c21d9cfd83eddb96Vignesh Venkatasubramanian          src16[j] = rnd.Rand16() & mask_;
237da49e34c1fb5e99681f4ad99c21d9cfd83eddb96Vignesh Venkatasubramanian          dst16[j] = rnd.Rand16() & mask_;
238da49e34c1fb5e99681f4ad99c21d9cfd83eddb96Vignesh Venkatasubramanian          test_input_block[j] = src16[j] - dst16[j];
239da49e34c1fb5e99681f4ad99c21d9cfd83eddb96Vignesh Venkatasubramanian#endif
240da49e34c1fb5e99681f4ad99c21d9cfd83eddb96Vignesh Venkatasubramanian        }
2415ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang      }
242ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang
243ba6c59e9d7d7013b3906b6f4230b663422681848Vignesh Venkatasubramanian      ASM_REGISTER_STATE_CHECK(
2445ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang          RunFwdTxfm(test_input_block, test_temp_block, pitch_));
2455ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang      for (int j = 0; j < 64; ++j) {
2465ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang          if (test_temp_block[j] > 0) {
2475ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang            test_temp_block[j] += 2;
2485ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang            test_temp_block[j] /= 4;
2495ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang            test_temp_block[j] *= 4;
2505ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang          } else {
2515ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang            test_temp_block[j] -= 2;
2525ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang            test_temp_block[j] /= 4;
2535ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang            test_temp_block[j] *= 4;
2545ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang          }
2555ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang      }
256da49e34c1fb5e99681f4ad99c21d9cfd83eddb96Vignesh Venkatasubramanian      if (bit_depth_ == VPX_BITS_8) {
257da49e34c1fb5e99681f4ad99c21d9cfd83eddb96Vignesh Venkatasubramanian        ASM_REGISTER_STATE_CHECK(
258da49e34c1fb5e99681f4ad99c21d9cfd83eddb96Vignesh Venkatasubramanian            RunInvTxfm(test_temp_block, dst, pitch_));
259da49e34c1fb5e99681f4ad99c21d9cfd83eddb96Vignesh Venkatasubramanian#if CONFIG_VP9_HIGHBITDEPTH
260da49e34c1fb5e99681f4ad99c21d9cfd83eddb96Vignesh Venkatasubramanian      } else {
261da49e34c1fb5e99681f4ad99c21d9cfd83eddb96Vignesh Venkatasubramanian        ASM_REGISTER_STATE_CHECK(
262da49e34c1fb5e99681f4ad99c21d9cfd83eddb96Vignesh Venkatasubramanian            RunInvTxfm(test_temp_block, CONVERT_TO_BYTEPTR(dst16), pitch_));
263da49e34c1fb5e99681f4ad99c21d9cfd83eddb96Vignesh Venkatasubramanian#endif
264da49e34c1fb5e99681f4ad99c21d9cfd83eddb96Vignesh Venkatasubramanian      }
2655ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
2665ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang      for (int j = 0; j < 64; ++j) {
267da49e34c1fb5e99681f4ad99c21d9cfd83eddb96Vignesh Venkatasubramanian#if CONFIG_VP9_HIGHBITDEPTH
268da49e34c1fb5e99681f4ad99c21d9cfd83eddb96Vignesh Venkatasubramanian        const int diff =
269da49e34c1fb5e99681f4ad99c21d9cfd83eddb96Vignesh Venkatasubramanian            bit_depth_ == VPX_BITS_8 ? dst[j] - src[j] : dst16[j] - src16[j];
270da49e34c1fb5e99681f4ad99c21d9cfd83eddb96Vignesh Venkatasubramanian#else
2715ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang        const int diff = dst[j] - src[j];
272da49e34c1fb5e99681f4ad99c21d9cfd83eddb96Vignesh Venkatasubramanian#endif
2735ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang        const int error = diff * diff;
2745ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang        if (max_error < error)
2755ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang          max_error = error;
2765ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang        total_error += error;
2775ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang      }
278ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang    }
279ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang
280da49e34c1fb5e99681f4ad99c21d9cfd83eddb96Vignesh Venkatasubramanian    EXPECT_GE(1 << 2 * (bit_depth_ - 8), max_error)
2815ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang      << "Error: 8x8 FDCT/IDCT or FHT/IHT has an individual"
2825ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang      << " roundtrip error > 1";
283ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang
284da49e34c1fb5e99681f4ad99c21d9cfd83eddb96Vignesh Venkatasubramanian    EXPECT_GE((count_test_block << 2 * (bit_depth_ - 8))/5, total_error)
2855ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang      << "Error: 8x8 FDCT/IDCT or FHT/IHT has average roundtrip "
2865ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang      << "error > 1/5 per block";
2875ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  }
288ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang
2895ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  void RunExtremalCheck() {
2905ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    ACMRandom rnd(ACMRandom::DeterministicSeed());
2915ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    int max_error = 0;
2925ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    int total_error = 0;
293ba6c59e9d7d7013b3906b6f4230b663422681848Vignesh Venkatasubramanian    int total_coeff_error = 0;
2945ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    const int count_test_block = 100000;
295da49e34c1fb5e99681f4ad99c21d9cfd83eddb96Vignesh Venkatasubramanian    DECLARE_ALIGNED(16, int16_t, test_input_block[64]);
296da49e34c1fb5e99681f4ad99c21d9cfd83eddb96Vignesh Venkatasubramanian    DECLARE_ALIGNED(16, tran_low_t, test_temp_block[64]);
297da49e34c1fb5e99681f4ad99c21d9cfd83eddb96Vignesh Venkatasubramanian    DECLARE_ALIGNED(16, tran_low_t, ref_temp_block[64]);
298da49e34c1fb5e99681f4ad99c21d9cfd83eddb96Vignesh Venkatasubramanian    DECLARE_ALIGNED(16, uint8_t, dst[64]);
299da49e34c1fb5e99681f4ad99c21d9cfd83eddb96Vignesh Venkatasubramanian    DECLARE_ALIGNED(16, uint8_t, src[64]);
300da49e34c1fb5e99681f4ad99c21d9cfd83eddb96Vignesh Venkatasubramanian#if CONFIG_VP9_HIGHBITDEPTH
301da49e34c1fb5e99681f4ad99c21d9cfd83eddb96Vignesh Venkatasubramanian    DECLARE_ALIGNED(16, uint16_t, dst16[64]);
302da49e34c1fb5e99681f4ad99c21d9cfd83eddb96Vignesh Venkatasubramanian    DECLARE_ALIGNED(16, uint16_t, src16[64]);
303da49e34c1fb5e99681f4ad99c21d9cfd83eddb96Vignesh Venkatasubramanian#endif
304ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang
3055ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    for (int i = 0; i < count_test_block; ++i) {
306da49e34c1fb5e99681f4ad99c21d9cfd83eddb96Vignesh Venkatasubramanian      // Initialize a test block with input range [-mask_, mask_].
3075ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang      for (int j = 0; j < 64; ++j) {
308da49e34c1fb5e99681f4ad99c21d9cfd83eddb96Vignesh Venkatasubramanian        if (bit_depth_ == VPX_BITS_8) {
309da49e34c1fb5e99681f4ad99c21d9cfd83eddb96Vignesh Venkatasubramanian          if (i == 0) {
310da49e34c1fb5e99681f4ad99c21d9cfd83eddb96Vignesh Venkatasubramanian            src[j] = 255;
311da49e34c1fb5e99681f4ad99c21d9cfd83eddb96Vignesh Venkatasubramanian            dst[j] = 0;
312da49e34c1fb5e99681f4ad99c21d9cfd83eddb96Vignesh Venkatasubramanian          } else if (i == 1) {
313da49e34c1fb5e99681f4ad99c21d9cfd83eddb96Vignesh Venkatasubramanian            src[j] = 0;
314da49e34c1fb5e99681f4ad99c21d9cfd83eddb96Vignesh Venkatasubramanian            dst[j] = 255;
315da49e34c1fb5e99681f4ad99c21d9cfd83eddb96Vignesh Venkatasubramanian          } else {
316da49e34c1fb5e99681f4ad99c21d9cfd83eddb96Vignesh Venkatasubramanian            src[j] = rnd.Rand8() % 2 ? 255 : 0;
317da49e34c1fb5e99681f4ad99c21d9cfd83eddb96Vignesh Venkatasubramanian            dst[j] = rnd.Rand8() % 2 ? 255 : 0;
318da49e34c1fb5e99681f4ad99c21d9cfd83eddb96Vignesh Venkatasubramanian          }
319da49e34c1fb5e99681f4ad99c21d9cfd83eddb96Vignesh Venkatasubramanian          test_input_block[j] = src[j] - dst[j];
320da49e34c1fb5e99681f4ad99c21d9cfd83eddb96Vignesh Venkatasubramanian#if CONFIG_VP9_HIGHBITDEPTH
321ba6c59e9d7d7013b3906b6f4230b663422681848Vignesh Venkatasubramanian        } else {
322da49e34c1fb5e99681f4ad99c21d9cfd83eddb96Vignesh Venkatasubramanian          if (i == 0) {
323da49e34c1fb5e99681f4ad99c21d9cfd83eddb96Vignesh Venkatasubramanian            src16[j] = mask_;
324da49e34c1fb5e99681f4ad99c21d9cfd83eddb96Vignesh Venkatasubramanian            dst16[j] = 0;
325da49e34c1fb5e99681f4ad99c21d9cfd83eddb96Vignesh Venkatasubramanian          } else if (i == 1) {
326da49e34c1fb5e99681f4ad99c21d9cfd83eddb96Vignesh Venkatasubramanian            src16[j] = 0;
327da49e34c1fb5e99681f4ad99c21d9cfd83eddb96Vignesh Venkatasubramanian            dst16[j] = mask_;
328da49e34c1fb5e99681f4ad99c21d9cfd83eddb96Vignesh Venkatasubramanian          } else {
329da49e34c1fb5e99681f4ad99c21d9cfd83eddb96Vignesh Venkatasubramanian            src16[j] = rnd.Rand8() % 2 ? mask_ : 0;
330da49e34c1fb5e99681f4ad99c21d9cfd83eddb96Vignesh Venkatasubramanian            dst16[j] = rnd.Rand8() % 2 ? mask_ : 0;
331da49e34c1fb5e99681f4ad99c21d9cfd83eddb96Vignesh Venkatasubramanian          }
332da49e34c1fb5e99681f4ad99c21d9cfd83eddb96Vignesh Venkatasubramanian          test_input_block[j] = src16[j] - dst16[j];
333da49e34c1fb5e99681f4ad99c21d9cfd83eddb96Vignesh Venkatasubramanian#endif
334ba6c59e9d7d7013b3906b6f4230b663422681848Vignesh Venkatasubramanian        }
3355ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang      }
336ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang
337ba6c59e9d7d7013b3906b6f4230b663422681848Vignesh Venkatasubramanian      ASM_REGISTER_STATE_CHECK(
3385ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang          RunFwdTxfm(test_input_block, test_temp_block, pitch_));
339ba6c59e9d7d7013b3906b6f4230b663422681848Vignesh Venkatasubramanian      ASM_REGISTER_STATE_CHECK(
340ba6c59e9d7d7013b3906b6f4230b663422681848Vignesh Venkatasubramanian          fwd_txfm_ref(test_input_block, ref_temp_block, pitch_, tx_type_));
341da49e34c1fb5e99681f4ad99c21d9cfd83eddb96Vignesh Venkatasubramanian      if (bit_depth_ == VPX_BITS_8) {
342da49e34c1fb5e99681f4ad99c21d9cfd83eddb96Vignesh Venkatasubramanian        ASM_REGISTER_STATE_CHECK(
343da49e34c1fb5e99681f4ad99c21d9cfd83eddb96Vignesh Venkatasubramanian            RunInvTxfm(test_temp_block, dst, pitch_));
344da49e34c1fb5e99681f4ad99c21d9cfd83eddb96Vignesh Venkatasubramanian#if CONFIG_VP9_HIGHBITDEPTH
345da49e34c1fb5e99681f4ad99c21d9cfd83eddb96Vignesh Venkatasubramanian      } else {
346da49e34c1fb5e99681f4ad99c21d9cfd83eddb96Vignesh Venkatasubramanian        ASM_REGISTER_STATE_CHECK(
347da49e34c1fb5e99681f4ad99c21d9cfd83eddb96Vignesh Venkatasubramanian            RunInvTxfm(test_temp_block, CONVERT_TO_BYTEPTR(dst16), pitch_));
348da49e34c1fb5e99681f4ad99c21d9cfd83eddb96Vignesh Venkatasubramanian#endif
349da49e34c1fb5e99681f4ad99c21d9cfd83eddb96Vignesh Venkatasubramanian      }
3505ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
3515ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang      for (int j = 0; j < 64; ++j) {
352da49e34c1fb5e99681f4ad99c21d9cfd83eddb96Vignesh Venkatasubramanian#if CONFIG_VP9_HIGHBITDEPTH
353da49e34c1fb5e99681f4ad99c21d9cfd83eddb96Vignesh Venkatasubramanian        const int diff =
354da49e34c1fb5e99681f4ad99c21d9cfd83eddb96Vignesh Venkatasubramanian            bit_depth_ == VPX_BITS_8 ? dst[j] - src[j] : dst16[j] - src16[j];
355da49e34c1fb5e99681f4ad99c21d9cfd83eddb96Vignesh Venkatasubramanian#else
3565ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang        const int diff = dst[j] - src[j];
357da49e34c1fb5e99681f4ad99c21d9cfd83eddb96Vignesh Venkatasubramanian#endif
3585ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang        const int error = diff * diff;
3595ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang        if (max_error < error)
3605ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang          max_error = error;
3615ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang        total_error += error;
362ba6c59e9d7d7013b3906b6f4230b663422681848Vignesh Venkatasubramanian
363ba6c59e9d7d7013b3906b6f4230b663422681848Vignesh Venkatasubramanian        const int coeff_diff = test_temp_block[j] - ref_temp_block[j];
364ba6c59e9d7d7013b3906b6f4230b663422681848Vignesh Venkatasubramanian        total_coeff_error += abs(coeff_diff);
3655ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang      }
3665ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
367da49e34c1fb5e99681f4ad99c21d9cfd83eddb96Vignesh Venkatasubramanian      EXPECT_GE(1 << 2 * (bit_depth_ - 8), max_error)
3685ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang          << "Error: Extremal 8x8 FDCT/IDCT or FHT/IHT has"
3695ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang          << "an individual roundtrip error > 1";
3705ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
371da49e34c1fb5e99681f4ad99c21d9cfd83eddb96Vignesh Venkatasubramanian      EXPECT_GE((count_test_block << 2 * (bit_depth_ - 8))/5, total_error)
3725ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang          << "Error: Extremal 8x8 FDCT/IDCT or FHT/IHT has average"
3735ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang          << " roundtrip error > 1/5 per block";
374ba6c59e9d7d7013b3906b6f4230b663422681848Vignesh Venkatasubramanian
375ba6c59e9d7d7013b3906b6f4230b663422681848Vignesh Venkatasubramanian      EXPECT_EQ(0, total_coeff_error)
376ba6c59e9d7d7013b3906b6f4230b663422681848Vignesh Venkatasubramanian          << "Error: Extremal 8x8 FDCT/FHT has"
377ba6c59e9d7d7013b3906b6f4230b663422681848Vignesh Venkatasubramanian          << "overflow issues in the intermediate steps > 1";
378ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang    }
3795ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  }
380ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang
381da49e34c1fb5e99681f4ad99c21d9cfd83eddb96Vignesh Venkatasubramanian  void RunInvAccuracyCheck() {
382da49e34c1fb5e99681f4ad99c21d9cfd83eddb96Vignesh Venkatasubramanian    ACMRandom rnd(ACMRandom::DeterministicSeed());
383da49e34c1fb5e99681f4ad99c21d9cfd83eddb96Vignesh Venkatasubramanian    const int count_test_block = 1000;
384da49e34c1fb5e99681f4ad99c21d9cfd83eddb96Vignesh Venkatasubramanian    DECLARE_ALIGNED(16, int16_t, in[kNumCoeffs]);
385da49e34c1fb5e99681f4ad99c21d9cfd83eddb96Vignesh Venkatasubramanian    DECLARE_ALIGNED(16, tran_low_t, coeff[kNumCoeffs]);
386da49e34c1fb5e99681f4ad99c21d9cfd83eddb96Vignesh Venkatasubramanian    DECLARE_ALIGNED(16, uint8_t, dst[kNumCoeffs]);
387da49e34c1fb5e99681f4ad99c21d9cfd83eddb96Vignesh Venkatasubramanian    DECLARE_ALIGNED(16, uint8_t, src[kNumCoeffs]);
388da49e34c1fb5e99681f4ad99c21d9cfd83eddb96Vignesh Venkatasubramanian#if CONFIG_VP9_HIGHBITDEPTH
389da49e34c1fb5e99681f4ad99c21d9cfd83eddb96Vignesh Venkatasubramanian    DECLARE_ALIGNED(16, uint16_t, src16[kNumCoeffs]);
390da49e34c1fb5e99681f4ad99c21d9cfd83eddb96Vignesh Venkatasubramanian    DECLARE_ALIGNED(16, uint16_t, dst16[kNumCoeffs]);
391da49e34c1fb5e99681f4ad99c21d9cfd83eddb96Vignesh Venkatasubramanian#endif
392da49e34c1fb5e99681f4ad99c21d9cfd83eddb96Vignesh Venkatasubramanian
393da49e34c1fb5e99681f4ad99c21d9cfd83eddb96Vignesh Venkatasubramanian    for (int i = 0; i < count_test_block; ++i) {
394da49e34c1fb5e99681f4ad99c21d9cfd83eddb96Vignesh Venkatasubramanian      double out_r[kNumCoeffs];
395da49e34c1fb5e99681f4ad99c21d9cfd83eddb96Vignesh Venkatasubramanian
396da49e34c1fb5e99681f4ad99c21d9cfd83eddb96Vignesh Venkatasubramanian      // Initialize a test block with input range [-255, 255].
397da49e34c1fb5e99681f4ad99c21d9cfd83eddb96Vignesh Venkatasubramanian      for (int j = 0; j < kNumCoeffs; ++j) {
398da49e34c1fb5e99681f4ad99c21d9cfd83eddb96Vignesh Venkatasubramanian        if (bit_depth_ == VPX_BITS_8) {
399da49e34c1fb5e99681f4ad99c21d9cfd83eddb96Vignesh Venkatasubramanian          src[j] = rnd.Rand8() % 2 ? 255 : 0;
400da49e34c1fb5e99681f4ad99c21d9cfd83eddb96Vignesh Venkatasubramanian          dst[j] = src[j] > 0 ? 0 : 255;
401da49e34c1fb5e99681f4ad99c21d9cfd83eddb96Vignesh Venkatasubramanian          in[j] = src[j] - dst[j];
402da49e34c1fb5e99681f4ad99c21d9cfd83eddb96Vignesh Venkatasubramanian#if CONFIG_VP9_HIGHBITDEPTH
403da49e34c1fb5e99681f4ad99c21d9cfd83eddb96Vignesh Venkatasubramanian        } else {
404da49e34c1fb5e99681f4ad99c21d9cfd83eddb96Vignesh Venkatasubramanian          src16[j] = rnd.Rand8() % 2 ? mask_ : 0;
405da49e34c1fb5e99681f4ad99c21d9cfd83eddb96Vignesh Venkatasubramanian          dst16[j] = src16[j] > 0 ? 0 : mask_;
406da49e34c1fb5e99681f4ad99c21d9cfd83eddb96Vignesh Venkatasubramanian          in[j] = src16[j] - dst16[j];
407da49e34c1fb5e99681f4ad99c21d9cfd83eddb96Vignesh Venkatasubramanian#endif
408da49e34c1fb5e99681f4ad99c21d9cfd83eddb96Vignesh Venkatasubramanian        }
409da49e34c1fb5e99681f4ad99c21d9cfd83eddb96Vignesh Venkatasubramanian      }
410da49e34c1fb5e99681f4ad99c21d9cfd83eddb96Vignesh Venkatasubramanian
411da49e34c1fb5e99681f4ad99c21d9cfd83eddb96Vignesh Venkatasubramanian      reference_8x8_dct_2d(in, out_r);
412da49e34c1fb5e99681f4ad99c21d9cfd83eddb96Vignesh Venkatasubramanian      for (int j = 0; j < kNumCoeffs; ++j)
413da49e34c1fb5e99681f4ad99c21d9cfd83eddb96Vignesh Venkatasubramanian        coeff[j] = static_cast<tran_low_t>(round(out_r[j]));
414da49e34c1fb5e99681f4ad99c21d9cfd83eddb96Vignesh Venkatasubramanian
415da49e34c1fb5e99681f4ad99c21d9cfd83eddb96Vignesh Venkatasubramanian      if (bit_depth_ == VPX_BITS_8) {
416da49e34c1fb5e99681f4ad99c21d9cfd83eddb96Vignesh Venkatasubramanian        ASM_REGISTER_STATE_CHECK(RunInvTxfm(coeff, dst, pitch_));
417da49e34c1fb5e99681f4ad99c21d9cfd83eddb96Vignesh Venkatasubramanian#if CONFIG_VP9_HIGHBITDEPTH
418da49e34c1fb5e99681f4ad99c21d9cfd83eddb96Vignesh Venkatasubramanian      } else {
419da49e34c1fb5e99681f4ad99c21d9cfd83eddb96Vignesh Venkatasubramanian        ASM_REGISTER_STATE_CHECK(RunInvTxfm(coeff, CONVERT_TO_BYTEPTR(dst16),
420da49e34c1fb5e99681f4ad99c21d9cfd83eddb96Vignesh Venkatasubramanian                                            pitch_));
421da49e34c1fb5e99681f4ad99c21d9cfd83eddb96Vignesh Venkatasubramanian#endif
422da49e34c1fb5e99681f4ad99c21d9cfd83eddb96Vignesh Venkatasubramanian      }
423da49e34c1fb5e99681f4ad99c21d9cfd83eddb96Vignesh Venkatasubramanian
424da49e34c1fb5e99681f4ad99c21d9cfd83eddb96Vignesh Venkatasubramanian      for (int j = 0; j < kNumCoeffs; ++j) {
425da49e34c1fb5e99681f4ad99c21d9cfd83eddb96Vignesh Venkatasubramanian#if CONFIG_VP9_HIGHBITDEPTH
426da49e34c1fb5e99681f4ad99c21d9cfd83eddb96Vignesh Venkatasubramanian        const uint32_t diff =
427da49e34c1fb5e99681f4ad99c21d9cfd83eddb96Vignesh Venkatasubramanian            bit_depth_ == VPX_BITS_8 ? dst[j] - src[j] : dst16[j] - src16[j];
428da49e34c1fb5e99681f4ad99c21d9cfd83eddb96Vignesh Venkatasubramanian#else
429da49e34c1fb5e99681f4ad99c21d9cfd83eddb96Vignesh Venkatasubramanian        const uint32_t diff = dst[j] - src[j];
430da49e34c1fb5e99681f4ad99c21d9cfd83eddb96Vignesh Venkatasubramanian#endif
431da49e34c1fb5e99681f4ad99c21d9cfd83eddb96Vignesh Venkatasubramanian        const uint32_t error = diff * diff;
432da49e34c1fb5e99681f4ad99c21d9cfd83eddb96Vignesh Venkatasubramanian        EXPECT_GE(1u << 2 * (bit_depth_ - 8), error)
433da49e34c1fb5e99681f4ad99c21d9cfd83eddb96Vignesh Venkatasubramanian            << "Error: 8x8 IDCT has error " << error
434da49e34c1fb5e99681f4ad99c21d9cfd83eddb96Vignesh Venkatasubramanian            << " at index " << j;
435da49e34c1fb5e99681f4ad99c21d9cfd83eddb96Vignesh Venkatasubramanian      }
436da49e34c1fb5e99681f4ad99c21d9cfd83eddb96Vignesh Venkatasubramanian    }
437da49e34c1fb5e99681f4ad99c21d9cfd83eddb96Vignesh Venkatasubramanian  }
438da49e34c1fb5e99681f4ad99c21d9cfd83eddb96Vignesh Venkatasubramanian
439da49e34c1fb5e99681f4ad99c21d9cfd83eddb96Vignesh Venkatasubramanian  void RunFwdAccuracyCheck() {
440da49e34c1fb5e99681f4ad99c21d9cfd83eddb96Vignesh Venkatasubramanian    ACMRandom rnd(ACMRandom::DeterministicSeed());
441da49e34c1fb5e99681f4ad99c21d9cfd83eddb96Vignesh Venkatasubramanian    const int count_test_block = 1000;
442da49e34c1fb5e99681f4ad99c21d9cfd83eddb96Vignesh Venkatasubramanian    DECLARE_ALIGNED(16, int16_t, in[kNumCoeffs]);
443da49e34c1fb5e99681f4ad99c21d9cfd83eddb96Vignesh Venkatasubramanian    DECLARE_ALIGNED(16, tran_low_t, coeff_r[kNumCoeffs]);
444da49e34c1fb5e99681f4ad99c21d9cfd83eddb96Vignesh Venkatasubramanian    DECLARE_ALIGNED(16, tran_low_t, coeff[kNumCoeffs]);
445da49e34c1fb5e99681f4ad99c21d9cfd83eddb96Vignesh Venkatasubramanian
446da49e34c1fb5e99681f4ad99c21d9cfd83eddb96Vignesh Venkatasubramanian    for (int i = 0; i < count_test_block; ++i) {
447da49e34c1fb5e99681f4ad99c21d9cfd83eddb96Vignesh Venkatasubramanian      double out_r[kNumCoeffs];
448da49e34c1fb5e99681f4ad99c21d9cfd83eddb96Vignesh Venkatasubramanian
449da49e34c1fb5e99681f4ad99c21d9cfd83eddb96Vignesh Venkatasubramanian      // Initialize a test block with input range [-mask_, mask_].
450da49e34c1fb5e99681f4ad99c21d9cfd83eddb96Vignesh Venkatasubramanian      for (int j = 0; j < kNumCoeffs; ++j)
451da49e34c1fb5e99681f4ad99c21d9cfd83eddb96Vignesh Venkatasubramanian        in[j] = rnd.Rand8() % 2 == 0 ? mask_ : -mask_;
452da49e34c1fb5e99681f4ad99c21d9cfd83eddb96Vignesh Venkatasubramanian
453da49e34c1fb5e99681f4ad99c21d9cfd83eddb96Vignesh Venkatasubramanian      RunFwdTxfm(in, coeff, pitch_);
454da49e34c1fb5e99681f4ad99c21d9cfd83eddb96Vignesh Venkatasubramanian      reference_8x8_dct_2d(in, out_r);
455da49e34c1fb5e99681f4ad99c21d9cfd83eddb96Vignesh Venkatasubramanian      for (int j = 0; j < kNumCoeffs; ++j)
456da49e34c1fb5e99681f4ad99c21d9cfd83eddb96Vignesh Venkatasubramanian        coeff_r[j] = static_cast<tran_low_t>(round(out_r[j]));
457da49e34c1fb5e99681f4ad99c21d9cfd83eddb96Vignesh Venkatasubramanian
458da49e34c1fb5e99681f4ad99c21d9cfd83eddb96Vignesh Venkatasubramanian      for (int j = 0; j < kNumCoeffs; ++j) {
459da49e34c1fb5e99681f4ad99c21d9cfd83eddb96Vignesh Venkatasubramanian        const uint32_t diff = coeff[j] - coeff_r[j];
460da49e34c1fb5e99681f4ad99c21d9cfd83eddb96Vignesh Venkatasubramanian        const uint32_t error = diff * diff;
461da49e34c1fb5e99681f4ad99c21d9cfd83eddb96Vignesh Venkatasubramanian        EXPECT_GE(9u << 2 * (bit_depth_ - 8), error)
462da49e34c1fb5e99681f4ad99c21d9cfd83eddb96Vignesh Venkatasubramanian            << "Error: 8x8 DCT has error " << error
463da49e34c1fb5e99681f4ad99c21d9cfd83eddb96Vignesh Venkatasubramanian            << " at index " << j;
464da49e34c1fb5e99681f4ad99c21d9cfd83eddb96Vignesh Venkatasubramanian      }
465da49e34c1fb5e99681f4ad99c21d9cfd83eddb96Vignesh Venkatasubramanian    }
466da49e34c1fb5e99681f4ad99c21d9cfd83eddb96Vignesh Venkatasubramanian  }
467da49e34c1fb5e99681f4ad99c21d9cfd83eddb96Vignesh Venkatasubramanian
468da49e34c1fb5e99681f4ad99c21d9cfd83eddb96Vignesh Venkatasubramanianvoid CompareInvReference(IdctFunc ref_txfm, int thresh) {
469da49e34c1fb5e99681f4ad99c21d9cfd83eddb96Vignesh Venkatasubramanian    ACMRandom rnd(ACMRandom::DeterministicSeed());
470da49e34c1fb5e99681f4ad99c21d9cfd83eddb96Vignesh Venkatasubramanian    const int count_test_block = 10000;
471da49e34c1fb5e99681f4ad99c21d9cfd83eddb96Vignesh Venkatasubramanian    const int eob = 12;
472da49e34c1fb5e99681f4ad99c21d9cfd83eddb96Vignesh Venkatasubramanian    DECLARE_ALIGNED(16, tran_low_t, coeff[kNumCoeffs]);
473da49e34c1fb5e99681f4ad99c21d9cfd83eddb96Vignesh Venkatasubramanian    DECLARE_ALIGNED(16, uint8_t, dst[kNumCoeffs]);
474da49e34c1fb5e99681f4ad99c21d9cfd83eddb96Vignesh Venkatasubramanian    DECLARE_ALIGNED(16, uint8_t, ref[kNumCoeffs]);
475da49e34c1fb5e99681f4ad99c21d9cfd83eddb96Vignesh Venkatasubramanian#if CONFIG_VP9_HIGHBITDEPTH
476da49e34c1fb5e99681f4ad99c21d9cfd83eddb96Vignesh Venkatasubramanian    DECLARE_ALIGNED(16, uint16_t, dst16[kNumCoeffs]);
477da49e34c1fb5e99681f4ad99c21d9cfd83eddb96Vignesh Venkatasubramanian    DECLARE_ALIGNED(16, uint16_t, ref16[kNumCoeffs]);
478da49e34c1fb5e99681f4ad99c21d9cfd83eddb96Vignesh Venkatasubramanian#endif
479da49e34c1fb5e99681f4ad99c21d9cfd83eddb96Vignesh Venkatasubramanian    const int16_t *scan = vp9_default_scan_orders[TX_8X8].scan;
480da49e34c1fb5e99681f4ad99c21d9cfd83eddb96Vignesh Venkatasubramanian
481da49e34c1fb5e99681f4ad99c21d9cfd83eddb96Vignesh Venkatasubramanian    for (int i = 0; i < count_test_block; ++i) {
482da49e34c1fb5e99681f4ad99c21d9cfd83eddb96Vignesh Venkatasubramanian      for (int j = 0; j < kNumCoeffs; ++j) {
483da49e34c1fb5e99681f4ad99c21d9cfd83eddb96Vignesh Venkatasubramanian        if (j < eob) {
484da49e34c1fb5e99681f4ad99c21d9cfd83eddb96Vignesh Venkatasubramanian          // Random values less than the threshold, either positive or negative
485da49e34c1fb5e99681f4ad99c21d9cfd83eddb96Vignesh Venkatasubramanian          coeff[scan[j]] = rnd(thresh) * (1-2*(i%2));
486da49e34c1fb5e99681f4ad99c21d9cfd83eddb96Vignesh Venkatasubramanian        } else {
487da49e34c1fb5e99681f4ad99c21d9cfd83eddb96Vignesh Venkatasubramanian          coeff[scan[j]] = 0;
488da49e34c1fb5e99681f4ad99c21d9cfd83eddb96Vignesh Venkatasubramanian        }
489da49e34c1fb5e99681f4ad99c21d9cfd83eddb96Vignesh Venkatasubramanian        if (bit_depth_ == VPX_BITS_8) {
490da49e34c1fb5e99681f4ad99c21d9cfd83eddb96Vignesh Venkatasubramanian          dst[j] = 0;
491da49e34c1fb5e99681f4ad99c21d9cfd83eddb96Vignesh Venkatasubramanian          ref[j] = 0;
492da49e34c1fb5e99681f4ad99c21d9cfd83eddb96Vignesh Venkatasubramanian#if CONFIG_VP9_HIGHBITDEPTH
493da49e34c1fb5e99681f4ad99c21d9cfd83eddb96Vignesh Venkatasubramanian        } else {
494da49e34c1fb5e99681f4ad99c21d9cfd83eddb96Vignesh Venkatasubramanian          dst16[j] = 0;
495da49e34c1fb5e99681f4ad99c21d9cfd83eddb96Vignesh Venkatasubramanian          ref16[j] = 0;
496da49e34c1fb5e99681f4ad99c21d9cfd83eddb96Vignesh Venkatasubramanian#endif
497da49e34c1fb5e99681f4ad99c21d9cfd83eddb96Vignesh Venkatasubramanian        }
498da49e34c1fb5e99681f4ad99c21d9cfd83eddb96Vignesh Venkatasubramanian      }
499da49e34c1fb5e99681f4ad99c21d9cfd83eddb96Vignesh Venkatasubramanian      if (bit_depth_ == VPX_BITS_8) {
500da49e34c1fb5e99681f4ad99c21d9cfd83eddb96Vignesh Venkatasubramanian        ref_txfm(coeff, ref, pitch_);
501da49e34c1fb5e99681f4ad99c21d9cfd83eddb96Vignesh Venkatasubramanian        ASM_REGISTER_STATE_CHECK(RunInvTxfm(coeff, dst, pitch_));
502da49e34c1fb5e99681f4ad99c21d9cfd83eddb96Vignesh Venkatasubramanian#if CONFIG_VP9_HIGHBITDEPTH
503da49e34c1fb5e99681f4ad99c21d9cfd83eddb96Vignesh Venkatasubramanian      } else {
504da49e34c1fb5e99681f4ad99c21d9cfd83eddb96Vignesh Venkatasubramanian        ref_txfm(coeff, CONVERT_TO_BYTEPTR(ref16), pitch_);
505da49e34c1fb5e99681f4ad99c21d9cfd83eddb96Vignesh Venkatasubramanian        ASM_REGISTER_STATE_CHECK(RunInvTxfm(coeff, CONVERT_TO_BYTEPTR(dst16),
506da49e34c1fb5e99681f4ad99c21d9cfd83eddb96Vignesh Venkatasubramanian                                            pitch_));
507da49e34c1fb5e99681f4ad99c21d9cfd83eddb96Vignesh Venkatasubramanian#endif
508da49e34c1fb5e99681f4ad99c21d9cfd83eddb96Vignesh Venkatasubramanian      }
509da49e34c1fb5e99681f4ad99c21d9cfd83eddb96Vignesh Venkatasubramanian
510da49e34c1fb5e99681f4ad99c21d9cfd83eddb96Vignesh Venkatasubramanian      for (int j = 0; j < kNumCoeffs; ++j) {
511da49e34c1fb5e99681f4ad99c21d9cfd83eddb96Vignesh Venkatasubramanian#if CONFIG_VP9_HIGHBITDEPTH
512da49e34c1fb5e99681f4ad99c21d9cfd83eddb96Vignesh Venkatasubramanian        const uint32_t diff =
513da49e34c1fb5e99681f4ad99c21d9cfd83eddb96Vignesh Venkatasubramanian            bit_depth_ == VPX_BITS_8 ? dst[j] - ref[j] : dst16[j] - ref16[j];
514da49e34c1fb5e99681f4ad99c21d9cfd83eddb96Vignesh Venkatasubramanian#else
515da49e34c1fb5e99681f4ad99c21d9cfd83eddb96Vignesh Venkatasubramanian        const uint32_t diff = dst[j] - ref[j];
516da49e34c1fb5e99681f4ad99c21d9cfd83eddb96Vignesh Venkatasubramanian#endif
517da49e34c1fb5e99681f4ad99c21d9cfd83eddb96Vignesh Venkatasubramanian        const uint32_t error = diff * diff;
518da49e34c1fb5e99681f4ad99c21d9cfd83eddb96Vignesh Venkatasubramanian        EXPECT_EQ(0u, error)
519da49e34c1fb5e99681f4ad99c21d9cfd83eddb96Vignesh Venkatasubramanian            << "Error: 8x8 IDCT has error " << error
520da49e34c1fb5e99681f4ad99c21d9cfd83eddb96Vignesh Venkatasubramanian            << " at index " << j;
521da49e34c1fb5e99681f4ad99c21d9cfd83eddb96Vignesh Venkatasubramanian      }
522da49e34c1fb5e99681f4ad99c21d9cfd83eddb96Vignesh Venkatasubramanian    }
523da49e34c1fb5e99681f4ad99c21d9cfd83eddb96Vignesh Venkatasubramanian  }
5245ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  int pitch_;
5255ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  int tx_type_;
526ba6c59e9d7d7013b3906b6f4230b663422681848Vignesh Venkatasubramanian  FhtFunc fwd_txfm_ref;
527da49e34c1fb5e99681f4ad99c21d9cfd83eddb96Vignesh Venkatasubramanian  vpx_bit_depth_t bit_depth_;
528da49e34c1fb5e99681f4ad99c21d9cfd83eddb96Vignesh Venkatasubramanian  int mask_;
5295ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang};
530ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang
5312ec72e65689c948e92b826ae1e867bf369e72f13Vignesh Venkatasubramanianclass FwdTrans8x8DCT
5322ec72e65689c948e92b826ae1e867bf369e72f13Vignesh Venkatasubramanian    : public FwdTrans8x8TestBase,
533ba6c59e9d7d7013b3906b6f4230b663422681848Vignesh Venkatasubramanian      public ::testing::TestWithParam<Dct8x8Param> {
5345ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang public:
5355ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  virtual ~FwdTrans8x8DCT() {}
5365ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
5375ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  virtual void SetUp() {
5385ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    fwd_txfm_ = GET_PARAM(0);
5395ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    inv_txfm_ = GET_PARAM(1);
5405ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    tx_type_  = GET_PARAM(2);
5415ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    pitch_    = 8;
5425ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    fwd_txfm_ref = fdct8x8_ref;
543da49e34c1fb5e99681f4ad99c21d9cfd83eddb96Vignesh Venkatasubramanian    bit_depth_ = GET_PARAM(3);
544da49e34c1fb5e99681f4ad99c21d9cfd83eddb96Vignesh Venkatasubramanian    mask_ = (1 << bit_depth_) - 1;
5455ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  }
5465ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
5475ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  virtual void TearDown() { libvpx_test::ClearSystemState(); }
5485ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
5495ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang protected:
550da49e34c1fb5e99681f4ad99c21d9cfd83eddb96Vignesh Venkatasubramanian  void RunFwdTxfm(int16_t *in, tran_low_t *out, int stride) {
5515ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    fwd_txfm_(in, out, stride);
5525ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  }
553da49e34c1fb5e99681f4ad99c21d9cfd83eddb96Vignesh Venkatasubramanian  void RunInvTxfm(tran_low_t *out, uint8_t *dst, int stride) {
5545ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    inv_txfm_(out, dst, stride);
555ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang  }
5565ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
557ba6c59e9d7d7013b3906b6f4230b663422681848Vignesh Venkatasubramanian  FdctFunc fwd_txfm_;
558ba6c59e9d7d7013b3906b6f4230b663422681848Vignesh Venkatasubramanian  IdctFunc inv_txfm_;
5595ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang};
5605ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
5615ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuangTEST_P(FwdTrans8x8DCT, SignBiasCheck) {
5625ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  RunSignBiasCheck();
56391037db265ecdd914a26e056cf69207b4f50924ehkuang}
564ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang
5655ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuangTEST_P(FwdTrans8x8DCT, RoundTripErrorCheck) {
5665ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  RunRoundTripErrorCheck();
5675ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang}
5685ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
5695ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuangTEST_P(FwdTrans8x8DCT, ExtremalCheck) {
5705ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  RunExtremalCheck();
5715ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang}
5725ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
573da49e34c1fb5e99681f4ad99c21d9cfd83eddb96Vignesh VenkatasubramanianTEST_P(FwdTrans8x8DCT, FwdAccuracyCheck) {
574da49e34c1fb5e99681f4ad99c21d9cfd83eddb96Vignesh Venkatasubramanian  RunFwdAccuracyCheck();
575da49e34c1fb5e99681f4ad99c21d9cfd83eddb96Vignesh Venkatasubramanian}
576da49e34c1fb5e99681f4ad99c21d9cfd83eddb96Vignesh Venkatasubramanian
577da49e34c1fb5e99681f4ad99c21d9cfd83eddb96Vignesh VenkatasubramanianTEST_P(FwdTrans8x8DCT, InvAccuracyCheck) {
578da49e34c1fb5e99681f4ad99c21d9cfd83eddb96Vignesh Venkatasubramanian  RunInvAccuracyCheck();
579da49e34c1fb5e99681f4ad99c21d9cfd83eddb96Vignesh Venkatasubramanian}
580da49e34c1fb5e99681f4ad99c21d9cfd83eddb96Vignesh Venkatasubramanian
5812ec72e65689c948e92b826ae1e867bf369e72f13Vignesh Venkatasubramanianclass FwdTrans8x8HT
5822ec72e65689c948e92b826ae1e867bf369e72f13Vignesh Venkatasubramanian    : public FwdTrans8x8TestBase,
583ba6c59e9d7d7013b3906b6f4230b663422681848Vignesh Venkatasubramanian      public ::testing::TestWithParam<Ht8x8Param> {
5845ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang public:
5855ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  virtual ~FwdTrans8x8HT() {}
5865ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
5875ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  virtual void SetUp() {
5885ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    fwd_txfm_ = GET_PARAM(0);
5895ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    inv_txfm_ = GET_PARAM(1);
5905ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    tx_type_  = GET_PARAM(2);
5915ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    pitch_    = 8;
5925ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    fwd_txfm_ref = fht8x8_ref;
593da49e34c1fb5e99681f4ad99c21d9cfd83eddb96Vignesh Venkatasubramanian    bit_depth_ = GET_PARAM(3);
594da49e34c1fb5e99681f4ad99c21d9cfd83eddb96Vignesh Venkatasubramanian    mask_ = (1 << bit_depth_) - 1;
5955ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  }
5965ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
5975ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  virtual void TearDown() { libvpx_test::ClearSystemState(); }
5985ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
5995ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang protected:
600da49e34c1fb5e99681f4ad99c21d9cfd83eddb96Vignesh Venkatasubramanian  void RunFwdTxfm(int16_t *in, tran_low_t *out, int stride) {
6015ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    fwd_txfm_(in, out, stride, tx_type_);
6025ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  }
603da49e34c1fb5e99681f4ad99c21d9cfd83eddb96Vignesh Venkatasubramanian  void RunInvTxfm(tran_low_t *out, uint8_t *dst, int stride) {
6045ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    inv_txfm_(out, dst, stride, tx_type_);
6055ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  }
6065ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
607ba6c59e9d7d7013b3906b6f4230b663422681848Vignesh Venkatasubramanian  FhtFunc fwd_txfm_;
608ba6c59e9d7d7013b3906b6f4230b663422681848Vignesh Venkatasubramanian  IhtFunc inv_txfm_;
6095ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang};
6105ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
6115ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuangTEST_P(FwdTrans8x8HT, SignBiasCheck) {
6125ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  RunSignBiasCheck();
6135ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang}
6145ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
6155ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuangTEST_P(FwdTrans8x8HT, RoundTripErrorCheck) {
6165ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  RunRoundTripErrorCheck();
6175ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang}
6185ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
6195ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuangTEST_P(FwdTrans8x8HT, ExtremalCheck) {
6205ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  RunExtremalCheck();
6215ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang}
6225ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
623da49e34c1fb5e99681f4ad99c21d9cfd83eddb96Vignesh Venkatasubramanianclass InvTrans8x8DCT
624da49e34c1fb5e99681f4ad99c21d9cfd83eddb96Vignesh Venkatasubramanian    : public FwdTrans8x8TestBase,
625da49e34c1fb5e99681f4ad99c21d9cfd83eddb96Vignesh Venkatasubramanian      public ::testing::TestWithParam<Idct8x8Param> {
626da49e34c1fb5e99681f4ad99c21d9cfd83eddb96Vignesh Venkatasubramanian public:
627da49e34c1fb5e99681f4ad99c21d9cfd83eddb96Vignesh Venkatasubramanian  virtual ~InvTrans8x8DCT() {}
628da49e34c1fb5e99681f4ad99c21d9cfd83eddb96Vignesh Venkatasubramanian
629da49e34c1fb5e99681f4ad99c21d9cfd83eddb96Vignesh Venkatasubramanian  virtual void SetUp() {
630da49e34c1fb5e99681f4ad99c21d9cfd83eddb96Vignesh Venkatasubramanian    ref_txfm_ = GET_PARAM(0);
631da49e34c1fb5e99681f4ad99c21d9cfd83eddb96Vignesh Venkatasubramanian    inv_txfm_ = GET_PARAM(1);
632da49e34c1fb5e99681f4ad99c21d9cfd83eddb96Vignesh Venkatasubramanian    thresh_ = GET_PARAM(2);
633da49e34c1fb5e99681f4ad99c21d9cfd83eddb96Vignesh Venkatasubramanian    pitch_ = 8;
634da49e34c1fb5e99681f4ad99c21d9cfd83eddb96Vignesh Venkatasubramanian    bit_depth_ = GET_PARAM(3);
635da49e34c1fb5e99681f4ad99c21d9cfd83eddb96Vignesh Venkatasubramanian    mask_ = (1 << bit_depth_) - 1;
636da49e34c1fb5e99681f4ad99c21d9cfd83eddb96Vignesh Venkatasubramanian  }
637da49e34c1fb5e99681f4ad99c21d9cfd83eddb96Vignesh Venkatasubramanian
638da49e34c1fb5e99681f4ad99c21d9cfd83eddb96Vignesh Venkatasubramanian  virtual void TearDown() { libvpx_test::ClearSystemState(); }
639da49e34c1fb5e99681f4ad99c21d9cfd83eddb96Vignesh Venkatasubramanian
640da49e34c1fb5e99681f4ad99c21d9cfd83eddb96Vignesh Venkatasubramanian protected:
641da49e34c1fb5e99681f4ad99c21d9cfd83eddb96Vignesh Venkatasubramanian  void RunInvTxfm(tran_low_t *out, uint8_t *dst, int stride) {
642da49e34c1fb5e99681f4ad99c21d9cfd83eddb96Vignesh Venkatasubramanian    inv_txfm_(out, dst, stride);
643da49e34c1fb5e99681f4ad99c21d9cfd83eddb96Vignesh Venkatasubramanian  }
644da49e34c1fb5e99681f4ad99c21d9cfd83eddb96Vignesh Venkatasubramanian  void RunFwdTxfm(int16_t *out, tran_low_t *dst, int stride) {}
645da49e34c1fb5e99681f4ad99c21d9cfd83eddb96Vignesh Venkatasubramanian
646da49e34c1fb5e99681f4ad99c21d9cfd83eddb96Vignesh Venkatasubramanian  IdctFunc ref_txfm_;
647da49e34c1fb5e99681f4ad99c21d9cfd83eddb96Vignesh Venkatasubramanian  IdctFunc inv_txfm_;
648da49e34c1fb5e99681f4ad99c21d9cfd83eddb96Vignesh Venkatasubramanian  int thresh_;
649da49e34c1fb5e99681f4ad99c21d9cfd83eddb96Vignesh Venkatasubramanian};
650da49e34c1fb5e99681f4ad99c21d9cfd83eddb96Vignesh Venkatasubramanian
651da49e34c1fb5e99681f4ad99c21d9cfd83eddb96Vignesh VenkatasubramanianTEST_P(InvTrans8x8DCT, CompareReference) {
652da49e34c1fb5e99681f4ad99c21d9cfd83eddb96Vignesh Venkatasubramanian  CompareInvReference(ref_txfm_, thresh_);
653da49e34c1fb5e99681f4ad99c21d9cfd83eddb96Vignesh Venkatasubramanian}
654da49e34c1fb5e99681f4ad99c21d9cfd83eddb96Vignesh Venkatasubramanian
6555ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuangusing std::tr1::make_tuple;
6565ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
657da49e34c1fb5e99681f4ad99c21d9cfd83eddb96Vignesh Venkatasubramanian#if CONFIG_VP9_HIGHBITDEPTH
658da49e34c1fb5e99681f4ad99c21d9cfd83eddb96Vignesh VenkatasubramanianINSTANTIATE_TEST_CASE_P(
659da49e34c1fb5e99681f4ad99c21d9cfd83eddb96Vignesh Venkatasubramanian    C, FwdTrans8x8DCT,
660da49e34c1fb5e99681f4ad99c21d9cfd83eddb96Vignesh Venkatasubramanian    ::testing::Values(
661da49e34c1fb5e99681f4ad99c21d9cfd83eddb96Vignesh Venkatasubramanian        make_tuple(&vpx_fdct8x8_c, &vpx_idct8x8_64_add_c, 0, VPX_BITS_8),
662da49e34c1fb5e99681f4ad99c21d9cfd83eddb96Vignesh Venkatasubramanian        make_tuple(&vpx_highbd_fdct8x8_c, &idct8x8_10, 0, VPX_BITS_10),
663da49e34c1fb5e99681f4ad99c21d9cfd83eddb96Vignesh Venkatasubramanian        make_tuple(&vpx_highbd_fdct8x8_c, &idct8x8_12, 0, VPX_BITS_12)));
664da49e34c1fb5e99681f4ad99c21d9cfd83eddb96Vignesh Venkatasubramanian#else
6655ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuangINSTANTIATE_TEST_CASE_P(
6665ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    C, FwdTrans8x8DCT,
6675ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    ::testing::Values(
668da49e34c1fb5e99681f4ad99c21d9cfd83eddb96Vignesh Venkatasubramanian        make_tuple(&vpx_fdct8x8_c, &vpx_idct8x8_64_add_c, 0, VPX_BITS_8)));
669da49e34c1fb5e99681f4ad99c21d9cfd83eddb96Vignesh Venkatasubramanian#endif  // CONFIG_VP9_HIGHBITDEPTH
670da49e34c1fb5e99681f4ad99c21d9cfd83eddb96Vignesh Venkatasubramanian
671da49e34c1fb5e99681f4ad99c21d9cfd83eddb96Vignesh Venkatasubramanian#if CONFIG_VP9_HIGHBITDEPTH
672da49e34c1fb5e99681f4ad99c21d9cfd83eddb96Vignesh VenkatasubramanianINSTANTIATE_TEST_CASE_P(
673da49e34c1fb5e99681f4ad99c21d9cfd83eddb96Vignesh Venkatasubramanian    C, FwdTrans8x8HT,
674da49e34c1fb5e99681f4ad99c21d9cfd83eddb96Vignesh Venkatasubramanian    ::testing::Values(
675da49e34c1fb5e99681f4ad99c21d9cfd83eddb96Vignesh Venkatasubramanian        make_tuple(&vp9_fht8x8_c, &vp9_iht8x8_64_add_c, 0, VPX_BITS_8),
676da49e34c1fb5e99681f4ad99c21d9cfd83eddb96Vignesh Venkatasubramanian        make_tuple(&vp9_highbd_fht8x8_c, &iht8x8_10, 0, VPX_BITS_10),
677da49e34c1fb5e99681f4ad99c21d9cfd83eddb96Vignesh Venkatasubramanian        make_tuple(&vp9_highbd_fht8x8_c, &iht8x8_10, 1, VPX_BITS_10),
678da49e34c1fb5e99681f4ad99c21d9cfd83eddb96Vignesh Venkatasubramanian        make_tuple(&vp9_highbd_fht8x8_c, &iht8x8_10, 2, VPX_BITS_10),
679da49e34c1fb5e99681f4ad99c21d9cfd83eddb96Vignesh Venkatasubramanian        make_tuple(&vp9_highbd_fht8x8_c, &iht8x8_10, 3, VPX_BITS_10),
680da49e34c1fb5e99681f4ad99c21d9cfd83eddb96Vignesh Venkatasubramanian        make_tuple(&vp9_highbd_fht8x8_c, &iht8x8_12, 0, VPX_BITS_12),
681da49e34c1fb5e99681f4ad99c21d9cfd83eddb96Vignesh Venkatasubramanian        make_tuple(&vp9_highbd_fht8x8_c, &iht8x8_12, 1, VPX_BITS_12),
682da49e34c1fb5e99681f4ad99c21d9cfd83eddb96Vignesh Venkatasubramanian        make_tuple(&vp9_highbd_fht8x8_c, &iht8x8_12, 2, VPX_BITS_12),
683da49e34c1fb5e99681f4ad99c21d9cfd83eddb96Vignesh Venkatasubramanian        make_tuple(&vp9_highbd_fht8x8_c, &iht8x8_12, 3, VPX_BITS_12),
684da49e34c1fb5e99681f4ad99c21d9cfd83eddb96Vignesh Venkatasubramanian        make_tuple(&vp9_fht8x8_c, &vp9_iht8x8_64_add_c, 1, VPX_BITS_8),
685da49e34c1fb5e99681f4ad99c21d9cfd83eddb96Vignesh Venkatasubramanian        make_tuple(&vp9_fht8x8_c, &vp9_iht8x8_64_add_c, 2, VPX_BITS_8),
686da49e34c1fb5e99681f4ad99c21d9cfd83eddb96Vignesh Venkatasubramanian        make_tuple(&vp9_fht8x8_c, &vp9_iht8x8_64_add_c, 3, VPX_BITS_8)));
687da49e34c1fb5e99681f4ad99c21d9cfd83eddb96Vignesh Venkatasubramanian#else
6885ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuangINSTANTIATE_TEST_CASE_P(
6895ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    C, FwdTrans8x8HT,
6905ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    ::testing::Values(
691da49e34c1fb5e99681f4ad99c21d9cfd83eddb96Vignesh Venkatasubramanian        make_tuple(&vp9_fht8x8_c, &vp9_iht8x8_64_add_c, 0, VPX_BITS_8),
692da49e34c1fb5e99681f4ad99c21d9cfd83eddb96Vignesh Venkatasubramanian        make_tuple(&vp9_fht8x8_c, &vp9_iht8x8_64_add_c, 1, VPX_BITS_8),
693da49e34c1fb5e99681f4ad99c21d9cfd83eddb96Vignesh Venkatasubramanian        make_tuple(&vp9_fht8x8_c, &vp9_iht8x8_64_add_c, 2, VPX_BITS_8),
694da49e34c1fb5e99681f4ad99c21d9cfd83eddb96Vignesh Venkatasubramanian        make_tuple(&vp9_fht8x8_c, &vp9_iht8x8_64_add_c, 3, VPX_BITS_8)));
695da49e34c1fb5e99681f4ad99c21d9cfd83eddb96Vignesh Venkatasubramanian#endif  // CONFIG_VP9_HIGHBITDEPTH
6962ec72e65689c948e92b826ae1e867bf369e72f13Vignesh Venkatasubramanian
697da49e34c1fb5e99681f4ad99c21d9cfd83eddb96Vignesh Venkatasubramanian#if HAVE_NEON_ASM && !CONFIG_VP9_HIGHBITDEPTH && !CONFIG_EMULATE_HARDWARE
6982ec72e65689c948e92b826ae1e867bf369e72f13Vignesh VenkatasubramanianINSTANTIATE_TEST_CASE_P(
6992ec72e65689c948e92b826ae1e867bf369e72f13Vignesh Venkatasubramanian    NEON, FwdTrans8x8DCT,
7002ec72e65689c948e92b826ae1e867bf369e72f13Vignesh Venkatasubramanian    ::testing::Values(
701da49e34c1fb5e99681f4ad99c21d9cfd83eddb96Vignesh Venkatasubramanian        make_tuple(&vpx_fdct8x8_neon, &vpx_idct8x8_64_add_neon, 0,
702da49e34c1fb5e99681f4ad99c21d9cfd83eddb96Vignesh Venkatasubramanian                   VPX_BITS_8)));
703da49e34c1fb5e99681f4ad99c21d9cfd83eddb96Vignesh Venkatasubramanian#endif  // HAVE_NEON_ASM && !CONFIG_VP9_HIGHBITDEPTH && !CONFIG_EMULATE_HARDWARE
704da49e34c1fb5e99681f4ad99c21d9cfd83eddb96Vignesh Venkatasubramanian
705da49e34c1fb5e99681f4ad99c21d9cfd83eddb96Vignesh Venkatasubramanian#if HAVE_NEON && !CONFIG_VP9_HIGHBITDEPTH && !CONFIG_EMULATE_HARDWARE
7062ec72e65689c948e92b826ae1e867bf369e72f13Vignesh VenkatasubramanianINSTANTIATE_TEST_CASE_P(
707da49e34c1fb5e99681f4ad99c21d9cfd83eddb96Vignesh Venkatasubramanian    NEON, FwdTrans8x8HT,
7082ec72e65689c948e92b826ae1e867bf369e72f13Vignesh Venkatasubramanian    ::testing::Values(
709da49e34c1fb5e99681f4ad99c21d9cfd83eddb96Vignesh Venkatasubramanian        make_tuple(&vp9_fht8x8_c, &vp9_iht8x8_64_add_neon, 0, VPX_BITS_8),
710da49e34c1fb5e99681f4ad99c21d9cfd83eddb96Vignesh Venkatasubramanian        make_tuple(&vp9_fht8x8_c, &vp9_iht8x8_64_add_neon, 1, VPX_BITS_8),
711da49e34c1fb5e99681f4ad99c21d9cfd83eddb96Vignesh Venkatasubramanian        make_tuple(&vp9_fht8x8_c, &vp9_iht8x8_64_add_neon, 2, VPX_BITS_8),
712da49e34c1fb5e99681f4ad99c21d9cfd83eddb96Vignesh Venkatasubramanian        make_tuple(&vp9_fht8x8_c, &vp9_iht8x8_64_add_neon, 3, VPX_BITS_8)));
713da49e34c1fb5e99681f4ad99c21d9cfd83eddb96Vignesh Venkatasubramanian#endif  // HAVE_NEON && !CONFIG_VP9_HIGHBITDEPTH && !CONFIG_EMULATE_HARDWARE
7145ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
715da49e34c1fb5e99681f4ad99c21d9cfd83eddb96Vignesh Venkatasubramanian#if HAVE_SSE2 && !CONFIG_VP9_HIGHBITDEPTH && !CONFIG_EMULATE_HARDWARE
7165ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuangINSTANTIATE_TEST_CASE_P(
7175ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    SSE2, FwdTrans8x8DCT,
7185ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    ::testing::Values(
719da49e34c1fb5e99681f4ad99c21d9cfd83eddb96Vignesh Venkatasubramanian        make_tuple(&vpx_fdct8x8_sse2, &vpx_idct8x8_64_add_sse2, 0,
720da49e34c1fb5e99681f4ad99c21d9cfd83eddb96Vignesh Venkatasubramanian                   VPX_BITS_8)));
7215ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuangINSTANTIATE_TEST_CASE_P(
7225ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    SSE2, FwdTrans8x8HT,
7235ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    ::testing::Values(
724da49e34c1fb5e99681f4ad99c21d9cfd83eddb96Vignesh Venkatasubramanian        make_tuple(&vp9_fht8x8_sse2, &vp9_iht8x8_64_add_sse2, 0, VPX_BITS_8),
725da49e34c1fb5e99681f4ad99c21d9cfd83eddb96Vignesh Venkatasubramanian        make_tuple(&vp9_fht8x8_sse2, &vp9_iht8x8_64_add_sse2, 1, VPX_BITS_8),
726da49e34c1fb5e99681f4ad99c21d9cfd83eddb96Vignesh Venkatasubramanian        make_tuple(&vp9_fht8x8_sse2, &vp9_iht8x8_64_add_sse2, 2, VPX_BITS_8),
727da49e34c1fb5e99681f4ad99c21d9cfd83eddb96Vignesh Venkatasubramanian        make_tuple(&vp9_fht8x8_sse2, &vp9_iht8x8_64_add_sse2, 3, VPX_BITS_8)));
728da49e34c1fb5e99681f4ad99c21d9cfd83eddb96Vignesh Venkatasubramanian#endif  // HAVE_SSE2 && !CONFIG_VP9_HIGHBITDEPTH && !CONFIG_EMULATE_HARDWARE
729da49e34c1fb5e99681f4ad99c21d9cfd83eddb96Vignesh Venkatasubramanian
730da49e34c1fb5e99681f4ad99c21d9cfd83eddb96Vignesh Venkatasubramanian#if HAVE_SSE2 && CONFIG_VP9_HIGHBITDEPTH && !CONFIG_EMULATE_HARDWARE
731da49e34c1fb5e99681f4ad99c21d9cfd83eddb96Vignesh VenkatasubramanianINSTANTIATE_TEST_CASE_P(
732da49e34c1fb5e99681f4ad99c21d9cfd83eddb96Vignesh Venkatasubramanian    SSE2, FwdTrans8x8DCT,
733da49e34c1fb5e99681f4ad99c21d9cfd83eddb96Vignesh Venkatasubramanian    ::testing::Values(
734da49e34c1fb5e99681f4ad99c21d9cfd83eddb96Vignesh Venkatasubramanian        make_tuple(&vpx_fdct8x8_sse2, &vpx_idct8x8_64_add_c, 0, VPX_BITS_8),
735da49e34c1fb5e99681f4ad99c21d9cfd83eddb96Vignesh Venkatasubramanian        make_tuple(&vpx_highbd_fdct8x8_c,
736da49e34c1fb5e99681f4ad99c21d9cfd83eddb96Vignesh Venkatasubramanian                   &idct8x8_64_add_10_sse2, 12, VPX_BITS_10),
737da49e34c1fb5e99681f4ad99c21d9cfd83eddb96Vignesh Venkatasubramanian        make_tuple(&vpx_highbd_fdct8x8_sse2,
738da49e34c1fb5e99681f4ad99c21d9cfd83eddb96Vignesh Venkatasubramanian                   &idct8x8_64_add_10_sse2, 12, VPX_BITS_10),
739da49e34c1fb5e99681f4ad99c21d9cfd83eddb96Vignesh Venkatasubramanian        make_tuple(&vpx_highbd_fdct8x8_c,
740da49e34c1fb5e99681f4ad99c21d9cfd83eddb96Vignesh Venkatasubramanian                   &idct8x8_64_add_12_sse2, 12, VPX_BITS_12),
741da49e34c1fb5e99681f4ad99c21d9cfd83eddb96Vignesh Venkatasubramanian        make_tuple(&vpx_highbd_fdct8x8_sse2,
742da49e34c1fb5e99681f4ad99c21d9cfd83eddb96Vignesh Venkatasubramanian                   &idct8x8_64_add_12_sse2, 12, VPX_BITS_12)));
743ba6c59e9d7d7013b3906b6f4230b663422681848Vignesh Venkatasubramanian
744da49e34c1fb5e99681f4ad99c21d9cfd83eddb96Vignesh VenkatasubramanianINSTANTIATE_TEST_CASE_P(
745da49e34c1fb5e99681f4ad99c21d9cfd83eddb96Vignesh Venkatasubramanian    SSE2, FwdTrans8x8HT,
746da49e34c1fb5e99681f4ad99c21d9cfd83eddb96Vignesh Venkatasubramanian    ::testing::Values(
747da49e34c1fb5e99681f4ad99c21d9cfd83eddb96Vignesh Venkatasubramanian        make_tuple(&vp9_fht8x8_sse2, &vp9_iht8x8_64_add_c, 0, VPX_BITS_8),
748da49e34c1fb5e99681f4ad99c21d9cfd83eddb96Vignesh Venkatasubramanian        make_tuple(&vp9_fht8x8_sse2, &vp9_iht8x8_64_add_c, 1, VPX_BITS_8),
749da49e34c1fb5e99681f4ad99c21d9cfd83eddb96Vignesh Venkatasubramanian        make_tuple(&vp9_fht8x8_sse2, &vp9_iht8x8_64_add_c, 2, VPX_BITS_8),
750da49e34c1fb5e99681f4ad99c21d9cfd83eddb96Vignesh Venkatasubramanian        make_tuple(&vp9_fht8x8_sse2, &vp9_iht8x8_64_add_c, 3, VPX_BITS_8)));
751da49e34c1fb5e99681f4ad99c21d9cfd83eddb96Vignesh Venkatasubramanian
752da49e34c1fb5e99681f4ad99c21d9cfd83eddb96Vignesh Venkatasubramanian// Optimizations take effect at a threshold of 6201, so we use a value close to
753da49e34c1fb5e99681f4ad99c21d9cfd83eddb96Vignesh Venkatasubramanian// that to test both branches.
754da49e34c1fb5e99681f4ad99c21d9cfd83eddb96Vignesh VenkatasubramanianINSTANTIATE_TEST_CASE_P(
755da49e34c1fb5e99681f4ad99c21d9cfd83eddb96Vignesh Venkatasubramanian    SSE2, InvTrans8x8DCT,
756da49e34c1fb5e99681f4ad99c21d9cfd83eddb96Vignesh Venkatasubramanian    ::testing::Values(
757da49e34c1fb5e99681f4ad99c21d9cfd83eddb96Vignesh Venkatasubramanian        make_tuple(&idct8x8_10_add_10_c,
758da49e34c1fb5e99681f4ad99c21d9cfd83eddb96Vignesh Venkatasubramanian                   &idct8x8_10_add_10_sse2, 6225, VPX_BITS_10),
759da49e34c1fb5e99681f4ad99c21d9cfd83eddb96Vignesh Venkatasubramanian        make_tuple(&idct8x8_10,
760da49e34c1fb5e99681f4ad99c21d9cfd83eddb96Vignesh Venkatasubramanian                   &idct8x8_64_add_10_sse2, 6225, VPX_BITS_10),
761da49e34c1fb5e99681f4ad99c21d9cfd83eddb96Vignesh Venkatasubramanian        make_tuple(&idct8x8_10_add_12_c,
762da49e34c1fb5e99681f4ad99c21d9cfd83eddb96Vignesh Venkatasubramanian                   &idct8x8_10_add_12_sse2, 6225, VPX_BITS_12),
763da49e34c1fb5e99681f4ad99c21d9cfd83eddb96Vignesh Venkatasubramanian        make_tuple(&idct8x8_12,
764da49e34c1fb5e99681f4ad99c21d9cfd83eddb96Vignesh Venkatasubramanian                   &idct8x8_64_add_12_sse2, 6225, VPX_BITS_12)));
765da49e34c1fb5e99681f4ad99c21d9cfd83eddb96Vignesh Venkatasubramanian#endif  // HAVE_SSE2 && CONFIG_VP9_HIGHBITDEPTH && !CONFIG_EMULATE_HARDWARE
766da49e34c1fb5e99681f4ad99c21d9cfd83eddb96Vignesh Venkatasubramanian
767da49e34c1fb5e99681f4ad99c21d9cfd83eddb96Vignesh Venkatasubramanian#if HAVE_SSSE3 && CONFIG_USE_X86INC && ARCH_X86_64 && \
768da49e34c1fb5e99681f4ad99c21d9cfd83eddb96Vignesh Venkatasubramanian    !CONFIG_VP9_HIGHBITDEPTH && !CONFIG_EMULATE_HARDWARE
769ba6c59e9d7d7013b3906b6f4230b663422681848Vignesh VenkatasubramanianINSTANTIATE_TEST_CASE_P(
770ba6c59e9d7d7013b3906b6f4230b663422681848Vignesh Venkatasubramanian    SSSE3, FwdTrans8x8DCT,
771ba6c59e9d7d7013b3906b6f4230b663422681848Vignesh Venkatasubramanian    ::testing::Values(
772da49e34c1fb5e99681f4ad99c21d9cfd83eddb96Vignesh Venkatasubramanian        make_tuple(&vpx_fdct8x8_ssse3, &vpx_idct8x8_64_add_ssse3, 0,
773da49e34c1fb5e99681f4ad99c21d9cfd83eddb96Vignesh Venkatasubramanian                   VPX_BITS_8)));
774ba6c59e9d7d7013b3906b6f4230b663422681848Vignesh Venkatasubramanian#endif
775da49e34c1fb5e99681f4ad99c21d9cfd83eddb96Vignesh Venkatasubramanian
776da49e34c1fb5e99681f4ad99c21d9cfd83eddb96Vignesh Venkatasubramanian#if HAVE_MSA && !CONFIG_VP9_HIGHBITDEPTH && !CONFIG_EMULATE_HARDWARE
777da49e34c1fb5e99681f4ad99c21d9cfd83eddb96Vignesh VenkatasubramanianINSTANTIATE_TEST_CASE_P(
778da49e34c1fb5e99681f4ad99c21d9cfd83eddb96Vignesh Venkatasubramanian    MSA, FwdTrans8x8DCT,
779da49e34c1fb5e99681f4ad99c21d9cfd83eddb96Vignesh Venkatasubramanian    ::testing::Values(
780da49e34c1fb5e99681f4ad99c21d9cfd83eddb96Vignesh Venkatasubramanian        make_tuple(&vpx_fdct8x8_msa, &vpx_idct8x8_64_add_msa, 0, VPX_BITS_8)));
781da49e34c1fb5e99681f4ad99c21d9cfd83eddb96Vignesh VenkatasubramanianINSTANTIATE_TEST_CASE_P(
782da49e34c1fb5e99681f4ad99c21d9cfd83eddb96Vignesh Venkatasubramanian    MSA, FwdTrans8x8HT,
783da49e34c1fb5e99681f4ad99c21d9cfd83eddb96Vignesh Venkatasubramanian    ::testing::Values(
784da49e34c1fb5e99681f4ad99c21d9cfd83eddb96Vignesh Venkatasubramanian        make_tuple(&vp9_fht8x8_msa, &vp9_iht8x8_64_add_msa, 0, VPX_BITS_8),
785da49e34c1fb5e99681f4ad99c21d9cfd83eddb96Vignesh Venkatasubramanian        make_tuple(&vp9_fht8x8_msa, &vp9_iht8x8_64_add_msa, 1, VPX_BITS_8),
786da49e34c1fb5e99681f4ad99c21d9cfd83eddb96Vignesh Venkatasubramanian        make_tuple(&vp9_fht8x8_msa, &vp9_iht8x8_64_add_msa, 2, VPX_BITS_8),
787da49e34c1fb5e99681f4ad99c21d9cfd83eddb96Vignesh Venkatasubramanian        make_tuple(&vp9_fht8x8_msa, &vp9_iht8x8_64_add_msa, 3, VPX_BITS_8)));
788da49e34c1fb5e99681f4ad99c21d9cfd83eddb96Vignesh Venkatasubramanian#endif  // HAVE_MSA && !CONFIG_VP9_HIGHBITDEPTH && !CONFIG_EMULATE_HARDWARE
789ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang}  // namespace
790