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