18b26fe55f3e4daa2311dbd2d95e8ac2b4e080685johannkoenig@chromium.org/* 28b26fe55f3e4daa2311dbd2d95e8ac2b4e080685johannkoenig@chromium.org * Copyright (c) 2013 The WebM project authors. All Rights Reserved. 38b26fe55f3e4daa2311dbd2d95e8ac2b4e080685johannkoenig@chromium.org * 48b26fe55f3e4daa2311dbd2d95e8ac2b4e080685johannkoenig@chromium.org * Use of this source code is governed by a BSD-style license 58b26fe55f3e4daa2311dbd2d95e8ac2b4e080685johannkoenig@chromium.org * that can be found in the LICENSE file in the root of the source 68b26fe55f3e4daa2311dbd2d95e8ac2b4e080685johannkoenig@chromium.org * tree. An additional intellectual property rights grant can be found 78b26fe55f3e4daa2311dbd2d95e8ac2b4e080685johannkoenig@chromium.org * in the file PATENTS. All contributing project authors may 88b26fe55f3e4daa2311dbd2d95e8ac2b4e080685johannkoenig@chromium.org * be found in the AUTHORS file in the root of the source tree. 98b26fe55f3e4daa2311dbd2d95e8ac2b4e080685johannkoenig@chromium.org */ 108b26fe55f3e4daa2311dbd2d95e8ac2b4e080685johannkoenig@chromium.org 118b26fe55f3e4daa2311dbd2d95e8ac2b4e080685johannkoenig@chromium.org#include <math.h> 128b26fe55f3e4daa2311dbd2d95e8ac2b4e080685johannkoenig@chromium.org#include <stdlib.h> 138b26fe55f3e4daa2311dbd2d95e8ac2b4e080685johannkoenig@chromium.org#include <string.h> 148b26fe55f3e4daa2311dbd2d95e8ac2b4e080685johannkoenig@chromium.org 158b26fe55f3e4daa2311dbd2d95e8ac2b4e080685johannkoenig@chromium.org#include "third_party/googletest/src/include/gtest/gtest.h" 168b26fe55f3e4daa2311dbd2d95e8ac2b4e080685johannkoenig@chromium.org#include "test/acm_random.h" 178b26fe55f3e4daa2311dbd2d95e8ac2b4e080685johannkoenig@chromium.org#include "test/clear_system_state.h" 188b26fe55f3e4daa2311dbd2d95e8ac2b4e080685johannkoenig@chromium.org#include "test/register_state_check.h" 198b26fe55f3e4daa2311dbd2d95e8ac2b4e080685johannkoenig@chromium.org#include "test/util.h" 208b26fe55f3e4daa2311dbd2d95e8ac2b4e080685johannkoenig@chromium.org 218b26fe55f3e4daa2311dbd2d95e8ac2b4e080685johannkoenig@chromium.org#include "./vp9_rtcd.h" 228b26fe55f3e4daa2311dbd2d95e8ac2b4e080685johannkoenig@chromium.org#include "vp9/common/vp9_blockd.h" 238b26fe55f3e4daa2311dbd2d95e8ac2b4e080685johannkoenig@chromium.org#include "vp9/common/vp9_scan.h" 248b26fe55f3e4daa2311dbd2d95e8ac2b4e080685johannkoenig@chromium.org#include "vpx/vpx_integer.h" 258b26fe55f3e4daa2311dbd2d95e8ac2b4e080685johannkoenig@chromium.org 268b26fe55f3e4daa2311dbd2d95e8ac2b4e080685johannkoenig@chromium.orgusing libvpx_test::ACMRandom; 278b26fe55f3e4daa2311dbd2d95e8ac2b4e080685johannkoenig@chromium.org 288b26fe55f3e4daa2311dbd2d95e8ac2b4e080685johannkoenig@chromium.orgnamespace { 2987997d490ae52aa962a985c95b3cddf7f8832641johannkoenig@chromium.orgtypedef void (*FwdTxfmFunc)(const int16_t *in, tran_low_t *out, int stride); 3087997d490ae52aa962a985c95b3cddf7f8832641johannkoenig@chromium.orgtypedef void (*InvTxfmFunc)(const tran_low_t *in, uint8_t *out, int stride); 31ac4e313c19203132648a2a271703b6ee76fe4284johannkoenig@chromium.orgtypedef std::tr1::tuple<FwdTxfmFunc, 32ac4e313c19203132648a2a271703b6ee76fe4284johannkoenig@chromium.org InvTxfmFunc, 33ac4e313c19203132648a2a271703b6ee76fe4284johannkoenig@chromium.org InvTxfmFunc, 34ac4e313c19203132648a2a271703b6ee76fe4284johannkoenig@chromium.org TX_SIZE, int> PartialInvTxfmParam; 358b26fe55f3e4daa2311dbd2d95e8ac2b4e080685johannkoenig@chromium.orgconst int kMaxNumCoeffs = 1024; 36ac4e313c19203132648a2a271703b6ee76fe4284johannkoenig@chromium.orgclass PartialIDctTest : public ::testing::TestWithParam<PartialInvTxfmParam> { 378b26fe55f3e4daa2311dbd2d95e8ac2b4e080685johannkoenig@chromium.org public: 388b26fe55f3e4daa2311dbd2d95e8ac2b4e080685johannkoenig@chromium.org virtual ~PartialIDctTest() {} 398b26fe55f3e4daa2311dbd2d95e8ac2b4e080685johannkoenig@chromium.org virtual void SetUp() { 4088b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org ftxfm_ = GET_PARAM(0); 4188b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org full_itxfm_ = GET_PARAM(1); 4288b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org partial_itxfm_ = GET_PARAM(2); 4388b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org tx_size_ = GET_PARAM(3); 4488b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org last_nonzero_ = GET_PARAM(4); 458b26fe55f3e4daa2311dbd2d95e8ac2b4e080685johannkoenig@chromium.org } 468b26fe55f3e4daa2311dbd2d95e8ac2b4e080685johannkoenig@chromium.org 478b26fe55f3e4daa2311dbd2d95e8ac2b4e080685johannkoenig@chromium.org virtual void TearDown() { libvpx_test::ClearSystemState(); } 488b26fe55f3e4daa2311dbd2d95e8ac2b4e080685johannkoenig@chromium.org 498b26fe55f3e4daa2311dbd2d95e8ac2b4e080685johannkoenig@chromium.org protected: 508b26fe55f3e4daa2311dbd2d95e8ac2b4e080685johannkoenig@chromium.org int last_nonzero_; 518b26fe55f3e4daa2311dbd2d95e8ac2b4e080685johannkoenig@chromium.org TX_SIZE tx_size_; 52ac4e313c19203132648a2a271703b6ee76fe4284johannkoenig@chromium.org FwdTxfmFunc ftxfm_; 53ac4e313c19203132648a2a271703b6ee76fe4284johannkoenig@chromium.org InvTxfmFunc full_itxfm_; 54ac4e313c19203132648a2a271703b6ee76fe4284johannkoenig@chromium.org InvTxfmFunc partial_itxfm_; 558b26fe55f3e4daa2311dbd2d95e8ac2b4e080685johannkoenig@chromium.org}; 568b26fe55f3e4daa2311dbd2d95e8ac2b4e080685johannkoenig@chromium.org 5788b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.orgTEST_P(PartialIDctTest, RunQuantCheck) { 5888b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org ACMRandom rnd(ACMRandom::DeterministicSeed()); 5988b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org int size; 6088b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org switch (tx_size_) { 6188b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org case TX_4X4: 6288b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org size = 4; 6388b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org break; 6488b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org case TX_8X8: 6588b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org size = 8; 6688b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org break; 6788b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org case TX_16X16: 6888b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org size = 16; 6988b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org break; 7088b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org case TX_32X32: 7188b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org size = 32; 7288b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org break; 7388b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org default: 7488b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org FAIL() << "Wrong Size!"; 7588b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org break; 7688b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org } 7787997d490ae52aa962a985c95b3cddf7f8832641johannkoenig@chromium.org DECLARE_ALIGNED_ARRAY(16, tran_low_t, test_coef_block1, kMaxNumCoeffs); 7887997d490ae52aa962a985c95b3cddf7f8832641johannkoenig@chromium.org DECLARE_ALIGNED_ARRAY(16, tran_low_t, test_coef_block2, kMaxNumCoeffs); 7988b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org DECLARE_ALIGNED_ARRAY(16, uint8_t, dst1, kMaxNumCoeffs); 8088b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org DECLARE_ALIGNED_ARRAY(16, uint8_t, dst2, kMaxNumCoeffs); 8188b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org 8288b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org const int count_test_block = 1000; 8388b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org const int block_size = size * size; 8488b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org 8588b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org DECLARE_ALIGNED_ARRAY(16, int16_t, input_extreme_block, kMaxNumCoeffs); 8687997d490ae52aa962a985c95b3cddf7f8832641johannkoenig@chromium.org DECLARE_ALIGNED_ARRAY(16, tran_low_t, output_ref_block, kMaxNumCoeffs); 8788b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org 8888b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org int max_error = 0; 8988b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org for (int i = 0; i < count_test_block; ++i) { 9088b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org // clear out destination buffer 9188b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org memset(dst1, 0, sizeof(*dst1) * block_size); 9288b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org memset(dst2, 0, sizeof(*dst2) * block_size); 9388b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org memset(test_coef_block1, 0, sizeof(*test_coef_block1) * block_size); 9488b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org memset(test_coef_block2, 0, sizeof(*test_coef_block2) * block_size); 9588b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org 9688b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org ACMRandom rnd(ACMRandom::DeterministicSeed()); 9788b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org 9888b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org for (int i = 0; i < count_test_block; ++i) { 9988b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org // Initialize a test block with input range [-255, 255]. 10088b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org if (i == 0) { 10188b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org for (int j = 0; j < block_size; ++j) 10288b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org input_extreme_block[j] = 255; 10388b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org } else if (i == 1) { 10488b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org for (int j = 0; j < block_size; ++j) 10588b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org input_extreme_block[j] = -255; 10688b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org } else { 10788b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org for (int j = 0; j < block_size; ++j) { 10888b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org input_extreme_block[j] = rnd.Rand8() % 2 ? 255 : -255; 10988b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org } 11088b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org } 11188b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org 11288b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org ftxfm_(input_extreme_block, output_ref_block, size); 11388b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org 11488b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org // quantization with maximum allowed step sizes 11588b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org test_coef_block1[0] = (output_ref_block[0] / 1336) * 1336; 11688b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org for (int j = 1; j < last_nonzero_; ++j) 11788b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org test_coef_block1[vp9_default_scan_orders[tx_size_].scan[j]] 11888b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org = (output_ref_block[j] / 1828) * 1828; 11988b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org } 12088b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org 12195aa45d73048f952dcaad0037429cc6751b34f2fjohannkoenig@google.com ASM_REGISTER_STATE_CHECK(full_itxfm_(test_coef_block1, dst1, size)); 12295aa45d73048f952dcaad0037429cc6751b34f2fjohannkoenig@google.com ASM_REGISTER_STATE_CHECK(partial_itxfm_(test_coef_block1, dst2, size)); 12388b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org 12488b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org for (int j = 0; j < block_size; ++j) { 12588b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org const int diff = dst1[j] - dst2[j]; 12688b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org const int error = diff * diff; 12788b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org if (max_error < error) 12888b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org max_error = error; 12988b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org } 13088b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org } 13188b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org 13288b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org EXPECT_EQ(0, max_error) 13388b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org << "Error: partial inverse transform produces different results"; 13488b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org} 13588b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org 1368b26fe55f3e4daa2311dbd2d95e8ac2b4e080685johannkoenig@chromium.orgTEST_P(PartialIDctTest, ResultsMatch) { 1378b26fe55f3e4daa2311dbd2d95e8ac2b4e080685johannkoenig@chromium.org ACMRandom rnd(ACMRandom::DeterministicSeed()); 1388b26fe55f3e4daa2311dbd2d95e8ac2b4e080685johannkoenig@chromium.org int size; 1398b26fe55f3e4daa2311dbd2d95e8ac2b4e080685johannkoenig@chromium.org switch (tx_size_) { 1400e29f91ae7876791fc422e9c7cea72b1866439a6johannkoenig@chromium.org case TX_4X4: 1410e29f91ae7876791fc422e9c7cea72b1866439a6johannkoenig@chromium.org size = 4; 1420e29f91ae7876791fc422e9c7cea72b1866439a6johannkoenig@chromium.org break; 1430e29f91ae7876791fc422e9c7cea72b1866439a6johannkoenig@chromium.org case TX_8X8: 1440e29f91ae7876791fc422e9c7cea72b1866439a6johannkoenig@chromium.org size = 8; 1450e29f91ae7876791fc422e9c7cea72b1866439a6johannkoenig@chromium.org break; 1460e29f91ae7876791fc422e9c7cea72b1866439a6johannkoenig@chromium.org case TX_16X16: 1470e29f91ae7876791fc422e9c7cea72b1866439a6johannkoenig@chromium.org size = 16; 1480e29f91ae7876791fc422e9c7cea72b1866439a6johannkoenig@chromium.org break; 1490e29f91ae7876791fc422e9c7cea72b1866439a6johannkoenig@chromium.org case TX_32X32: 1500e29f91ae7876791fc422e9c7cea72b1866439a6johannkoenig@chromium.org size = 32; 1510e29f91ae7876791fc422e9c7cea72b1866439a6johannkoenig@chromium.org break; 1520e29f91ae7876791fc422e9c7cea72b1866439a6johannkoenig@chromium.org default: 1530e29f91ae7876791fc422e9c7cea72b1866439a6johannkoenig@chromium.org FAIL() << "Wrong Size!"; 1540e29f91ae7876791fc422e9c7cea72b1866439a6johannkoenig@chromium.org break; 1558b26fe55f3e4daa2311dbd2d95e8ac2b4e080685johannkoenig@chromium.org } 15687997d490ae52aa962a985c95b3cddf7f8832641johannkoenig@chromium.org DECLARE_ALIGNED_ARRAY(16, tran_low_t, test_coef_block1, kMaxNumCoeffs); 15787997d490ae52aa962a985c95b3cddf7f8832641johannkoenig@chromium.org DECLARE_ALIGNED_ARRAY(16, tran_low_t, test_coef_block2, kMaxNumCoeffs); 1588b26fe55f3e4daa2311dbd2d95e8ac2b4e080685johannkoenig@chromium.org DECLARE_ALIGNED_ARRAY(16, uint8_t, dst1, kMaxNumCoeffs); 1598b26fe55f3e4daa2311dbd2d95e8ac2b4e080685johannkoenig@chromium.org DECLARE_ALIGNED_ARRAY(16, uint8_t, dst2, kMaxNumCoeffs); 1608b26fe55f3e4daa2311dbd2d95e8ac2b4e080685johannkoenig@chromium.org const int count_test_block = 1000; 1618b26fe55f3e4daa2311dbd2d95e8ac2b4e080685johannkoenig@chromium.org const int max_coeff = 32766 / 4; 1628b26fe55f3e4daa2311dbd2d95e8ac2b4e080685johannkoenig@chromium.org const int block_size = size * size; 1638b26fe55f3e4daa2311dbd2d95e8ac2b4e080685johannkoenig@chromium.org int max_error = 0; 1648b26fe55f3e4daa2311dbd2d95e8ac2b4e080685johannkoenig@chromium.org for (int i = 0; i < count_test_block; ++i) { 1658b26fe55f3e4daa2311dbd2d95e8ac2b4e080685johannkoenig@chromium.org // clear out destination buffer 1668b26fe55f3e4daa2311dbd2d95e8ac2b4e080685johannkoenig@chromium.org memset(dst1, 0, sizeof(*dst1) * block_size); 1678b26fe55f3e4daa2311dbd2d95e8ac2b4e080685johannkoenig@chromium.org memset(dst2, 0, sizeof(*dst2) * block_size); 1688b26fe55f3e4daa2311dbd2d95e8ac2b4e080685johannkoenig@chromium.org memset(test_coef_block1, 0, sizeof(*test_coef_block1) * block_size); 1698b26fe55f3e4daa2311dbd2d95e8ac2b4e080685johannkoenig@chromium.org memset(test_coef_block2, 0, sizeof(*test_coef_block2) * block_size); 1708b26fe55f3e4daa2311dbd2d95e8ac2b4e080685johannkoenig@chromium.org int max_energy_leftover = max_coeff * max_coeff; 1718b26fe55f3e4daa2311dbd2d95e8ac2b4e080685johannkoenig@chromium.org for (int j = 0; j < last_nonzero_; ++j) { 1720e29f91ae7876791fc422e9c7cea72b1866439a6johannkoenig@chromium.org int16_t coef = static_cast<int16_t>(sqrt(1.0 * max_energy_leftover) * 1738b26fe55f3e4daa2311dbd2d95e8ac2b4e080685johannkoenig@chromium.org (rnd.Rand16() - 32768) / 65536); 1748b26fe55f3e4daa2311dbd2d95e8ac2b4e080685johannkoenig@chromium.org max_energy_leftover -= coef * coef; 1758b26fe55f3e4daa2311dbd2d95e8ac2b4e080685johannkoenig@chromium.org if (max_energy_leftover < 0) { 1768b26fe55f3e4daa2311dbd2d95e8ac2b4e080685johannkoenig@chromium.org max_energy_leftover = 0; 1778b26fe55f3e4daa2311dbd2d95e8ac2b4e080685johannkoenig@chromium.org coef = 0; 1788b26fe55f3e4daa2311dbd2d95e8ac2b4e080685johannkoenig@chromium.org } 1798b26fe55f3e4daa2311dbd2d95e8ac2b4e080685johannkoenig@chromium.org test_coef_block1[vp9_default_scan_orders[tx_size_].scan[j]] = coef; 1808b26fe55f3e4daa2311dbd2d95e8ac2b4e080685johannkoenig@chromium.org } 1818b26fe55f3e4daa2311dbd2d95e8ac2b4e080685johannkoenig@chromium.org 1828b26fe55f3e4daa2311dbd2d95e8ac2b4e080685johannkoenig@chromium.org memcpy(test_coef_block2, test_coef_block1, 1838b26fe55f3e4daa2311dbd2d95e8ac2b4e080685johannkoenig@chromium.org sizeof(*test_coef_block2) * block_size); 1848b26fe55f3e4daa2311dbd2d95e8ac2b4e080685johannkoenig@chromium.org 18595aa45d73048f952dcaad0037429cc6751b34f2fjohannkoenig@google.com ASM_REGISTER_STATE_CHECK(full_itxfm_(test_coef_block1, dst1, size)); 18695aa45d73048f952dcaad0037429cc6751b34f2fjohannkoenig@google.com ASM_REGISTER_STATE_CHECK(partial_itxfm_(test_coef_block2, dst2, size)); 1878b26fe55f3e4daa2311dbd2d95e8ac2b4e080685johannkoenig@chromium.org 1888b26fe55f3e4daa2311dbd2d95e8ac2b4e080685johannkoenig@chromium.org for (int j = 0; j < block_size; ++j) { 1898b26fe55f3e4daa2311dbd2d95e8ac2b4e080685johannkoenig@chromium.org const int diff = dst1[j] - dst2[j]; 1908b26fe55f3e4daa2311dbd2d95e8ac2b4e080685johannkoenig@chromium.org const int error = diff * diff; 1918b26fe55f3e4daa2311dbd2d95e8ac2b4e080685johannkoenig@chromium.org if (max_error < error) 1928b26fe55f3e4daa2311dbd2d95e8ac2b4e080685johannkoenig@chromium.org max_error = error; 1938b26fe55f3e4daa2311dbd2d95e8ac2b4e080685johannkoenig@chromium.org } 1948b26fe55f3e4daa2311dbd2d95e8ac2b4e080685johannkoenig@chromium.org } 1958b26fe55f3e4daa2311dbd2d95e8ac2b4e080685johannkoenig@chromium.org 1968b26fe55f3e4daa2311dbd2d95e8ac2b4e080685johannkoenig@chromium.org EXPECT_EQ(0, max_error) 1978b26fe55f3e4daa2311dbd2d95e8ac2b4e080685johannkoenig@chromium.org << "Error: partial inverse transform produces different results"; 1988b26fe55f3e4daa2311dbd2d95e8ac2b4e080685johannkoenig@chromium.org} 1998b26fe55f3e4daa2311dbd2d95e8ac2b4e080685johannkoenig@chromium.orgusing std::tr1::make_tuple; 2008b26fe55f3e4daa2311dbd2d95e8ac2b4e080685johannkoenig@chromium.org 2018b26fe55f3e4daa2311dbd2d95e8ac2b4e080685johannkoenig@chromium.orgINSTANTIATE_TEST_CASE_P( 2028b26fe55f3e4daa2311dbd2d95e8ac2b4e080685johannkoenig@chromium.org C, PartialIDctTest, 2038b26fe55f3e4daa2311dbd2d95e8ac2b4e080685johannkoenig@chromium.org ::testing::Values( 20488b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org make_tuple(&vp9_fdct32x32_c, 20588b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org &vp9_idct32x32_1024_add_c, 2060e29f91ae7876791fc422e9c7cea72b1866439a6johannkoenig@chromium.org &vp9_idct32x32_34_add_c, 2078b26fe55f3e4daa2311dbd2d95e8ac2b4e080685johannkoenig@chromium.org TX_32X32, 34), 20888b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org make_tuple(&vp9_fdct32x32_c, 20988b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org &vp9_idct32x32_1024_add_c, 2100e29f91ae7876791fc422e9c7cea72b1866439a6johannkoenig@chromium.org &vp9_idct32x32_1_add_c, 2118b26fe55f3e4daa2311dbd2d95e8ac2b4e080685johannkoenig@chromium.org TX_32X32, 1), 21288b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org make_tuple(&vp9_fdct16x16_c, 21388b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org &vp9_idct16x16_256_add_c, 2140e29f91ae7876791fc422e9c7cea72b1866439a6johannkoenig@chromium.org &vp9_idct16x16_10_add_c, 2158b26fe55f3e4daa2311dbd2d95e8ac2b4e080685johannkoenig@chromium.org TX_16X16, 10), 21688b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org make_tuple(&vp9_fdct16x16_c, 21788b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org &vp9_idct16x16_256_add_c, 2180e29f91ae7876791fc422e9c7cea72b1866439a6johannkoenig@chromium.org &vp9_idct16x16_1_add_c, 2198b26fe55f3e4daa2311dbd2d95e8ac2b4e080685johannkoenig@chromium.org TX_16X16, 1), 22088b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org make_tuple(&vp9_fdct8x8_c, 22188b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org &vp9_idct8x8_64_add_c, 2227765c078fa920ba6c949c15f16b6cc979d8bb95bjohannkoenig@chromium.org &vp9_idct8x8_12_add_c, 2237765c078fa920ba6c949c15f16b6cc979d8bb95bjohannkoenig@chromium.org TX_8X8, 12), 22488b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org make_tuple(&vp9_fdct8x8_c, 22588b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org &vp9_idct8x8_64_add_c, 2260e29f91ae7876791fc422e9c7cea72b1866439a6johannkoenig@chromium.org &vp9_idct8x8_1_add_c, 2278b26fe55f3e4daa2311dbd2d95e8ac2b4e080685johannkoenig@chromium.org TX_8X8, 1), 22888b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org make_tuple(&vp9_fdct4x4_c, 22988b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org &vp9_idct4x4_16_add_c, 2300e29f91ae7876791fc422e9c7cea72b1866439a6johannkoenig@chromium.org &vp9_idct4x4_1_add_c, 2318b26fe55f3e4daa2311dbd2d95e8ac2b4e080685johannkoenig@chromium.org TX_4X4, 1))); 23287997d490ae52aa962a985c95b3cddf7f8832641johannkoenig@chromium.org 2337765c078fa920ba6c949c15f16b6cc979d8bb95bjohannkoenig@chromium.org#if HAVE_NEON_ASM 234411971f94253c85e1866c281860d6344f6aa0c78fgalligan@chromium.orgINSTANTIATE_TEST_CASE_P( 235411971f94253c85e1866c281860d6344f6aa0c78fgalligan@chromium.org NEON, PartialIDctTest, 236411971f94253c85e1866c281860d6344f6aa0c78fgalligan@chromium.org ::testing::Values( 23788b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org make_tuple(&vp9_fdct32x32_c, 23888b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org &vp9_idct32x32_1024_add_c, 239411971f94253c85e1866c281860d6344f6aa0c78fgalligan@chromium.org &vp9_idct32x32_1_add_neon, 240411971f94253c85e1866c281860d6344f6aa0c78fgalligan@chromium.org TX_32X32, 1), 24188b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org make_tuple(&vp9_fdct16x16_c, 24288b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org &vp9_idct16x16_256_add_c, 243411971f94253c85e1866c281860d6344f6aa0c78fgalligan@chromium.org &vp9_idct16x16_10_add_neon, 244411971f94253c85e1866c281860d6344f6aa0c78fgalligan@chromium.org TX_16X16, 10), 24588b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org make_tuple(&vp9_fdct16x16_c, 24688b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org &vp9_idct16x16_256_add_c, 247411971f94253c85e1866c281860d6344f6aa0c78fgalligan@chromium.org &vp9_idct16x16_1_add_neon, 248411971f94253c85e1866c281860d6344f6aa0c78fgalligan@chromium.org TX_16X16, 1), 24988b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org make_tuple(&vp9_fdct8x8_c, 25088b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org &vp9_idct8x8_64_add_c, 2517765c078fa920ba6c949c15f16b6cc979d8bb95bjohannkoenig@chromium.org &vp9_idct8x8_12_add_neon, 2527765c078fa920ba6c949c15f16b6cc979d8bb95bjohannkoenig@chromium.org TX_8X8, 12), 25388b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org make_tuple(&vp9_fdct8x8_c, 25488b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org &vp9_idct8x8_64_add_c, 255411971f94253c85e1866c281860d6344f6aa0c78fgalligan@chromium.org &vp9_idct8x8_1_add_neon, 256411971f94253c85e1866c281860d6344f6aa0c78fgalligan@chromium.org TX_8X8, 1), 25788b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org make_tuple(&vp9_fdct4x4_c, 25888b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org &vp9_idct4x4_16_add_c, 259411971f94253c85e1866c281860d6344f6aa0c78fgalligan@chromium.org &vp9_idct4x4_1_add_neon, 260411971f94253c85e1866c281860d6344f6aa0c78fgalligan@chromium.org TX_4X4, 1))); 261411971f94253c85e1866c281860d6344f6aa0c78fgalligan@chromium.org#endif 262411971f94253c85e1866c281860d6344f6aa0c78fgalligan@chromium.org 26387997d490ae52aa962a985c95b3cddf7f8832641johannkoenig@chromium.org#if HAVE_SSE2 && !CONFIG_VP9_HIGHBITDEPTH 2648b26fe55f3e4daa2311dbd2d95e8ac2b4e080685johannkoenig@chromium.orgINSTANTIATE_TEST_CASE_P( 2658b26fe55f3e4daa2311dbd2d95e8ac2b4e080685johannkoenig@chromium.org SSE2, PartialIDctTest, 2668b26fe55f3e4daa2311dbd2d95e8ac2b4e080685johannkoenig@chromium.org ::testing::Values( 26788b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org make_tuple(&vp9_fdct32x32_c, 26888b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org &vp9_idct32x32_1024_add_c, 2690e29f91ae7876791fc422e9c7cea72b1866439a6johannkoenig@chromium.org &vp9_idct32x32_34_add_sse2, 2708b26fe55f3e4daa2311dbd2d95e8ac2b4e080685johannkoenig@chromium.org TX_32X32, 34), 27188b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org make_tuple(&vp9_fdct32x32_c, 27288b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org &vp9_idct32x32_1024_add_c, 2730e29f91ae7876791fc422e9c7cea72b1866439a6johannkoenig@chromium.org &vp9_idct32x32_1_add_sse2, 2748b26fe55f3e4daa2311dbd2d95e8ac2b4e080685johannkoenig@chromium.org TX_32X32, 1), 27588b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org make_tuple(&vp9_fdct16x16_c, 27688b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org &vp9_idct16x16_256_add_c, 2770e29f91ae7876791fc422e9c7cea72b1866439a6johannkoenig@chromium.org &vp9_idct16x16_10_add_sse2, 2788b26fe55f3e4daa2311dbd2d95e8ac2b4e080685johannkoenig@chromium.org TX_16X16, 10), 27988b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org make_tuple(&vp9_fdct16x16_c, 28088b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org &vp9_idct16x16_256_add_c, 2810e29f91ae7876791fc422e9c7cea72b1866439a6johannkoenig@chromium.org &vp9_idct16x16_1_add_sse2, 2828b26fe55f3e4daa2311dbd2d95e8ac2b4e080685johannkoenig@chromium.org TX_16X16, 1), 28388b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org make_tuple(&vp9_fdct8x8_c, 28488b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org &vp9_idct8x8_64_add_c, 2857765c078fa920ba6c949c15f16b6cc979d8bb95bjohannkoenig@chromium.org &vp9_idct8x8_12_add_sse2, 2867765c078fa920ba6c949c15f16b6cc979d8bb95bjohannkoenig@chromium.org TX_8X8, 12), 28788b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org make_tuple(&vp9_fdct8x8_c, 28888b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org &vp9_idct8x8_64_add_c, 2890e29f91ae7876791fc422e9c7cea72b1866439a6johannkoenig@chromium.org &vp9_idct8x8_1_add_sse2, 2908b26fe55f3e4daa2311dbd2d95e8ac2b4e080685johannkoenig@chromium.org TX_8X8, 1), 29188b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org make_tuple(&vp9_fdct4x4_c, 29288b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org &vp9_idct4x4_16_add_c, 2930e29f91ae7876791fc422e9c7cea72b1866439a6johannkoenig@chromium.org &vp9_idct4x4_1_add_sse2, 2948b26fe55f3e4daa2311dbd2d95e8ac2b4e080685johannkoenig@chromium.org TX_4X4, 1))); 2958b26fe55f3e4daa2311dbd2d95e8ac2b4e080685johannkoenig@chromium.org#endif 2967765c078fa920ba6c949c15f16b6cc979d8bb95bjohannkoenig@chromium.org 29787997d490ae52aa962a985c95b3cddf7f8832641johannkoenig@chromium.org#if HAVE_SSSE3 && ARCH_X86_64 && !CONFIG_VP9_HIGHBITDEPTH 2987765c078fa920ba6c949c15f16b6cc979d8bb95bjohannkoenig@chromium.orgINSTANTIATE_TEST_CASE_P( 29988b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org SSSE3_64, PartialIDctTest, 3007765c078fa920ba6c949c15f16b6cc979d8bb95bjohannkoenig@chromium.org ::testing::Values( 30188b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org make_tuple(&vp9_fdct8x8_c, 30288b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org &vp9_idct8x8_64_add_c, 3037765c078fa920ba6c949c15f16b6cc979d8bb95bjohannkoenig@chromium.org &vp9_idct8x8_12_add_ssse3, 3047765c078fa920ba6c949c15f16b6cc979d8bb95bjohannkoenig@chromium.org TX_8X8, 12))); 3057765c078fa920ba6c949c15f16b6cc979d8bb95bjohannkoenig@chromium.org#endif 30688b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org 30787997d490ae52aa962a985c95b3cddf7f8832641johannkoenig@chromium.org#if HAVE_SSSE3 && !CONFIG_VP9_HIGHBITDEPTH 30888b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.orgINSTANTIATE_TEST_CASE_P( 30988b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org SSSE3, PartialIDctTest, 31088b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org ::testing::Values( 31188b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org make_tuple(&vp9_fdct16x16_c, 31288b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org &vp9_idct16x16_256_add_c, 31388b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org &vp9_idct16x16_10_add_ssse3, 31488b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org TX_16X16, 10))); 31588b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org#endif 3168b26fe55f3e4daa2311dbd2d95e8ac2b4e080685johannkoenig@chromium.org} // namespace 317