shithub: libvpx

Download patch

ref: d711f1091dbe16ae162b3061dae4641c0c93649d
parent: 09be534f132a79c0599e922a1f322b35f398634d
parent: 1711cf2dbb1debeb6313ddff118ad70d2b266470
author: John Koleszar <jkoleszar@google.com>
date: Wed Feb 27 06:22:46 EST 2013

Merge "add vp8 variance test"

--- a/test/test.mk
+++ b/test/test.mk
@@ -50,6 +50,7 @@
 LIBVPX_TEST_SRCS-$(CONFIG_VP8_ENCODER) += set_roi.cc
 LIBVPX_TEST_SRCS-yes                   += sixtap_predict_test.cc
 LIBVPX_TEST_SRCS-$(CONFIG_VP8_ENCODER) += subtract_test.cc
+LIBVPX_TEST_SRCS-$(CONFIG_VP8_ENCODER) += variance_test.cc
 LIBVPX_TEST_SRCS-$(CONFIG_VP8_ENCODER) += vp8_fdct4x4_test.cc
 
 endif # VP8
--- a/test/variance_test.cc
+++ b/test/variance_test.cc
@@ -12,11 +12,17 @@
 
 #include "third_party/googletest/src/include/gtest/gtest.h"
 
+#include "vpx/vpx_integer.h"
 #include "vpx_config.h"
 extern "C" {
-#include "vp9/encoder/vp9_variance.h"
-#include "vpx/vpx_integer.h"
-#include "vp9_rtcd.h"
+#if CONFIG_VP8_ENCODER
+# include "vp8/common/variance.h"
+# include "vp8_rtcd.h"
+#endif
+#if CONFIG_VP9_ENCODER
+# include "vp9/encoder/vp9_variance.h"
+# include "vp9_rtcd.h"
+#endif
 }
 
 namespace {
@@ -25,11 +31,12 @@
 using ::std::tr1::make_tuple;
 using ::std::tr1::tuple;
 
-class VP9VarianceTest :
-    public ::testing::TestWithParam<tuple<int, int, vp9_variance_fn_t> > {
+template<typename VarianceFunctionType>
+class VarianceTest :
+    public ::testing::TestWithParam<tuple<int, int, VarianceFunctionType> > {
  public:
   virtual void SetUp() {
-    const tuple<int, int, vp9_variance_fn_t>& params = GetParam();
+    const tuple<int, int, VarianceFunctionType>& params = this->GetParam();
     width_  = get<0>(params);
     height_ = get<1>(params);
     variance_ = get<2>(params);
@@ -47,15 +54,20 @@
   }
 
  protected:
+  void ZeroTest();
+  void OneQuarterTest();
+
   uint8_t* src_;
   uint8_t* ref_;
   int width_;
   int height_;
   int block_size_;
-  vp9_variance_fn_t variance_;
+  VarianceFunctionType variance_;
+
 };
 
-TEST_P(VP9VarianceTest, Zero) {
+template<typename VarianceFunctionType>
+void VarianceTest<VarianceFunctionType>::ZeroTest() {
   for (int i = 0; i <= 255; ++i) {
     memset(src_, i, block_size_);
     for (int j = 0; j <= 255; ++j) {
@@ -67,7 +79,8 @@
   }
 }
 
-TEST_P(VP9VarianceTest, OneQuarter) {
+template<typename VarianceFunctionType>
+void VarianceTest<VarianceFunctionType>::OneQuarterTest() {
   memset(src_, 255, block_size_);
   const int half = block_size_ / 2;
   memset(ref_, 255, half);
@@ -78,6 +91,74 @@
   EXPECT_EQ(expected, var);
 }
 
+// -----------------------------------------------------------------------------
+// VP8 test cases.
+
+namespace vp8 {
+
+#if CONFIG_VP8_ENCODER
+typedef VarianceTest<vp8_variance_fn_t> VP8VarianceTest;
+
+TEST_P(VP8VarianceTest, Zero) { ZeroTest(); }
+TEST_P(VP8VarianceTest, OneQuarter) { OneQuarterTest(); }
+
+const vp8_variance_fn_t variance4x4_c = vp8_variance4x4_c;
+const vp8_variance_fn_t variance8x8_c = vp8_variance8x8_c;
+const vp8_variance_fn_t variance8x16_c = vp8_variance8x16_c;
+const vp8_variance_fn_t variance16x8_c = vp8_variance16x8_c;
+const vp8_variance_fn_t variance16x16_c = vp8_variance16x16_c;
+INSTANTIATE_TEST_CASE_P(
+    C, VP8VarianceTest,
+    ::testing::Values(make_tuple(4, 4, variance4x4_c),
+                      make_tuple(8, 8, variance8x8_c),
+                      make_tuple(8, 16, variance8x16_c),
+                      make_tuple(16, 8, variance16x8_c),
+                      make_tuple(16, 16, variance16x16_c)));
+
+#if HAVE_MMX
+const vp8_variance_fn_t variance4x4_mmx = vp8_variance4x4_mmx;
+const vp8_variance_fn_t variance8x8_mmx = vp8_variance8x8_mmx;
+const vp8_variance_fn_t variance8x16_mmx = vp8_variance8x16_mmx;
+const vp8_variance_fn_t variance16x8_mmx = vp8_variance16x8_mmx;
+const vp8_variance_fn_t variance16x16_mmx = vp8_variance16x16_mmx;
+INSTANTIATE_TEST_CASE_P(
+    MMX, VP8VarianceTest,
+    ::testing::Values(make_tuple(4, 4, variance4x4_mmx),
+                      make_tuple(8, 8, variance8x8_mmx),
+                      make_tuple(8, 16, variance8x16_mmx),
+                      make_tuple(16, 8, variance16x8_mmx),
+                      make_tuple(16, 16, variance16x16_mmx)));
+#endif
+
+#if HAVE_SSE2
+const vp8_variance_fn_t variance4x4_wmt = vp8_variance4x4_wmt;
+const vp8_variance_fn_t variance8x8_wmt = vp8_variance8x8_wmt;
+const vp8_variance_fn_t variance8x16_wmt = vp8_variance8x16_wmt;
+const vp8_variance_fn_t variance16x8_wmt = vp8_variance16x8_wmt;
+const vp8_variance_fn_t variance16x16_wmt = vp8_variance16x16_wmt;
+INSTANTIATE_TEST_CASE_P(
+    SSE2, VP8VarianceTest,
+    ::testing::Values(make_tuple(4, 4, variance4x4_wmt),
+                      make_tuple(8, 8, variance8x8_wmt),
+                      make_tuple(8, 16, variance8x16_wmt),
+                      make_tuple(16, 8, variance16x8_wmt),
+                      make_tuple(16, 16, variance16x16_wmt)));
+#endif
+#endif  // CONFIG_VP8_ENCODER
+
+}  // namespace vp8
+
+// -----------------------------------------------------------------------------
+// VP9 test cases.
+
+namespace vp9 {
+
+#if CONFIG_VP9_ENCODER
+typedef VarianceTest<vp9_variance_fn_t> VP9VarianceTest;
+
+TEST_P(VP9VarianceTest, Zero) { ZeroTest(); }
+TEST_P(VP9VarianceTest, OneQuarter) { OneQuarterTest(); }
+
 const vp9_variance_fn_t variance4x4_c = vp9_variance4x4_c;
 const vp9_variance_fn_t variance8x8_c = vp9_variance8x8_c;
 const vp9_variance_fn_t variance8x16_c = vp9_variance8x16_c;
@@ -120,4 +201,8 @@
                       make_tuple(16, 8, variance16x8_wmt),
                       make_tuple(16, 16, variance16x16_wmt)));
 #endif
+#endif  // CONFIG_VP9_ENCODER
+
+}  // namespace vp9
+
 }  // namespace