1d0351deb5037171ecec154298d37e3a74d992b0dfgalligan@chromium.org/* 2d0351deb5037171ecec154298d37e3a74d992b0dfgalligan@chromium.org * Copyright (c) 2012 The WebM project authors. All Rights Reserved. 3d0351deb5037171ecec154298d37e3a74d992b0dfgalligan@chromium.org * 4d0351deb5037171ecec154298d37e3a74d992b0dfgalligan@chromium.org * Use of this source code is governed by a BSD-style license 5d0351deb5037171ecec154298d37e3a74d992b0dfgalligan@chromium.org * that can be found in the LICENSE file in the root of the source 6d0351deb5037171ecec154298d37e3a74d992b0dfgalligan@chromium.org * tree. An additional intellectual property rights grant can be found 7d0351deb5037171ecec154298d37e3a74d992b0dfgalligan@chromium.org * in the file PATENTS. All contributing project authors may 8d0351deb5037171ecec154298d37e3a74d992b0dfgalligan@chromium.org * be found in the AUTHORS file in the root of the source tree. 9d0351deb5037171ecec154298d37e3a74d992b0dfgalligan@chromium.org */ 10d0351deb5037171ecec154298d37e3a74d992b0dfgalligan@chromium.org 11d0351deb5037171ecec154298d37e3a74d992b0dfgalligan@chromium.org#include "third_party/googletest/src/include/gtest/gtest.h" 12d0351deb5037171ecec154298d37e3a74d992b0dfgalligan@chromium.org#include "test/acm_random.h" 13d0351deb5037171ecec154298d37e3a74d992b0dfgalligan@chromium.org#include "test/clear_system_state.h" 14d0351deb5037171ecec154298d37e3a74d992b0dfgalligan@chromium.org#include "test/register_state_check.h" 15d0351deb5037171ecec154298d37e3a74d992b0dfgalligan@chromium.org#include "./vpx_config.h" 16d0351deb5037171ecec154298d37e3a74d992b0dfgalligan@chromium.org#include "./vp9_rtcd.h" 17d0351deb5037171ecec154298d37e3a74d992b0dfgalligan@chromium.org#include "vp9/common/vp9_blockd.h" 18d0351deb5037171ecec154298d37e3a74d992b0dfgalligan@chromium.org#include "vpx_mem/vpx_mem.h" 19d0351deb5037171ecec154298d37e3a74d992b0dfgalligan@chromium.org 20ac4e313c19203132648a2a271703b6ee76fe4284johannkoenig@chromium.orgtypedef void (*SubtractFunc)(int rows, int cols, 21ac4e313c19203132648a2a271703b6ee76fe4284johannkoenig@chromium.org int16_t *diff_ptr, ptrdiff_t diff_stride, 22ac4e313c19203132648a2a271703b6ee76fe4284johannkoenig@chromium.org const uint8_t *src_ptr, ptrdiff_t src_stride, 23ac4e313c19203132648a2a271703b6ee76fe4284johannkoenig@chromium.org const uint8_t *pred_ptr, ptrdiff_t pred_stride); 24d0351deb5037171ecec154298d37e3a74d992b0dfgalligan@chromium.org 25d0351deb5037171ecec154298d37e3a74d992b0dfgalligan@chromium.orgnamespace vp9 { 26d0351deb5037171ecec154298d37e3a74d992b0dfgalligan@chromium.org 27ac4e313c19203132648a2a271703b6ee76fe4284johannkoenig@chromium.orgclass VP9SubtractBlockTest : public ::testing::TestWithParam<SubtractFunc> { 28d0351deb5037171ecec154298d37e3a74d992b0dfgalligan@chromium.org public: 29d0351deb5037171ecec154298d37e3a74d992b0dfgalligan@chromium.org virtual void TearDown() { 30d0351deb5037171ecec154298d37e3a74d992b0dfgalligan@chromium.org libvpx_test::ClearSystemState(); 31d0351deb5037171ecec154298d37e3a74d992b0dfgalligan@chromium.org } 32d0351deb5037171ecec154298d37e3a74d992b0dfgalligan@chromium.org}; 33d0351deb5037171ecec154298d37e3a74d992b0dfgalligan@chromium.org 34d0351deb5037171ecec154298d37e3a74d992b0dfgalligan@chromium.orgusing libvpx_test::ACMRandom; 35d0351deb5037171ecec154298d37e3a74d992b0dfgalligan@chromium.org 36d0351deb5037171ecec154298d37e3a74d992b0dfgalligan@chromium.orgTEST_P(VP9SubtractBlockTest, SimpleSubtract) { 37d0351deb5037171ecec154298d37e3a74d992b0dfgalligan@chromium.org ACMRandom rnd(ACMRandom::DeterministicSeed()); 38d0351deb5037171ecec154298d37e3a74d992b0dfgalligan@chromium.org 39d0351deb5037171ecec154298d37e3a74d992b0dfgalligan@chromium.org // FIXME(rbultje) split in its own file 4053a13f1fa964820f7a8f9d3932a6f3c0433f8bf5fgalligan@chromium.org for (BLOCK_SIZE bsize = BLOCK_4X4; bsize < BLOCK_SIZES; 4153a13f1fa964820f7a8f9d3932a6f3c0433f8bf5fgalligan@chromium.org bsize = static_cast<BLOCK_SIZE>(static_cast<int>(bsize) + 1)) { 42d851b91d14ef0bd71acdce7b90c9a8f1af1181adjohannkoenig@chromium.org const int block_width = 4 * num_4x4_blocks_wide_lookup[bsize]; 43d851b91d14ef0bd71acdce7b90c9a8f1af1181adjohannkoenig@chromium.org const int block_height = 4 * num_4x4_blocks_high_lookup[bsize]; 44d0351deb5037171ecec154298d37e3a74d992b0dfgalligan@chromium.org int16_t *diff = reinterpret_cast<int16_t *>( 45d0351deb5037171ecec154298d37e3a74d992b0dfgalligan@chromium.org vpx_memalign(16, sizeof(*diff) * block_width * block_height * 2)); 46d0351deb5037171ecec154298d37e3a74d992b0dfgalligan@chromium.org uint8_t *pred = reinterpret_cast<uint8_t *>( 47d0351deb5037171ecec154298d37e3a74d992b0dfgalligan@chromium.org vpx_memalign(16, block_width * block_height * 2)); 48d0351deb5037171ecec154298d37e3a74d992b0dfgalligan@chromium.org uint8_t *src = reinterpret_cast<uint8_t *>( 49d0351deb5037171ecec154298d37e3a74d992b0dfgalligan@chromium.org vpx_memalign(16, block_width * block_height * 2)); 50d0351deb5037171ecec154298d37e3a74d992b0dfgalligan@chromium.org 51d0351deb5037171ecec154298d37e3a74d992b0dfgalligan@chromium.org for (int n = 0; n < 100; n++) { 52d0351deb5037171ecec154298d37e3a74d992b0dfgalligan@chromium.org for (int r = 0; r < block_height; ++r) { 53d0351deb5037171ecec154298d37e3a74d992b0dfgalligan@chromium.org for (int c = 0; c < block_width * 2; ++c) { 54d0351deb5037171ecec154298d37e3a74d992b0dfgalligan@chromium.org src[r * block_width * 2 + c] = rnd.Rand8(); 55d0351deb5037171ecec154298d37e3a74d992b0dfgalligan@chromium.org pred[r * block_width * 2 + c] = rnd.Rand8(); 56d0351deb5037171ecec154298d37e3a74d992b0dfgalligan@chromium.org } 57d0351deb5037171ecec154298d37e3a74d992b0dfgalligan@chromium.org } 58d0351deb5037171ecec154298d37e3a74d992b0dfgalligan@chromium.org 59d0351deb5037171ecec154298d37e3a74d992b0dfgalligan@chromium.org GetParam()(block_height, block_width, diff, block_width, 60d0351deb5037171ecec154298d37e3a74d992b0dfgalligan@chromium.org src, block_width, pred, block_width); 61d0351deb5037171ecec154298d37e3a74d992b0dfgalligan@chromium.org 62d0351deb5037171ecec154298d37e3a74d992b0dfgalligan@chromium.org for (int r = 0; r < block_height; ++r) { 63d0351deb5037171ecec154298d37e3a74d992b0dfgalligan@chromium.org for (int c = 0; c < block_width; ++c) { 64d0351deb5037171ecec154298d37e3a74d992b0dfgalligan@chromium.org EXPECT_EQ(diff[r * block_width + c], 65d0351deb5037171ecec154298d37e3a74d992b0dfgalligan@chromium.org (src[r * block_width + c] - 66d0351deb5037171ecec154298d37e3a74d992b0dfgalligan@chromium.org pred[r * block_width + c])) << "r = " << r 67d0351deb5037171ecec154298d37e3a74d992b0dfgalligan@chromium.org << ", c = " << c 68d0351deb5037171ecec154298d37e3a74d992b0dfgalligan@chromium.org << ", bs = " << bsize; 69d0351deb5037171ecec154298d37e3a74d992b0dfgalligan@chromium.org } 70d0351deb5037171ecec154298d37e3a74d992b0dfgalligan@chromium.org } 71d0351deb5037171ecec154298d37e3a74d992b0dfgalligan@chromium.org 72d0351deb5037171ecec154298d37e3a74d992b0dfgalligan@chromium.org GetParam()(block_height, block_width, diff, block_width * 2, 73d0351deb5037171ecec154298d37e3a74d992b0dfgalligan@chromium.org src, block_width * 2, pred, block_width * 2); 74d0351deb5037171ecec154298d37e3a74d992b0dfgalligan@chromium.org 75d0351deb5037171ecec154298d37e3a74d992b0dfgalligan@chromium.org for (int r = 0; r < block_height; ++r) { 76d0351deb5037171ecec154298d37e3a74d992b0dfgalligan@chromium.org for (int c = 0; c < block_width; ++c) { 77d0351deb5037171ecec154298d37e3a74d992b0dfgalligan@chromium.org EXPECT_EQ(diff[r * block_width * 2 + c], 78d0351deb5037171ecec154298d37e3a74d992b0dfgalligan@chromium.org (src[r * block_width * 2 + c] - 79d0351deb5037171ecec154298d37e3a74d992b0dfgalligan@chromium.org pred[r * block_width * 2 + c])) << "r = " << r 80d0351deb5037171ecec154298d37e3a74d992b0dfgalligan@chromium.org << ", c = " << c 81d0351deb5037171ecec154298d37e3a74d992b0dfgalligan@chromium.org << ", bs = " << bsize; 82d0351deb5037171ecec154298d37e3a74d992b0dfgalligan@chromium.org } 83d0351deb5037171ecec154298d37e3a74d992b0dfgalligan@chromium.org } 84d0351deb5037171ecec154298d37e3a74d992b0dfgalligan@chromium.org } 85d0351deb5037171ecec154298d37e3a74d992b0dfgalligan@chromium.org vpx_free(diff); 86d0351deb5037171ecec154298d37e3a74d992b0dfgalligan@chromium.org vpx_free(pred); 87d0351deb5037171ecec154298d37e3a74d992b0dfgalligan@chromium.org vpx_free(src); 88d0351deb5037171ecec154298d37e3a74d992b0dfgalligan@chromium.org } 89d0351deb5037171ecec154298d37e3a74d992b0dfgalligan@chromium.org} 90d0351deb5037171ecec154298d37e3a74d992b0dfgalligan@chromium.org 91d0351deb5037171ecec154298d37e3a74d992b0dfgalligan@chromium.orgINSTANTIATE_TEST_CASE_P(C, VP9SubtractBlockTest, 92d0351deb5037171ecec154298d37e3a74d992b0dfgalligan@chromium.org ::testing::Values(vp9_subtract_block_c)); 93d0351deb5037171ecec154298d37e3a74d992b0dfgalligan@chromium.org 9453a13f1fa964820f7a8f9d3932a6f3c0433f8bf5fgalligan@chromium.org#if HAVE_SSE2 && CONFIG_USE_X86INC 95d0351deb5037171ecec154298d37e3a74d992b0dfgalligan@chromium.orgINSTANTIATE_TEST_CASE_P(SSE2, VP9SubtractBlockTest, 96d0351deb5037171ecec154298d37e3a74d992b0dfgalligan@chromium.org ::testing::Values(vp9_subtract_block_sse2)); 97d0351deb5037171ecec154298d37e3a74d992b0dfgalligan@chromium.org#endif 9841294d96d7dbf9bc215b09832a8336c5fb158f0bjohannkoenig@chromium.org#if HAVE_NEON 9941294d96d7dbf9bc215b09832a8336c5fb158f0bjohannkoenig@chromium.orgINSTANTIATE_TEST_CASE_P(NEON, VP9SubtractBlockTest, 10041294d96d7dbf9bc215b09832a8336c5fb158f0bjohannkoenig@chromium.org ::testing::Values(vp9_subtract_block_neon)); 10141294d96d7dbf9bc215b09832a8336c5fb158f0bjohannkoenig@chromium.org#endif 10241294d96d7dbf9bc215b09832a8336c5fb158f0bjohannkoenig@chromium.org 103d0351deb5037171ecec154298d37e3a74d992b0dfgalligan@chromium.org} // namespace vp9 104