idct_test.cc revision 1184aebb761cbeac9124c37189a80a1a58f04b6b
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 111b362b15af34006e6a11974088a46d42b903418eJohannextern "C" { 12ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang#include "./vpx_config.h" 13ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang#include "./vp8_rtcd.h" 141b362b15af34006e6a11974088a46d42b903418eJohann} 15ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang#include "test/clear_system_state.h" 16ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang#include "test/register_state_check.h" 171b362b15af34006e6a11974088a46d42b903418eJohann#include "third_party/googletest/src/include/gtest/gtest.h" 181b362b15af34006e6a11974088a46d42b903418eJohann 191184aebb761cbeac9124c37189a80a1a58f04b6bhkuang#include "vpx/vpx_integer.h" 201184aebb761cbeac9124c37189a80a1a58f04b6bhkuang 211184aebb761cbeac9124c37189a80a1a58f04b6bhkuangtypedef void (*idct_fn_t)(int16_t *input, unsigned char *pred_ptr, 221b362b15af34006e6a11974088a46d42b903418eJohann int pred_stride, unsigned char *dst_ptr, 231b362b15af34006e6a11974088a46d42b903418eJohann int dst_stride); 241b362b15af34006e6a11974088a46d42b903418eJohannnamespace { 25ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuangclass IDCTTest : public ::testing::TestWithParam<idct_fn_t> { 2691037db265ecdd914a26e056cf69207b4f50924ehkuang protected: 2791037db265ecdd914a26e056cf69207b4f50924ehkuang virtual void SetUp() { 2891037db265ecdd914a26e056cf69207b4f50924ehkuang int i; 2991037db265ecdd914a26e056cf69207b4f50924ehkuang 3091037db265ecdd914a26e056cf69207b4f50924ehkuang UUT = GetParam(); 3191037db265ecdd914a26e056cf69207b4f50924ehkuang memset(input, 0, sizeof(input)); 3291037db265ecdd914a26e056cf69207b4f50924ehkuang /* Set up guard blocks */ 3391037db265ecdd914a26e056cf69207b4f50924ehkuang for (i = 0; i < 256; i++) output[i] = ((i & 0xF) < 4 && (i < 64)) ? 0 : -1; 3491037db265ecdd914a26e056cf69207b4f50924ehkuang } 3591037db265ecdd914a26e056cf69207b4f50924ehkuang 3691037db265ecdd914a26e056cf69207b4f50924ehkuang virtual void TearDown() { libvpx_test::ClearSystemState(); } 3791037db265ecdd914a26e056cf69207b4f50924ehkuang 3891037db265ecdd914a26e056cf69207b4f50924ehkuang idct_fn_t UUT; 391184aebb761cbeac9124c37189a80a1a58f04b6bhkuang int16_t input[16]; 4091037db265ecdd914a26e056cf69207b4f50924ehkuang unsigned char output[256]; 4191037db265ecdd914a26e056cf69207b4f50924ehkuang unsigned char predict[256]; 421b362b15af34006e6a11974088a46d42b903418eJohann}; 431b362b15af34006e6a11974088a46d42b903418eJohann 44ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuangTEST_P(IDCTTest, TestGuardBlocks) { 4591037db265ecdd914a26e056cf69207b4f50924ehkuang int i; 461b362b15af34006e6a11974088a46d42b903418eJohann 4791037db265ecdd914a26e056cf69207b4f50924ehkuang for (i = 0; i < 256; i++) 4891037db265ecdd914a26e056cf69207b4f50924ehkuang if ((i & 0xF) < 4 && i < 64) 4991037db265ecdd914a26e056cf69207b4f50924ehkuang EXPECT_EQ(0, output[i]) << i; 5091037db265ecdd914a26e056cf69207b4f50924ehkuang else 5191037db265ecdd914a26e056cf69207b4f50924ehkuang EXPECT_EQ(255, output[i]); 521b362b15af34006e6a11974088a46d42b903418eJohann} 531b362b15af34006e6a11974088a46d42b903418eJohann 54ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuangTEST_P(IDCTTest, TestAllZeros) { 5591037db265ecdd914a26e056cf69207b4f50924ehkuang int i; 561b362b15af34006e6a11974088a46d42b903418eJohann 5791037db265ecdd914a26e056cf69207b4f50924ehkuang REGISTER_STATE_CHECK(UUT(input, output, 16, output, 16)); 581b362b15af34006e6a11974088a46d42b903418eJohann 5991037db265ecdd914a26e056cf69207b4f50924ehkuang for (i = 0; i < 256; i++) 6091037db265ecdd914a26e056cf69207b4f50924ehkuang if ((i & 0xF) < 4 && i < 64) 6191037db265ecdd914a26e056cf69207b4f50924ehkuang EXPECT_EQ(0, output[i]) << "i==" << i; 6291037db265ecdd914a26e056cf69207b4f50924ehkuang else 6391037db265ecdd914a26e056cf69207b4f50924ehkuang EXPECT_EQ(255, output[i]) << "i==" << i; 641b362b15af34006e6a11974088a46d42b903418eJohann} 651b362b15af34006e6a11974088a46d42b903418eJohann 66ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuangTEST_P(IDCTTest, TestAllOnes) { 6791037db265ecdd914a26e056cf69207b4f50924ehkuang int i; 681b362b15af34006e6a11974088a46d42b903418eJohann 6991037db265ecdd914a26e056cf69207b4f50924ehkuang input[0] = 4; 7091037db265ecdd914a26e056cf69207b4f50924ehkuang REGISTER_STATE_CHECK(UUT(input, output, 16, output, 16)); 711b362b15af34006e6a11974088a46d42b903418eJohann 7291037db265ecdd914a26e056cf69207b4f50924ehkuang for (i = 0; i < 256; i++) 7391037db265ecdd914a26e056cf69207b4f50924ehkuang if ((i & 0xF) < 4 && i < 64) 7491037db265ecdd914a26e056cf69207b4f50924ehkuang EXPECT_EQ(1, output[i]) << "i==" << i; 7591037db265ecdd914a26e056cf69207b4f50924ehkuang else 7691037db265ecdd914a26e056cf69207b4f50924ehkuang EXPECT_EQ(255, output[i]) << "i==" << i; 771b362b15af34006e6a11974088a46d42b903418eJohann} 781b362b15af34006e6a11974088a46d42b903418eJohann 79ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuangTEST_P(IDCTTest, TestAddOne) { 8091037db265ecdd914a26e056cf69207b4f50924ehkuang int i; 811b362b15af34006e6a11974088a46d42b903418eJohann 8291037db265ecdd914a26e056cf69207b4f50924ehkuang for (i = 0; i < 256; i++) predict[i] = i; 8391037db265ecdd914a26e056cf69207b4f50924ehkuang input[0] = 4; 8491037db265ecdd914a26e056cf69207b4f50924ehkuang REGISTER_STATE_CHECK(UUT(input, predict, 16, output, 16)); 851b362b15af34006e6a11974088a46d42b903418eJohann 8691037db265ecdd914a26e056cf69207b4f50924ehkuang for (i = 0; i < 256; i++) 8791037db265ecdd914a26e056cf69207b4f50924ehkuang if ((i & 0xF) < 4 && i < 64) 8891037db265ecdd914a26e056cf69207b4f50924ehkuang EXPECT_EQ(i + 1, output[i]) << "i==" << i; 8991037db265ecdd914a26e056cf69207b4f50924ehkuang else 9091037db265ecdd914a26e056cf69207b4f50924ehkuang EXPECT_EQ(255, output[i]) << "i==" << i; 911b362b15af34006e6a11974088a46d42b903418eJohann} 921b362b15af34006e6a11974088a46d42b903418eJohann 93ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuangTEST_P(IDCTTest, TestWithData) { 9491037db265ecdd914a26e056cf69207b4f50924ehkuang int i; 9591037db265ecdd914a26e056cf69207b4f50924ehkuang 9691037db265ecdd914a26e056cf69207b4f50924ehkuang for (i = 0; i < 16; i++) input[i] = i; 9791037db265ecdd914a26e056cf69207b4f50924ehkuang 9891037db265ecdd914a26e056cf69207b4f50924ehkuang REGISTER_STATE_CHECK(UUT(input, output, 16, output, 16)); 9991037db265ecdd914a26e056cf69207b4f50924ehkuang 10091037db265ecdd914a26e056cf69207b4f50924ehkuang for (i = 0; i < 256; i++) 10191037db265ecdd914a26e056cf69207b4f50924ehkuang if ((i & 0xF) > 3 || i > 63) 10291037db265ecdd914a26e056cf69207b4f50924ehkuang EXPECT_EQ(255, output[i]) << "i==" << i; 10391037db265ecdd914a26e056cf69207b4f50924ehkuang else if (i == 0) 10491037db265ecdd914a26e056cf69207b4f50924ehkuang EXPECT_EQ(11, output[i]) << "i==" << i; 10591037db265ecdd914a26e056cf69207b4f50924ehkuang else if (i == 34) 10691037db265ecdd914a26e056cf69207b4f50924ehkuang EXPECT_EQ(1, output[i]) << "i==" << i; 10791037db265ecdd914a26e056cf69207b4f50924ehkuang else if (i == 2 || i == 17 || i == 32) 10891037db265ecdd914a26e056cf69207b4f50924ehkuang EXPECT_EQ(3, output[i]) << "i==" << i; 10991037db265ecdd914a26e056cf69207b4f50924ehkuang else 11091037db265ecdd914a26e056cf69207b4f50924ehkuang EXPECT_EQ(0, output[i]) << "i==" << i; 1111b362b15af34006e6a11974088a46d42b903418eJohann} 1121b362b15af34006e6a11974088a46d42b903418eJohann 11391037db265ecdd914a26e056cf69207b4f50924ehkuangINSTANTIATE_TEST_CASE_P(C, IDCTTest, ::testing::Values(vp8_short_idct4x4llm_c)); 1141b362b15af34006e6a11974088a46d42b903418eJohann#if HAVE_MMX 1151b362b15af34006e6a11974088a46d42b903418eJohannINSTANTIATE_TEST_CASE_P(MMX, IDCTTest, 1161b362b15af34006e6a11974088a46d42b903418eJohann ::testing::Values(vp8_short_idct4x4llm_mmx)); 1171b362b15af34006e6a11974088a46d42b903418eJohann#endif 1181b362b15af34006e6a11974088a46d42b903418eJohann} 119