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