1 /* 2 * Copyright (c) 2012 The WebM project authors. All Rights Reserved. 3 * 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. 9 */ 10 #include <stdlib.h> 11 #include <new> 12 13 #include "third_party/googletest/src/include/gtest/gtest.h" 14 15 #include "test/clear_system_state.h" 16 #include "test/register_state_check.h" 17 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" 24 #endif 25 #if CONFIG_VP9_ENCODER 26 # include "./vp9_rtcd.h" 27 # include "vp9/encoder/vp9_variance.h" 28 #endif 29 #include "test/acm_random.h" 30 31 namespace { 32 33 using ::std::tr1::get; 34 using ::std::tr1::make_tuple; 35 using ::std::tr1::tuple; 36 using libvpx_test::ACMRandom; 37 38 static unsigned int mb_ss_ref(const int16_t *src) { 39 unsigned int res = 0; 40 for (int i = 0; i < 256; ++i) { 41 res += src[i] * src[i]; 42 } 43 return res; 44 } 45 46 static unsigned int variance_ref(const uint8_t *ref, const uint8_t *src, 47 int l2w, int l2h, unsigned int *sse_ptr) { 48 int se = 0; 49 unsigned int sse = 0; 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]; 54 se += diff; 55 sse += diff * diff; 56 } 57 } 58 *sse_ptr = sse; 59 return sse - (((int64_t) se * se) >> (l2w + l2h)); 60 } 61 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) { 65 int se = 0; 66 unsigned int sse = 0; 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]; 79 se += diff; 80 sse += diff * diff; 81 } 82 } 83 *sse_ptr = sse; 84 return sse - (((int64_t) se * se) >> (l2w + l2h)); 85 } 86 87 typedef unsigned int (*SumOfSquaresFunction)(const int16_t *src); 88 89 class SumOfSquaresTest : public ::testing::TestWithParam<SumOfSquaresFunction> { 90 public: 91 SumOfSquaresTest() : func_(GetParam()) {} 92 93 virtual ~SumOfSquaresTest() { 94 libvpx_test::ClearSystemState(); 95 } 96 97 protected: 98 void ConstTest(); 99 void RefTest(); 100 101 SumOfSquaresFunction func_; 102 ACMRandom rnd_; 103 }; 104 105 void SumOfSquaresTest::ConstTest() { 106 int16_t mem[256]; 107 unsigned int res; 108 for (int v = 0; v < 256; ++v) { 109 for (int i = 0; i < 256; ++i) { 110 mem[i] = v; 111 } 112 ASM_REGISTER_STATE_CHECK(res = func_(mem)); 113 EXPECT_EQ(256u * (v * v), res); 114 } 115 } 116 117 void SumOfSquaresTest::RefTest() { 118 int16_t mem[256]; 119 for (int i = 0; i < 100; ++i) { 120 for (int j = 0; j < 256; ++j) { 121 mem[j] = rnd_.Rand8() - rnd_.Rand8(); 122 } 123 124 const unsigned int expected = mb_ss_ref(mem); 125 unsigned int res; 126 ASM_REGISTER_STATE_CHECK(res = func_(mem)); 127 EXPECT_EQ(expected, res); 128 } 129 } 130 131 template<typename VarianceFunctionType> 132 class VarianceTest 133 : public ::testing::TestWithParam<tuple<int, int, VarianceFunctionType> > { 134 public: 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); 142 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); 149 } 150 151 virtual void TearDown() { 152 vpx_free(src_); 153 delete[] ref_; 154 libvpx_test::ClearSystemState(); 155 } 156 157 protected: 158 void ZeroTest(); 159 void RefTest(); 160 void OneQuarterTest(); 161 162 ACMRandom rnd_; 163 uint8_t* src_; 164 uint8_t* ref_; 165 int width_, log2width_; 166 int height_, log2height_; 167 int block_size_; 168 VarianceFunctionType variance_; 169 }; 170 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_); 177 unsigned int sse; 178 unsigned int var; 179 ASM_REGISTER_STATE_CHECK( 180 var = variance_(src_, width_, ref_, width_, &sse)); 181 EXPECT_EQ(0u, var) << "src values: " << i << "ref values: " << j; 182 } 183 } 184 } 185 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(); 192 } 193 unsigned int sse1, sse2; 194 unsigned int var1; 195 ASM_REGISTER_STATE_CHECK( 196 var1 = variance_(src_, width_, ref_, width_, &sse1)); 197 const unsigned int var2 = variance_ref(src_, ref_, log2width_, 198 log2height_, &sse2); 199 EXPECT_EQ(sse1, sse2); 200 EXPECT_EQ(var1, var2); 201 } 202 } 203 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); 210 unsigned int sse; 211 unsigned int var; 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); 215 } 216 217 #if CONFIG_VP8_ENCODER 218 template<typename MseFunctionType> 219 class MseTest 220 : public ::testing::TestWithParam<tuple<int, int, MseFunctionType> > { 221 public: 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); 229 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); 236 } 237 238 virtual void TearDown() { 239 vpx_free(src_); 240 delete[] ref_; 241 libvpx_test::ClearSystemState(); 242 } 243 244 protected: 245 void RefTest_mse(); 246 void RefTest_sse(); 247 void MaxTest_mse(); 248 void MaxTest_sse(); 249 250 ACMRandom rnd; 251 uint8_t* src_; 252 uint8_t* ref_; 253 int width_, log2width_; 254 int height_, log2height_; 255 int block_size_; 256 MseFunctionType mse_; 257 }; 258 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(); 265 } 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); 270 } 271 } 272 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(); 279 } 280 unsigned int sse2; 281 unsigned int var1; 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); 286 } 287 } 288 289 template<typename MseFunctionType> 290 void MseTest<MseFunctionType>::MaxTest_mse() { 291 memset(src_, 255, block_size_); 292 memset(ref_, 0, block_size_); 293 unsigned int sse; 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); 297 } 298 299 template<typename MseFunctionType> 300 void MseTest<MseFunctionType>::MaxTest_sse() { 301 memset(src_, 255, block_size_); 302 memset(ref_, 0, block_size_); 303 unsigned int var; 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); 307 } 308 #endif 309 310 #if CONFIG_VP9_ENCODER 311 312 unsigned int subpel_avg_variance_ref(const uint8_t *ref, 313 const uint8_t *src, 314 const uint8_t *second_pred, 315 int l2w, int l2h, 316 int xoff, int yoff, 317 unsigned int *sse_ptr) { 318 int se = 0; 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]; 332 se += diff; 333 sse += diff * diff; 334 } 335 } 336 *sse_ptr = sse; 337 return sse - (((int64_t) se * se) >> (l2w + l2h)); 338 } 339 340 template<typename SubpelVarianceFunctionType> 341 class SubpelVarianceTest 342 : public ::testing::TestWithParam<tuple<int, int, 343 SubpelVarianceFunctionType> > { 344 public: 345 virtual void SetUp() { 346 const tuple<int, int, SubpelVarianceFunctionType>& params = 347 this->GetParam(); 348 log2width_ = get<0>(params); 349 width_ = 1 << log2width_; 350 log2height_ = get<1>(params); 351 height_ = 1 << log2height_; 352 subpel_variance_ = get<2>(params); 353 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); 362 } 363 364 virtual void TearDown() { 365 vpx_free(src_); 366 delete[] ref_; 367 vpx_free(sec_); 368 libvpx_test::ClearSystemState(); 369 } 370 371 protected: 372 void RefTest(); 373 374 ACMRandom rnd_; 375 uint8_t *src_; 376 uint8_t *ref_; 377 uint8_t *sec_; 378 int width_, log2width_; 379 int height_, log2height_; 380 int block_size_; 381 SubpelVarianceFunctionType subpel_variance_; 382 }; 383 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(); 390 } 391 for (int j = 0; j < block_size_ + width_ + height_ + 1; j++) { 392 ref_[j] = rnd_.Rand8(); 393 } 394 unsigned int sse1, sse2; 395 unsigned int var1; 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; 402 } 403 } 404 } 405 406 template<> 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(); 413 } 414 for (int j = 0; j < block_size_ + width_ + height_ + 1; j++) { 415 ref_[j] = rnd_.Rand8(); 416 } 417 unsigned int sse1, sse2; 418 unsigned int var1; 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_, 424 x, y, &sse2); 425 EXPECT_EQ(sse1, sse2) << "at position " << x << ", " << y; 426 EXPECT_EQ(var1, var2) << "at position " << x << ", " << y; 427 } 428 } 429 } 430 431 #endif // CONFIG_VP9_ENCODER 432 433 // ----------------------------------------------------------------------------- 434 // VP8 test cases. 435 436 namespace vp8 { 437 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); 441 442 typedef MseTest<vp8_sse_fn_t> VP8SseTest; 443 typedef MseTest<vp8_variance_fn_t> VP8MseTest; 444 typedef VarianceTest<vp8_variance_fn_t> VP8VarianceTest; 445 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(); } 453 454 const vp8_sse_fn_t get4x4sse_cs_c = vp8_get4x4sse_cs_c; 455 INSTANTIATE_TEST_CASE_P( 456 C, VP8SseTest, 457 ::testing::Values(make_tuple(2, 2, get4x4sse_cs_c))); 458 459 const vp8_variance_fn_t mse16x16_c = vp8_mse16x16_c; 460 INSTANTIATE_TEST_CASE_P( 461 C, VP8MseTest, 462 ::testing::Values(make_tuple(4, 4, mse16x16_c))); 463 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( 470 C, VP8VarianceTest, 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))); 476 477 #if HAVE_NEON 478 const vp8_sse_fn_t get4x4sse_cs_neon = vp8_get4x4sse_cs_neon; 479 INSTANTIATE_TEST_CASE_P( 480 NEON, VP8SseTest, 481 ::testing::Values(make_tuple(2, 2, get4x4sse_cs_neon))); 482 483 const vp8_variance_fn_t mse16x16_neon = vp8_mse16x16_neon; 484 INSTANTIATE_TEST_CASE_P( 485 NEON, VP8MseTest, 486 ::testing::Values(make_tuple(4, 4, mse16x16_neon))); 487 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))); 498 #endif 499 500 501 #if HAVE_MMX 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))); 514 #endif 515 516 #if HAVE_SSE2 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))); 529 #endif 530 #endif // CONFIG_VP8_ENCODER 531 532 } // namespace vp8 533 534 // ----------------------------------------------------------------------------- 535 // VP9 test cases. 536 537 namespace vp9 { 538 539 #if CONFIG_VP9_ENCODER 540 541 TEST_P(SumOfSquaresTest, Const) { ConstTest(); } 542 TEST_P(SumOfSquaresTest, Ref) { RefTest(); } 543 544 INSTANTIATE_TEST_CASE_P(C, SumOfSquaresTest, 545 ::testing::Values(vp9_get_mb_ss_c)); 546 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; 550 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(); } 556 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( 571 C, VP9VarianceTest, 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))); 585 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))); 627 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))); 669 670 #if HAVE_SSE2 671 #if CONFIG_USE_X86INC 672 673 INSTANTIATE_TEST_CASE_P(SSE2, SumOfSquaresTest, 674 ::testing::Values(vp9_get_mb_ss_sse2)); 675 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))); 704 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))); 746 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))); 788 #endif 789 #endif 790 791 #if HAVE_SSSE3 792 #if CONFIG_USE_X86INC 793 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))); 835 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))); 877 #endif 878 #endif 879 880 #if HAVE_AVX2 881 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))); 894 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))); 903 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))); 912 #endif // HAVE_AVX2 913 #if HAVE_NEON 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))); 922 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))); 934 #endif // HAVE_NEON 935 #endif // CONFIG_VP9_ENCODER 936 937 } // namespace vp9 938 939 } // namespace 940