add vp8 variance test
authorJames Zern <jzern@google.com>
Sat, 23 Feb 2013 00:23:36 +0000 (16:23 -0800)
committerJames Zern <jzern@google.com>
Sat, 23 Feb 2013 00:25:14 +0000 (16:25 -0800)
Change-Id: I4e94ee2c4e2360d6a11a454c323f2899c1bb6f72

test/test.mk
test/variance_test.cc

index e7a1dcd..e0e6d1e 100644 (file)
@@ -50,6 +50,7 @@ LIBVPX_TEST_SRCS-yes                   += sad_test.cc
 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
index 83f1139..120df31 100644 (file)
 
 #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::get;
 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 @@ class VP9VarianceTest :
   }
 
  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, Zero) {
   }
 }
 
-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 @@ TEST_P(VP9VarianceTest, OneQuarter) {
   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 @@ INSTANTIATE_TEST_CASE_P(
                       make_tuple(16, 8, variance16x8_wmt),
                       make_tuple(16, 16, variance16x16_wmt)));
 #endif
+#endif  // CONFIG_VP9_ENCODER
+
+}  // namespace vp9
+
 }  // namespace