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