16fefe538d859300e7febe78271828198c10f1b52fgalligan@chromium.org/* 26fefe538d859300e7febe78271828198c10f1b52fgalligan@chromium.org * Copyright (c) 2012 The WebM project authors. All Rights Reserved. 36fefe538d859300e7febe78271828198c10f1b52fgalligan@chromium.org * 46fefe538d859300e7febe78271828198c10f1b52fgalligan@chromium.org * Use of this source code is governed by a BSD-style license 56fefe538d859300e7febe78271828198c10f1b52fgalligan@chromium.org * that can be found in the LICENSE file in the root of the source 66fefe538d859300e7febe78271828198c10f1b52fgalligan@chromium.org * tree. An additional intellectual property rights grant can be found 76fefe538d859300e7febe78271828198c10f1b52fgalligan@chromium.org * in the file PATENTS. All contributing project authors may 86fefe538d859300e7febe78271828198c10f1b52fgalligan@chromium.org * be found in the AUTHORS file in the root of the source tree. 96fefe538d859300e7febe78271828198c10f1b52fgalligan@chromium.org */ 106fefe538d859300e7febe78271828198c10f1b52fgalligan@chromium.org 116fefe538d859300e7febe78271828198c10f1b52fgalligan@chromium.org#include <math.h> 126fefe538d859300e7febe78271828198c10f1b52fgalligan@chromium.org#include <stdlib.h> 136fefe538d859300e7febe78271828198c10f1b52fgalligan@chromium.org#include <string.h> 146fefe538d859300e7febe78271828198c10f1b52fgalligan@chromium.org 156fefe538d859300e7febe78271828198c10f1b52fgalligan@chromium.org#include "third_party/googletest/src/include/gtest/gtest.h" 160d106b34dc08439a7c6887d1316a3e1a35f8f0cajohannkoenig@chromium.org#include "test/acm_random.h" 17f9586bb54d74c97d07b09eb2512f8569c9c1c025fgalligan@chromium.org#include "test/clear_system_state.h" 18f9586bb54d74c97d07b09eb2512f8569c9c1c025fgalligan@chromium.org#include "test/register_state_check.h" 190d106b34dc08439a7c6887d1316a3e1a35f8f0cajohannkoenig@chromium.org#include "test/util.h" 206fefe538d859300e7febe78271828198c10f1b52fgalligan@chromium.org 21f9586bb54d74c97d07b09eb2512f8569c9c1c025fgalligan@chromium.org#include "./vp9_rtcd.h" 22dddee1ec7cedf276305b107429f684539b105276johannkoenig@chromium.org#include "vp9/common/vp9_entropy.h" 2387997d490ae52aa962a985c95b3cddf7f8832641johannkoenig@chromium.org#include "vpx/vpx_codec.h" 24dddee1ec7cedf276305b107429f684539b105276johannkoenig@chromium.org#include "vpx/vpx_integer.h" 25dddee1ec7cedf276305b107429f684539b105276johannkoenig@chromium.org 2687997d490ae52aa962a985c95b3cddf7f8832641johannkoenig@chromium.orgconst int kNumCoeffs = 64; 2787997d490ae52aa962a985c95b3cddf7f8832641johannkoenig@chromium.orgconst double kPi = 3.141592653589793238462643383279502884; 2887997d490ae52aa962a985c95b3cddf7f8832641johannkoenig@chromium.orgvoid reference_8x8_dct_1d(const double in[8], double out[8], int stride) { 2987997d490ae52aa962a985c95b3cddf7f8832641johannkoenig@chromium.org const double kInvSqrt2 = 0.707106781186547524400844362104; 3087997d490ae52aa962a985c95b3cddf7f8832641johannkoenig@chromium.org for (int k = 0; k < 8; k++) { 3187997d490ae52aa962a985c95b3cddf7f8832641johannkoenig@chromium.org out[k] = 0.0; 3287997d490ae52aa962a985c95b3cddf7f8832641johannkoenig@chromium.org for (int n = 0; n < 8; n++) 3387997d490ae52aa962a985c95b3cddf7f8832641johannkoenig@chromium.org out[k] += in[n] * cos(kPi * (2 * n + 1) * k / 16.0); 3487997d490ae52aa962a985c95b3cddf7f8832641johannkoenig@chromium.org if (k == 0) 3587997d490ae52aa962a985c95b3cddf7f8832641johannkoenig@chromium.org out[k] = out[k] * kInvSqrt2; 3687997d490ae52aa962a985c95b3cddf7f8832641johannkoenig@chromium.org } 3787997d490ae52aa962a985c95b3cddf7f8832641johannkoenig@chromium.org} 3887997d490ae52aa962a985c95b3cddf7f8832641johannkoenig@chromium.org 3987997d490ae52aa962a985c95b3cddf7f8832641johannkoenig@chromium.orgvoid reference_8x8_dct_2d(const int16_t input[kNumCoeffs], 4087997d490ae52aa962a985c95b3cddf7f8832641johannkoenig@chromium.org double output[kNumCoeffs]) { 4187997d490ae52aa962a985c95b3cddf7f8832641johannkoenig@chromium.org // First transform columns 4287997d490ae52aa962a985c95b3cddf7f8832641johannkoenig@chromium.org for (int i = 0; i < 8; ++i) { 4387997d490ae52aa962a985c95b3cddf7f8832641johannkoenig@chromium.org double temp_in[8], temp_out[8]; 4487997d490ae52aa962a985c95b3cddf7f8832641johannkoenig@chromium.org for (int j = 0; j < 8; ++j) 4587997d490ae52aa962a985c95b3cddf7f8832641johannkoenig@chromium.org temp_in[j] = input[j*8 + i]; 4687997d490ae52aa962a985c95b3cddf7f8832641johannkoenig@chromium.org reference_8x8_dct_1d(temp_in, temp_out, 1); 4787997d490ae52aa962a985c95b3cddf7f8832641johannkoenig@chromium.org for (int j = 0; j < 8; ++j) 4887997d490ae52aa962a985c95b3cddf7f8832641johannkoenig@chromium.org output[j * 8 + i] = temp_out[j]; 4987997d490ae52aa962a985c95b3cddf7f8832641johannkoenig@chromium.org } 5087997d490ae52aa962a985c95b3cddf7f8832641johannkoenig@chromium.org // Then transform rows 5187997d490ae52aa962a985c95b3cddf7f8832641johannkoenig@chromium.org for (int i = 0; i < 8; ++i) { 5287997d490ae52aa962a985c95b3cddf7f8832641johannkoenig@chromium.org double temp_in[8], temp_out[8]; 5387997d490ae52aa962a985c95b3cddf7f8832641johannkoenig@chromium.org for (int j = 0; j < 8; ++j) 5487997d490ae52aa962a985c95b3cddf7f8832641johannkoenig@chromium.org temp_in[j] = output[j + i*8]; 5587997d490ae52aa962a985c95b3cddf7f8832641johannkoenig@chromium.org reference_8x8_dct_1d(temp_in, temp_out, 1); 5687997d490ae52aa962a985c95b3cddf7f8832641johannkoenig@chromium.org // Scale by some magic number 5787997d490ae52aa962a985c95b3cddf7f8832641johannkoenig@chromium.org for (int j = 0; j < 8; ++j) 5887997d490ae52aa962a985c95b3cddf7f8832641johannkoenig@chromium.org output[j + i * 8] = temp_out[j] * 2; 5987997d490ae52aa962a985c95b3cddf7f8832641johannkoenig@chromium.org } 606fefe538d859300e7febe78271828198c10f1b52fgalligan@chromium.org} 616fefe538d859300e7febe78271828198c10f1b52fgalligan@chromium.org 626fefe538d859300e7febe78271828198c10f1b52fgalligan@chromium.orgusing libvpx_test::ACMRandom; 636fefe538d859300e7febe78271828198c10f1b52fgalligan@chromium.org 646fefe538d859300e7febe78271828198c10f1b52fgalligan@chromium.orgnamespace { 6587997d490ae52aa962a985c95b3cddf7f8832641johannkoenig@chromium.orgtypedef void (*FdctFunc)(const int16_t *in, tran_low_t *out, int stride); 6687997d490ae52aa962a985c95b3cddf7f8832641johannkoenig@chromium.orgtypedef void (*IdctFunc)(const tran_low_t *in, uint8_t *out, int stride); 6787997d490ae52aa962a985c95b3cddf7f8832641johannkoenig@chromium.orgtypedef void (*FhtFunc)(const int16_t *in, tran_low_t *out, int stride, 68ac4e313c19203132648a2a271703b6ee76fe4284johannkoenig@chromium.org int tx_type); 6987997d490ae52aa962a985c95b3cddf7f8832641johannkoenig@chromium.orgtypedef void (*IhtFunc)(const tran_low_t *in, uint8_t *out, int stride, 70ac4e313c19203132648a2a271703b6ee76fe4284johannkoenig@chromium.org int tx_type); 710d106b34dc08439a7c6887d1316a3e1a35f8f0cajohannkoenig@chromium.org 7287997d490ae52aa962a985c95b3cddf7f8832641johannkoenig@chromium.orgtypedef std::tr1::tuple<FdctFunc, IdctFunc, int, vpx_bit_depth_t> Dct8x8Param; 7387997d490ae52aa962a985c95b3cddf7f8832641johannkoenig@chromium.orgtypedef std::tr1::tuple<FhtFunc, IhtFunc, int, vpx_bit_depth_t> Ht8x8Param; 74d851b91d14ef0bd71acdce7b90c9a8f1af1181adjohannkoenig@chromium.org 7587997d490ae52aa962a985c95b3cddf7f8832641johannkoenig@chromium.orgvoid fdct8x8_ref(const int16_t *in, tran_low_t *out, int stride, int tx_type) { 760d106b34dc08439a7c6887d1316a3e1a35f8f0cajohannkoenig@chromium.org vp9_fdct8x8_c(in, out, stride); 77ee2f97e8e0aed42dc736a058a7e8b580eef36d8djohannkoenig@chromium.org} 780d106b34dc08439a7c6887d1316a3e1a35f8f0cajohannkoenig@chromium.org 7987997d490ae52aa962a985c95b3cddf7f8832641johannkoenig@chromium.orgvoid fht8x8_ref(const int16_t *in, tran_low_t *out, int stride, int tx_type) { 8076e516e2154f353aa02c504bac88afb0f95fefa7johannkoenig@chromium.org vp9_fht8x8_c(in, out, stride, tx_type); 8147265f8fe3a36a426773454ad90d20c9aa616c24johannkoenig@chromium.org} 8247265f8fe3a36a426773454ad90d20c9aa616c24johannkoenig@chromium.org 8387997d490ae52aa962a985c95b3cddf7f8832641johannkoenig@chromium.org#if CONFIG_VP9_HIGHBITDEPTH 8487997d490ae52aa962a985c95b3cddf7f8832641johannkoenig@chromium.orgvoid idct8x8_10(const tran_low_t *in, uint8_t *out, int stride) { 8587997d490ae52aa962a985c95b3cddf7f8832641johannkoenig@chromium.org vp9_high_idct8x8_64_add_c(in, out, stride, 10); 8687997d490ae52aa962a985c95b3cddf7f8832641johannkoenig@chromium.org} 8787997d490ae52aa962a985c95b3cddf7f8832641johannkoenig@chromium.org 8887997d490ae52aa962a985c95b3cddf7f8832641johannkoenig@chromium.orgvoid idct8x8_12(const tran_low_t *in, uint8_t *out, int stride) { 8987997d490ae52aa962a985c95b3cddf7f8832641johannkoenig@chromium.org vp9_high_idct8x8_64_add_c(in, out, stride, 12); 9087997d490ae52aa962a985c95b3cddf7f8832641johannkoenig@chromium.org} 9187997d490ae52aa962a985c95b3cddf7f8832641johannkoenig@chromium.org 9287997d490ae52aa962a985c95b3cddf7f8832641johannkoenig@chromium.orgvoid iht8x8_10(const tran_low_t *in, uint8_t *out, int stride, int tx_type) { 9387997d490ae52aa962a985c95b3cddf7f8832641johannkoenig@chromium.org vp9_high_iht8x8_64_add_c(in, out, stride, tx_type, 10); 9487997d490ae52aa962a985c95b3cddf7f8832641johannkoenig@chromium.org} 9587997d490ae52aa962a985c95b3cddf7f8832641johannkoenig@chromium.org 9687997d490ae52aa962a985c95b3cddf7f8832641johannkoenig@chromium.orgvoid iht8x8_12(const tran_low_t *in, uint8_t *out, int stride, int tx_type) { 9787997d490ae52aa962a985c95b3cddf7f8832641johannkoenig@chromium.org vp9_high_iht8x8_64_add_c(in, out, stride, tx_type, 12); 9887997d490ae52aa962a985c95b3cddf7f8832641johannkoenig@chromium.org} 9987997d490ae52aa962a985c95b3cddf7f8832641johannkoenig@chromium.org#endif 10087997d490ae52aa962a985c95b3cddf7f8832641johannkoenig@chromium.org 1010d106b34dc08439a7c6887d1316a3e1a35f8f0cajohannkoenig@chromium.orgclass FwdTrans8x8TestBase { 10247265f8fe3a36a426773454ad90d20c9aa616c24johannkoenig@chromium.org public: 1030d106b34dc08439a7c6887d1316a3e1a35f8f0cajohannkoenig@chromium.org virtual ~FwdTrans8x8TestBase() {} 10447265f8fe3a36a426773454ad90d20c9aa616c24johannkoenig@chromium.org 10547265f8fe3a36a426773454ad90d20c9aa616c24johannkoenig@chromium.org protected: 10687997d490ae52aa962a985c95b3cddf7f8832641johannkoenig@chromium.org virtual void RunFwdTxfm(int16_t *in, tran_low_t *out, int stride) = 0; 10787997d490ae52aa962a985c95b3cddf7f8832641johannkoenig@chromium.org virtual void RunInvTxfm(tran_low_t *out, uint8_t *dst, int stride) = 0; 10847265f8fe3a36a426773454ad90d20c9aa616c24johannkoenig@chromium.org 1090d106b34dc08439a7c6887d1316a3e1a35f8f0cajohannkoenig@chromium.org void RunSignBiasCheck() { 1100d106b34dc08439a7c6887d1316a3e1a35f8f0cajohannkoenig@chromium.org ACMRandom rnd(ACMRandom::DeterministicSeed()); 1110d106b34dc08439a7c6887d1316a3e1a35f8f0cajohannkoenig@chromium.org DECLARE_ALIGNED_ARRAY(16, int16_t, test_input_block, 64); 11287997d490ae52aa962a985c95b3cddf7f8832641johannkoenig@chromium.org DECLARE_ALIGNED_ARRAY(16, tran_low_t, test_output_block, 64); 1130d106b34dc08439a7c6887d1316a3e1a35f8f0cajohannkoenig@chromium.org int count_sign_block[64][2]; 1140d106b34dc08439a7c6887d1316a3e1a35f8f0cajohannkoenig@chromium.org const int count_test_block = 100000; 1156fefe538d859300e7febe78271828198c10f1b52fgalligan@chromium.org 1160d106b34dc08439a7c6887d1316a3e1a35f8f0cajohannkoenig@chromium.org memset(count_sign_block, 0, sizeof(count_sign_block)); 1176fefe538d859300e7febe78271828198c10f1b52fgalligan@chromium.org 1180d106b34dc08439a7c6887d1316a3e1a35f8f0cajohannkoenig@chromium.org for (int i = 0; i < count_test_block; ++i) { 1190d106b34dc08439a7c6887d1316a3e1a35f8f0cajohannkoenig@chromium.org // Initialize a test block with input range [-255, 255]. 1200d106b34dc08439a7c6887d1316a3e1a35f8f0cajohannkoenig@chromium.org for (int j = 0; j < 64; ++j) 12187997d490ae52aa962a985c95b3cddf7f8832641johannkoenig@chromium.org test_input_block[j] = ((rnd.Rand16() >> (16 - bit_depth_)) & mask_) - 12287997d490ae52aa962a985c95b3cddf7f8832641johannkoenig@chromium.org ((rnd.Rand16() >> (16 - bit_depth_)) & mask_); 12395aa45d73048f952dcaad0037429cc6751b34f2fjohannkoenig@google.com ASM_REGISTER_STATE_CHECK( 1240d106b34dc08439a7c6887d1316a3e1a35f8f0cajohannkoenig@chromium.org RunFwdTxfm(test_input_block, test_output_block, pitch_)); 1256fefe538d859300e7febe78271828198c10f1b52fgalligan@chromium.org 1260d106b34dc08439a7c6887d1316a3e1a35f8f0cajohannkoenig@chromium.org for (int j = 0; j < 64; ++j) { 1270d106b34dc08439a7c6887d1316a3e1a35f8f0cajohannkoenig@chromium.org if (test_output_block[j] < 0) 1280d106b34dc08439a7c6887d1316a3e1a35f8f0cajohannkoenig@chromium.org ++count_sign_block[j][0]; 1290d106b34dc08439a7c6887d1316a3e1a35f8f0cajohannkoenig@chromium.org else if (test_output_block[j] > 0) 1300d106b34dc08439a7c6887d1316a3e1a35f8f0cajohannkoenig@chromium.org ++count_sign_block[j][1]; 1310d106b34dc08439a7c6887d1316a3e1a35f8f0cajohannkoenig@chromium.org } 1320d106b34dc08439a7c6887d1316a3e1a35f8f0cajohannkoenig@chromium.org } 1336fefe538d859300e7febe78271828198c10f1b52fgalligan@chromium.org 1346fefe538d859300e7febe78271828198c10f1b52fgalligan@chromium.org for (int j = 0; j < 64; ++j) { 1350d106b34dc08439a7c6887d1316a3e1a35f8f0cajohannkoenig@chromium.org const int diff = abs(count_sign_block[j][0] - count_sign_block[j][1]); 1360d106b34dc08439a7c6887d1316a3e1a35f8f0cajohannkoenig@chromium.org const int max_diff = 1125; 13787997d490ae52aa962a985c95b3cddf7f8832641johannkoenig@chromium.org EXPECT_LT(diff, max_diff << (bit_depth_ - 8)) 1380d106b34dc08439a7c6887d1316a3e1a35f8f0cajohannkoenig@chromium.org << "Error: 8x8 FDCT/FHT has a sign bias > " 1390d106b34dc08439a7c6887d1316a3e1a35f8f0cajohannkoenig@chromium.org << 1. * max_diff / count_test_block * 100 << "%" 1400d106b34dc08439a7c6887d1316a3e1a35f8f0cajohannkoenig@chromium.org << " for input range [-255, 255] at index " << j 1410d106b34dc08439a7c6887d1316a3e1a35f8f0cajohannkoenig@chromium.org << " count0: " << count_sign_block[j][0] 1420d106b34dc08439a7c6887d1316a3e1a35f8f0cajohannkoenig@chromium.org << " count1: " << count_sign_block[j][1] 1430d106b34dc08439a7c6887d1316a3e1a35f8f0cajohannkoenig@chromium.org << " diff: " << diff; 1446fefe538d859300e7febe78271828198c10f1b52fgalligan@chromium.org } 1456fefe538d859300e7febe78271828198c10f1b52fgalligan@chromium.org 1460d106b34dc08439a7c6887d1316a3e1a35f8f0cajohannkoenig@chromium.org memset(count_sign_block, 0, sizeof(count_sign_block)); 1476fefe538d859300e7febe78271828198c10f1b52fgalligan@chromium.org 1480d106b34dc08439a7c6887d1316a3e1a35f8f0cajohannkoenig@chromium.org for (int i = 0; i < count_test_block; ++i) { 1490d106b34dc08439a7c6887d1316a3e1a35f8f0cajohannkoenig@chromium.org // Initialize a test block with input range [-15, 15]. 1500d106b34dc08439a7c6887d1316a3e1a35f8f0cajohannkoenig@chromium.org for (int j = 0; j < 64; ++j) 1510d106b34dc08439a7c6887d1316a3e1a35f8f0cajohannkoenig@chromium.org test_input_block[j] = (rnd.Rand8() >> 4) - (rnd.Rand8() >> 4); 15295aa45d73048f952dcaad0037429cc6751b34f2fjohannkoenig@google.com ASM_REGISTER_STATE_CHECK( 1530d106b34dc08439a7c6887d1316a3e1a35f8f0cajohannkoenig@chromium.org RunFwdTxfm(test_input_block, test_output_block, pitch_)); 1546fefe538d859300e7febe78271828198c10f1b52fgalligan@chromium.org 1550d106b34dc08439a7c6887d1316a3e1a35f8f0cajohannkoenig@chromium.org for (int j = 0; j < 64; ++j) { 1560d106b34dc08439a7c6887d1316a3e1a35f8f0cajohannkoenig@chromium.org if (test_output_block[j] < 0) 1570d106b34dc08439a7c6887d1316a3e1a35f8f0cajohannkoenig@chromium.org ++count_sign_block[j][0]; 1580d106b34dc08439a7c6887d1316a3e1a35f8f0cajohannkoenig@chromium.org else if (test_output_block[j] > 0) 1590d106b34dc08439a7c6887d1316a3e1a35f8f0cajohannkoenig@chromium.org ++count_sign_block[j][1]; 1600d106b34dc08439a7c6887d1316a3e1a35f8f0cajohannkoenig@chromium.org } 1610d106b34dc08439a7c6887d1316a3e1a35f8f0cajohannkoenig@chromium.org } 1626fefe538d859300e7febe78271828198c10f1b52fgalligan@chromium.org 1636fefe538d859300e7febe78271828198c10f1b52fgalligan@chromium.org for (int j = 0; j < 64; ++j) { 1640d106b34dc08439a7c6887d1316a3e1a35f8f0cajohannkoenig@chromium.org const int diff = abs(count_sign_block[j][0] - count_sign_block[j][1]); 1650d106b34dc08439a7c6887d1316a3e1a35f8f0cajohannkoenig@chromium.org const int max_diff = 10000; 16687997d490ae52aa962a985c95b3cddf7f8832641johannkoenig@chromium.org EXPECT_LT(diff, max_diff << (bit_depth_ - 8)) 1670d106b34dc08439a7c6887d1316a3e1a35f8f0cajohannkoenig@chromium.org << "Error: 4x4 FDCT/FHT has a sign bias > " 1680d106b34dc08439a7c6887d1316a3e1a35f8f0cajohannkoenig@chromium.org << 1. * max_diff / count_test_block * 100 << "%" 1690d106b34dc08439a7c6887d1316a3e1a35f8f0cajohannkoenig@chromium.org << " for input range [-15, 15] at index " << j 1700d106b34dc08439a7c6887d1316a3e1a35f8f0cajohannkoenig@chromium.org << " count0: " << count_sign_block[j][0] 1710d106b34dc08439a7c6887d1316a3e1a35f8f0cajohannkoenig@chromium.org << " count1: " << count_sign_block[j][1] 1720d106b34dc08439a7c6887d1316a3e1a35f8f0cajohannkoenig@chromium.org << " diff: " << diff; 1736fefe538d859300e7febe78271828198c10f1b52fgalligan@chromium.org } 1746fefe538d859300e7febe78271828198c10f1b52fgalligan@chromium.org } 1756fefe538d859300e7febe78271828198c10f1b52fgalligan@chromium.org 1760d106b34dc08439a7c6887d1316a3e1a35f8f0cajohannkoenig@chromium.org void RunRoundTripErrorCheck() { 1770d106b34dc08439a7c6887d1316a3e1a35f8f0cajohannkoenig@chromium.org ACMRandom rnd(ACMRandom::DeterministicSeed()); 1780d106b34dc08439a7c6887d1316a3e1a35f8f0cajohannkoenig@chromium.org int max_error = 0; 1790d106b34dc08439a7c6887d1316a3e1a35f8f0cajohannkoenig@chromium.org int total_error = 0; 1800d106b34dc08439a7c6887d1316a3e1a35f8f0cajohannkoenig@chromium.org const int count_test_block = 100000; 18147265f8fe3a36a426773454ad90d20c9aa616c24johannkoenig@chromium.org DECLARE_ALIGNED_ARRAY(16, int16_t, test_input_block, 64); 18287997d490ae52aa962a985c95b3cddf7f8832641johannkoenig@chromium.org DECLARE_ALIGNED_ARRAY(16, tran_low_t, test_temp_block, 64); 18347265f8fe3a36a426773454ad90d20c9aa616c24johannkoenig@chromium.org DECLARE_ALIGNED_ARRAY(16, uint8_t, dst, 64); 18447265f8fe3a36a426773454ad90d20c9aa616c24johannkoenig@chromium.org DECLARE_ALIGNED_ARRAY(16, uint8_t, src, 64); 18587997d490ae52aa962a985c95b3cddf7f8832641johannkoenig@chromium.org#if CONFIG_VP9_HIGHBITDEPTH 18687997d490ae52aa962a985c95b3cddf7f8832641johannkoenig@chromium.org DECLARE_ALIGNED_ARRAY(16, uint16_t, dst16, 64); 18787997d490ae52aa962a985c95b3cddf7f8832641johannkoenig@chromium.org DECLARE_ALIGNED_ARRAY(16, uint16_t, src16, 64); 18887997d490ae52aa962a985c95b3cddf7f8832641johannkoenig@chromium.org#endif 1896fefe538d859300e7febe78271828198c10f1b52fgalligan@chromium.org 1900d106b34dc08439a7c6887d1316a3e1a35f8f0cajohannkoenig@chromium.org for (int i = 0; i < count_test_block; ++i) { 1910d106b34dc08439a7c6887d1316a3e1a35f8f0cajohannkoenig@chromium.org // Initialize a test block with input range [-255, 255]. 1920d106b34dc08439a7c6887d1316a3e1a35f8f0cajohannkoenig@chromium.org for (int j = 0; j < 64; ++j) { 19387997d490ae52aa962a985c95b3cddf7f8832641johannkoenig@chromium.org if (bit_depth_ == VPX_BITS_8) { 19487997d490ae52aa962a985c95b3cddf7f8832641johannkoenig@chromium.org src[j] = rnd.Rand8(); 19587997d490ae52aa962a985c95b3cddf7f8832641johannkoenig@chromium.org dst[j] = rnd.Rand8(); 19687997d490ae52aa962a985c95b3cddf7f8832641johannkoenig@chromium.org test_input_block[j] = src[j] - dst[j]; 19787997d490ae52aa962a985c95b3cddf7f8832641johannkoenig@chromium.org#if CONFIG_VP9_HIGHBITDEPTH 19887997d490ae52aa962a985c95b3cddf7f8832641johannkoenig@chromium.org } else { 19987997d490ae52aa962a985c95b3cddf7f8832641johannkoenig@chromium.org src16[j] = rnd.Rand16() & mask_; 20087997d490ae52aa962a985c95b3cddf7f8832641johannkoenig@chromium.org dst16[j] = rnd.Rand16() & mask_; 20187997d490ae52aa962a985c95b3cddf7f8832641johannkoenig@chromium.org test_input_block[j] = src16[j] - dst16[j]; 20287997d490ae52aa962a985c95b3cddf7f8832641johannkoenig@chromium.org#endif 20387997d490ae52aa962a985c95b3cddf7f8832641johannkoenig@chromium.org } 2040d106b34dc08439a7c6887d1316a3e1a35f8f0cajohannkoenig@chromium.org } 2053c315c7cf74983e7cc6a5290265081bb64ddfeb3fgalligan@chromium.org 20695aa45d73048f952dcaad0037429cc6751b34f2fjohannkoenig@google.com ASM_REGISTER_STATE_CHECK( 2070d106b34dc08439a7c6887d1316a3e1a35f8f0cajohannkoenig@chromium.org RunFwdTxfm(test_input_block, test_temp_block, pitch_)); 2080d106b34dc08439a7c6887d1316a3e1a35f8f0cajohannkoenig@chromium.org for (int j = 0; j < 64; ++j) { 2090d106b34dc08439a7c6887d1316a3e1a35f8f0cajohannkoenig@chromium.org if (test_temp_block[j] > 0) { 2100d106b34dc08439a7c6887d1316a3e1a35f8f0cajohannkoenig@chromium.org test_temp_block[j] += 2; 2110d106b34dc08439a7c6887d1316a3e1a35f8f0cajohannkoenig@chromium.org test_temp_block[j] /= 4; 2120d106b34dc08439a7c6887d1316a3e1a35f8f0cajohannkoenig@chromium.org test_temp_block[j] *= 4; 2130d106b34dc08439a7c6887d1316a3e1a35f8f0cajohannkoenig@chromium.org } else { 2140d106b34dc08439a7c6887d1316a3e1a35f8f0cajohannkoenig@chromium.org test_temp_block[j] -= 2; 2150d106b34dc08439a7c6887d1316a3e1a35f8f0cajohannkoenig@chromium.org test_temp_block[j] /= 4; 2160d106b34dc08439a7c6887d1316a3e1a35f8f0cajohannkoenig@chromium.org test_temp_block[j] *= 4; 2170d106b34dc08439a7c6887d1316a3e1a35f8f0cajohannkoenig@chromium.org } 2180d106b34dc08439a7c6887d1316a3e1a35f8f0cajohannkoenig@chromium.org } 21987997d490ae52aa962a985c95b3cddf7f8832641johannkoenig@chromium.org if (bit_depth_ == VPX_BITS_8) { 22087997d490ae52aa962a985c95b3cddf7f8832641johannkoenig@chromium.org ASM_REGISTER_STATE_CHECK( 22187997d490ae52aa962a985c95b3cddf7f8832641johannkoenig@chromium.org RunInvTxfm(test_temp_block, dst, pitch_)); 22287997d490ae52aa962a985c95b3cddf7f8832641johannkoenig@chromium.org#if CONFIG_VP9_HIGHBITDEPTH 22387997d490ae52aa962a985c95b3cddf7f8832641johannkoenig@chromium.org } else { 22487997d490ae52aa962a985c95b3cddf7f8832641johannkoenig@chromium.org ASM_REGISTER_STATE_CHECK( 22587997d490ae52aa962a985c95b3cddf7f8832641johannkoenig@chromium.org RunInvTxfm(test_temp_block, CONVERT_TO_BYTEPTR(dst16), pitch_)); 22687997d490ae52aa962a985c95b3cddf7f8832641johannkoenig@chromium.org#endif 22787997d490ae52aa962a985c95b3cddf7f8832641johannkoenig@chromium.org } 2280d106b34dc08439a7c6887d1316a3e1a35f8f0cajohannkoenig@chromium.org 2290d106b34dc08439a7c6887d1316a3e1a35f8f0cajohannkoenig@chromium.org for (int j = 0; j < 64; ++j) { 23087997d490ae52aa962a985c95b3cddf7f8832641johannkoenig@chromium.org#if CONFIG_VP9_HIGHBITDEPTH 23187997d490ae52aa962a985c95b3cddf7f8832641johannkoenig@chromium.org const int diff = 23287997d490ae52aa962a985c95b3cddf7f8832641johannkoenig@chromium.org bit_depth_ == VPX_BITS_8 ? dst[j] - src[j] : dst16[j] - src16[j]; 23387997d490ae52aa962a985c95b3cddf7f8832641johannkoenig@chromium.org#else 2340d106b34dc08439a7c6887d1316a3e1a35f8f0cajohannkoenig@chromium.org const int diff = dst[j] - src[j]; 23587997d490ae52aa962a985c95b3cddf7f8832641johannkoenig@chromium.org#endif 2360d106b34dc08439a7c6887d1316a3e1a35f8f0cajohannkoenig@chromium.org const int error = diff * diff; 2370d106b34dc08439a7c6887d1316a3e1a35f8f0cajohannkoenig@chromium.org if (max_error < error) 2380d106b34dc08439a7c6887d1316a3e1a35f8f0cajohannkoenig@chromium.org max_error = error; 2390d106b34dc08439a7c6887d1316a3e1a35f8f0cajohannkoenig@chromium.org total_error += error; 2400d106b34dc08439a7c6887d1316a3e1a35f8f0cajohannkoenig@chromium.org } 2416fefe538d859300e7febe78271828198c10f1b52fgalligan@chromium.org } 2426fefe538d859300e7febe78271828198c10f1b52fgalligan@chromium.org 24387997d490ae52aa962a985c95b3cddf7f8832641johannkoenig@chromium.org EXPECT_GE(1 << 2 * (bit_depth_ - 8), max_error) 2440d106b34dc08439a7c6887d1316a3e1a35f8f0cajohannkoenig@chromium.org << "Error: 8x8 FDCT/IDCT or FHT/IHT has an individual" 2450d106b34dc08439a7c6887d1316a3e1a35f8f0cajohannkoenig@chromium.org << " roundtrip error > 1"; 2466fefe538d859300e7febe78271828198c10f1b52fgalligan@chromium.org 24787997d490ae52aa962a985c95b3cddf7f8832641johannkoenig@chromium.org EXPECT_GE((count_test_block << 2 * (bit_depth_ - 8))/5, total_error) 2480d106b34dc08439a7c6887d1316a3e1a35f8f0cajohannkoenig@chromium.org << "Error: 8x8 FDCT/IDCT or FHT/IHT has average roundtrip " 2490d106b34dc08439a7c6887d1316a3e1a35f8f0cajohannkoenig@chromium.org << "error > 1/5 per block"; 2500d106b34dc08439a7c6887d1316a3e1a35f8f0cajohannkoenig@chromium.org } 2516fefe538d859300e7febe78271828198c10f1b52fgalligan@chromium.org 2520d106b34dc08439a7c6887d1316a3e1a35f8f0cajohannkoenig@chromium.org void RunExtremalCheck() { 2530d106b34dc08439a7c6887d1316a3e1a35f8f0cajohannkoenig@chromium.org ACMRandom rnd(ACMRandom::DeterministicSeed()); 2540d106b34dc08439a7c6887d1316a3e1a35f8f0cajohannkoenig@chromium.org int max_error = 0; 2550d106b34dc08439a7c6887d1316a3e1a35f8f0cajohannkoenig@chromium.org int total_error = 0; 25688b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org int total_coeff_error = 0; 2570d106b34dc08439a7c6887d1316a3e1a35f8f0cajohannkoenig@chromium.org const int count_test_block = 100000; 25847265f8fe3a36a426773454ad90d20c9aa616c24johannkoenig@chromium.org DECLARE_ALIGNED_ARRAY(16, int16_t, test_input_block, 64); 25987997d490ae52aa962a985c95b3cddf7f8832641johannkoenig@chromium.org DECLARE_ALIGNED_ARRAY(16, tran_low_t, test_temp_block, 64); 26087997d490ae52aa962a985c95b3cddf7f8832641johannkoenig@chromium.org DECLARE_ALIGNED_ARRAY(16, tran_low_t, ref_temp_block, 64); 26147265f8fe3a36a426773454ad90d20c9aa616c24johannkoenig@chromium.org DECLARE_ALIGNED_ARRAY(16, uint8_t, dst, 64); 26247265f8fe3a36a426773454ad90d20c9aa616c24johannkoenig@chromium.org DECLARE_ALIGNED_ARRAY(16, uint8_t, src, 64); 26387997d490ae52aa962a985c95b3cddf7f8832641johannkoenig@chromium.org#if CONFIG_VP9_HIGHBITDEPTH 26487997d490ae52aa962a985c95b3cddf7f8832641johannkoenig@chromium.org DECLARE_ALIGNED_ARRAY(16, uint16_t, dst16, 64); 26587997d490ae52aa962a985c95b3cddf7f8832641johannkoenig@chromium.org DECLARE_ALIGNED_ARRAY(16, uint16_t, src16, 64); 26687997d490ae52aa962a985c95b3cddf7f8832641johannkoenig@chromium.org#endif 2676fefe538d859300e7febe78271828198c10f1b52fgalligan@chromium.org 2680d106b34dc08439a7c6887d1316a3e1a35f8f0cajohannkoenig@chromium.org for (int i = 0; i < count_test_block; ++i) { 26987997d490ae52aa962a985c95b3cddf7f8832641johannkoenig@chromium.org // Initialize a test block with input range [-mask_, mask_]. 2700d106b34dc08439a7c6887d1316a3e1a35f8f0cajohannkoenig@chromium.org for (int j = 0; j < 64; ++j) { 27187997d490ae52aa962a985c95b3cddf7f8832641johannkoenig@chromium.org if (bit_depth_ == VPX_BITS_8) { 27287997d490ae52aa962a985c95b3cddf7f8832641johannkoenig@chromium.org if (i == 0) { 27387997d490ae52aa962a985c95b3cddf7f8832641johannkoenig@chromium.org src[j] = 255; 27487997d490ae52aa962a985c95b3cddf7f8832641johannkoenig@chromium.org dst[j] = 0; 27587997d490ae52aa962a985c95b3cddf7f8832641johannkoenig@chromium.org } else if (i == 1) { 27687997d490ae52aa962a985c95b3cddf7f8832641johannkoenig@chromium.org src[j] = 0; 27787997d490ae52aa962a985c95b3cddf7f8832641johannkoenig@chromium.org dst[j] = 255; 27887997d490ae52aa962a985c95b3cddf7f8832641johannkoenig@chromium.org } else { 27987997d490ae52aa962a985c95b3cddf7f8832641johannkoenig@chromium.org src[j] = rnd.Rand8() % 2 ? 255 : 0; 28087997d490ae52aa962a985c95b3cddf7f8832641johannkoenig@chromium.org dst[j] = rnd.Rand8() % 2 ? 255 : 0; 28187997d490ae52aa962a985c95b3cddf7f8832641johannkoenig@chromium.org } 28287997d490ae52aa962a985c95b3cddf7f8832641johannkoenig@chromium.org test_input_block[j] = src[j] - dst[j]; 28387997d490ae52aa962a985c95b3cddf7f8832641johannkoenig@chromium.org#if CONFIG_VP9_HIGHBITDEPTH 28488b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org } else { 28587997d490ae52aa962a985c95b3cddf7f8832641johannkoenig@chromium.org if (i == 0) { 28687997d490ae52aa962a985c95b3cddf7f8832641johannkoenig@chromium.org src16[j] = mask_; 28787997d490ae52aa962a985c95b3cddf7f8832641johannkoenig@chromium.org dst16[j] = 0; 28887997d490ae52aa962a985c95b3cddf7f8832641johannkoenig@chromium.org } else if (i == 1) { 28987997d490ae52aa962a985c95b3cddf7f8832641johannkoenig@chromium.org src16[j] = 0; 29087997d490ae52aa962a985c95b3cddf7f8832641johannkoenig@chromium.org dst16[j] = mask_; 29187997d490ae52aa962a985c95b3cddf7f8832641johannkoenig@chromium.org } else { 29287997d490ae52aa962a985c95b3cddf7f8832641johannkoenig@chromium.org src16[j] = rnd.Rand8() % 2 ? mask_ : 0; 29387997d490ae52aa962a985c95b3cddf7f8832641johannkoenig@chromium.org dst16[j] = rnd.Rand8() % 2 ? mask_ : 0; 29487997d490ae52aa962a985c95b3cddf7f8832641johannkoenig@chromium.org } 29587997d490ae52aa962a985c95b3cddf7f8832641johannkoenig@chromium.org test_input_block[j] = src16[j] - dst16[j]; 29687997d490ae52aa962a985c95b3cddf7f8832641johannkoenig@chromium.org#endif 29788b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org } 2980d106b34dc08439a7c6887d1316a3e1a35f8f0cajohannkoenig@chromium.org } 2996fefe538d859300e7febe78271828198c10f1b52fgalligan@chromium.org 30095aa45d73048f952dcaad0037429cc6751b34f2fjohannkoenig@google.com ASM_REGISTER_STATE_CHECK( 3010d106b34dc08439a7c6887d1316a3e1a35f8f0cajohannkoenig@chromium.org RunFwdTxfm(test_input_block, test_temp_block, pitch_)); 30295aa45d73048f952dcaad0037429cc6751b34f2fjohannkoenig@google.com ASM_REGISTER_STATE_CHECK( 30388b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org fwd_txfm_ref(test_input_block, ref_temp_block, pitch_, tx_type_)); 30487997d490ae52aa962a985c95b3cddf7f8832641johannkoenig@chromium.org if (bit_depth_ == VPX_BITS_8) { 30587997d490ae52aa962a985c95b3cddf7f8832641johannkoenig@chromium.org ASM_REGISTER_STATE_CHECK( 30687997d490ae52aa962a985c95b3cddf7f8832641johannkoenig@chromium.org RunInvTxfm(test_temp_block, dst, pitch_)); 30787997d490ae52aa962a985c95b3cddf7f8832641johannkoenig@chromium.org#if CONFIG_VP9_HIGHBITDEPTH 30887997d490ae52aa962a985c95b3cddf7f8832641johannkoenig@chromium.org } else { 30987997d490ae52aa962a985c95b3cddf7f8832641johannkoenig@chromium.org ASM_REGISTER_STATE_CHECK( 31087997d490ae52aa962a985c95b3cddf7f8832641johannkoenig@chromium.org RunInvTxfm(test_temp_block, CONVERT_TO_BYTEPTR(dst16), pitch_)); 31187997d490ae52aa962a985c95b3cddf7f8832641johannkoenig@chromium.org#endif 31287997d490ae52aa962a985c95b3cddf7f8832641johannkoenig@chromium.org } 3130d106b34dc08439a7c6887d1316a3e1a35f8f0cajohannkoenig@chromium.org 3140d106b34dc08439a7c6887d1316a3e1a35f8f0cajohannkoenig@chromium.org for (int j = 0; j < 64; ++j) { 31587997d490ae52aa962a985c95b3cddf7f8832641johannkoenig@chromium.org#if CONFIG_VP9_HIGHBITDEPTH 31687997d490ae52aa962a985c95b3cddf7f8832641johannkoenig@chromium.org const int diff = 31787997d490ae52aa962a985c95b3cddf7f8832641johannkoenig@chromium.org bit_depth_ == VPX_BITS_8 ? dst[j] - src[j] : dst16[j] - src16[j]; 31887997d490ae52aa962a985c95b3cddf7f8832641johannkoenig@chromium.org#else 3190d106b34dc08439a7c6887d1316a3e1a35f8f0cajohannkoenig@chromium.org const int diff = dst[j] - src[j]; 32087997d490ae52aa962a985c95b3cddf7f8832641johannkoenig@chromium.org#endif 3210d106b34dc08439a7c6887d1316a3e1a35f8f0cajohannkoenig@chromium.org const int error = diff * diff; 3220d106b34dc08439a7c6887d1316a3e1a35f8f0cajohannkoenig@chromium.org if (max_error < error) 3230d106b34dc08439a7c6887d1316a3e1a35f8f0cajohannkoenig@chromium.org max_error = error; 3240d106b34dc08439a7c6887d1316a3e1a35f8f0cajohannkoenig@chromium.org total_error += error; 32588b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org 32688b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org const int coeff_diff = test_temp_block[j] - ref_temp_block[j]; 32788b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org total_coeff_error += abs(coeff_diff); 3280d106b34dc08439a7c6887d1316a3e1a35f8f0cajohannkoenig@chromium.org } 3290d106b34dc08439a7c6887d1316a3e1a35f8f0cajohannkoenig@chromium.org 33087997d490ae52aa962a985c95b3cddf7f8832641johannkoenig@chromium.org EXPECT_GE(1 << 2 * (bit_depth_ - 8), max_error) 3310d106b34dc08439a7c6887d1316a3e1a35f8f0cajohannkoenig@chromium.org << "Error: Extremal 8x8 FDCT/IDCT or FHT/IHT has" 3320d106b34dc08439a7c6887d1316a3e1a35f8f0cajohannkoenig@chromium.org << "an individual roundtrip error > 1"; 3330d106b34dc08439a7c6887d1316a3e1a35f8f0cajohannkoenig@chromium.org 33487997d490ae52aa962a985c95b3cddf7f8832641johannkoenig@chromium.org EXPECT_GE((count_test_block << 2 * (bit_depth_ - 8))/5, total_error) 3350d106b34dc08439a7c6887d1316a3e1a35f8f0cajohannkoenig@chromium.org << "Error: Extremal 8x8 FDCT/IDCT or FHT/IHT has average" 3360d106b34dc08439a7c6887d1316a3e1a35f8f0cajohannkoenig@chromium.org << " roundtrip error > 1/5 per block"; 33788b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org 33888b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org EXPECT_EQ(0, total_coeff_error) 33988b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org << "Error: Extremal 8x8 FDCT/FHT has" 34088b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org << "overflow issues in the intermediate steps > 1"; 341ee2f97e8e0aed42dc736a058a7e8b580eef36d8djohannkoenig@chromium.org } 3420d106b34dc08439a7c6887d1316a3e1a35f8f0cajohannkoenig@chromium.org } 3433c315c7cf74983e7cc6a5290265081bb64ddfeb3fgalligan@chromium.org 34487997d490ae52aa962a985c95b3cddf7f8832641johannkoenig@chromium.org void RunInvAccuracyCheck() { 34587997d490ae52aa962a985c95b3cddf7f8832641johannkoenig@chromium.org ACMRandom rnd(ACMRandom::DeterministicSeed()); 34687997d490ae52aa962a985c95b3cddf7f8832641johannkoenig@chromium.org const int count_test_block = 1000; 34787997d490ae52aa962a985c95b3cddf7f8832641johannkoenig@chromium.org DECLARE_ALIGNED_ARRAY(16, int16_t, in, kNumCoeffs); 34887997d490ae52aa962a985c95b3cddf7f8832641johannkoenig@chromium.org DECLARE_ALIGNED_ARRAY(16, tran_low_t, coeff, kNumCoeffs); 34987997d490ae52aa962a985c95b3cddf7f8832641johannkoenig@chromium.org DECLARE_ALIGNED_ARRAY(16, uint8_t, dst, kNumCoeffs); 35087997d490ae52aa962a985c95b3cddf7f8832641johannkoenig@chromium.org DECLARE_ALIGNED_ARRAY(16, uint8_t, src, kNumCoeffs); 35187997d490ae52aa962a985c95b3cddf7f8832641johannkoenig@chromium.org#if CONFIG_VP9_HIGHBITDEPTH 35287997d490ae52aa962a985c95b3cddf7f8832641johannkoenig@chromium.org DECLARE_ALIGNED_ARRAY(16, uint16_t, src16, kNumCoeffs); 35387997d490ae52aa962a985c95b3cddf7f8832641johannkoenig@chromium.org DECLARE_ALIGNED_ARRAY(16, uint16_t, dst16, kNumCoeffs); 35487997d490ae52aa962a985c95b3cddf7f8832641johannkoenig@chromium.org#endif 35587997d490ae52aa962a985c95b3cddf7f8832641johannkoenig@chromium.org 35687997d490ae52aa962a985c95b3cddf7f8832641johannkoenig@chromium.org for (int i = 0; i < count_test_block; ++i) { 35787997d490ae52aa962a985c95b3cddf7f8832641johannkoenig@chromium.org double out_r[kNumCoeffs]; 35887997d490ae52aa962a985c95b3cddf7f8832641johannkoenig@chromium.org 35987997d490ae52aa962a985c95b3cddf7f8832641johannkoenig@chromium.org // Initialize a test block with input range [-255, 255]. 36087997d490ae52aa962a985c95b3cddf7f8832641johannkoenig@chromium.org for (int j = 0; j < kNumCoeffs; ++j) { 36187997d490ae52aa962a985c95b3cddf7f8832641johannkoenig@chromium.org if (bit_depth_ == VPX_BITS_8) { 36287997d490ae52aa962a985c95b3cddf7f8832641johannkoenig@chromium.org src[j] = rnd.Rand8() % 2 ? 255 : 0; 36387997d490ae52aa962a985c95b3cddf7f8832641johannkoenig@chromium.org dst[j] = src[j] > 0 ? 0 : 255; 36487997d490ae52aa962a985c95b3cddf7f8832641johannkoenig@chromium.org in[j] = src[j] - dst[j]; 36587997d490ae52aa962a985c95b3cddf7f8832641johannkoenig@chromium.org#if CONFIG_VP9_HIGHBITDEPTH 36687997d490ae52aa962a985c95b3cddf7f8832641johannkoenig@chromium.org } else { 36787997d490ae52aa962a985c95b3cddf7f8832641johannkoenig@chromium.org src16[j] = rnd.Rand8() % 2 ? mask_ : 0; 36887997d490ae52aa962a985c95b3cddf7f8832641johannkoenig@chromium.org dst16[j] = src16[j] > 0 ? 0 : mask_; 36987997d490ae52aa962a985c95b3cddf7f8832641johannkoenig@chromium.org in[j] = src16[j] - dst16[j]; 37087997d490ae52aa962a985c95b3cddf7f8832641johannkoenig@chromium.org#endif 37187997d490ae52aa962a985c95b3cddf7f8832641johannkoenig@chromium.org } 37287997d490ae52aa962a985c95b3cddf7f8832641johannkoenig@chromium.org } 37387997d490ae52aa962a985c95b3cddf7f8832641johannkoenig@chromium.org 37487997d490ae52aa962a985c95b3cddf7f8832641johannkoenig@chromium.org reference_8x8_dct_2d(in, out_r); 37587997d490ae52aa962a985c95b3cddf7f8832641johannkoenig@chromium.org for (int j = 0; j < kNumCoeffs; ++j) 37687997d490ae52aa962a985c95b3cddf7f8832641johannkoenig@chromium.org coeff[j] = static_cast<tran_low_t>(round(out_r[j])); 37787997d490ae52aa962a985c95b3cddf7f8832641johannkoenig@chromium.org 37887997d490ae52aa962a985c95b3cddf7f8832641johannkoenig@chromium.org if (bit_depth_ == VPX_BITS_8) { 37987997d490ae52aa962a985c95b3cddf7f8832641johannkoenig@chromium.org ASM_REGISTER_STATE_CHECK(RunInvTxfm(coeff, dst, pitch_)); 38087997d490ae52aa962a985c95b3cddf7f8832641johannkoenig@chromium.org#if CONFIG_VP9_HIGHBITDEPTH 38187997d490ae52aa962a985c95b3cddf7f8832641johannkoenig@chromium.org } else { 38287997d490ae52aa962a985c95b3cddf7f8832641johannkoenig@chromium.org ASM_REGISTER_STATE_CHECK(RunInvTxfm(coeff, CONVERT_TO_BYTEPTR(dst16), 38387997d490ae52aa962a985c95b3cddf7f8832641johannkoenig@chromium.org pitch_)); 38487997d490ae52aa962a985c95b3cddf7f8832641johannkoenig@chromium.org#endif 38587997d490ae52aa962a985c95b3cddf7f8832641johannkoenig@chromium.org } 38687997d490ae52aa962a985c95b3cddf7f8832641johannkoenig@chromium.org 38787997d490ae52aa962a985c95b3cddf7f8832641johannkoenig@chromium.org for (int j = 0; j < kNumCoeffs; ++j) { 38887997d490ae52aa962a985c95b3cddf7f8832641johannkoenig@chromium.org#if CONFIG_VP9_HIGHBITDEPTH 38987997d490ae52aa962a985c95b3cddf7f8832641johannkoenig@chromium.org const uint32_t diff = 39087997d490ae52aa962a985c95b3cddf7f8832641johannkoenig@chromium.org bit_depth_ == VPX_BITS_8 ? dst[j] - src[j] : dst16[j] - src16[j]; 39187997d490ae52aa962a985c95b3cddf7f8832641johannkoenig@chromium.org#else 39287997d490ae52aa962a985c95b3cddf7f8832641johannkoenig@chromium.org const uint32_t diff = dst[j] - src[j]; 39387997d490ae52aa962a985c95b3cddf7f8832641johannkoenig@chromium.org#endif 39487997d490ae52aa962a985c95b3cddf7f8832641johannkoenig@chromium.org const uint32_t error = diff * diff; 39587997d490ae52aa962a985c95b3cddf7f8832641johannkoenig@chromium.org EXPECT_GE(1u << 2 * (bit_depth_ - 8), error) 39687997d490ae52aa962a985c95b3cddf7f8832641johannkoenig@chromium.org << "Error: 8x8 IDCT has error " << error 39787997d490ae52aa962a985c95b3cddf7f8832641johannkoenig@chromium.org << " at index " << j; 39887997d490ae52aa962a985c95b3cddf7f8832641johannkoenig@chromium.org } 39987997d490ae52aa962a985c95b3cddf7f8832641johannkoenig@chromium.org } 40087997d490ae52aa962a985c95b3cddf7f8832641johannkoenig@chromium.org } 40187997d490ae52aa962a985c95b3cddf7f8832641johannkoenig@chromium.org 40287997d490ae52aa962a985c95b3cddf7f8832641johannkoenig@chromium.org void RunFwdAccuracyCheck() { 40387997d490ae52aa962a985c95b3cddf7f8832641johannkoenig@chromium.org ACMRandom rnd(ACMRandom::DeterministicSeed()); 40487997d490ae52aa962a985c95b3cddf7f8832641johannkoenig@chromium.org const int count_test_block = 1000; 40587997d490ae52aa962a985c95b3cddf7f8832641johannkoenig@chromium.org DECLARE_ALIGNED_ARRAY(16, int16_t, in, kNumCoeffs); 40687997d490ae52aa962a985c95b3cddf7f8832641johannkoenig@chromium.org DECLARE_ALIGNED_ARRAY(16, tran_low_t, coeff_r, kNumCoeffs); 40787997d490ae52aa962a985c95b3cddf7f8832641johannkoenig@chromium.org DECLARE_ALIGNED_ARRAY(16, tran_low_t, coeff, kNumCoeffs); 40887997d490ae52aa962a985c95b3cddf7f8832641johannkoenig@chromium.org 40987997d490ae52aa962a985c95b3cddf7f8832641johannkoenig@chromium.org for (int i = 0; i < count_test_block; ++i) { 41087997d490ae52aa962a985c95b3cddf7f8832641johannkoenig@chromium.org double out_r[kNumCoeffs]; 41187997d490ae52aa962a985c95b3cddf7f8832641johannkoenig@chromium.org 41287997d490ae52aa962a985c95b3cddf7f8832641johannkoenig@chromium.org // Initialize a test block with input range [-mask_, mask_]. 41387997d490ae52aa962a985c95b3cddf7f8832641johannkoenig@chromium.org for (int j = 0; j < kNumCoeffs; ++j) 41487997d490ae52aa962a985c95b3cddf7f8832641johannkoenig@chromium.org in[j] = rnd.Rand8() % 2 == 0 ? mask_ : -mask_; 41587997d490ae52aa962a985c95b3cddf7f8832641johannkoenig@chromium.org 41687997d490ae52aa962a985c95b3cddf7f8832641johannkoenig@chromium.org RunFwdTxfm(in, coeff, pitch_); 41787997d490ae52aa962a985c95b3cddf7f8832641johannkoenig@chromium.org reference_8x8_dct_2d(in, out_r); 41887997d490ae52aa962a985c95b3cddf7f8832641johannkoenig@chromium.org for (int j = 0; j < kNumCoeffs; ++j) 41987997d490ae52aa962a985c95b3cddf7f8832641johannkoenig@chromium.org coeff_r[j] = static_cast<tran_low_t>(round(out_r[j])); 42087997d490ae52aa962a985c95b3cddf7f8832641johannkoenig@chromium.org 42187997d490ae52aa962a985c95b3cddf7f8832641johannkoenig@chromium.org for (int j = 0; j < kNumCoeffs; ++j) { 42287997d490ae52aa962a985c95b3cddf7f8832641johannkoenig@chromium.org const uint32_t diff = coeff[j] - coeff_r[j]; 42387997d490ae52aa962a985c95b3cddf7f8832641johannkoenig@chromium.org const uint32_t error = diff * diff; 42487997d490ae52aa962a985c95b3cddf7f8832641johannkoenig@chromium.org EXPECT_GE(9u << 2 * (bit_depth_ - 8), error) 42587997d490ae52aa962a985c95b3cddf7f8832641johannkoenig@chromium.org << "Error: 8x8 DCT has error " << error 42687997d490ae52aa962a985c95b3cddf7f8832641johannkoenig@chromium.org << " at index " << j; 42787997d490ae52aa962a985c95b3cddf7f8832641johannkoenig@chromium.org } 42887997d490ae52aa962a985c95b3cddf7f8832641johannkoenig@chromium.org } 42987997d490ae52aa962a985c95b3cddf7f8832641johannkoenig@chromium.org } 4300d106b34dc08439a7c6887d1316a3e1a35f8f0cajohannkoenig@chromium.org int pitch_; 4310d106b34dc08439a7c6887d1316a3e1a35f8f0cajohannkoenig@chromium.org int tx_type_; 432ac4e313c19203132648a2a271703b6ee76fe4284johannkoenig@chromium.org FhtFunc fwd_txfm_ref; 43387997d490ae52aa962a985c95b3cddf7f8832641johannkoenig@chromium.org vpx_bit_depth_t bit_depth_; 43487997d490ae52aa962a985c95b3cddf7f8832641johannkoenig@chromium.org int mask_; 4350d106b34dc08439a7c6887d1316a3e1a35f8f0cajohannkoenig@chromium.org}; 4363c315c7cf74983e7cc6a5290265081bb64ddfeb3fgalligan@chromium.org 437d851b91d14ef0bd71acdce7b90c9a8f1af1181adjohannkoenig@chromium.orgclass FwdTrans8x8DCT 438d851b91d14ef0bd71acdce7b90c9a8f1af1181adjohannkoenig@chromium.org : public FwdTrans8x8TestBase, 439ac4e313c19203132648a2a271703b6ee76fe4284johannkoenig@chromium.org public ::testing::TestWithParam<Dct8x8Param> { 4400d106b34dc08439a7c6887d1316a3e1a35f8f0cajohannkoenig@chromium.org public: 4410d106b34dc08439a7c6887d1316a3e1a35f8f0cajohannkoenig@chromium.org virtual ~FwdTrans8x8DCT() {} 4420d106b34dc08439a7c6887d1316a3e1a35f8f0cajohannkoenig@chromium.org 4430d106b34dc08439a7c6887d1316a3e1a35f8f0cajohannkoenig@chromium.org virtual void SetUp() { 4440d106b34dc08439a7c6887d1316a3e1a35f8f0cajohannkoenig@chromium.org fwd_txfm_ = GET_PARAM(0); 4450d106b34dc08439a7c6887d1316a3e1a35f8f0cajohannkoenig@chromium.org inv_txfm_ = GET_PARAM(1); 4460d106b34dc08439a7c6887d1316a3e1a35f8f0cajohannkoenig@chromium.org tx_type_ = GET_PARAM(2); 4470d106b34dc08439a7c6887d1316a3e1a35f8f0cajohannkoenig@chromium.org pitch_ = 8; 4480d106b34dc08439a7c6887d1316a3e1a35f8f0cajohannkoenig@chromium.org fwd_txfm_ref = fdct8x8_ref; 44987997d490ae52aa962a985c95b3cddf7f8832641johannkoenig@chromium.org bit_depth_ = GET_PARAM(3); 45087997d490ae52aa962a985c95b3cddf7f8832641johannkoenig@chromium.org mask_ = (1 << bit_depth_) - 1; 4510d106b34dc08439a7c6887d1316a3e1a35f8f0cajohannkoenig@chromium.org } 4520d106b34dc08439a7c6887d1316a3e1a35f8f0cajohannkoenig@chromium.org 4530d106b34dc08439a7c6887d1316a3e1a35f8f0cajohannkoenig@chromium.org virtual void TearDown() { libvpx_test::ClearSystemState(); } 4540d106b34dc08439a7c6887d1316a3e1a35f8f0cajohannkoenig@chromium.org 4550d106b34dc08439a7c6887d1316a3e1a35f8f0cajohannkoenig@chromium.org protected: 45687997d490ae52aa962a985c95b3cddf7f8832641johannkoenig@chromium.org void RunFwdTxfm(int16_t *in, tran_low_t *out, int stride) { 4570d106b34dc08439a7c6887d1316a3e1a35f8f0cajohannkoenig@chromium.org fwd_txfm_(in, out, stride); 4580d106b34dc08439a7c6887d1316a3e1a35f8f0cajohannkoenig@chromium.org } 45987997d490ae52aa962a985c95b3cddf7f8832641johannkoenig@chromium.org void RunInvTxfm(tran_low_t *out, uint8_t *dst, int stride) { 4600d106b34dc08439a7c6887d1316a3e1a35f8f0cajohannkoenig@chromium.org inv_txfm_(out, dst, stride); 4613c315c7cf74983e7cc6a5290265081bb64ddfeb3fgalligan@chromium.org } 4620d106b34dc08439a7c6887d1316a3e1a35f8f0cajohannkoenig@chromium.org 463ac4e313c19203132648a2a271703b6ee76fe4284johannkoenig@chromium.org FdctFunc fwd_txfm_; 464ac4e313c19203132648a2a271703b6ee76fe4284johannkoenig@chromium.org IdctFunc inv_txfm_; 4650d106b34dc08439a7c6887d1316a3e1a35f8f0cajohannkoenig@chromium.org}; 4660d106b34dc08439a7c6887d1316a3e1a35f8f0cajohannkoenig@chromium.org 4670d106b34dc08439a7c6887d1316a3e1a35f8f0cajohannkoenig@chromium.orgTEST_P(FwdTrans8x8DCT, SignBiasCheck) { 4680d106b34dc08439a7c6887d1316a3e1a35f8f0cajohannkoenig@chromium.org RunSignBiasCheck(); 4693c315c7cf74983e7cc6a5290265081bb64ddfeb3fgalligan@chromium.org} 4703c315c7cf74983e7cc6a5290265081bb64ddfeb3fgalligan@chromium.org 4710d106b34dc08439a7c6887d1316a3e1a35f8f0cajohannkoenig@chromium.orgTEST_P(FwdTrans8x8DCT, RoundTripErrorCheck) { 4720d106b34dc08439a7c6887d1316a3e1a35f8f0cajohannkoenig@chromium.org RunRoundTripErrorCheck(); 4730d106b34dc08439a7c6887d1316a3e1a35f8f0cajohannkoenig@chromium.org} 4740d106b34dc08439a7c6887d1316a3e1a35f8f0cajohannkoenig@chromium.org 4750d106b34dc08439a7c6887d1316a3e1a35f8f0cajohannkoenig@chromium.orgTEST_P(FwdTrans8x8DCT, ExtremalCheck) { 4760d106b34dc08439a7c6887d1316a3e1a35f8f0cajohannkoenig@chromium.org RunExtremalCheck(); 4770d106b34dc08439a7c6887d1316a3e1a35f8f0cajohannkoenig@chromium.org} 4780d106b34dc08439a7c6887d1316a3e1a35f8f0cajohannkoenig@chromium.org 47987997d490ae52aa962a985c95b3cddf7f8832641johannkoenig@chromium.orgTEST_P(FwdTrans8x8DCT, FwdAccuracyCheck) { 48087997d490ae52aa962a985c95b3cddf7f8832641johannkoenig@chromium.org RunFwdAccuracyCheck(); 48187997d490ae52aa962a985c95b3cddf7f8832641johannkoenig@chromium.org} 48287997d490ae52aa962a985c95b3cddf7f8832641johannkoenig@chromium.org 48387997d490ae52aa962a985c95b3cddf7f8832641johannkoenig@chromium.orgTEST_P(FwdTrans8x8DCT, InvAccuracyCheck) { 48487997d490ae52aa962a985c95b3cddf7f8832641johannkoenig@chromium.org RunInvAccuracyCheck(); 48587997d490ae52aa962a985c95b3cddf7f8832641johannkoenig@chromium.org} 48687997d490ae52aa962a985c95b3cddf7f8832641johannkoenig@chromium.org 487d851b91d14ef0bd71acdce7b90c9a8f1af1181adjohannkoenig@chromium.orgclass FwdTrans8x8HT 488d851b91d14ef0bd71acdce7b90c9a8f1af1181adjohannkoenig@chromium.org : public FwdTrans8x8TestBase, 489ac4e313c19203132648a2a271703b6ee76fe4284johannkoenig@chromium.org public ::testing::TestWithParam<Ht8x8Param> { 4900d106b34dc08439a7c6887d1316a3e1a35f8f0cajohannkoenig@chromium.org public: 4910d106b34dc08439a7c6887d1316a3e1a35f8f0cajohannkoenig@chromium.org virtual ~FwdTrans8x8HT() {} 4920d106b34dc08439a7c6887d1316a3e1a35f8f0cajohannkoenig@chromium.org 4930d106b34dc08439a7c6887d1316a3e1a35f8f0cajohannkoenig@chromium.org virtual void SetUp() { 4940d106b34dc08439a7c6887d1316a3e1a35f8f0cajohannkoenig@chromium.org fwd_txfm_ = GET_PARAM(0); 4950d106b34dc08439a7c6887d1316a3e1a35f8f0cajohannkoenig@chromium.org inv_txfm_ = GET_PARAM(1); 4960d106b34dc08439a7c6887d1316a3e1a35f8f0cajohannkoenig@chromium.org tx_type_ = GET_PARAM(2); 4970d106b34dc08439a7c6887d1316a3e1a35f8f0cajohannkoenig@chromium.org pitch_ = 8; 4980d106b34dc08439a7c6887d1316a3e1a35f8f0cajohannkoenig@chromium.org fwd_txfm_ref = fht8x8_ref; 49987997d490ae52aa962a985c95b3cddf7f8832641johannkoenig@chromium.org bit_depth_ = GET_PARAM(3); 50087997d490ae52aa962a985c95b3cddf7f8832641johannkoenig@chromium.org mask_ = (1 << bit_depth_) - 1; 5010d106b34dc08439a7c6887d1316a3e1a35f8f0cajohannkoenig@chromium.org } 5020d106b34dc08439a7c6887d1316a3e1a35f8f0cajohannkoenig@chromium.org 5030d106b34dc08439a7c6887d1316a3e1a35f8f0cajohannkoenig@chromium.org virtual void TearDown() { libvpx_test::ClearSystemState(); } 5040d106b34dc08439a7c6887d1316a3e1a35f8f0cajohannkoenig@chromium.org 5050d106b34dc08439a7c6887d1316a3e1a35f8f0cajohannkoenig@chromium.org protected: 50687997d490ae52aa962a985c95b3cddf7f8832641johannkoenig@chromium.org void RunFwdTxfm(int16_t *in, tran_low_t *out, int stride) { 5070d106b34dc08439a7c6887d1316a3e1a35f8f0cajohannkoenig@chromium.org fwd_txfm_(in, out, stride, tx_type_); 5080d106b34dc08439a7c6887d1316a3e1a35f8f0cajohannkoenig@chromium.org } 50987997d490ae52aa962a985c95b3cddf7f8832641johannkoenig@chromium.org void RunInvTxfm(tran_low_t *out, uint8_t *dst, int stride) { 5100d106b34dc08439a7c6887d1316a3e1a35f8f0cajohannkoenig@chromium.org inv_txfm_(out, dst, stride, tx_type_); 5110d106b34dc08439a7c6887d1316a3e1a35f8f0cajohannkoenig@chromium.org } 5120d106b34dc08439a7c6887d1316a3e1a35f8f0cajohannkoenig@chromium.org 513ac4e313c19203132648a2a271703b6ee76fe4284johannkoenig@chromium.org FhtFunc fwd_txfm_; 514ac4e313c19203132648a2a271703b6ee76fe4284johannkoenig@chromium.org IhtFunc inv_txfm_; 5150d106b34dc08439a7c6887d1316a3e1a35f8f0cajohannkoenig@chromium.org}; 5160d106b34dc08439a7c6887d1316a3e1a35f8f0cajohannkoenig@chromium.org 5170d106b34dc08439a7c6887d1316a3e1a35f8f0cajohannkoenig@chromium.orgTEST_P(FwdTrans8x8HT, SignBiasCheck) { 5180d106b34dc08439a7c6887d1316a3e1a35f8f0cajohannkoenig@chromium.org RunSignBiasCheck(); 5190d106b34dc08439a7c6887d1316a3e1a35f8f0cajohannkoenig@chromium.org} 5200d106b34dc08439a7c6887d1316a3e1a35f8f0cajohannkoenig@chromium.org 5210d106b34dc08439a7c6887d1316a3e1a35f8f0cajohannkoenig@chromium.orgTEST_P(FwdTrans8x8HT, RoundTripErrorCheck) { 5220d106b34dc08439a7c6887d1316a3e1a35f8f0cajohannkoenig@chromium.org RunRoundTripErrorCheck(); 5230d106b34dc08439a7c6887d1316a3e1a35f8f0cajohannkoenig@chromium.org} 5240d106b34dc08439a7c6887d1316a3e1a35f8f0cajohannkoenig@chromium.org 5250d106b34dc08439a7c6887d1316a3e1a35f8f0cajohannkoenig@chromium.orgTEST_P(FwdTrans8x8HT, ExtremalCheck) { 5260d106b34dc08439a7c6887d1316a3e1a35f8f0cajohannkoenig@chromium.org RunExtremalCheck(); 5270d106b34dc08439a7c6887d1316a3e1a35f8f0cajohannkoenig@chromium.org} 5280d106b34dc08439a7c6887d1316a3e1a35f8f0cajohannkoenig@chromium.org 5290d106b34dc08439a7c6887d1316a3e1a35f8f0cajohannkoenig@chromium.orgusing std::tr1::make_tuple; 5300d106b34dc08439a7c6887d1316a3e1a35f8f0cajohannkoenig@chromium.org 53187997d490ae52aa962a985c95b3cddf7f8832641johannkoenig@chromium.org#if CONFIG_VP9_HIGHBITDEPTH 5320d106b34dc08439a7c6887d1316a3e1a35f8f0cajohannkoenig@chromium.orgINSTANTIATE_TEST_CASE_P( 5330d106b34dc08439a7c6887d1316a3e1a35f8f0cajohannkoenig@chromium.org C, FwdTrans8x8DCT, 5340d106b34dc08439a7c6887d1316a3e1a35f8f0cajohannkoenig@chromium.org ::testing::Values( 53587997d490ae52aa962a985c95b3cddf7f8832641johannkoenig@chromium.org make_tuple(&vp9_high_fdct8x8_c, &idct8x8_10, 0, VPX_BITS_10), 53687997d490ae52aa962a985c95b3cddf7f8832641johannkoenig@chromium.org make_tuple(&vp9_high_fdct8x8_c, &idct8x8_12, 0, VPX_BITS_12), 53787997d490ae52aa962a985c95b3cddf7f8832641johannkoenig@chromium.org make_tuple(&vp9_fdct8x8_c, &vp9_idct8x8_64_add_c, 0, VPX_BITS_8))); 53887997d490ae52aa962a985c95b3cddf7f8832641johannkoenig@chromium.org#else 53987997d490ae52aa962a985c95b3cddf7f8832641johannkoenig@chromium.orgINSTANTIATE_TEST_CASE_P( 54087997d490ae52aa962a985c95b3cddf7f8832641johannkoenig@chromium.org C, FwdTrans8x8DCT, 54187997d490ae52aa962a985c95b3cddf7f8832641johannkoenig@chromium.org ::testing::Values( 54287997d490ae52aa962a985c95b3cddf7f8832641johannkoenig@chromium.org make_tuple(&vp9_fdct8x8_c, &vp9_idct8x8_64_add_c, 0, VPX_BITS_8))); 54387997d490ae52aa962a985c95b3cddf7f8832641johannkoenig@chromium.org#endif 54487997d490ae52aa962a985c95b3cddf7f8832641johannkoenig@chromium.org 54587997d490ae52aa962a985c95b3cddf7f8832641johannkoenig@chromium.org#if CONFIG_VP9_HIGHBITDEPTH 5460d106b34dc08439a7c6887d1316a3e1a35f8f0cajohannkoenig@chromium.orgINSTANTIATE_TEST_CASE_P( 5470d106b34dc08439a7c6887d1316a3e1a35f8f0cajohannkoenig@chromium.org C, FwdTrans8x8HT, 5480d106b34dc08439a7c6887d1316a3e1a35f8f0cajohannkoenig@chromium.org ::testing::Values( 54987997d490ae52aa962a985c95b3cddf7f8832641johannkoenig@chromium.org make_tuple(&vp9_high_fht8x8_c, &iht8x8_10, 0, VPX_BITS_10), 55087997d490ae52aa962a985c95b3cddf7f8832641johannkoenig@chromium.org make_tuple(&vp9_high_fht8x8_c, &iht8x8_10, 1, VPX_BITS_10), 55187997d490ae52aa962a985c95b3cddf7f8832641johannkoenig@chromium.org make_tuple(&vp9_high_fht8x8_c, &iht8x8_10, 2, VPX_BITS_10), 55287997d490ae52aa962a985c95b3cddf7f8832641johannkoenig@chromium.org make_tuple(&vp9_high_fht8x8_c, &iht8x8_10, 3, VPX_BITS_10), 55387997d490ae52aa962a985c95b3cddf7f8832641johannkoenig@chromium.org make_tuple(&vp9_high_fht8x8_c, &iht8x8_12, 0, VPX_BITS_12), 55487997d490ae52aa962a985c95b3cddf7f8832641johannkoenig@chromium.org make_tuple(&vp9_high_fht8x8_c, &iht8x8_12, 1, VPX_BITS_12), 55587997d490ae52aa962a985c95b3cddf7f8832641johannkoenig@chromium.org make_tuple(&vp9_high_fht8x8_c, &iht8x8_12, 2, VPX_BITS_12), 55687997d490ae52aa962a985c95b3cddf7f8832641johannkoenig@chromium.org make_tuple(&vp9_high_fht8x8_c, &iht8x8_12, 3, VPX_BITS_12), 55787997d490ae52aa962a985c95b3cddf7f8832641johannkoenig@chromium.org make_tuple(&vp9_fht8x8_c, &vp9_iht8x8_64_add_c, 0, VPX_BITS_8), 55887997d490ae52aa962a985c95b3cddf7f8832641johannkoenig@chromium.org make_tuple(&vp9_fht8x8_c, &vp9_iht8x8_64_add_c, 1, VPX_BITS_8), 55987997d490ae52aa962a985c95b3cddf7f8832641johannkoenig@chromium.org make_tuple(&vp9_fht8x8_c, &vp9_iht8x8_64_add_c, 2, VPX_BITS_8), 56087997d490ae52aa962a985c95b3cddf7f8832641johannkoenig@chromium.org make_tuple(&vp9_fht8x8_c, &vp9_iht8x8_64_add_c, 3, VPX_BITS_8))); 56187997d490ae52aa962a985c95b3cddf7f8832641johannkoenig@chromium.org#else 56287997d490ae52aa962a985c95b3cddf7f8832641johannkoenig@chromium.orgINSTANTIATE_TEST_CASE_P( 56387997d490ae52aa962a985c95b3cddf7f8832641johannkoenig@chromium.org C, FwdTrans8x8HT, 56487997d490ae52aa962a985c95b3cddf7f8832641johannkoenig@chromium.org ::testing::Values( 56587997d490ae52aa962a985c95b3cddf7f8832641johannkoenig@chromium.org make_tuple(&vp9_fht8x8_c, &vp9_iht8x8_64_add_c, 0, VPX_BITS_8), 56687997d490ae52aa962a985c95b3cddf7f8832641johannkoenig@chromium.org make_tuple(&vp9_fht8x8_c, &vp9_iht8x8_64_add_c, 1, VPX_BITS_8), 56787997d490ae52aa962a985c95b3cddf7f8832641johannkoenig@chromium.org make_tuple(&vp9_fht8x8_c, &vp9_iht8x8_64_add_c, 2, VPX_BITS_8), 56887997d490ae52aa962a985c95b3cddf7f8832641johannkoenig@chromium.org make_tuple(&vp9_fht8x8_c, &vp9_iht8x8_64_add_c, 3, VPX_BITS_8))); 56987997d490ae52aa962a985c95b3cddf7f8832641johannkoenig@chromium.org#endif 5700d106b34dc08439a7c6887d1316a3e1a35f8f0cajohannkoenig@chromium.org 57187997d490ae52aa962a985c95b3cddf7f8832641johannkoenig@chromium.org#if HAVE_NEON_ASM && !CONFIG_VP9_HIGHBITDEPTH 572411971f94253c85e1866c281860d6344f6aa0c78fgalligan@chromium.orgINSTANTIATE_TEST_CASE_P( 573411971f94253c85e1866c281860d6344f6aa0c78fgalligan@chromium.org NEON, FwdTrans8x8DCT, 574411971f94253c85e1866c281860d6344f6aa0c78fgalligan@chromium.org ::testing::Values( 57587997d490ae52aa962a985c95b3cddf7f8832641johannkoenig@chromium.org make_tuple(&vp9_fdct8x8_neon, &vp9_idct8x8_64_add_neon, 0, 57687997d490ae52aa962a985c95b3cddf7f8832641johannkoenig@chromium.org VPX_BITS_8))); 577411971f94253c85e1866c281860d6344f6aa0c78fgalligan@chromium.orgINSTANTIATE_TEST_CASE_P( 578411971f94253c85e1866c281860d6344f6aa0c78fgalligan@chromium.org DISABLED_NEON, FwdTrans8x8HT, 579411971f94253c85e1866c281860d6344f6aa0c78fgalligan@chromium.org ::testing::Values( 58087997d490ae52aa962a985c95b3cddf7f8832641johannkoenig@chromium.org make_tuple(&vp9_fht8x8_c, &vp9_iht8x8_64_add_neon, 0, VPX_BITS_8), 58187997d490ae52aa962a985c95b3cddf7f8832641johannkoenig@chromium.org make_tuple(&vp9_fht8x8_c, &vp9_iht8x8_64_add_neon, 1, VPX_BITS_8), 58287997d490ae52aa962a985c95b3cddf7f8832641johannkoenig@chromium.org make_tuple(&vp9_fht8x8_c, &vp9_iht8x8_64_add_neon, 2, VPX_BITS_8), 58387997d490ae52aa962a985c95b3cddf7f8832641johannkoenig@chromium.org make_tuple(&vp9_fht8x8_c, &vp9_iht8x8_64_add_neon, 3, VPX_BITS_8))); 584411971f94253c85e1866c281860d6344f6aa0c78fgalligan@chromium.org#endif 585411971f94253c85e1866c281860d6344f6aa0c78fgalligan@chromium.org 58687997d490ae52aa962a985c95b3cddf7f8832641johannkoenig@chromium.org#if HAVE_SSE2 && !CONFIG_VP9_HIGHBITDEPTH 5870d106b34dc08439a7c6887d1316a3e1a35f8f0cajohannkoenig@chromium.orgINSTANTIATE_TEST_CASE_P( 5880d106b34dc08439a7c6887d1316a3e1a35f8f0cajohannkoenig@chromium.org SSE2, FwdTrans8x8DCT, 5890d106b34dc08439a7c6887d1316a3e1a35f8f0cajohannkoenig@chromium.org ::testing::Values( 59087997d490ae52aa962a985c95b3cddf7f8832641johannkoenig@chromium.org make_tuple(&vp9_fdct8x8_sse2, &vp9_idct8x8_64_add_sse2, 0, 59187997d490ae52aa962a985c95b3cddf7f8832641johannkoenig@chromium.org VPX_BITS_8))); 5920d106b34dc08439a7c6887d1316a3e1a35f8f0cajohannkoenig@chromium.orgINSTANTIATE_TEST_CASE_P( 5930d106b34dc08439a7c6887d1316a3e1a35f8f0cajohannkoenig@chromium.org SSE2, FwdTrans8x8HT, 5940d106b34dc08439a7c6887d1316a3e1a35f8f0cajohannkoenig@chromium.org ::testing::Values( 59587997d490ae52aa962a985c95b3cddf7f8832641johannkoenig@chromium.org make_tuple(&vp9_fht8x8_sse2, &vp9_iht8x8_64_add_sse2, 0, VPX_BITS_8), 59687997d490ae52aa962a985c95b3cddf7f8832641johannkoenig@chromium.org make_tuple(&vp9_fht8x8_sse2, &vp9_iht8x8_64_add_sse2, 1, VPX_BITS_8), 59787997d490ae52aa962a985c95b3cddf7f8832641johannkoenig@chromium.org make_tuple(&vp9_fht8x8_sse2, &vp9_iht8x8_64_add_sse2, 2, VPX_BITS_8), 59887997d490ae52aa962a985c95b3cddf7f8832641johannkoenig@chromium.org make_tuple(&vp9_fht8x8_sse2, &vp9_iht8x8_64_add_sse2, 3, VPX_BITS_8))); 5990d106b34dc08439a7c6887d1316a3e1a35f8f0cajohannkoenig@chromium.org#endif 6007765c078fa920ba6c949c15f16b6cc979d8bb95bjohannkoenig@chromium.org 60187997d490ae52aa962a985c95b3cddf7f8832641johannkoenig@chromium.org#if HAVE_SSSE3 && ARCH_X86_64 && !CONFIG_VP9_HIGHBITDEPTH 6027765c078fa920ba6c949c15f16b6cc979d8bb95bjohannkoenig@chromium.orgINSTANTIATE_TEST_CASE_P( 6037765c078fa920ba6c949c15f16b6cc979d8bb95bjohannkoenig@chromium.org SSSE3, FwdTrans8x8DCT, 6047765c078fa920ba6c949c15f16b6cc979d8bb95bjohannkoenig@chromium.org ::testing::Values( 60587997d490ae52aa962a985c95b3cddf7f8832641johannkoenig@chromium.org make_tuple(&vp9_fdct8x8_ssse3, &vp9_idct8x8_64_add_ssse3, 0, 60687997d490ae52aa962a985c95b3cddf7f8832641johannkoenig@chromium.org VPX_BITS_8))); 6077765c078fa920ba6c949c15f16b6cc979d8bb95bjohannkoenig@chromium.org#endif 6086fefe538d859300e7febe78271828198c10f1b52fgalligan@chromium.org} // namespace 609