Home | History | Annotate | Download | only in test
      1 /*
      2  *  Copyright (c) 2012 The WebM project authors. All Rights Reserved.
      3  *
      4  *  Use of this source code is governed by a BSD-style license
      5  *  that can be found in the LICENSE file in the root of the source
      6  *  tree. An additional intellectual property rights grant can be found
      7  *  in the file PATENTS.  All contributing project authors may
      8  *  be found in the AUTHORS file in the root of the source tree.
      9  */
     10 
     11 #include "third_party/googletest/src/include/gtest/gtest.h"
     12 
     13 #include "./vp9_rtcd.h"
     14 #include "./vpx_config.h"
     15 #include "./vpx_dsp_rtcd.h"
     16 #include "test/acm_random.h"
     17 #include "test/bench.h"
     18 #include "test/clear_system_state.h"
     19 #include "test/register_state_check.h"
     20 #include "vp9/common/vp9_blockd.h"
     21 #include "vpx_ports/msvc.h"
     22 #include "vpx_mem/vpx_mem.h"
     23 
     24 typedef void (*SubtractFunc)(int rows, int cols, int16_t *diff_ptr,
     25                              ptrdiff_t diff_stride, const uint8_t *src_ptr,
     26                              ptrdiff_t src_stride, const uint8_t *pred_ptr,
     27                              ptrdiff_t pred_stride);
     28 
     29 namespace vp9 {
     30 
     31 class VP9SubtractBlockTest : public AbstractBench,
     32                              public ::testing::TestWithParam<SubtractFunc> {
     33  public:
     34   virtual void TearDown() { libvpx_test::ClearSystemState(); }
     35 
     36  protected:
     37   virtual void Run() {
     38     GetParam()(block_height_, block_width_, diff_, block_width_, src_,
     39                block_width_, pred_, block_width_);
     40   }
     41 
     42   void SetupBlocks(BLOCK_SIZE bsize) {
     43     block_width_ = 4 * num_4x4_blocks_wide_lookup[bsize];
     44     block_height_ = 4 * num_4x4_blocks_high_lookup[bsize];
     45     diff_ = reinterpret_cast<int16_t *>(
     46         vpx_memalign(16, sizeof(*diff_) * block_width_ * block_height_ * 2));
     47     pred_ = reinterpret_cast<uint8_t *>(
     48         vpx_memalign(16, block_width_ * block_height_ * 2));
     49     src_ = reinterpret_cast<uint8_t *>(
     50         vpx_memalign(16, block_width_ * block_height_ * 2));
     51   }
     52 
     53   int block_width_;
     54   int block_height_;
     55   int16_t *diff_;
     56   uint8_t *pred_;
     57   uint8_t *src_;
     58 };
     59 
     60 using libvpx_test::ACMRandom;
     61 
     62 TEST_P(VP9SubtractBlockTest, DISABLED_Speed) {
     63   ACMRandom rnd(ACMRandom::DeterministicSeed());
     64 
     65   for (BLOCK_SIZE bsize = BLOCK_4X4; bsize < BLOCK_SIZES;
     66        bsize = static_cast<BLOCK_SIZE>(static_cast<int>(bsize) + 1)) {
     67     SetupBlocks(bsize);
     68 
     69     RunNTimes(100000000 / (block_height_ * block_width_));
     70     char block_size[16];
     71     snprintf(block_size, sizeof(block_size), "%dx%d", block_height_,
     72              block_width_);
     73     char title[100];
     74     snprintf(title, sizeof(title), "%8s ", block_size);
     75     PrintMedian(title);
     76 
     77     vpx_free(diff_);
     78     vpx_free(pred_);
     79     vpx_free(src_);
     80   }
     81 }
     82 
     83 TEST_P(VP9SubtractBlockTest, SimpleSubtract) {
     84   ACMRandom rnd(ACMRandom::DeterministicSeed());
     85 
     86   for (BLOCK_SIZE bsize = BLOCK_4X4; bsize < BLOCK_SIZES;
     87        bsize = static_cast<BLOCK_SIZE>(static_cast<int>(bsize) + 1)) {
     88     SetupBlocks(bsize);
     89 
     90     for (int n = 0; n < 100; n++) {
     91       for (int r = 0; r < block_height_; ++r) {
     92         for (int c = 0; c < block_width_ * 2; ++c) {
     93           src_[r * block_width_ * 2 + c] = rnd.Rand8();
     94           pred_[r * block_width_ * 2 + c] = rnd.Rand8();
     95         }
     96       }
     97 
     98       GetParam()(block_height_, block_width_, diff_, block_width_, src_,
     99                  block_width_, pred_, block_width_);
    100 
    101       for (int r = 0; r < block_height_; ++r) {
    102         for (int c = 0; c < block_width_; ++c) {
    103           EXPECT_EQ(diff_[r * block_width_ + c],
    104                     (src_[r * block_width_ + c] - pred_[r * block_width_ + c]))
    105               << "r = " << r << ", c = " << c
    106               << ", bs = " << static_cast<int>(bsize);
    107         }
    108       }
    109 
    110       GetParam()(block_height_, block_width_, diff_, block_width_ * 2, src_,
    111                  block_width_ * 2, pred_, block_width_ * 2);
    112 
    113       for (int r = 0; r < block_height_; ++r) {
    114         for (int c = 0; c < block_width_; ++c) {
    115           EXPECT_EQ(diff_[r * block_width_ * 2 + c],
    116                     (src_[r * block_width_ * 2 + c] -
    117                      pred_[r * block_width_ * 2 + c]))
    118               << "r = " << r << ", c = " << c
    119               << ", bs = " << static_cast<int>(bsize);
    120         }
    121       }
    122     }
    123     vpx_free(diff_);
    124     vpx_free(pred_);
    125     vpx_free(src_);
    126   }
    127 }
    128 
    129 INSTANTIATE_TEST_CASE_P(C, VP9SubtractBlockTest,
    130                         ::testing::Values(vpx_subtract_block_c));
    131 
    132 #if HAVE_SSE2
    133 INSTANTIATE_TEST_CASE_P(SSE2, VP9SubtractBlockTest,
    134                         ::testing::Values(vpx_subtract_block_sse2));
    135 #endif
    136 #if HAVE_NEON
    137 INSTANTIATE_TEST_CASE_P(NEON, VP9SubtractBlockTest,
    138                         ::testing::Values(vpx_subtract_block_neon));
    139 #endif
    140 #if HAVE_MSA
    141 INSTANTIATE_TEST_CASE_P(MSA, VP9SubtractBlockTest,
    142                         ::testing::Values(vpx_subtract_block_msa));
    143 #endif
    144 
    145 #if HAVE_MMI
    146 INSTANTIATE_TEST_CASE_P(MMI, VP9SubtractBlockTest,
    147                         ::testing::Values(vpx_subtract_block_mmi));
    148 #endif
    149 
    150 #if HAVE_VSX
    151 INSTANTIATE_TEST_CASE_P(VSX, VP9SubtractBlockTest,
    152                         ::testing::Values(vpx_subtract_block_vsx));
    153 #endif
    154 
    155 }  // namespace vp9
    156