1/* 2 * Copyright (c) 2012 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 "third_party/googletest/src/include/gtest/gtest.h" 12#include "test/acm_random.h" 13#include "test/clear_system_state.h" 14#include "test/register_state_check.h" 15#include "./vpx_config.h" 16#include "./vp9_rtcd.h" 17#include "vp9/common/vp9_blockd.h" 18#include "vpx_mem/vpx_mem.h" 19 20typedef void (*SubtractFunc)(int rows, int cols, 21 int16_t *diff_ptr, ptrdiff_t diff_stride, 22 const uint8_t *src_ptr, ptrdiff_t src_stride, 23 const uint8_t *pred_ptr, ptrdiff_t pred_stride); 24 25namespace vp9 { 26 27class VP9SubtractBlockTest : public ::testing::TestWithParam<SubtractFunc> { 28 public: 29 virtual void TearDown() { 30 libvpx_test::ClearSystemState(); 31 } 32}; 33 34using libvpx_test::ACMRandom; 35 36TEST_P(VP9SubtractBlockTest, SimpleSubtract) { 37 ACMRandom rnd(ACMRandom::DeterministicSeed()); 38 39 // FIXME(rbultje) split in its own file 40 for (BLOCK_SIZE bsize = BLOCK_4X4; bsize < BLOCK_SIZES; 41 bsize = static_cast<BLOCK_SIZE>(static_cast<int>(bsize) + 1)) { 42 const int block_width = 4 * num_4x4_blocks_wide_lookup[bsize]; 43 const int block_height = 4 * num_4x4_blocks_high_lookup[bsize]; 44 int16_t *diff = reinterpret_cast<int16_t *>( 45 vpx_memalign(16, sizeof(*diff) * block_width * block_height * 2)); 46 uint8_t *pred = reinterpret_cast<uint8_t *>( 47 vpx_memalign(16, block_width * block_height * 2)); 48 uint8_t *src = reinterpret_cast<uint8_t *>( 49 vpx_memalign(16, block_width * block_height * 2)); 50 51 for (int n = 0; n < 100; n++) { 52 for (int r = 0; r < block_height; ++r) { 53 for (int c = 0; c < block_width * 2; ++c) { 54 src[r * block_width * 2 + c] = rnd.Rand8(); 55 pred[r * block_width * 2 + c] = rnd.Rand8(); 56 } 57 } 58 59 GetParam()(block_height, block_width, diff, block_width, 60 src, block_width, pred, block_width); 61 62 for (int r = 0; r < block_height; ++r) { 63 for (int c = 0; c < block_width; ++c) { 64 EXPECT_EQ(diff[r * block_width + c], 65 (src[r * block_width + c] - 66 pred[r * block_width + c])) << "r = " << r 67 << ", c = " << c 68 << ", bs = " << bsize; 69 } 70 } 71 72 GetParam()(block_height, block_width, diff, block_width * 2, 73 src, block_width * 2, pred, block_width * 2); 74 75 for (int r = 0; r < block_height; ++r) { 76 for (int c = 0; c < block_width; ++c) { 77 EXPECT_EQ(diff[r * block_width * 2 + c], 78 (src[r * block_width * 2 + c] - 79 pred[r * block_width * 2 + c])) << "r = " << r 80 << ", c = " << c 81 << ", bs = " << bsize; 82 } 83 } 84 } 85 vpx_free(diff); 86 vpx_free(pred); 87 vpx_free(src); 88 } 89} 90 91INSTANTIATE_TEST_CASE_P(C, VP9SubtractBlockTest, 92 ::testing::Values(vp9_subtract_block_c)); 93 94#if HAVE_SSE2 && CONFIG_USE_X86INC 95INSTANTIATE_TEST_CASE_P(SSE2, VP9SubtractBlockTest, 96 ::testing::Values(vp9_subtract_block_sse2)); 97#endif 98#if HAVE_NEON 99INSTANTIATE_TEST_CASE_P(NEON, VP9SubtractBlockTest, 100 ::testing::Values(vp9_subtract_block_neon)); 101#endif 102 103} // namespace vp9 104