11b362b15af34006e6a11974088a46d42b903418eJohann/* 21b362b15af34006e6a11974088a46d42b903418eJohann * Copyright (c) 2010 The WebM project authors. All Rights Reserved. 31b362b15af34006e6a11974088a46d42b903418eJohann * 41b362b15af34006e6a11974088a46d42b903418eJohann * Use of this source code is governed by a BSD-style license 51b362b15af34006e6a11974088a46d42b903418eJohann * that can be found in the LICENSE file in the root of the source 61b362b15af34006e6a11974088a46d42b903418eJohann * tree. An additional intellectual property rights grant can be found 71b362b15af34006e6a11974088a46d42b903418eJohann * in the file PATENTS. All contributing project authors may 81b362b15af34006e6a11974088a46d42b903418eJohann * be found in the AUTHORS file in the root of the source tree. 91b362b15af34006e6a11974088a46d42b903418eJohann */ 101b362b15af34006e6a11974088a46d42b903418eJohann 11ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang#include "./vpx_config.h" 12ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang#include "./vp8_rtcd.h" 13ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang#include "test/clear_system_state.h" 14ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang#include "test/register_state_check.h" 151b362b15af34006e6a11974088a46d42b903418eJohann#include "third_party/googletest/src/include/gtest/gtest.h" 161b362b15af34006e6a11974088a46d42b903418eJohann 173df0563f1b24dac6c0bd122fc922a48211269061hkuang#include "vpx/vpx_integer.h" 183df0563f1b24dac6c0bd122fc922a48211269061hkuang 193df0563f1b24dac6c0bd122fc922a48211269061hkuangtypedef void (*idct_fn_t)(int16_t *input, unsigned char *pred_ptr, 201b362b15af34006e6a11974088a46d42b903418eJohann int pred_stride, unsigned char *dst_ptr, 211b362b15af34006e6a11974088a46d42b903418eJohann int dst_stride); 221b362b15af34006e6a11974088a46d42b903418eJohannnamespace { 23ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuangclass IDCTTest : public ::testing::TestWithParam<idct_fn_t> { 2491037db265ecdd914a26e056cf69207b4f50924ehkuang protected: 2591037db265ecdd914a26e056cf69207b4f50924ehkuang virtual void SetUp() { 2691037db265ecdd914a26e056cf69207b4f50924ehkuang int i; 2791037db265ecdd914a26e056cf69207b4f50924ehkuang 2891037db265ecdd914a26e056cf69207b4f50924ehkuang UUT = GetParam(); 2991037db265ecdd914a26e056cf69207b4f50924ehkuang memset(input, 0, sizeof(input)); 3091037db265ecdd914a26e056cf69207b4f50924ehkuang /* Set up guard blocks */ 3191037db265ecdd914a26e056cf69207b4f50924ehkuang for (i = 0; i < 256; i++) output[i] = ((i & 0xF) < 4 && (i < 64)) ? 0 : -1; 3291037db265ecdd914a26e056cf69207b4f50924ehkuang } 3391037db265ecdd914a26e056cf69207b4f50924ehkuang 3491037db265ecdd914a26e056cf69207b4f50924ehkuang virtual void TearDown() { libvpx_test::ClearSystemState(); } 3591037db265ecdd914a26e056cf69207b4f50924ehkuang 3691037db265ecdd914a26e056cf69207b4f50924ehkuang idct_fn_t UUT; 373df0563f1b24dac6c0bd122fc922a48211269061hkuang int16_t input[16]; 3891037db265ecdd914a26e056cf69207b4f50924ehkuang unsigned char output[256]; 3991037db265ecdd914a26e056cf69207b4f50924ehkuang unsigned char predict[256]; 401b362b15af34006e6a11974088a46d42b903418eJohann}; 411b362b15af34006e6a11974088a46d42b903418eJohann 42ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuangTEST_P(IDCTTest, TestGuardBlocks) { 4391037db265ecdd914a26e056cf69207b4f50924ehkuang int i; 441b362b15af34006e6a11974088a46d42b903418eJohann 4591037db265ecdd914a26e056cf69207b4f50924ehkuang for (i = 0; i < 256; i++) 4691037db265ecdd914a26e056cf69207b4f50924ehkuang if ((i & 0xF) < 4 && i < 64) 4791037db265ecdd914a26e056cf69207b4f50924ehkuang EXPECT_EQ(0, output[i]) << i; 4891037db265ecdd914a26e056cf69207b4f50924ehkuang else 4991037db265ecdd914a26e056cf69207b4f50924ehkuang EXPECT_EQ(255, output[i]); 501b362b15af34006e6a11974088a46d42b903418eJohann} 511b362b15af34006e6a11974088a46d42b903418eJohann 52ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuangTEST_P(IDCTTest, TestAllZeros) { 5391037db265ecdd914a26e056cf69207b4f50924ehkuang int i; 541b362b15af34006e6a11974088a46d42b903418eJohann 5591037db265ecdd914a26e056cf69207b4f50924ehkuang REGISTER_STATE_CHECK(UUT(input, output, 16, output, 16)); 561b362b15af34006e6a11974088a46d42b903418eJohann 5791037db265ecdd914a26e056cf69207b4f50924ehkuang for (i = 0; i < 256; i++) 5891037db265ecdd914a26e056cf69207b4f50924ehkuang if ((i & 0xF) < 4 && i < 64) 5991037db265ecdd914a26e056cf69207b4f50924ehkuang EXPECT_EQ(0, output[i]) << "i==" << i; 6091037db265ecdd914a26e056cf69207b4f50924ehkuang else 6191037db265ecdd914a26e056cf69207b4f50924ehkuang EXPECT_EQ(255, output[i]) << "i==" << i; 621b362b15af34006e6a11974088a46d42b903418eJohann} 631b362b15af34006e6a11974088a46d42b903418eJohann 64ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuangTEST_P(IDCTTest, TestAllOnes) { 6591037db265ecdd914a26e056cf69207b4f50924ehkuang int i; 661b362b15af34006e6a11974088a46d42b903418eJohann 6791037db265ecdd914a26e056cf69207b4f50924ehkuang input[0] = 4; 6891037db265ecdd914a26e056cf69207b4f50924ehkuang REGISTER_STATE_CHECK(UUT(input, output, 16, output, 16)); 691b362b15af34006e6a11974088a46d42b903418eJohann 7091037db265ecdd914a26e056cf69207b4f50924ehkuang for (i = 0; i < 256; i++) 7191037db265ecdd914a26e056cf69207b4f50924ehkuang if ((i & 0xF) < 4 && i < 64) 7291037db265ecdd914a26e056cf69207b4f50924ehkuang EXPECT_EQ(1, output[i]) << "i==" << i; 7391037db265ecdd914a26e056cf69207b4f50924ehkuang else 7491037db265ecdd914a26e056cf69207b4f50924ehkuang EXPECT_EQ(255, output[i]) << "i==" << i; 751b362b15af34006e6a11974088a46d42b903418eJohann} 761b362b15af34006e6a11974088a46d42b903418eJohann 77ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuangTEST_P(IDCTTest, TestAddOne) { 7891037db265ecdd914a26e056cf69207b4f50924ehkuang int i; 791b362b15af34006e6a11974088a46d42b903418eJohann 8091037db265ecdd914a26e056cf69207b4f50924ehkuang for (i = 0; i < 256; i++) predict[i] = i; 8191037db265ecdd914a26e056cf69207b4f50924ehkuang input[0] = 4; 8291037db265ecdd914a26e056cf69207b4f50924ehkuang REGISTER_STATE_CHECK(UUT(input, predict, 16, output, 16)); 831b362b15af34006e6a11974088a46d42b903418eJohann 8491037db265ecdd914a26e056cf69207b4f50924ehkuang for (i = 0; i < 256; i++) 8591037db265ecdd914a26e056cf69207b4f50924ehkuang if ((i & 0xF) < 4 && i < 64) 8691037db265ecdd914a26e056cf69207b4f50924ehkuang EXPECT_EQ(i + 1, output[i]) << "i==" << i; 8791037db265ecdd914a26e056cf69207b4f50924ehkuang else 8891037db265ecdd914a26e056cf69207b4f50924ehkuang EXPECT_EQ(255, output[i]) << "i==" << i; 891b362b15af34006e6a11974088a46d42b903418eJohann} 901b362b15af34006e6a11974088a46d42b903418eJohann 91ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuangTEST_P(IDCTTest, TestWithData) { 9291037db265ecdd914a26e056cf69207b4f50924ehkuang int i; 9391037db265ecdd914a26e056cf69207b4f50924ehkuang 9491037db265ecdd914a26e056cf69207b4f50924ehkuang for (i = 0; i < 16; i++) input[i] = i; 9591037db265ecdd914a26e056cf69207b4f50924ehkuang 9691037db265ecdd914a26e056cf69207b4f50924ehkuang REGISTER_STATE_CHECK(UUT(input, output, 16, output, 16)); 9791037db265ecdd914a26e056cf69207b4f50924ehkuang 9891037db265ecdd914a26e056cf69207b4f50924ehkuang for (i = 0; i < 256; i++) 9991037db265ecdd914a26e056cf69207b4f50924ehkuang if ((i & 0xF) > 3 || i > 63) 10091037db265ecdd914a26e056cf69207b4f50924ehkuang EXPECT_EQ(255, output[i]) << "i==" << i; 10191037db265ecdd914a26e056cf69207b4f50924ehkuang else if (i == 0) 10291037db265ecdd914a26e056cf69207b4f50924ehkuang EXPECT_EQ(11, output[i]) << "i==" << i; 10391037db265ecdd914a26e056cf69207b4f50924ehkuang else if (i == 34) 10491037db265ecdd914a26e056cf69207b4f50924ehkuang EXPECT_EQ(1, output[i]) << "i==" << i; 10591037db265ecdd914a26e056cf69207b4f50924ehkuang else if (i == 2 || i == 17 || i == 32) 10691037db265ecdd914a26e056cf69207b4f50924ehkuang EXPECT_EQ(3, output[i]) << "i==" << i; 10791037db265ecdd914a26e056cf69207b4f50924ehkuang else 10891037db265ecdd914a26e056cf69207b4f50924ehkuang EXPECT_EQ(0, output[i]) << "i==" << i; 1091b362b15af34006e6a11974088a46d42b903418eJohann} 1101b362b15af34006e6a11974088a46d42b903418eJohann 11191037db265ecdd914a26e056cf69207b4f50924ehkuangINSTANTIATE_TEST_CASE_P(C, IDCTTest, ::testing::Values(vp8_short_idct4x4llm_c)); 1121b362b15af34006e6a11974088a46d42b903418eJohann#if HAVE_MMX 1131b362b15af34006e6a11974088a46d42b903418eJohannINSTANTIATE_TEST_CASE_P(MMX, IDCTTest, 1141b362b15af34006e6a11974088a46d42b903418eJohann ::testing::Values(vp8_short_idct4x4llm_mmx)); 1151b362b15af34006e6a11974088a46d42b903418eJohann#endif 1161b362b15af34006e6a11974088a46d42b903418eJohann} 117