From 0b60d3ffa581c3546f341271c96fac8264bcd385 Mon Sep 17 00:00:00 2001 From: Jerome Jiang Date: Tue, 31 Jan 2017 20:21:55 -0800 Subject: [PATCH] Add unit tests for vp9_block_error_fp. BUG=webm:1365 Change-Id: I004e5cd7ca331d14b31b7fc3edeee45fce064026 --- test/avg_test.cc | 116 ++++++++++++++++++++++++++++++++++++++++++++++- 1 file changed, 115 insertions(+), 1 deletion(-) diff --git a/test/avg_test.cc b/test/avg_test.cc index 68a83d66e..f634c7a26 100644 --- a/test/avg_test.cc +++ b/test/avg_test.cc @@ -14,6 +14,7 @@ #include "third_party/googletest/src/include/gtest/gtest.h" +#include "./vp9_rtcd.h" #include "./vpx_config.h" #include "./vpx_dsp_rtcd.h" @@ -231,6 +232,61 @@ class SatdTest : public ::testing::Test, ACMRandom rnd_; }; +typedef int64_t (*BlockErrorFunc)(const tran_low_t *coeff, + const tran_low_t *dqcoeff, int block_size); +typedef std::tr1::tuple BlockErrorTestParam; + +class BlockErrorTest + : public ::testing::Test, + public ::testing::WithParamInterface { + protected: + virtual void SetUp() { + txfm_size_ = GET_PARAM(0); + block_error_func_ = GET_PARAM(1); + rnd_.Reset(ACMRandom::DeterministicSeed()); + coeff_ = reinterpret_cast( + vpx_memalign(16, sizeof(*coeff_) * txfm_size_)); + dqcoeff_ = reinterpret_cast( + vpx_memalign(16, sizeof(*dqcoeff_) * txfm_size_)); + ASSERT_TRUE(coeff_ != NULL); + ASSERT_TRUE(dqcoeff_ != NULL); + } + + virtual void TearDown() { + libvpx_test::ClearSystemState(); + vpx_free(coeff_); + vpx_free(dqcoeff_); + } + + void FillConstant(const tran_low_t coeff_val, const tran_low_t dqcoeff_val) { + for (int i = 0; i < txfm_size_; ++i) coeff_[i] = coeff_val; + for (int i = 0; i < txfm_size_; ++i) dqcoeff_[i] = dqcoeff_val; + } + + void FillRandom() { + // Just two fixed seeds + rnd_.Reset(0xb0b9); + for (int i = 0; i < txfm_size_; ++i) coeff_[i] = rnd_.Rand16() >> 1; + rnd_.Reset(0xb0c8); + for (int i = 0; i < txfm_size_; ++i) dqcoeff_[i] = rnd_.Rand16() >> 1; + } + + void Check(const int64_t expected) { + int64_t total; + ASM_REGISTER_STATE_CHECK( + total = block_error_func_(coeff_, dqcoeff_, txfm_size_)); + EXPECT_EQ(expected, total); + } + + int txfm_size_; + + private: + tran_low_t *coeff_; + tran_low_t *dqcoeff_; + BlockErrorFunc block_error_func_; + ACMRandom rnd_; +}; + uint8_t *AverageTestBase::source_data_ = NULL; TEST_P(AverageTest, MinValue) { @@ -311,6 +367,35 @@ TEST_P(SatdTest, Random) { Check(expected); } +TEST_P(BlockErrorTest, MinValue) { + const int64_t kMin = -32640; + const int64_t expected = kMin * kMin * txfm_size_; + FillConstant(kMin, 0); + Check(expected); +} + +TEST_P(BlockErrorTest, MaxValue) { + const int64_t kMax = 32640; + const int64_t expected = kMax * kMax * txfm_size_; + FillConstant(kMax, 0); + Check(expected); +} + +TEST_P(BlockErrorTest, Random) { + int64_t expected; + switch (txfm_size_) { + case 16: expected = 2051681432; break; + case 64: expected = 11075114379; break; + case 256: expected = 44386271116; break; + case 1024: expected = 184774996089; break; + default: + FAIL() << "Invalid satd size (" << txfm_size_ + << ") valid: 16/64/256/1024"; + } + FillRandom(); + Check(expected); +} + using std::tr1::make_tuple; INSTANTIATE_TEST_CASE_P( @@ -324,6 +409,13 @@ INSTANTIATE_TEST_CASE_P(C, SatdTest, make_tuple(256, &vpx_satd_c), make_tuple(1024, &vpx_satd_c))); +INSTANTIATE_TEST_CASE_P( + C, BlockErrorTest, + ::testing::Values(make_tuple(16, &vp9_block_error_fp_c), + make_tuple(64, &vp9_block_error_fp_c), + make_tuple(256, &vp9_block_error_fp_c), + make_tuple(1024, &vp9_block_error_fp_c))); + #if HAVE_SSE2 INSTANTIATE_TEST_CASE_P( SSE2, AverageTest, @@ -353,7 +445,18 @@ INSTANTIATE_TEST_CASE_P(SSE2, SatdTest, make_tuple(64, &vpx_satd_sse2), make_tuple(256, &vpx_satd_sse2), make_tuple(1024, &vpx_satd_sse2))); -#endif + +// TODO(jianj): Remove the highbitdepth flag once the SIMD functions are +// in place. +#if !CONFIG_VP9_HIGHBITDEPTH +INSTANTIATE_TEST_CASE_P( + SSE2, BlockErrorTest, + ::testing::Values(make_tuple(16, &vp9_block_error_fp_sse2), + make_tuple(64, &vp9_block_error_fp_sse2), + make_tuple(256, &vp9_block_error_fp_sse2), + make_tuple(1024, &vp9_block_error_fp_sse2))); +#endif // !CONFIG_VP9_HIGHBITDEPTH +#endif // HAVE_SSE2 #if HAVE_NEON INSTANTIATE_TEST_CASE_P( @@ -384,6 +487,17 @@ INSTANTIATE_TEST_CASE_P(NEON, SatdTest, make_tuple(64, &vpx_satd_neon), make_tuple(256, &vpx_satd_neon), make_tuple(1024, &vpx_satd_neon))); + +// TODO(jianj): Remove the highbitdepth flag once the SIMD functions are +// in place. +#if !CONFIG_VP9_HIGHBITDEPTH +INSTANTIATE_TEST_CASE_P( + NEON, BlockErrorTest, + ::testing::Values(make_tuple(16, &vp9_block_error_fp_neon), + make_tuple(64, &vp9_block_error_fp_neon), + make_tuple(256, &vp9_block_error_fp_neon), + make_tuple(1024, &vp9_block_error_fp_neon))); +#endif // !CONFIG_VP9_HIGHBITDEPTH #endif // HAVE_NEON #if HAVE_MSA -- 2.40.0