191037db265ecdd914a26e056cf69207b4f50924ehkuang/* 291037db265ecdd914a26e056cf69207b4f50924ehkuang * Copyright (c) 2012 The WebM project authors. All Rights Reserved. 391037db265ecdd914a26e056cf69207b4f50924ehkuang * 491037db265ecdd914a26e056cf69207b4f50924ehkuang * Use of this source code is governed by a BSD-style license 591037db265ecdd914a26e056cf69207b4f50924ehkuang * that can be found in the LICENSE file in the root of the source 691037db265ecdd914a26e056cf69207b4f50924ehkuang * tree. An additional intellectual property rights grant can be found 791037db265ecdd914a26e056cf69207b4f50924ehkuang * in the file PATENTS. All contributing project authors may 891037db265ecdd914a26e056cf69207b4f50924ehkuang * be found in the AUTHORS file in the root of the source tree. 991037db265ecdd914a26e056cf69207b4f50924ehkuang */ 1091037db265ecdd914a26e056cf69207b4f50924ehkuang 1191037db265ecdd914a26e056cf69207b4f50924ehkuang#include "third_party/googletest/src/include/gtest/gtest.h" 12da49e34c1fb5e99681f4ad99c21d9cfd83eddb96Vignesh Venkatasubramanian 13da49e34c1fb5e99681f4ad99c21d9cfd83eddb96Vignesh Venkatasubramanian#include "./vp9_rtcd.h" 14da49e34c1fb5e99681f4ad99c21d9cfd83eddb96Vignesh Venkatasubramanian#include "./vpx_config.h" 15da49e34c1fb5e99681f4ad99c21d9cfd83eddb96Vignesh Venkatasubramanian#include "./vpx_dsp_rtcd.h" 1691037db265ecdd914a26e056cf69207b4f50924ehkuang#include "test/acm_random.h" 1791037db265ecdd914a26e056cf69207b4f50924ehkuang#include "test/clear_system_state.h" 1891037db265ecdd914a26e056cf69207b4f50924ehkuang#include "test/register_state_check.h" 1991037db265ecdd914a26e056cf69207b4f50924ehkuang#include "vp9/common/vp9_blockd.h" 2091037db265ecdd914a26e056cf69207b4f50924ehkuang#include "vpx_mem/vpx_mem.h" 2191037db265ecdd914a26e056cf69207b4f50924ehkuang 22ba6c59e9d7d7013b3906b6f4230b663422681848Vignesh Venkatasubramaniantypedef void (*SubtractFunc)(int rows, int cols, 23ba6c59e9d7d7013b3906b6f4230b663422681848Vignesh Venkatasubramanian int16_t *diff_ptr, ptrdiff_t diff_stride, 24ba6c59e9d7d7013b3906b6f4230b663422681848Vignesh Venkatasubramanian const uint8_t *src_ptr, ptrdiff_t src_stride, 25ba6c59e9d7d7013b3906b6f4230b663422681848Vignesh Venkatasubramanian const uint8_t *pred_ptr, ptrdiff_t pred_stride); 2691037db265ecdd914a26e056cf69207b4f50924ehkuang 2791037db265ecdd914a26e056cf69207b4f50924ehkuangnamespace vp9 { 2891037db265ecdd914a26e056cf69207b4f50924ehkuang 29ba6c59e9d7d7013b3906b6f4230b663422681848Vignesh Venkatasubramanianclass VP9SubtractBlockTest : public ::testing::TestWithParam<SubtractFunc> { 3091037db265ecdd914a26e056cf69207b4f50924ehkuang public: 3191037db265ecdd914a26e056cf69207b4f50924ehkuang virtual void TearDown() { 3291037db265ecdd914a26e056cf69207b4f50924ehkuang libvpx_test::ClearSystemState(); 3391037db265ecdd914a26e056cf69207b4f50924ehkuang } 3491037db265ecdd914a26e056cf69207b4f50924ehkuang}; 3591037db265ecdd914a26e056cf69207b4f50924ehkuang 3691037db265ecdd914a26e056cf69207b4f50924ehkuangusing libvpx_test::ACMRandom; 3791037db265ecdd914a26e056cf69207b4f50924ehkuang 3891037db265ecdd914a26e056cf69207b4f50924ehkuangTEST_P(VP9SubtractBlockTest, SimpleSubtract) { 3991037db265ecdd914a26e056cf69207b4f50924ehkuang ACMRandom rnd(ACMRandom::DeterministicSeed()); 4091037db265ecdd914a26e056cf69207b4f50924ehkuang 4191037db265ecdd914a26e056cf69207b4f50924ehkuang // FIXME(rbultje) split in its own file 421184aebb761cbeac9124c37189a80a1a58f04b6bhkuang for (BLOCK_SIZE bsize = BLOCK_4X4; bsize < BLOCK_SIZES; 431184aebb761cbeac9124c37189a80a1a58f04b6bhkuang bsize = static_cast<BLOCK_SIZE>(static_cast<int>(bsize) + 1)) { 442ec72e65689c948e92b826ae1e867bf369e72f13Vignesh Venkatasubramanian const int block_width = 4 * num_4x4_blocks_wide_lookup[bsize]; 452ec72e65689c948e92b826ae1e867bf369e72f13Vignesh Venkatasubramanian const int block_height = 4 * num_4x4_blocks_high_lookup[bsize]; 4691037db265ecdd914a26e056cf69207b4f50924ehkuang int16_t *diff = reinterpret_cast<int16_t *>( 4791037db265ecdd914a26e056cf69207b4f50924ehkuang vpx_memalign(16, sizeof(*diff) * block_width * block_height * 2)); 4891037db265ecdd914a26e056cf69207b4f50924ehkuang uint8_t *pred = reinterpret_cast<uint8_t *>( 4991037db265ecdd914a26e056cf69207b4f50924ehkuang vpx_memalign(16, block_width * block_height * 2)); 5091037db265ecdd914a26e056cf69207b4f50924ehkuang uint8_t *src = reinterpret_cast<uint8_t *>( 5191037db265ecdd914a26e056cf69207b4f50924ehkuang vpx_memalign(16, block_width * block_height * 2)); 5291037db265ecdd914a26e056cf69207b4f50924ehkuang 5391037db265ecdd914a26e056cf69207b4f50924ehkuang for (int n = 0; n < 100; n++) { 5491037db265ecdd914a26e056cf69207b4f50924ehkuang for (int r = 0; r < block_height; ++r) { 5591037db265ecdd914a26e056cf69207b4f50924ehkuang for (int c = 0; c < block_width * 2; ++c) { 5691037db265ecdd914a26e056cf69207b4f50924ehkuang src[r * block_width * 2 + c] = rnd.Rand8(); 5791037db265ecdd914a26e056cf69207b4f50924ehkuang pred[r * block_width * 2 + c] = rnd.Rand8(); 5891037db265ecdd914a26e056cf69207b4f50924ehkuang } 5991037db265ecdd914a26e056cf69207b4f50924ehkuang } 6091037db265ecdd914a26e056cf69207b4f50924ehkuang 6191037db265ecdd914a26e056cf69207b4f50924ehkuang GetParam()(block_height, block_width, diff, block_width, 6291037db265ecdd914a26e056cf69207b4f50924ehkuang src, block_width, pred, block_width); 6391037db265ecdd914a26e056cf69207b4f50924ehkuang 6491037db265ecdd914a26e056cf69207b4f50924ehkuang for (int r = 0; r < block_height; ++r) { 6591037db265ecdd914a26e056cf69207b4f50924ehkuang for (int c = 0; c < block_width; ++c) { 6691037db265ecdd914a26e056cf69207b4f50924ehkuang EXPECT_EQ(diff[r * block_width + c], 6791037db265ecdd914a26e056cf69207b4f50924ehkuang (src[r * block_width + c] - 6891037db265ecdd914a26e056cf69207b4f50924ehkuang pred[r * block_width + c])) << "r = " << r 6991037db265ecdd914a26e056cf69207b4f50924ehkuang << ", c = " << c 7091037db265ecdd914a26e056cf69207b4f50924ehkuang << ", bs = " << bsize; 7191037db265ecdd914a26e056cf69207b4f50924ehkuang } 7291037db265ecdd914a26e056cf69207b4f50924ehkuang } 7391037db265ecdd914a26e056cf69207b4f50924ehkuang 7491037db265ecdd914a26e056cf69207b4f50924ehkuang GetParam()(block_height, block_width, diff, block_width * 2, 7591037db265ecdd914a26e056cf69207b4f50924ehkuang src, block_width * 2, pred, block_width * 2); 7691037db265ecdd914a26e056cf69207b4f50924ehkuang 7791037db265ecdd914a26e056cf69207b4f50924ehkuang for (int r = 0; r < block_height; ++r) { 7891037db265ecdd914a26e056cf69207b4f50924ehkuang for (int c = 0; c < block_width; ++c) { 7991037db265ecdd914a26e056cf69207b4f50924ehkuang EXPECT_EQ(diff[r * block_width * 2 + c], 8091037db265ecdd914a26e056cf69207b4f50924ehkuang (src[r * block_width * 2 + c] - 8191037db265ecdd914a26e056cf69207b4f50924ehkuang pred[r * block_width * 2 + c])) << "r = " << r 8291037db265ecdd914a26e056cf69207b4f50924ehkuang << ", c = " << c 8391037db265ecdd914a26e056cf69207b4f50924ehkuang << ", bs = " << bsize; 8491037db265ecdd914a26e056cf69207b4f50924ehkuang } 8591037db265ecdd914a26e056cf69207b4f50924ehkuang } 8691037db265ecdd914a26e056cf69207b4f50924ehkuang } 8791037db265ecdd914a26e056cf69207b4f50924ehkuang vpx_free(diff); 8891037db265ecdd914a26e056cf69207b4f50924ehkuang vpx_free(pred); 8991037db265ecdd914a26e056cf69207b4f50924ehkuang vpx_free(src); 9091037db265ecdd914a26e056cf69207b4f50924ehkuang } 9191037db265ecdd914a26e056cf69207b4f50924ehkuang} 9291037db265ecdd914a26e056cf69207b4f50924ehkuang 9391037db265ecdd914a26e056cf69207b4f50924ehkuangINSTANTIATE_TEST_CASE_P(C, VP9SubtractBlockTest, 94da49e34c1fb5e99681f4ad99c21d9cfd83eddb96Vignesh Venkatasubramanian ::testing::Values(vpx_subtract_block_c)); 9591037db265ecdd914a26e056cf69207b4f50924ehkuang 96f3bed9137f66ef693bd406e43b17e9a1114f1e14hkuang#if HAVE_SSE2 && CONFIG_USE_X86INC 9791037db265ecdd914a26e056cf69207b4f50924ehkuangINSTANTIATE_TEST_CASE_P(SSE2, VP9SubtractBlockTest, 98da49e34c1fb5e99681f4ad99c21d9cfd83eddb96Vignesh Venkatasubramanian ::testing::Values(vpx_subtract_block_sse2)); 9991037db265ecdd914a26e056cf69207b4f50924ehkuang#endif 100ba6c59e9d7d7013b3906b6f4230b663422681848Vignesh Venkatasubramanian#if HAVE_NEON 101ba6c59e9d7d7013b3906b6f4230b663422681848Vignesh VenkatasubramanianINSTANTIATE_TEST_CASE_P(NEON, VP9SubtractBlockTest, 102da49e34c1fb5e99681f4ad99c21d9cfd83eddb96Vignesh Venkatasubramanian ::testing::Values(vpx_subtract_block_neon)); 103da49e34c1fb5e99681f4ad99c21d9cfd83eddb96Vignesh Venkatasubramanian#endif 104da49e34c1fb5e99681f4ad99c21d9cfd83eddb96Vignesh Venkatasubramanian#if HAVE_MSA 105da49e34c1fb5e99681f4ad99c21d9cfd83eddb96Vignesh VenkatasubramanianINSTANTIATE_TEST_CASE_P(MSA, VP9SubtractBlockTest, 106da49e34c1fb5e99681f4ad99c21d9cfd83eddb96Vignesh Venkatasubramanian ::testing::Values(vpx_subtract_block_msa)); 107ba6c59e9d7d7013b3906b6f4230b663422681848Vignesh Venkatasubramanian#endif 108ba6c59e9d7d7013b3906b6f4230b663422681848Vignesh Venkatasubramanian 10991037db265ecdd914a26e056cf69207b4f50924ehkuang} // namespace vp9 110