ref: a16ca80b09cb4d698606d706486c2d22577af124
parent: bb40844e320f4daa0ef84df2864924fcb819a3ed
parent: 0b60d3ffa581c3546f341271c96fac8264bcd385
author: Jerome Jiang <jianj@google.com>
date: Thu Feb 2 17:20:42 EST 2017
Merge "Add unit tests for vp9_block_error_fp."
--- 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 @@
ACMRandom rnd_;
};
+typedef int64_t (*BlockErrorFunc)(const tran_low_t *coeff,
+ const tran_low_t *dqcoeff, int block_size);
+typedef std::tr1::tuple<int, BlockErrorFunc> BlockErrorTestParam;
+
+class BlockErrorTest
+ : public ::testing::Test,
+ public ::testing::WithParamInterface<BlockErrorTestParam> {
+ protected:
+ virtual void SetUp() {
+ txfm_size_ = GET_PARAM(0);
+ block_error_func_ = GET_PARAM(1);
+ rnd_.Reset(ACMRandom::DeterministicSeed());
+ coeff_ = reinterpret_cast<tran_low_t *>(
+ vpx_memalign(16, sizeof(*coeff_) * txfm_size_));
+ dqcoeff_ = reinterpret_cast<tran_low_t *>(
+ 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 @@
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 @@
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,8 +445,19 @@
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(
NEON, AverageTest,
@@ -384,6 +487,17 @@
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