2 * Copyright (c) 2012 The WebM project authors. All Rights Reserved.
4 * Use of this source code is governed by a BSD-style license
5 * that can be found in the LICENSE file in the root of the source
6 * tree. An additional intellectual property rights grant can be found
7 * in the file PATENTS. All contributing project authors may
8 * be found in the AUTHORS file in the root of the source tree.
13 #include "third_party/googletest/src/include/gtest/gtest.h"
15 #include "test/clear_system_state.h"
16 #include "test/register_state_check.h"
18 #include "vpx/vpx_integer.h"
19 #include "./vpx_config.h"
20 #include "vpx_mem/vpx_mem.h"
21 #if CONFIG_VP8_ENCODER
22 # include "./vp8_rtcd.h"
23 # include "vp8/common/variance.h"
25 #if CONFIG_VP9_ENCODER
26 # include "./vp9_rtcd.h"
27 # include "vp9/encoder/vp9_variance.h"
29 #include "test/acm_random.h"
33 using ::std::tr1::get;
34 using ::std::tr1::make_tuple;
35 using ::std::tr1::tuple;
36 using libvpx_test::ACMRandom;
38 static unsigned int mb_ss_ref(const int16_t *src) {
40 for (int i = 0; i < 256; ++i) {
41 res += src[i] * src[i];
46 static unsigned int variance_ref(const uint8_t *ref, const uint8_t *src,
47 int l2w, int l2h, unsigned int *sse_ptr) {
50 const int w = 1 << l2w, h = 1 << l2h;
51 for (int y = 0; y < h; y++) {
52 for (int x = 0; x < w; x++) {
53 int diff = ref[w * y + x] - src[w * y + x];
59 return sse - (((int64_t) se * se) >> (l2w + l2h));
62 static unsigned int subpel_variance_ref(const uint8_t *ref, const uint8_t *src,
63 int l2w, int l2h, int xoff, int yoff,
64 unsigned int *sse_ptr) {
67 const int w = 1 << l2w, h = 1 << l2h;
68 for (int y = 0; y < h; y++) {
69 for (int x = 0; x < w; x++) {
70 // bilinear interpolation at a 16th pel step
71 const int a1 = ref[(w + 1) * (y + 0) + x + 0];
72 const int a2 = ref[(w + 1) * (y + 0) + x + 1];
73 const int b1 = ref[(w + 1) * (y + 1) + x + 0];
74 const int b2 = ref[(w + 1) * (y + 1) + x + 1];
75 const int a = a1 + (((a2 - a1) * xoff + 8) >> 4);
76 const int b = b1 + (((b2 - b1) * xoff + 8) >> 4);
77 const int r = a + (((b - a) * yoff + 8) >> 4);
78 int diff = r - src[w * y + x];
84 return sse - (((int64_t) se * se) >> (l2w + l2h));
87 typedef unsigned int (*SumOfSquaresFunction)(const int16_t *src);
89 class SumOfSquaresTest : public ::testing::TestWithParam<SumOfSquaresFunction> {
91 SumOfSquaresTest() : func_(GetParam()) {}
93 virtual ~SumOfSquaresTest() {
94 libvpx_test::ClearSystemState();
101 SumOfSquaresFunction func_;
105 void SumOfSquaresTest::ConstTest() {
108 for (int v = 0; v < 256; ++v) {
109 for (int i = 0; i < 256; ++i) {
112 ASM_REGISTER_STATE_CHECK(res = func_(mem));
113 EXPECT_EQ(256u * (v * v), res);
117 void SumOfSquaresTest::RefTest() {
119 for (int i = 0; i < 100; ++i) {
120 for (int j = 0; j < 256; ++j) {
121 mem[j] = rnd_.Rand8() - rnd_.Rand8();
124 const unsigned int expected = mb_ss_ref(mem);
126 ASM_REGISTER_STATE_CHECK(res = func_(mem));
127 EXPECT_EQ(expected, res);
131 template<typename VarianceFunctionType>
133 : public ::testing::TestWithParam<tuple<int, int, VarianceFunctionType> > {
135 virtual void SetUp() {
136 const tuple<int, int, VarianceFunctionType>& params = this->GetParam();
137 log2width_ = get<0>(params);
138 width_ = 1 << log2width_;
139 log2height_ = get<1>(params);
140 height_ = 1 << log2height_;
141 variance_ = get<2>(params);
143 rnd_.Reset(ACMRandom::DeterministicSeed());
144 block_size_ = width_ * height_;
145 src_ = reinterpret_cast<uint8_t *>(vpx_memalign(16, block_size_));
146 ref_ = new uint8_t[block_size_];
147 ASSERT_TRUE(src_ != NULL);
148 ASSERT_TRUE(ref_ != NULL);
151 virtual void TearDown() {
154 libvpx_test::ClearSystemState();
160 void OneQuarterTest();
165 int width_, log2width_;
166 int height_, log2height_;
168 VarianceFunctionType variance_;
171 template<typename VarianceFunctionType>
172 void VarianceTest<VarianceFunctionType>::ZeroTest() {
173 for (int i = 0; i <= 255; ++i) {
174 memset(src_, i, block_size_);
175 for (int j = 0; j <= 255; ++j) {
176 memset(ref_, j, block_size_);
179 ASM_REGISTER_STATE_CHECK(
180 var = variance_(src_, width_, ref_, width_, &sse));
181 EXPECT_EQ(0u, var) << "src values: " << i << "ref values: " << j;
186 template<typename VarianceFunctionType>
187 void VarianceTest<VarianceFunctionType>::RefTest() {
188 for (int i = 0; i < 10; ++i) {
189 for (int j = 0; j < block_size_; j++) {
190 src_[j] = rnd_.Rand8();
191 ref_[j] = rnd_.Rand8();
193 unsigned int sse1, sse2;
195 ASM_REGISTER_STATE_CHECK(
196 var1 = variance_(src_, width_, ref_, width_, &sse1));
197 const unsigned int var2 = variance_ref(src_, ref_, log2width_,
199 EXPECT_EQ(sse1, sse2);
200 EXPECT_EQ(var1, var2);
204 template<typename VarianceFunctionType>
205 void VarianceTest<VarianceFunctionType>::OneQuarterTest() {
206 memset(src_, 255, block_size_);
207 const int half = block_size_ / 2;
208 memset(ref_, 255, half);
209 memset(ref_ + half, 0, half);
212 ASM_REGISTER_STATE_CHECK(var = variance_(src_, width_, ref_, width_, &sse));
213 const unsigned int expected = block_size_ * 255 * 255 / 4;
214 EXPECT_EQ(expected, var);
217 #if CONFIG_VP8_ENCODER
218 template<typename MseFunctionType>
220 : public ::testing::TestWithParam<tuple<int, int, MseFunctionType> > {
222 virtual void SetUp() {
223 const tuple<int, int, MseFunctionType>& params = this->GetParam();
224 log2width_ = get<0>(params);
225 width_ = 1 << log2width_;
226 log2height_ = get<1>(params);
227 height_ = 1 << log2height_;
228 mse_ = get<2>(params);
230 rnd(ACMRandom::DeterministicSeed());
231 block_size_ = width_ * height_;
232 src_ = reinterpret_cast<uint8_t *>(vpx_memalign(16, block_size_));
233 ref_ = new uint8_t[block_size_];
234 ASSERT_TRUE(src_ != NULL);
235 ASSERT_TRUE(ref_ != NULL);
238 virtual void TearDown() {
241 libvpx_test::ClearSystemState();
253 int width_, log2width_;
254 int height_, log2height_;
256 MseFunctionType mse_;
259 template<typename MseFunctionType>
260 void MseTest<MseFunctionType>::RefTest_mse() {
261 for (int i = 0; i < 10; ++i) {
262 for (int j = 0; j < block_size_; j++) {
263 src_[j] = rnd.Rand8();
264 ref_[j] = rnd.Rand8();
266 unsigned int sse1, sse2;
267 ASM_REGISTER_STATE_CHECK(mse_(src_, width_, ref_, width_, &sse1));
268 variance_ref(src_, ref_, log2width_, log2height_, &sse2);
269 EXPECT_EQ(sse1, sse2);
273 template<typename MseFunctionType>
274 void MseTest<MseFunctionType>::RefTest_sse() {
275 for (int i = 0; i < 10; ++i) {
276 for (int j = 0; j < block_size_; j++) {
277 src_[j] = rnd.Rand8();
278 ref_[j] = rnd.Rand8();
282 ASM_REGISTER_STATE_CHECK(
283 var1 = mse_(src_, width_, ref_, width_));
284 variance_ref(src_, ref_, log2width_, log2height_, &sse2);
285 EXPECT_EQ(var1, sse2);
289 template<typename MseFunctionType>
290 void MseTest<MseFunctionType>::MaxTest_mse() {
291 memset(src_, 255, block_size_);
292 memset(ref_, 0, block_size_);
294 ASM_REGISTER_STATE_CHECK(mse_(src_, width_, ref_, width_, &sse));
295 const unsigned int expected = block_size_ * 255 * 255;
296 EXPECT_EQ(expected, sse);
299 template<typename MseFunctionType>
300 void MseTest<MseFunctionType>::MaxTest_sse() {
301 memset(src_, 255, block_size_);
302 memset(ref_, 0, block_size_);
304 ASM_REGISTER_STATE_CHECK(var = mse_(src_, width_, ref_, width_));
305 const unsigned int expected = block_size_ * 255 * 255;
306 EXPECT_EQ(expected, var);
310 #if CONFIG_VP9_ENCODER
312 unsigned int subpel_avg_variance_ref(const uint8_t *ref,
314 const uint8_t *second_pred,
317 unsigned int *sse_ptr) {
319 unsigned int sse = 0;
320 const int w = 1 << l2w, h = 1 << l2h;
321 for (int y = 0; y < h; y++) {
322 for (int x = 0; x < w; x++) {
323 // bilinear interpolation at a 16th pel step
324 const int a1 = ref[(w + 1) * (y + 0) + x + 0];
325 const int a2 = ref[(w + 1) * (y + 0) + x + 1];
326 const int b1 = ref[(w + 1) * (y + 1) + x + 0];
327 const int b2 = ref[(w + 1) * (y + 1) + x + 1];
328 const int a = a1 + (((a2 - a1) * xoff + 8) >> 4);
329 const int b = b1 + (((b2 - b1) * xoff + 8) >> 4);
330 const int r = a + (((b - a) * yoff + 8) >> 4);
331 int diff = ((r + second_pred[w * y + x] + 1) >> 1) - src[w * y + x];
337 return sse - (((int64_t) se * se) >> (l2w + l2h));
340 template<typename SubpelVarianceFunctionType>
341 class SubpelVarianceTest
342 : public ::testing::TestWithParam<tuple<int, int,
343 SubpelVarianceFunctionType> > {
345 virtual void SetUp() {
346 const tuple<int, int, SubpelVarianceFunctionType>& params =
348 log2width_ = get<0>(params);
349 width_ = 1 << log2width_;
350 log2height_ = get<1>(params);
351 height_ = 1 << log2height_;
352 subpel_variance_ = get<2>(params);
354 rnd_.Reset(ACMRandom::DeterministicSeed());
355 block_size_ = width_ * height_;
356 src_ = reinterpret_cast<uint8_t *>(vpx_memalign(16, block_size_));
357 sec_ = reinterpret_cast<uint8_t *>(vpx_memalign(16, block_size_));
358 ref_ = new uint8_t[block_size_ + width_ + height_ + 1];
359 ASSERT_TRUE(src_ != NULL);
360 ASSERT_TRUE(sec_ != NULL);
361 ASSERT_TRUE(ref_ != NULL);
364 virtual void TearDown() {
368 libvpx_test::ClearSystemState();
378 int width_, log2width_;
379 int height_, log2height_;
381 SubpelVarianceFunctionType subpel_variance_;
384 template<typename SubpelVarianceFunctionType>
385 void SubpelVarianceTest<SubpelVarianceFunctionType>::RefTest() {
386 for (int x = 0; x < 16; ++x) {
387 for (int y = 0; y < 16; ++y) {
388 for (int j = 0; j < block_size_; j++) {
389 src_[j] = rnd_.Rand8();
391 for (int j = 0; j < block_size_ + width_ + height_ + 1; j++) {
392 ref_[j] = rnd_.Rand8();
394 unsigned int sse1, sse2;
396 ASM_REGISTER_STATE_CHECK(var1 = subpel_variance_(ref_, width_ + 1, x, y,
397 src_, width_, &sse1));
398 const unsigned int var2 = subpel_variance_ref(ref_, src_, log2width_,
399 log2height_, x, y, &sse2);
400 EXPECT_EQ(sse1, sse2) << "at position " << x << ", " << y;
401 EXPECT_EQ(var1, var2) << "at position " << x << ", " << y;
407 void SubpelVarianceTest<vp9_subp_avg_variance_fn_t>::RefTest() {
408 for (int x = 0; x < 16; ++x) {
409 for (int y = 0; y < 16; ++y) {
410 for (int j = 0; j < block_size_; j++) {
411 src_[j] = rnd_.Rand8();
412 sec_[j] = rnd_.Rand8();
414 for (int j = 0; j < block_size_ + width_ + height_ + 1; j++) {
415 ref_[j] = rnd_.Rand8();
417 unsigned int sse1, sse2;
419 ASM_REGISTER_STATE_CHECK(
420 var1 = subpel_variance_(ref_, width_ + 1, x, y,
421 src_, width_, &sse1, sec_));
422 const unsigned int var2 = subpel_avg_variance_ref(ref_, src_, sec_,
423 log2width_, log2height_,
425 EXPECT_EQ(sse1, sse2) << "at position " << x << ", " << y;
426 EXPECT_EQ(var1, var2) << "at position " << x << ", " << y;
431 #endif // CONFIG_VP9_ENCODER
433 // -----------------------------------------------------------------------------
438 #if CONFIG_VP8_ENCODER
439 typedef unsigned int (*vp8_sse_fn_t)(const unsigned char *src_ptr,
440 int source_stride, const unsigned char *ref_ptr, int ref_stride);
442 typedef MseTest<vp8_sse_fn_t> VP8SseTest;
443 typedef MseTest<vp8_variance_fn_t> VP8MseTest;
444 typedef VarianceTest<vp8_variance_fn_t> VP8VarianceTest;
446 TEST_P(VP8SseTest, Ref_sse) { RefTest_sse(); }
447 TEST_P(VP8SseTest, Max_sse) { MaxTest_sse(); }
448 TEST_P(VP8MseTest, Ref_mse) { RefTest_mse(); }
449 TEST_P(VP8MseTest, Max_mse) { MaxTest_mse(); }
450 TEST_P(VP8VarianceTest, Zero) { ZeroTest(); }
451 TEST_P(VP8VarianceTest, Ref) { RefTest(); }
452 TEST_P(VP8VarianceTest, OneQuarter) { OneQuarterTest(); }
454 const vp8_sse_fn_t get4x4sse_cs_c = vp8_get4x4sse_cs_c;
455 INSTANTIATE_TEST_CASE_P(
457 ::testing::Values(make_tuple(2, 2, get4x4sse_cs_c)));
459 const vp8_variance_fn_t mse16x16_c = vp8_mse16x16_c;
460 INSTANTIATE_TEST_CASE_P(
462 ::testing::Values(make_tuple(4, 4, mse16x16_c)));
464 const vp8_variance_fn_t variance4x4_c = vp8_variance4x4_c;
465 const vp8_variance_fn_t variance8x8_c = vp8_variance8x8_c;
466 const vp8_variance_fn_t variance8x16_c = vp8_variance8x16_c;
467 const vp8_variance_fn_t variance16x8_c = vp8_variance16x8_c;
468 const vp8_variance_fn_t variance16x16_c = vp8_variance16x16_c;
469 INSTANTIATE_TEST_CASE_P(
471 ::testing::Values(make_tuple(2, 2, variance4x4_c),
472 make_tuple(3, 3, variance8x8_c),
473 make_tuple(3, 4, variance8x16_c),
474 make_tuple(4, 3, variance16x8_c),
475 make_tuple(4, 4, variance16x16_c)));
478 const vp8_sse_fn_t get4x4sse_cs_neon = vp8_get4x4sse_cs_neon;
479 INSTANTIATE_TEST_CASE_P(
481 ::testing::Values(make_tuple(2, 2, get4x4sse_cs_neon)));
483 const vp8_variance_fn_t mse16x16_neon = vp8_mse16x16_neon;
484 INSTANTIATE_TEST_CASE_P(
486 ::testing::Values(make_tuple(4, 4, mse16x16_neon)));
488 const vp8_variance_fn_t variance8x8_neon = vp8_variance8x8_neon;
489 const vp8_variance_fn_t variance8x16_neon = vp8_variance8x16_neon;
490 const vp8_variance_fn_t variance16x8_neon = vp8_variance16x8_neon;
491 const vp8_variance_fn_t variance16x16_neon = vp8_variance16x16_neon;
492 INSTANTIATE_TEST_CASE_P(
493 NEON, VP8VarianceTest,
494 ::testing::Values(make_tuple(3, 3, variance8x8_neon),
495 make_tuple(3, 4, variance8x16_neon),
496 make_tuple(4, 3, variance16x8_neon),
497 make_tuple(4, 4, variance16x16_neon)));
502 const vp8_variance_fn_t variance4x4_mmx = vp8_variance4x4_mmx;
503 const vp8_variance_fn_t variance8x8_mmx = vp8_variance8x8_mmx;
504 const vp8_variance_fn_t variance8x16_mmx = vp8_variance8x16_mmx;
505 const vp8_variance_fn_t variance16x8_mmx = vp8_variance16x8_mmx;
506 const vp8_variance_fn_t variance16x16_mmx = vp8_variance16x16_mmx;
507 INSTANTIATE_TEST_CASE_P(
508 MMX, VP8VarianceTest,
509 ::testing::Values(make_tuple(2, 2, variance4x4_mmx),
510 make_tuple(3, 3, variance8x8_mmx),
511 make_tuple(3, 4, variance8x16_mmx),
512 make_tuple(4, 3, variance16x8_mmx),
513 make_tuple(4, 4, variance16x16_mmx)));
517 const vp8_variance_fn_t variance4x4_wmt = vp8_variance4x4_wmt;
518 const vp8_variance_fn_t variance8x8_wmt = vp8_variance8x8_wmt;
519 const vp8_variance_fn_t variance8x16_wmt = vp8_variance8x16_wmt;
520 const vp8_variance_fn_t variance16x8_wmt = vp8_variance16x8_wmt;
521 const vp8_variance_fn_t variance16x16_wmt = vp8_variance16x16_wmt;
522 INSTANTIATE_TEST_CASE_P(
523 SSE2, VP8VarianceTest,
524 ::testing::Values(make_tuple(2, 2, variance4x4_wmt),
525 make_tuple(3, 3, variance8x8_wmt),
526 make_tuple(3, 4, variance8x16_wmt),
527 make_tuple(4, 3, variance16x8_wmt),
528 make_tuple(4, 4, variance16x16_wmt)));
530 #endif // CONFIG_VP8_ENCODER
534 // -----------------------------------------------------------------------------
539 #if CONFIG_VP9_ENCODER
541 TEST_P(SumOfSquaresTest, Const) { ConstTest(); }
542 TEST_P(SumOfSquaresTest, Ref) { RefTest(); }
544 INSTANTIATE_TEST_CASE_P(C, SumOfSquaresTest,
545 ::testing::Values(vp9_get_mb_ss_c));
547 typedef VarianceTest<vp9_variance_fn_t> VP9VarianceTest;
548 typedef SubpelVarianceTest<vp9_subpixvariance_fn_t> VP9SubpelVarianceTest;
549 typedef SubpelVarianceTest<vp9_subp_avg_variance_fn_t> VP9SubpelAvgVarianceTest;
551 TEST_P(VP9VarianceTest, Zero) { ZeroTest(); }
552 TEST_P(VP9VarianceTest, Ref) { RefTest(); }
553 TEST_P(VP9SubpelVarianceTest, Ref) { RefTest(); }
554 TEST_P(VP9SubpelAvgVarianceTest, Ref) { RefTest(); }
555 TEST_P(VP9VarianceTest, OneQuarter) { OneQuarterTest(); }
557 const vp9_variance_fn_t variance4x4_c = vp9_variance4x4_c;
558 const vp9_variance_fn_t variance4x8_c = vp9_variance4x8_c;
559 const vp9_variance_fn_t variance8x4_c = vp9_variance8x4_c;
560 const vp9_variance_fn_t variance8x8_c = vp9_variance8x8_c;
561 const vp9_variance_fn_t variance8x16_c = vp9_variance8x16_c;
562 const vp9_variance_fn_t variance16x8_c = vp9_variance16x8_c;
563 const vp9_variance_fn_t variance16x16_c = vp9_variance16x16_c;
564 const vp9_variance_fn_t variance16x32_c = vp9_variance16x32_c;
565 const vp9_variance_fn_t variance32x16_c = vp9_variance32x16_c;
566 const vp9_variance_fn_t variance32x32_c = vp9_variance32x32_c;
567 const vp9_variance_fn_t variance32x64_c = vp9_variance32x64_c;
568 const vp9_variance_fn_t variance64x32_c = vp9_variance64x32_c;
569 const vp9_variance_fn_t variance64x64_c = vp9_variance64x64_c;
570 INSTANTIATE_TEST_CASE_P(
572 ::testing::Values(make_tuple(2, 2, variance4x4_c),
573 make_tuple(2, 3, variance4x8_c),
574 make_tuple(3, 2, variance8x4_c),
575 make_tuple(3, 3, variance8x8_c),
576 make_tuple(3, 4, variance8x16_c),
577 make_tuple(4, 3, variance16x8_c),
578 make_tuple(4, 4, variance16x16_c),
579 make_tuple(4, 5, variance16x32_c),
580 make_tuple(5, 4, variance32x16_c),
581 make_tuple(5, 5, variance32x32_c),
582 make_tuple(5, 6, variance32x64_c),
583 make_tuple(6, 5, variance64x32_c),
584 make_tuple(6, 6, variance64x64_c)));
586 const vp9_subpixvariance_fn_t subpel_variance4x4_c =
587 vp9_sub_pixel_variance4x4_c;
588 const vp9_subpixvariance_fn_t subpel_variance4x8_c =
589 vp9_sub_pixel_variance4x8_c;
590 const vp9_subpixvariance_fn_t subpel_variance8x4_c =
591 vp9_sub_pixel_variance8x4_c;
592 const vp9_subpixvariance_fn_t subpel_variance8x8_c =
593 vp9_sub_pixel_variance8x8_c;
594 const vp9_subpixvariance_fn_t subpel_variance8x16_c =
595 vp9_sub_pixel_variance8x16_c;
596 const vp9_subpixvariance_fn_t subpel_variance16x8_c =
597 vp9_sub_pixel_variance16x8_c;
598 const vp9_subpixvariance_fn_t subpel_variance16x16_c =
599 vp9_sub_pixel_variance16x16_c;
600 const vp9_subpixvariance_fn_t subpel_variance16x32_c =
601 vp9_sub_pixel_variance16x32_c;
602 const vp9_subpixvariance_fn_t subpel_variance32x16_c =
603 vp9_sub_pixel_variance32x16_c;
604 const vp9_subpixvariance_fn_t subpel_variance32x32_c =
605 vp9_sub_pixel_variance32x32_c;
606 const vp9_subpixvariance_fn_t subpel_variance32x64_c =
607 vp9_sub_pixel_variance32x64_c;
608 const vp9_subpixvariance_fn_t subpel_variance64x32_c =
609 vp9_sub_pixel_variance64x32_c;
610 const vp9_subpixvariance_fn_t subpel_variance64x64_c =
611 vp9_sub_pixel_variance64x64_c;
612 INSTANTIATE_TEST_CASE_P(
613 C, VP9SubpelVarianceTest,
614 ::testing::Values(make_tuple(2, 2, subpel_variance4x4_c),
615 make_tuple(2, 3, subpel_variance4x8_c),
616 make_tuple(3, 2, subpel_variance8x4_c),
617 make_tuple(3, 3, subpel_variance8x8_c),
618 make_tuple(3, 4, subpel_variance8x16_c),
619 make_tuple(4, 3, subpel_variance16x8_c),
620 make_tuple(4, 4, subpel_variance16x16_c),
621 make_tuple(4, 5, subpel_variance16x32_c),
622 make_tuple(5, 4, subpel_variance32x16_c),
623 make_tuple(5, 5, subpel_variance32x32_c),
624 make_tuple(5, 6, subpel_variance32x64_c),
625 make_tuple(6, 5, subpel_variance64x32_c),
626 make_tuple(6, 6, subpel_variance64x64_c)));
628 const vp9_subp_avg_variance_fn_t subpel_avg_variance4x4_c =
629 vp9_sub_pixel_avg_variance4x4_c;
630 const vp9_subp_avg_variance_fn_t subpel_avg_variance4x8_c =
631 vp9_sub_pixel_avg_variance4x8_c;
632 const vp9_subp_avg_variance_fn_t subpel_avg_variance8x4_c =
633 vp9_sub_pixel_avg_variance8x4_c;
634 const vp9_subp_avg_variance_fn_t subpel_avg_variance8x8_c =
635 vp9_sub_pixel_avg_variance8x8_c;
636 const vp9_subp_avg_variance_fn_t subpel_avg_variance8x16_c =
637 vp9_sub_pixel_avg_variance8x16_c;
638 const vp9_subp_avg_variance_fn_t subpel_avg_variance16x8_c =
639 vp9_sub_pixel_avg_variance16x8_c;
640 const vp9_subp_avg_variance_fn_t subpel_avg_variance16x16_c =
641 vp9_sub_pixel_avg_variance16x16_c;
642 const vp9_subp_avg_variance_fn_t subpel_avg_variance16x32_c =
643 vp9_sub_pixel_avg_variance16x32_c;
644 const vp9_subp_avg_variance_fn_t subpel_avg_variance32x16_c =
645 vp9_sub_pixel_avg_variance32x16_c;
646 const vp9_subp_avg_variance_fn_t subpel_avg_variance32x32_c =
647 vp9_sub_pixel_avg_variance32x32_c;
648 const vp9_subp_avg_variance_fn_t subpel_avg_variance32x64_c =
649 vp9_sub_pixel_avg_variance32x64_c;
650 const vp9_subp_avg_variance_fn_t subpel_avg_variance64x32_c =
651 vp9_sub_pixel_avg_variance64x32_c;
652 const vp9_subp_avg_variance_fn_t subpel_avg_variance64x64_c =
653 vp9_sub_pixel_avg_variance64x64_c;
654 INSTANTIATE_TEST_CASE_P(
655 C, VP9SubpelAvgVarianceTest,
656 ::testing::Values(make_tuple(2, 2, subpel_avg_variance4x4_c),
657 make_tuple(2, 3, subpel_avg_variance4x8_c),
658 make_tuple(3, 2, subpel_avg_variance8x4_c),
659 make_tuple(3, 3, subpel_avg_variance8x8_c),
660 make_tuple(3, 4, subpel_avg_variance8x16_c),
661 make_tuple(4, 3, subpel_avg_variance16x8_c),
662 make_tuple(4, 4, subpel_avg_variance16x16_c),
663 make_tuple(4, 5, subpel_avg_variance16x32_c),
664 make_tuple(5, 4, subpel_avg_variance32x16_c),
665 make_tuple(5, 5, subpel_avg_variance32x32_c),
666 make_tuple(5, 6, subpel_avg_variance32x64_c),
667 make_tuple(6, 5, subpel_avg_variance64x32_c),
668 make_tuple(6, 6, subpel_avg_variance64x64_c)));
671 #if CONFIG_USE_X86INC
673 INSTANTIATE_TEST_CASE_P(SSE2, SumOfSquaresTest,
674 ::testing::Values(vp9_get_mb_ss_sse2));
676 const vp9_variance_fn_t variance4x4_sse2 = vp9_variance4x4_sse2;
677 const vp9_variance_fn_t variance4x8_sse2 = vp9_variance4x8_sse2;
678 const vp9_variance_fn_t variance8x4_sse2 = vp9_variance8x4_sse2;
679 const vp9_variance_fn_t variance8x8_sse2 = vp9_variance8x8_sse2;
680 const vp9_variance_fn_t variance8x16_sse2 = vp9_variance8x16_sse2;
681 const vp9_variance_fn_t variance16x8_sse2 = vp9_variance16x8_sse2;
682 const vp9_variance_fn_t variance16x16_sse2 = vp9_variance16x16_sse2;
683 const vp9_variance_fn_t variance16x32_sse2 = vp9_variance16x32_sse2;
684 const vp9_variance_fn_t variance32x16_sse2 = vp9_variance32x16_sse2;
685 const vp9_variance_fn_t variance32x32_sse2 = vp9_variance32x32_sse2;
686 const vp9_variance_fn_t variance32x64_sse2 = vp9_variance32x64_sse2;
687 const vp9_variance_fn_t variance64x32_sse2 = vp9_variance64x32_sse2;
688 const vp9_variance_fn_t variance64x64_sse2 = vp9_variance64x64_sse2;
689 INSTANTIATE_TEST_CASE_P(
690 SSE2, VP9VarianceTest,
691 ::testing::Values(make_tuple(2, 2, variance4x4_sse2),
692 make_tuple(2, 3, variance4x8_sse2),
693 make_tuple(3, 2, variance8x4_sse2),
694 make_tuple(3, 3, variance8x8_sse2),
695 make_tuple(3, 4, variance8x16_sse2),
696 make_tuple(4, 3, variance16x8_sse2),
697 make_tuple(4, 4, variance16x16_sse2),
698 make_tuple(4, 5, variance16x32_sse2),
699 make_tuple(5, 4, variance32x16_sse2),
700 make_tuple(5, 5, variance32x32_sse2),
701 make_tuple(5, 6, variance32x64_sse2),
702 make_tuple(6, 5, variance64x32_sse2),
703 make_tuple(6, 6, variance64x64_sse2)));
705 const vp9_subpixvariance_fn_t subpel_variance4x4_sse =
706 vp9_sub_pixel_variance4x4_sse;
707 const vp9_subpixvariance_fn_t subpel_variance4x8_sse =
708 vp9_sub_pixel_variance4x8_sse;
709 const vp9_subpixvariance_fn_t subpel_variance8x4_sse2 =
710 vp9_sub_pixel_variance8x4_sse2;
711 const vp9_subpixvariance_fn_t subpel_variance8x8_sse2 =
712 vp9_sub_pixel_variance8x8_sse2;
713 const vp9_subpixvariance_fn_t subpel_variance8x16_sse2 =
714 vp9_sub_pixel_variance8x16_sse2;
715 const vp9_subpixvariance_fn_t subpel_variance16x8_sse2 =
716 vp9_sub_pixel_variance16x8_sse2;
717 const vp9_subpixvariance_fn_t subpel_variance16x16_sse2 =
718 vp9_sub_pixel_variance16x16_sse2;
719 const vp9_subpixvariance_fn_t subpel_variance16x32_sse2 =
720 vp9_sub_pixel_variance16x32_sse2;
721 const vp9_subpixvariance_fn_t subpel_variance32x16_sse2 =
722 vp9_sub_pixel_variance32x16_sse2;
723 const vp9_subpixvariance_fn_t subpel_variance32x32_sse2 =
724 vp9_sub_pixel_variance32x32_sse2;
725 const vp9_subpixvariance_fn_t subpel_variance32x64_sse2 =
726 vp9_sub_pixel_variance32x64_sse2;
727 const vp9_subpixvariance_fn_t subpel_variance64x32_sse2 =
728 vp9_sub_pixel_variance64x32_sse2;
729 const vp9_subpixvariance_fn_t subpel_variance64x64_sse2 =
730 vp9_sub_pixel_variance64x64_sse2;
731 INSTANTIATE_TEST_CASE_P(
732 SSE2, VP9SubpelVarianceTest,
733 ::testing::Values(make_tuple(2, 2, subpel_variance4x4_sse),
734 make_tuple(2, 3, subpel_variance4x8_sse),
735 make_tuple(3, 2, subpel_variance8x4_sse2),
736 make_tuple(3, 3, subpel_variance8x8_sse2),
737 make_tuple(3, 4, subpel_variance8x16_sse2),
738 make_tuple(4, 3, subpel_variance16x8_sse2),
739 make_tuple(4, 4, subpel_variance16x16_sse2),
740 make_tuple(4, 5, subpel_variance16x32_sse2),
741 make_tuple(5, 4, subpel_variance32x16_sse2),
742 make_tuple(5, 5, subpel_variance32x32_sse2),
743 make_tuple(5, 6, subpel_variance32x64_sse2),
744 make_tuple(6, 5, subpel_variance64x32_sse2),
745 make_tuple(6, 6, subpel_variance64x64_sse2)));
747 const vp9_subp_avg_variance_fn_t subpel_avg_variance4x4_sse =
748 vp9_sub_pixel_avg_variance4x4_sse;
749 const vp9_subp_avg_variance_fn_t subpel_avg_variance4x8_sse =
750 vp9_sub_pixel_avg_variance4x8_sse;
751 const vp9_subp_avg_variance_fn_t subpel_avg_variance8x4_sse2 =
752 vp9_sub_pixel_avg_variance8x4_sse2;
753 const vp9_subp_avg_variance_fn_t subpel_avg_variance8x8_sse2 =
754 vp9_sub_pixel_avg_variance8x8_sse2;
755 const vp9_subp_avg_variance_fn_t subpel_avg_variance8x16_sse2 =
756 vp9_sub_pixel_avg_variance8x16_sse2;
757 const vp9_subp_avg_variance_fn_t subpel_avg_variance16x8_sse2 =
758 vp9_sub_pixel_avg_variance16x8_sse2;
759 const vp9_subp_avg_variance_fn_t subpel_avg_variance16x16_sse2 =
760 vp9_sub_pixel_avg_variance16x16_sse2;
761 const vp9_subp_avg_variance_fn_t subpel_avg_variance16x32_sse2 =
762 vp9_sub_pixel_avg_variance16x32_sse2;
763 const vp9_subp_avg_variance_fn_t subpel_avg_variance32x16_sse2 =
764 vp9_sub_pixel_avg_variance32x16_sse2;
765 const vp9_subp_avg_variance_fn_t subpel_avg_variance32x32_sse2 =
766 vp9_sub_pixel_avg_variance32x32_sse2;
767 const vp9_subp_avg_variance_fn_t subpel_avg_variance32x64_sse2 =
768 vp9_sub_pixel_avg_variance32x64_sse2;
769 const vp9_subp_avg_variance_fn_t subpel_avg_variance64x32_sse2 =
770 vp9_sub_pixel_avg_variance64x32_sse2;
771 const vp9_subp_avg_variance_fn_t subpel_avg_variance64x64_sse2 =
772 vp9_sub_pixel_avg_variance64x64_sse2;
773 INSTANTIATE_TEST_CASE_P(
774 SSE2, VP9SubpelAvgVarianceTest,
775 ::testing::Values(make_tuple(2, 2, subpel_avg_variance4x4_sse),
776 make_tuple(2, 3, subpel_avg_variance4x8_sse),
777 make_tuple(3, 2, subpel_avg_variance8x4_sse2),
778 make_tuple(3, 3, subpel_avg_variance8x8_sse2),
779 make_tuple(3, 4, subpel_avg_variance8x16_sse2),
780 make_tuple(4, 3, subpel_avg_variance16x8_sse2),
781 make_tuple(4, 4, subpel_avg_variance16x16_sse2),
782 make_tuple(4, 5, subpel_avg_variance16x32_sse2),
783 make_tuple(5, 4, subpel_avg_variance32x16_sse2),
784 make_tuple(5, 5, subpel_avg_variance32x32_sse2),
785 make_tuple(5, 6, subpel_avg_variance32x64_sse2),
786 make_tuple(6, 5, subpel_avg_variance64x32_sse2),
787 make_tuple(6, 6, subpel_avg_variance64x64_sse2)));
792 #if CONFIG_USE_X86INC
794 const vp9_subpixvariance_fn_t subpel_variance4x4_ssse3 =
795 vp9_sub_pixel_variance4x4_ssse3;
796 const vp9_subpixvariance_fn_t subpel_variance4x8_ssse3 =
797 vp9_sub_pixel_variance4x8_ssse3;
798 const vp9_subpixvariance_fn_t subpel_variance8x4_ssse3 =
799 vp9_sub_pixel_variance8x4_ssse3;
800 const vp9_subpixvariance_fn_t subpel_variance8x8_ssse3 =
801 vp9_sub_pixel_variance8x8_ssse3;
802 const vp9_subpixvariance_fn_t subpel_variance8x16_ssse3 =
803 vp9_sub_pixel_variance8x16_ssse3;
804 const vp9_subpixvariance_fn_t subpel_variance16x8_ssse3 =
805 vp9_sub_pixel_variance16x8_ssse3;
806 const vp9_subpixvariance_fn_t subpel_variance16x16_ssse3 =
807 vp9_sub_pixel_variance16x16_ssse3;
808 const vp9_subpixvariance_fn_t subpel_variance16x32_ssse3 =
809 vp9_sub_pixel_variance16x32_ssse3;
810 const vp9_subpixvariance_fn_t subpel_variance32x16_ssse3 =
811 vp9_sub_pixel_variance32x16_ssse3;
812 const vp9_subpixvariance_fn_t subpel_variance32x32_ssse3 =
813 vp9_sub_pixel_variance32x32_ssse3;
814 const vp9_subpixvariance_fn_t subpel_variance32x64_ssse3 =
815 vp9_sub_pixel_variance32x64_ssse3;
816 const vp9_subpixvariance_fn_t subpel_variance64x32_ssse3 =
817 vp9_sub_pixel_variance64x32_ssse3;
818 const vp9_subpixvariance_fn_t subpel_variance64x64_ssse3 =
819 vp9_sub_pixel_variance64x64_ssse3;
820 INSTANTIATE_TEST_CASE_P(
821 SSSE3, VP9SubpelVarianceTest,
822 ::testing::Values(make_tuple(2, 2, subpel_variance4x4_ssse3),
823 make_tuple(2, 3, subpel_variance4x8_ssse3),
824 make_tuple(3, 2, subpel_variance8x4_ssse3),
825 make_tuple(3, 3, subpel_variance8x8_ssse3),
826 make_tuple(3, 4, subpel_variance8x16_ssse3),
827 make_tuple(4, 3, subpel_variance16x8_ssse3),
828 make_tuple(4, 4, subpel_variance16x16_ssse3),
829 make_tuple(4, 5, subpel_variance16x32_ssse3),
830 make_tuple(5, 4, subpel_variance32x16_ssse3),
831 make_tuple(5, 5, subpel_variance32x32_ssse3),
832 make_tuple(5, 6, subpel_variance32x64_ssse3),
833 make_tuple(6, 5, subpel_variance64x32_ssse3),
834 make_tuple(6, 6, subpel_variance64x64_ssse3)));
836 const vp9_subp_avg_variance_fn_t subpel_avg_variance4x4_ssse3 =
837 vp9_sub_pixel_avg_variance4x4_ssse3;
838 const vp9_subp_avg_variance_fn_t subpel_avg_variance4x8_ssse3 =
839 vp9_sub_pixel_avg_variance4x8_ssse3;
840 const vp9_subp_avg_variance_fn_t subpel_avg_variance8x4_ssse3 =
841 vp9_sub_pixel_avg_variance8x4_ssse3;
842 const vp9_subp_avg_variance_fn_t subpel_avg_variance8x8_ssse3 =
843 vp9_sub_pixel_avg_variance8x8_ssse3;
844 const vp9_subp_avg_variance_fn_t subpel_avg_variance8x16_ssse3 =
845 vp9_sub_pixel_avg_variance8x16_ssse3;
846 const vp9_subp_avg_variance_fn_t subpel_avg_variance16x8_ssse3 =
847 vp9_sub_pixel_avg_variance16x8_ssse3;
848 const vp9_subp_avg_variance_fn_t subpel_avg_variance16x16_ssse3 =
849 vp9_sub_pixel_avg_variance16x16_ssse3;
850 const vp9_subp_avg_variance_fn_t subpel_avg_variance16x32_ssse3 =
851 vp9_sub_pixel_avg_variance16x32_ssse3;
852 const vp9_subp_avg_variance_fn_t subpel_avg_variance32x16_ssse3 =
853 vp9_sub_pixel_avg_variance32x16_ssse3;
854 const vp9_subp_avg_variance_fn_t subpel_avg_variance32x32_ssse3 =
855 vp9_sub_pixel_avg_variance32x32_ssse3;
856 const vp9_subp_avg_variance_fn_t subpel_avg_variance32x64_ssse3 =
857 vp9_sub_pixel_avg_variance32x64_ssse3;
858 const vp9_subp_avg_variance_fn_t subpel_avg_variance64x32_ssse3 =
859 vp9_sub_pixel_avg_variance64x32_ssse3;
860 const vp9_subp_avg_variance_fn_t subpel_avg_variance64x64_ssse3 =
861 vp9_sub_pixel_avg_variance64x64_ssse3;
862 INSTANTIATE_TEST_CASE_P(
863 SSSE3, VP9SubpelAvgVarianceTest,
864 ::testing::Values(make_tuple(2, 2, subpel_avg_variance4x4_ssse3),
865 make_tuple(2, 3, subpel_avg_variance4x8_ssse3),
866 make_tuple(3, 2, subpel_avg_variance8x4_ssse3),
867 make_tuple(3, 3, subpel_avg_variance8x8_ssse3),
868 make_tuple(3, 4, subpel_avg_variance8x16_ssse3),
869 make_tuple(4, 3, subpel_avg_variance16x8_ssse3),
870 make_tuple(4, 4, subpel_avg_variance16x16_ssse3),
871 make_tuple(4, 5, subpel_avg_variance16x32_ssse3),
872 make_tuple(5, 4, subpel_avg_variance32x16_ssse3),
873 make_tuple(5, 5, subpel_avg_variance32x32_ssse3),
874 make_tuple(5, 6, subpel_avg_variance32x64_ssse3),
875 make_tuple(6, 5, subpel_avg_variance64x32_ssse3),
876 make_tuple(6, 6, subpel_avg_variance64x64_ssse3)));
882 const vp9_variance_fn_t variance16x16_avx2 = vp9_variance16x16_avx2;
883 const vp9_variance_fn_t variance32x16_avx2 = vp9_variance32x16_avx2;
884 const vp9_variance_fn_t variance32x32_avx2 = vp9_variance32x32_avx2;
885 const vp9_variance_fn_t variance64x32_avx2 = vp9_variance64x32_avx2;
886 const vp9_variance_fn_t variance64x64_avx2 = vp9_variance64x64_avx2;
887 INSTANTIATE_TEST_CASE_P(
888 AVX2, VP9VarianceTest,
889 ::testing::Values(make_tuple(4, 4, variance16x16_avx2),
890 make_tuple(5, 4, variance32x16_avx2),
891 make_tuple(5, 5, variance32x32_avx2),
892 make_tuple(6, 5, variance64x32_avx2),
893 make_tuple(6, 6, variance64x64_avx2)));
895 const vp9_subpixvariance_fn_t subpel_variance32x32_avx2 =
896 vp9_sub_pixel_variance32x32_avx2;
897 const vp9_subpixvariance_fn_t subpel_variance64x64_avx2 =
898 vp9_sub_pixel_variance64x64_avx2;
899 INSTANTIATE_TEST_CASE_P(
900 AVX2, VP9SubpelVarianceTest,
901 ::testing::Values(make_tuple(5, 5, subpel_variance32x32_avx2),
902 make_tuple(6, 6, subpel_variance64x64_avx2)));
904 const vp9_subp_avg_variance_fn_t subpel_avg_variance32x32_avx2 =
905 vp9_sub_pixel_avg_variance32x32_avx2;
906 const vp9_subp_avg_variance_fn_t subpel_avg_variance64x64_avx2 =
907 vp9_sub_pixel_avg_variance64x64_avx2;
908 INSTANTIATE_TEST_CASE_P(
909 AVX2, VP9SubpelAvgVarianceTest,
910 ::testing::Values(make_tuple(5, 5, subpel_avg_variance32x32_avx2),
911 make_tuple(6, 6, subpel_avg_variance64x64_avx2)));
914 const vp9_variance_fn_t variance8x8_neon = vp9_variance8x8_neon;
915 const vp9_variance_fn_t variance16x16_neon = vp9_variance16x16_neon;
916 const vp9_variance_fn_t variance32x32_neon = vp9_variance32x32_neon;
917 INSTANTIATE_TEST_CASE_P(
918 NEON, VP9VarianceTest,
919 ::testing::Values(make_tuple(3, 3, variance8x8_neon),
920 make_tuple(4, 4, variance16x16_neon),
921 make_tuple(5, 5, variance32x32_neon)));
923 const vp9_subpixvariance_fn_t subpel_variance8x8_neon =
924 vp9_sub_pixel_variance8x8_neon;
925 const vp9_subpixvariance_fn_t subpel_variance16x16_neon =
926 vp9_sub_pixel_variance16x16_neon;
927 const vp9_subpixvariance_fn_t subpel_variance32x32_neon =
928 vp9_sub_pixel_variance32x32_neon;
929 INSTANTIATE_TEST_CASE_P(
930 NEON, VP9SubpelVarianceTest,
931 ::testing::Values(make_tuple(3, 3, subpel_variance8x8_neon),
932 make_tuple(4, 4, subpel_variance16x16_neon),
933 make_tuple(5, 5, subpel_variance32x32_neon)));
935 #endif // CONFIG_VP9_ENCODER