1233d2500723e5594f3e7c70896ffeeef32b9c950ywan/* 2233d2500723e5594f3e7c70896ffeeef32b9c950ywan * Copyright (c) 2012 The WebM project authors. All Rights Reserved. 3233d2500723e5594f3e7c70896ffeeef32b9c950ywan * 4233d2500723e5594f3e7c70896ffeeef32b9c950ywan * Use of this source code is governed by a BSD-style license 5233d2500723e5594f3e7c70896ffeeef32b9c950ywan * that can be found in the LICENSE file in the root of the source 6233d2500723e5594f3e7c70896ffeeef32b9c950ywan * tree. An additional intellectual property rights grant can be found 7233d2500723e5594f3e7c70896ffeeef32b9c950ywan * in the file PATENTS. All contributing project authors may 8233d2500723e5594f3e7c70896ffeeef32b9c950ywan * be found in the AUTHORS file in the root of the source tree. 9233d2500723e5594f3e7c70896ffeeef32b9c950ywan */ 10233d2500723e5594f3e7c70896ffeeef32b9c950ywan 11233d2500723e5594f3e7c70896ffeeef32b9c950ywan#include "third_party/googletest/src/include/gtest/gtest.h" 12233d2500723e5594f3e7c70896ffeeef32b9c950ywan#include "test/acm_random.h" 13233d2500723e5594f3e7c70896ffeeef32b9c950ywan#include "test/clear_system_state.h" 14233d2500723e5594f3e7c70896ffeeef32b9c950ywan#include "test/register_state_check.h" 15233d2500723e5594f3e7c70896ffeeef32b9c950ywan#include "./vpx_config.h" 16233d2500723e5594f3e7c70896ffeeef32b9c950ywan#include "./vp9_rtcd.h" 17233d2500723e5594f3e7c70896ffeeef32b9c950ywan#include "vp9/common/vp9_blockd.h" 18233d2500723e5594f3e7c70896ffeeef32b9c950ywan#include "vpx_mem/vpx_mem.h" 19233d2500723e5594f3e7c70896ffeeef32b9c950ywan 20233d2500723e5594f3e7c70896ffeeef32b9c950ywantypedef void (*subtract_fn_t)(int rows, int cols, 21233d2500723e5594f3e7c70896ffeeef32b9c950ywan int16_t *diff_ptr, ptrdiff_t diff_stride, 22233d2500723e5594f3e7c70896ffeeef32b9c950ywan const uint8_t *src_ptr, ptrdiff_t src_stride, 23233d2500723e5594f3e7c70896ffeeef32b9c950ywan const uint8_t *pred_ptr, ptrdiff_t pred_stride); 24233d2500723e5594f3e7c70896ffeeef32b9c950ywan 25233d2500723e5594f3e7c70896ffeeef32b9c950ywannamespace vp9 { 26233d2500723e5594f3e7c70896ffeeef32b9c950ywan 27233d2500723e5594f3e7c70896ffeeef32b9c950ywanclass VP9SubtractBlockTest : public ::testing::TestWithParam<subtract_fn_t> { 28233d2500723e5594f3e7c70896ffeeef32b9c950ywan public: 29233d2500723e5594f3e7c70896ffeeef32b9c950ywan virtual void TearDown() { 30233d2500723e5594f3e7c70896ffeeef32b9c950ywan libvpx_test::ClearSystemState(); 31233d2500723e5594f3e7c70896ffeeef32b9c950ywan } 32233d2500723e5594f3e7c70896ffeeef32b9c950ywan}; 33233d2500723e5594f3e7c70896ffeeef32b9c950ywan 34233d2500723e5594f3e7c70896ffeeef32b9c950ywanusing libvpx_test::ACMRandom; 35233d2500723e5594f3e7c70896ffeeef32b9c950ywan 36233d2500723e5594f3e7c70896ffeeef32b9c950ywanTEST_P(VP9SubtractBlockTest, SimpleSubtract) { 37233d2500723e5594f3e7c70896ffeeef32b9c950ywan ACMRandom rnd(ACMRandom::DeterministicSeed()); 38233d2500723e5594f3e7c70896ffeeef32b9c950ywan 39233d2500723e5594f3e7c70896ffeeef32b9c950ywan // FIXME(rbultje) split in its own file 40233d2500723e5594f3e7c70896ffeeef32b9c950ywan for (BLOCK_SIZE bsize = BLOCK_4X4; bsize < BLOCK_SIZES; 41233d2500723e5594f3e7c70896ffeeef32b9c950ywan bsize = static_cast<BLOCK_SIZE>(static_cast<int>(bsize) + 1)) { 42233d2500723e5594f3e7c70896ffeeef32b9c950ywan const int block_width = 4 * num_4x4_blocks_wide_lookup[bsize]; 43233d2500723e5594f3e7c70896ffeeef32b9c950ywan const int block_height = 4 * num_4x4_blocks_high_lookup[bsize]; 44233d2500723e5594f3e7c70896ffeeef32b9c950ywan int16_t *diff = reinterpret_cast<int16_t *>( 45233d2500723e5594f3e7c70896ffeeef32b9c950ywan vpx_memalign(16, sizeof(*diff) * block_width * block_height * 2)); 46233d2500723e5594f3e7c70896ffeeef32b9c950ywan uint8_t *pred = reinterpret_cast<uint8_t *>( 47233d2500723e5594f3e7c70896ffeeef32b9c950ywan vpx_memalign(16, block_width * block_height * 2)); 48233d2500723e5594f3e7c70896ffeeef32b9c950ywan uint8_t *src = reinterpret_cast<uint8_t *>( 49233d2500723e5594f3e7c70896ffeeef32b9c950ywan vpx_memalign(16, block_width * block_height * 2)); 50233d2500723e5594f3e7c70896ffeeef32b9c950ywan 51233d2500723e5594f3e7c70896ffeeef32b9c950ywan for (int n = 0; n < 100; n++) { 52233d2500723e5594f3e7c70896ffeeef32b9c950ywan for (int r = 0; r < block_height; ++r) { 53233d2500723e5594f3e7c70896ffeeef32b9c950ywan for (int c = 0; c < block_width * 2; ++c) { 54233d2500723e5594f3e7c70896ffeeef32b9c950ywan src[r * block_width * 2 + c] = rnd.Rand8(); 55233d2500723e5594f3e7c70896ffeeef32b9c950ywan pred[r * block_width * 2 + c] = rnd.Rand8(); 56233d2500723e5594f3e7c70896ffeeef32b9c950ywan } 57233d2500723e5594f3e7c70896ffeeef32b9c950ywan } 58233d2500723e5594f3e7c70896ffeeef32b9c950ywan 59233d2500723e5594f3e7c70896ffeeef32b9c950ywan GetParam()(block_height, block_width, diff, block_width, 60233d2500723e5594f3e7c70896ffeeef32b9c950ywan src, block_width, pred, block_width); 61233d2500723e5594f3e7c70896ffeeef32b9c950ywan 62233d2500723e5594f3e7c70896ffeeef32b9c950ywan for (int r = 0; r < block_height; ++r) { 63233d2500723e5594f3e7c70896ffeeef32b9c950ywan for (int c = 0; c < block_width; ++c) { 64233d2500723e5594f3e7c70896ffeeef32b9c950ywan EXPECT_EQ(diff[r * block_width + c], 65233d2500723e5594f3e7c70896ffeeef32b9c950ywan (src[r * block_width + c] - 66233d2500723e5594f3e7c70896ffeeef32b9c950ywan pred[r * block_width + c])) << "r = " << r 67233d2500723e5594f3e7c70896ffeeef32b9c950ywan << ", c = " << c 68233d2500723e5594f3e7c70896ffeeef32b9c950ywan << ", bs = " << bsize; 69233d2500723e5594f3e7c70896ffeeef32b9c950ywan } 70233d2500723e5594f3e7c70896ffeeef32b9c950ywan } 71233d2500723e5594f3e7c70896ffeeef32b9c950ywan 72233d2500723e5594f3e7c70896ffeeef32b9c950ywan GetParam()(block_height, block_width, diff, block_width * 2, 73233d2500723e5594f3e7c70896ffeeef32b9c950ywan src, block_width * 2, pred, block_width * 2); 74233d2500723e5594f3e7c70896ffeeef32b9c950ywan 75233d2500723e5594f3e7c70896ffeeef32b9c950ywan for (int r = 0; r < block_height; ++r) { 76233d2500723e5594f3e7c70896ffeeef32b9c950ywan for (int c = 0; c < block_width; ++c) { 77233d2500723e5594f3e7c70896ffeeef32b9c950ywan EXPECT_EQ(diff[r * block_width * 2 + c], 78233d2500723e5594f3e7c70896ffeeef32b9c950ywan (src[r * block_width * 2 + c] - 79233d2500723e5594f3e7c70896ffeeef32b9c950ywan pred[r * block_width * 2 + c])) << "r = " << r 80233d2500723e5594f3e7c70896ffeeef32b9c950ywan << ", c = " << c 81233d2500723e5594f3e7c70896ffeeef32b9c950ywan << ", bs = " << bsize; 82233d2500723e5594f3e7c70896ffeeef32b9c950ywan } 83233d2500723e5594f3e7c70896ffeeef32b9c950ywan } 84233d2500723e5594f3e7c70896ffeeef32b9c950ywan } 85233d2500723e5594f3e7c70896ffeeef32b9c950ywan vpx_free(diff); 86233d2500723e5594f3e7c70896ffeeef32b9c950ywan vpx_free(pred); 87233d2500723e5594f3e7c70896ffeeef32b9c950ywan vpx_free(src); 88233d2500723e5594f3e7c70896ffeeef32b9c950ywan } 89233d2500723e5594f3e7c70896ffeeef32b9c950ywan} 90233d2500723e5594f3e7c70896ffeeef32b9c950ywan 91233d2500723e5594f3e7c70896ffeeef32b9c950ywanINSTANTIATE_TEST_CASE_P(C, VP9SubtractBlockTest, 92233d2500723e5594f3e7c70896ffeeef32b9c950ywan ::testing::Values(vp9_subtract_block_c)); 93233d2500723e5594f3e7c70896ffeeef32b9c950ywan 94233d2500723e5594f3e7c70896ffeeef32b9c950ywan#if HAVE_SSE2 && CONFIG_USE_X86INC 95233d2500723e5594f3e7c70896ffeeef32b9c950ywanINSTANTIATE_TEST_CASE_P(SSE2, VP9SubtractBlockTest, 96233d2500723e5594f3e7c70896ffeeef32b9c950ywan ::testing::Values(vp9_subtract_block_sse2)); 97233d2500723e5594f3e7c70896ffeeef32b9c950ywan#endif 98233d2500723e5594f3e7c70896ffeeef32b9c950ywan} // namespace vp9 99