1 /* 2 * Copyright (c) 2010 The WebM project authors. All Rights Reserved. 3 * 4 * Use of this source code is governed by a BSD-style license 5 * that can be found in the LICENSE file in the root of the source 6 * tree. An additional intellectual property rights grant can be found 7 * in the file PATENTS. All contributing project authors may 8 * be found in the AUTHORS file in the root of the source tree. 9 */ 10 11 #include "./vpx_config.h" 12 #include "./vp8_rtcd.h" 13 14 #include "third_party/googletest/src/include/gtest/gtest.h" 15 16 #include "test/buffer.h" 17 #include "test/clear_system_state.h" 18 #include "test/register_state_check.h" 19 #include "vpx/vpx_integer.h" 20 21 typedef void (*IdctFunc)(int16_t *input, unsigned char *pred_ptr, 22 int pred_stride, unsigned char *dst_ptr, 23 int dst_stride); 24 namespace { 25 26 using libvpx_test::Buffer; 27 28 class IDCTTest : public ::testing::TestWithParam<IdctFunc> { 29 protected: 30 virtual void SetUp() { 31 UUT = GetParam(); 32 33 input = new Buffer<int16_t>(4, 4, 0); 34 ASSERT_TRUE(input != NULL); 35 ASSERT_TRUE(input->Init()); 36 predict = new Buffer<uint8_t>(4, 4, 3); 37 ASSERT_TRUE(predict != NULL); 38 ASSERT_TRUE(predict->Init()); 39 output = new Buffer<uint8_t>(4, 4, 3); 40 ASSERT_TRUE(output != NULL); 41 ASSERT_TRUE(output->Init()); 42 } 43 44 virtual void TearDown() { 45 delete input; 46 delete predict; 47 delete output; 48 libvpx_test::ClearSystemState(); 49 } 50 51 IdctFunc UUT; 52 Buffer<int16_t> *input; 53 Buffer<uint8_t> *predict; 54 Buffer<uint8_t> *output; 55 }; 56 57 TEST_P(IDCTTest, TestAllZeros) { 58 // When the input is '0' the output will be '0'. 59 input->Set(0); 60 predict->Set(0); 61 output->Set(0); 62 63 ASM_REGISTER_STATE_CHECK(UUT(input->TopLeftPixel(), predict->TopLeftPixel(), 64 predict->stride(), output->TopLeftPixel(), 65 output->stride())); 66 67 ASSERT_TRUE(input->CheckValues(0)); 68 ASSERT_TRUE(input->CheckPadding()); 69 ASSERT_TRUE(output->CheckValues(0)); 70 ASSERT_TRUE(output->CheckPadding()); 71 } 72 73 TEST_P(IDCTTest, TestAllOnes) { 74 input->Set(0); 75 ASSERT_TRUE(input->TopLeftPixel() != NULL); 76 // When the first element is '4' it will fill the output buffer with '1'. 77 input->TopLeftPixel()[0] = 4; 78 predict->Set(0); 79 output->Set(0); 80 81 ASM_REGISTER_STATE_CHECK(UUT(input->TopLeftPixel(), predict->TopLeftPixel(), 82 predict->stride(), output->TopLeftPixel(), 83 output->stride())); 84 85 ASSERT_TRUE(output->CheckValues(1)); 86 ASSERT_TRUE(output->CheckPadding()); 87 } 88 89 TEST_P(IDCTTest, TestAddOne) { 90 // Set the transform output to '1' and make sure it gets added to the 91 // prediction buffer. 92 input->Set(0); 93 ASSERT_TRUE(input->TopLeftPixel() != NULL); 94 input->TopLeftPixel()[0] = 4; 95 output->Set(0); 96 97 uint8_t *pred = predict->TopLeftPixel(); 98 for (int y = 0; y < 4; ++y) { 99 for (int x = 0; x < 4; ++x) { 100 pred[y * predict->stride() + x] = y * 4 + x; 101 } 102 } 103 104 ASM_REGISTER_STATE_CHECK(UUT(input->TopLeftPixel(), predict->TopLeftPixel(), 105 predict->stride(), output->TopLeftPixel(), 106 output->stride())); 107 108 uint8_t const *out = output->TopLeftPixel(); 109 for (int y = 0; y < 4; ++y) { 110 for (int x = 0; x < 4; ++x) { 111 EXPECT_EQ(1 + y * 4 + x, out[y * output->stride() + x]); 112 } 113 } 114 115 if (HasFailure()) { 116 output->DumpBuffer(); 117 } 118 119 ASSERT_TRUE(output->CheckPadding()); 120 } 121 122 TEST_P(IDCTTest, TestWithData) { 123 // Test a single known input. 124 predict->Set(0); 125 126 int16_t *in = input->TopLeftPixel(); 127 for (int y = 0; y < 4; ++y) { 128 for (int x = 0; x < 4; ++x) { 129 in[y * input->stride() + x] = y * 4 + x; 130 } 131 } 132 133 ASM_REGISTER_STATE_CHECK(UUT(input->TopLeftPixel(), predict->TopLeftPixel(), 134 predict->stride(), output->TopLeftPixel(), 135 output->stride())); 136 137 uint8_t *out = output->TopLeftPixel(); 138 for (int y = 0; y < 4; ++y) { 139 for (int x = 0; x < 4; ++x) { 140 switch (y * 4 + x) { 141 case 0: EXPECT_EQ(11, out[y * output->stride() + x]); break; 142 case 2: 143 case 5: 144 case 8: EXPECT_EQ(3, out[y * output->stride() + x]); break; 145 case 10: EXPECT_EQ(1, out[y * output->stride() + x]); break; 146 default: EXPECT_EQ(0, out[y * output->stride() + x]); 147 } 148 } 149 } 150 151 if (HasFailure()) { 152 output->DumpBuffer(); 153 } 154 155 ASSERT_TRUE(output->CheckPadding()); 156 } 157 158 INSTANTIATE_TEST_CASE_P(C, IDCTTest, ::testing::Values(vp8_short_idct4x4llm_c)); 159 160 #if HAVE_NEON 161 INSTANTIATE_TEST_CASE_P(NEON, IDCTTest, 162 ::testing::Values(vp8_short_idct4x4llm_neon)); 163 #endif // HAVE_NEON 164 165 #if HAVE_MMX 166 INSTANTIATE_TEST_CASE_P(MMX, IDCTTest, 167 ::testing::Values(vp8_short_idct4x4llm_mmx)); 168 #endif // HAVE_MMX 169 170 #if HAVE_MSA 171 INSTANTIATE_TEST_CASE_P(MSA, IDCTTest, 172 ::testing::Values(vp8_short_idct4x4llm_msa)); 173 #endif // HAVE_MSA 174 175 #if HAVE_MMI 176 INSTANTIATE_TEST_CASE_P(MMI, IDCTTest, 177 ::testing::Values(vp8_short_idct4x4llm_mmi)); 178 #endif // HAVE_MMI 179 } // namespace 180