15821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/* 25821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Copyright (c) 2010 The WebM project authors. All Rights Reserved. 35821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * 45821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Use of this source code is governed by a BSD-style license 55821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * that can be found in the LICENSE file in the root of the source 65821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * tree. An additional intellectual property rights grant can be found 75821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * in the file PATENTS. All contributing project authors may 85821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * be found in the AUTHORS file in the root of the source tree. 95821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */ 105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "./vpx_config.h" 125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "./vp8_rtcd.h" 133551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)#include "test/clear_system_state.h" 145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "test/register_state_check.h" 155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "third_party/googletest/src/include/gtest/gtest.h" 165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "vpx/vpx_integer.h" 185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)typedef void (*IdctFunc)(int16_t *input, unsigned char *pred_ptr, 205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int pred_stride, unsigned char *dst_ptr, 215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int dst_stride); 225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace { 235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class IDCTTest : public ::testing::TestWithParam<IdctFunc> { 245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) protected: 255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual void SetUp() { 265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int i; 275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) UUT = GetParam(); 295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) memset(input, 0, sizeof(input)); 305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) /* Set up guard blocks */ 315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) for (i = 0; i < 256; i++) output[i] = ((i & 0xF) < 4 && (i < 64)) ? 0 : -1; 325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual void TearDown() { libvpx_test::ClearSystemState(); } 355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) IdctFunc UUT; 375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int16_t input[16]; 385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) unsigned char output[256]; 395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) unsigned char predict[256]; 405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}; 415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_P(IDCTTest, TestGuardBlocks) { 435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int i; 445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) for (i = 0; i < 256; i++) 465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if ((i & 0xF) < 4 && i < 64) 47a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) EXPECT_EQ(0, output[i]) << i; 485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) else 49a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) EXPECT_EQ(255, output[i]); 505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_P(IDCTTest, TestAllZeros) { 535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int i; 545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASM_REGISTER_STATE_CHECK(UUT(input, output, 16, output, 16)); 565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 57 for (i = 0; i < 256; i++) 58 if ((i & 0xF) < 4 && i < 64) 59 EXPECT_EQ(0, output[i]) << "i==" << i; 60 else 61 EXPECT_EQ(255, output[i]) << "i==" << i; 62} 63 64TEST_P(IDCTTest, TestAllOnes) { 65 int i; 66 67 input[0] = 4; 68 ASM_REGISTER_STATE_CHECK(UUT(input, output, 16, output, 16)); 69 70 for (i = 0; i < 256; i++) 71 if ((i & 0xF) < 4 && i < 64) 72 EXPECT_EQ(1, output[i]) << "i==" << i; 73 else 74 EXPECT_EQ(255, output[i]) << "i==" << i; 75} 76 77TEST_P(IDCTTest, TestAddOne) { 78 int i; 79 80 for (i = 0; i < 256; i++) predict[i] = i; 81 input[0] = 4; 82 ASM_REGISTER_STATE_CHECK(UUT(input, predict, 16, output, 16)); 83 84 for (i = 0; i < 256; i++) 85 if ((i & 0xF) < 4 && i < 64) 86 EXPECT_EQ(i + 1, output[i]) << "i==" << i; 87 else 88 EXPECT_EQ(255, output[i]) << "i==" << i; 89} 90 91TEST_P(IDCTTest, TestWithData) { 92 int i; 93 94 for (i = 0; i < 16; i++) input[i] = i; 95 96 ASM_REGISTER_STATE_CHECK(UUT(input, output, 16, output, 16)); 97 98 for (i = 0; i < 256; i++) 99 if ((i & 0xF) > 3 || i > 63) 100 EXPECT_EQ(255, output[i]) << "i==" << i; 101 else if (i == 0) 102 EXPECT_EQ(11, output[i]) << "i==" << i; 103 else if (i == 34) 104 EXPECT_EQ(1, output[i]) << "i==" << i; 105 else if (i == 2 || i == 17 || i == 32) 106 EXPECT_EQ(3, output[i]) << "i==" << i; 107 else 108 EXPECT_EQ(0, output[i]) << "i==" << i; 109} 110 111INSTANTIATE_TEST_CASE_P(C, IDCTTest, ::testing::Values(vp8_short_idct4x4llm_c)); 112#if HAVE_MMX 113INSTANTIATE_TEST_CASE_P(MMX, IDCTTest, 114 ::testing::Values(vp8_short_idct4x4llm_mmx)); 115#endif 116} 117