diff --git a/test/test.mk b/test/test.mk index e7a1dcd34e7469a1e382a8ee00562a8cf66bd1c2..e0e6d1ee28e172fb1615846367ec43ca84672343 100644 --- a/test/test.mk +++ b/test/test.mk @@ -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 diff --git a/test/variance_test.cc b/test/variance_test.cc index 83f1139949dfb981fc7e25b17e414a7de429e8c2..120df316e0d3cdcf2ab976ae98f57b9ed021f3cd 100644 --- 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::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