sad_test.cc 41 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495969798991001011021031041051061071081091101111121131141151161171181191201211221231241251261271281291301311321331341351361371381391401411421431441451461471481491501511521531541551561571581591601611621631641651661671681691701711721731741751761771781791801811821831841851861871881891901911921931941951961971981992002012022032042052062072082092102112122132142152162172182192202212222232242252262272282292302312322332342352362372382392402412422432442452462472482492502512522532542552562572582592602612622632642652662672682692702712722732742752762772782792802812822832842852862872882892902912922932942952962972982993003013023033043053063073083093103113123133143153163173183193203213223233243253263273283293303313323333343353363373383393403413423433443453463473483493503513523533543553563573583593603613623633643653663673683693703713723733743753763773783793803813823833843853863873883893903913923933943953963973983994004014024034044054064074084094104114124134144154164174184194204214224234244254264274284294304314324334344354364374384394404414424434444454464474484494504514524534544554564574584594604614624634644654664674684694704714724734744754764774784794804814824834844854864874884894904914924934944954964974984995005015025035045055065075085095105115125135145155165175185195205215225235245255265275285295305315325335345355365375385395405415425435445455465475485495505515525535545555565575585595605615625635645655665675685695705715725735745755765775785795805815825835845855865875885895905915925935945955965975985996006016026036046056066076086096106116126136146156166176186196206216226236246256266276286296306316326336346356366376386396406416426436446456466476486496506516526536546556566576586596606616626636646656666676686696706716726736746756766776786796806816826836846856866876886896906916926936946956966976986997007017027037047057067077087097107117127137147157167177187197207217227237247257267277287297307317327337347357367377387397407417427437447457467477487497507517527537547557567577587597607617627637647657667677687697707717727737747757767777787797807817827837847857867877887897907917927937947957967977987998008018028038048058068078088098108118128138148158168178188198208218228238248258268278288298308318328338348358368378388398408418428438448458468478488498508518528538548558568578588598608618628638648658668678688698708718728738748758768778788798808818828838848858868878888898908918928938948958968978988999009019029039049059069079089099109119129139149159169179189199209219229239249259269279289299309319329339349359369379389399409419429439449459469479489499509519529539549559569579589599609619629639649659669679689699709719729739749759769779789799809819829839849859869879889899909919929939949959969979989991000100110021003100410051006100710081009101010111012101310141015101610171018101910201021102210231024102510261027102810291030103110321033103410351036103710381039104010411042104310441045104610471048
  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 <string.h>
  11. #include <limits.h>
  12. #include <stdio.h>
  13. #include "third_party/googletest/src/include/gtest/gtest.h"
  14. #include "./vpx_config.h"
  15. #include "./vpx_dsp_rtcd.h"
  16. #include "test/acm_random.h"
  17. #include "test/clear_system_state.h"
  18. #include "test/register_state_check.h"
  19. #include "test/util.h"
  20. #include "vpx/vpx_codec.h"
  21. #include "vpx_mem/vpx_mem.h"
  22. #include "vpx_ports/mem.h"
  23. template <typename Function>
  24. struct TestParams {
  25. TestParams(int w, int h, Function f, int bd = -1)
  26. : width(w), height(h), bit_depth(bd), func(f) {}
  27. int width, height, bit_depth;
  28. Function func;
  29. };
  30. typedef unsigned int (*SadMxNFunc)(const uint8_t *src_ptr, int src_stride,
  31. const uint8_t *ref_ptr, int ref_stride);
  32. typedef TestParams<SadMxNFunc> SadMxNParam;
  33. typedef unsigned int (*SadMxNAvgFunc)(const uint8_t *src_ptr, int src_stride,
  34. const uint8_t *ref_ptr, int ref_stride,
  35. const uint8_t *second_pred);
  36. typedef TestParams<SadMxNAvgFunc> SadMxNAvgParam;
  37. typedef void (*SadMxNx4Func)(const uint8_t *src_ptr, int src_stride,
  38. const uint8_t *const ref_ptr[], int ref_stride,
  39. unsigned int *sad_array);
  40. typedef TestParams<SadMxNx4Func> SadMxNx4Param;
  41. using libvpx_test::ACMRandom;
  42. namespace {
  43. template <typename ParamType>
  44. class SADTestBase : public ::testing::TestWithParam<ParamType> {
  45. public:
  46. explicit SADTestBase(const ParamType &params) : params_(params) {}
  47. virtual void SetUp() {
  48. source_data8_ = reinterpret_cast<uint8_t *>(
  49. vpx_memalign(kDataAlignment, kDataBlockSize));
  50. reference_data8_ = reinterpret_cast<uint8_t *>(
  51. vpx_memalign(kDataAlignment, kDataBufferSize));
  52. second_pred8_ =
  53. reinterpret_cast<uint8_t *>(vpx_memalign(kDataAlignment, 64 * 64));
  54. source_data16_ = reinterpret_cast<uint16_t *>(
  55. vpx_memalign(kDataAlignment, kDataBlockSize * sizeof(uint16_t)));
  56. reference_data16_ = reinterpret_cast<uint16_t *>(
  57. vpx_memalign(kDataAlignment, kDataBufferSize * sizeof(uint16_t)));
  58. second_pred16_ = reinterpret_cast<uint16_t *>(
  59. vpx_memalign(kDataAlignment, 64 * 64 * sizeof(uint16_t)));
  60. if (params_.bit_depth == -1) {
  61. use_high_bit_depth_ = false;
  62. bit_depth_ = VPX_BITS_8;
  63. source_data_ = source_data8_;
  64. reference_data_ = reference_data8_;
  65. second_pred_ = second_pred8_;
  66. #if CONFIG_VP9_HIGHBITDEPTH
  67. } else {
  68. use_high_bit_depth_ = true;
  69. bit_depth_ = static_cast<vpx_bit_depth_t>(params_.bit_depth);
  70. source_data_ = CONVERT_TO_BYTEPTR(source_data16_);
  71. reference_data_ = CONVERT_TO_BYTEPTR(reference_data16_);
  72. second_pred_ = CONVERT_TO_BYTEPTR(second_pred16_);
  73. #endif // CONFIG_VP9_HIGHBITDEPTH
  74. }
  75. mask_ = (1 << bit_depth_) - 1;
  76. source_stride_ = (params_.width + 31) & ~31;
  77. reference_stride_ = params_.width * 2;
  78. rnd_.Reset(ACMRandom::DeterministicSeed());
  79. }
  80. virtual void TearDown() {
  81. vpx_free(source_data8_);
  82. source_data8_ = NULL;
  83. vpx_free(reference_data8_);
  84. reference_data8_ = NULL;
  85. vpx_free(second_pred8_);
  86. second_pred8_ = NULL;
  87. vpx_free(source_data16_);
  88. source_data16_ = NULL;
  89. vpx_free(reference_data16_);
  90. reference_data16_ = NULL;
  91. vpx_free(second_pred16_);
  92. second_pred16_ = NULL;
  93. libvpx_test::ClearSystemState();
  94. }
  95. protected:
  96. // Handle blocks up to 4 blocks 64x64 with stride up to 128
  97. static const int kDataAlignment = 16;
  98. static const int kDataBlockSize = 64 * 128;
  99. static const int kDataBufferSize = 4 * kDataBlockSize;
  100. uint8_t *GetReference(int block_idx) const {
  101. #if CONFIG_VP9_HIGHBITDEPTH
  102. if (use_high_bit_depth_) {
  103. return CONVERT_TO_BYTEPTR(CONVERT_TO_SHORTPTR(reference_data_) +
  104. block_idx * kDataBlockSize);
  105. }
  106. #endif // CONFIG_VP9_HIGHBITDEPTH
  107. return reference_data_ + block_idx * kDataBlockSize;
  108. }
  109. // Sum of Absolute Differences. Given two blocks, calculate the absolute
  110. // difference between two pixels in the same relative location; accumulate.
  111. uint32_t ReferenceSAD(int block_idx) const {
  112. uint32_t sad = 0;
  113. const uint8_t *const reference8 = GetReference(block_idx);
  114. const uint8_t *const source8 = source_data_;
  115. #if CONFIG_VP9_HIGHBITDEPTH
  116. const uint16_t *const reference16 =
  117. CONVERT_TO_SHORTPTR(GetReference(block_idx));
  118. const uint16_t *const source16 = CONVERT_TO_SHORTPTR(source_data_);
  119. #endif // CONFIG_VP9_HIGHBITDEPTH
  120. for (int h = 0; h < params_.height; ++h) {
  121. for (int w = 0; w < params_.width; ++w) {
  122. if (!use_high_bit_depth_) {
  123. sad += abs(source8[h * source_stride_ + w] -
  124. reference8[h * reference_stride_ + w]);
  125. #if CONFIG_VP9_HIGHBITDEPTH
  126. } else {
  127. sad += abs(source16[h * source_stride_ + w] -
  128. reference16[h * reference_stride_ + w]);
  129. #endif // CONFIG_VP9_HIGHBITDEPTH
  130. }
  131. }
  132. }
  133. return sad;
  134. }
  135. // Sum of Absolute Differences Average. Given two blocks, and a prediction
  136. // calculate the absolute difference between one pixel and average of the
  137. // corresponding and predicted pixels; accumulate.
  138. unsigned int ReferenceSADavg(int block_idx) const {
  139. unsigned int sad = 0;
  140. const uint8_t *const reference8 = GetReference(block_idx);
  141. const uint8_t *const source8 = source_data_;
  142. const uint8_t *const second_pred8 = second_pred_;
  143. #if CONFIG_VP9_HIGHBITDEPTH
  144. const uint16_t *const reference16 =
  145. CONVERT_TO_SHORTPTR(GetReference(block_idx));
  146. const uint16_t *const source16 = CONVERT_TO_SHORTPTR(source_data_);
  147. const uint16_t *const second_pred16 = CONVERT_TO_SHORTPTR(second_pred_);
  148. #endif // CONFIG_VP9_HIGHBITDEPTH
  149. for (int h = 0; h < params_.height; ++h) {
  150. for (int w = 0; w < params_.width; ++w) {
  151. if (!use_high_bit_depth_) {
  152. const int tmp = second_pred8[h * params_.width + w] +
  153. reference8[h * reference_stride_ + w];
  154. const uint8_t comp_pred = ROUND_POWER_OF_TWO(tmp, 1);
  155. sad += abs(source8[h * source_stride_ + w] - comp_pred);
  156. #if CONFIG_VP9_HIGHBITDEPTH
  157. } else {
  158. const int tmp = second_pred16[h * params_.width + w] +
  159. reference16[h * reference_stride_ + w];
  160. const uint16_t comp_pred = ROUND_POWER_OF_TWO(tmp, 1);
  161. sad += abs(source16[h * source_stride_ + w] - comp_pred);
  162. #endif // CONFIG_VP9_HIGHBITDEPTH
  163. }
  164. }
  165. }
  166. return sad;
  167. }
  168. void FillConstant(uint8_t *data, int stride, uint16_t fill_constant) const {
  169. uint8_t *data8 = data;
  170. #if CONFIG_VP9_HIGHBITDEPTH
  171. uint16_t *data16 = CONVERT_TO_SHORTPTR(data);
  172. #endif // CONFIG_VP9_HIGHBITDEPTH
  173. for (int h = 0; h < params_.height; ++h) {
  174. for (int w = 0; w < params_.width; ++w) {
  175. if (!use_high_bit_depth_) {
  176. data8[h * stride + w] = static_cast<uint8_t>(fill_constant);
  177. #if CONFIG_VP9_HIGHBITDEPTH
  178. } else {
  179. data16[h * stride + w] = fill_constant;
  180. #endif // CONFIG_VP9_HIGHBITDEPTH
  181. }
  182. }
  183. }
  184. }
  185. void FillRandom(uint8_t *data, int stride) {
  186. uint8_t *data8 = data;
  187. #if CONFIG_VP9_HIGHBITDEPTH
  188. uint16_t *data16 = CONVERT_TO_SHORTPTR(data);
  189. #endif // CONFIG_VP9_HIGHBITDEPTH
  190. for (int h = 0; h < params_.height; ++h) {
  191. for (int w = 0; w < params_.width; ++w) {
  192. if (!use_high_bit_depth_) {
  193. data8[h * stride + w] = rnd_.Rand8();
  194. #if CONFIG_VP9_HIGHBITDEPTH
  195. } else {
  196. data16[h * stride + w] = rnd_.Rand16() & mask_;
  197. #endif // CONFIG_VP9_HIGHBITDEPTH
  198. }
  199. }
  200. }
  201. }
  202. uint32_t mask_;
  203. vpx_bit_depth_t bit_depth_;
  204. int source_stride_;
  205. int reference_stride_;
  206. bool use_high_bit_depth_;
  207. uint8_t *source_data_;
  208. uint8_t *reference_data_;
  209. uint8_t *second_pred_;
  210. uint8_t *source_data8_;
  211. uint8_t *reference_data8_;
  212. uint8_t *second_pred8_;
  213. uint16_t *source_data16_;
  214. uint16_t *reference_data16_;
  215. uint16_t *second_pred16_;
  216. ACMRandom rnd_;
  217. ParamType params_;
  218. };
  219. class SADx4Test : public SADTestBase<SadMxNx4Param> {
  220. public:
  221. SADx4Test() : SADTestBase(GetParam()) {}
  222. protected:
  223. void SADs(unsigned int *results) const {
  224. const uint8_t *references[] = { GetReference(0), GetReference(1),
  225. GetReference(2), GetReference(3) };
  226. ASM_REGISTER_STATE_CHECK(params_.func(
  227. source_data_, source_stride_, references, reference_stride_, results));
  228. }
  229. void CheckSADs() const {
  230. uint32_t reference_sad, exp_sad[4];
  231. SADs(exp_sad);
  232. for (int block = 0; block < 4; ++block) {
  233. reference_sad = ReferenceSAD(block);
  234. EXPECT_EQ(reference_sad, exp_sad[block]) << "block " << block;
  235. }
  236. }
  237. };
  238. class SADTest : public SADTestBase<SadMxNParam> {
  239. public:
  240. SADTest() : SADTestBase(GetParam()) {}
  241. protected:
  242. unsigned int SAD(int block_idx) const {
  243. unsigned int ret;
  244. const uint8_t *const reference = GetReference(block_idx);
  245. ASM_REGISTER_STATE_CHECK(ret = params_.func(source_data_, source_stride_,
  246. reference, reference_stride_));
  247. return ret;
  248. }
  249. void CheckSAD() const {
  250. const unsigned int reference_sad = ReferenceSAD(0);
  251. const unsigned int exp_sad = SAD(0);
  252. ASSERT_EQ(reference_sad, exp_sad);
  253. }
  254. };
  255. class SADavgTest : public SADTestBase<SadMxNAvgParam> {
  256. public:
  257. SADavgTest() : SADTestBase(GetParam()) {}
  258. protected:
  259. unsigned int SAD_avg(int block_idx) const {
  260. unsigned int ret;
  261. const uint8_t *const reference = GetReference(block_idx);
  262. ASM_REGISTER_STATE_CHECK(ret = params_.func(source_data_, source_stride_,
  263. reference, reference_stride_,
  264. second_pred_));
  265. return ret;
  266. }
  267. void CheckSAD() const {
  268. const unsigned int reference_sad = ReferenceSADavg(0);
  269. const unsigned int exp_sad = SAD_avg(0);
  270. ASSERT_EQ(reference_sad, exp_sad);
  271. }
  272. };
  273. TEST_P(SADTest, MaxRef) {
  274. FillConstant(source_data_, source_stride_, 0);
  275. FillConstant(reference_data_, reference_stride_, mask_);
  276. CheckSAD();
  277. }
  278. TEST_P(SADTest, MaxSrc) {
  279. FillConstant(source_data_, source_stride_, mask_);
  280. FillConstant(reference_data_, reference_stride_, 0);
  281. CheckSAD();
  282. }
  283. TEST_P(SADTest, ShortRef) {
  284. const int tmp_stride = reference_stride_;
  285. reference_stride_ >>= 1;
  286. FillRandom(source_data_, source_stride_);
  287. FillRandom(reference_data_, reference_stride_);
  288. CheckSAD();
  289. reference_stride_ = tmp_stride;
  290. }
  291. TEST_P(SADTest, UnalignedRef) {
  292. // The reference frame, but not the source frame, may be unaligned for
  293. // certain types of searches.
  294. const int tmp_stride = reference_stride_;
  295. reference_stride_ -= 1;
  296. FillRandom(source_data_, source_stride_);
  297. FillRandom(reference_data_, reference_stride_);
  298. CheckSAD();
  299. reference_stride_ = tmp_stride;
  300. }
  301. TEST_P(SADTest, ShortSrc) {
  302. const int tmp_stride = source_stride_;
  303. source_stride_ >>= 1;
  304. FillRandom(source_data_, source_stride_);
  305. FillRandom(reference_data_, reference_stride_);
  306. CheckSAD();
  307. source_stride_ = tmp_stride;
  308. }
  309. TEST_P(SADavgTest, MaxRef) {
  310. FillConstant(source_data_, source_stride_, 0);
  311. FillConstant(reference_data_, reference_stride_, mask_);
  312. FillConstant(second_pred_, params_.width, 0);
  313. CheckSAD();
  314. }
  315. TEST_P(SADavgTest, MaxSrc) {
  316. FillConstant(source_data_, source_stride_, mask_);
  317. FillConstant(reference_data_, reference_stride_, 0);
  318. FillConstant(second_pred_, params_.width, 0);
  319. CheckSAD();
  320. }
  321. TEST_P(SADavgTest, ShortRef) {
  322. const int tmp_stride = reference_stride_;
  323. reference_stride_ >>= 1;
  324. FillRandom(source_data_, source_stride_);
  325. FillRandom(reference_data_, reference_stride_);
  326. FillRandom(second_pred_, params_.width);
  327. CheckSAD();
  328. reference_stride_ = tmp_stride;
  329. }
  330. TEST_P(SADavgTest, UnalignedRef) {
  331. // The reference frame, but not the source frame, may be unaligned for
  332. // certain types of searches.
  333. const int tmp_stride = reference_stride_;
  334. reference_stride_ -= 1;
  335. FillRandom(source_data_, source_stride_);
  336. FillRandom(reference_data_, reference_stride_);
  337. FillRandom(second_pred_, params_.width);
  338. CheckSAD();
  339. reference_stride_ = tmp_stride;
  340. }
  341. TEST_P(SADavgTest, ShortSrc) {
  342. const int tmp_stride = source_stride_;
  343. source_stride_ >>= 1;
  344. FillRandom(source_data_, source_stride_);
  345. FillRandom(reference_data_, reference_stride_);
  346. FillRandom(second_pred_, params_.width);
  347. CheckSAD();
  348. source_stride_ = tmp_stride;
  349. }
  350. TEST_P(SADx4Test, MaxRef) {
  351. FillConstant(source_data_, source_stride_, 0);
  352. FillConstant(GetReference(0), reference_stride_, mask_);
  353. FillConstant(GetReference(1), reference_stride_, mask_);
  354. FillConstant(GetReference(2), reference_stride_, mask_);
  355. FillConstant(GetReference(3), reference_stride_, mask_);
  356. CheckSADs();
  357. }
  358. TEST_P(SADx4Test, MaxSrc) {
  359. FillConstant(source_data_, source_stride_, mask_);
  360. FillConstant(GetReference(0), reference_stride_, 0);
  361. FillConstant(GetReference(1), reference_stride_, 0);
  362. FillConstant(GetReference(2), reference_stride_, 0);
  363. FillConstant(GetReference(3), reference_stride_, 0);
  364. CheckSADs();
  365. }
  366. TEST_P(SADx4Test, ShortRef) {
  367. int tmp_stride = reference_stride_;
  368. reference_stride_ >>= 1;
  369. FillRandom(source_data_, source_stride_);
  370. FillRandom(GetReference(0), reference_stride_);
  371. FillRandom(GetReference(1), reference_stride_);
  372. FillRandom(GetReference(2), reference_stride_);
  373. FillRandom(GetReference(3), reference_stride_);
  374. CheckSADs();
  375. reference_stride_ = tmp_stride;
  376. }
  377. TEST_P(SADx4Test, UnalignedRef) {
  378. // The reference frame, but not the source frame, may be unaligned for
  379. // certain types of searches.
  380. int tmp_stride = reference_stride_;
  381. reference_stride_ -= 1;
  382. FillRandom(source_data_, source_stride_);
  383. FillRandom(GetReference(0), reference_stride_);
  384. FillRandom(GetReference(1), reference_stride_);
  385. FillRandom(GetReference(2), reference_stride_);
  386. FillRandom(GetReference(3), reference_stride_);
  387. CheckSADs();
  388. reference_stride_ = tmp_stride;
  389. }
  390. TEST_P(SADx4Test, ShortSrc) {
  391. int tmp_stride = source_stride_;
  392. source_stride_ >>= 1;
  393. FillRandom(source_data_, source_stride_);
  394. FillRandom(GetReference(0), reference_stride_);
  395. FillRandom(GetReference(1), reference_stride_);
  396. FillRandom(GetReference(2), reference_stride_);
  397. FillRandom(GetReference(3), reference_stride_);
  398. CheckSADs();
  399. source_stride_ = tmp_stride;
  400. }
  401. TEST_P(SADx4Test, SrcAlignedByWidth) {
  402. uint8_t *tmp_source_data = source_data_;
  403. source_data_ += params_.width;
  404. FillRandom(source_data_, source_stride_);
  405. FillRandom(GetReference(0), reference_stride_);
  406. FillRandom(GetReference(1), reference_stride_);
  407. FillRandom(GetReference(2), reference_stride_);
  408. FillRandom(GetReference(3), reference_stride_);
  409. CheckSADs();
  410. source_data_ = tmp_source_data;
  411. }
  412. //------------------------------------------------------------------------------
  413. // C functions
  414. const SadMxNParam c_tests[] = {
  415. SadMxNParam(64, 64, &vpx_sad64x64_c),
  416. SadMxNParam(64, 32, &vpx_sad64x32_c),
  417. SadMxNParam(32, 64, &vpx_sad32x64_c),
  418. SadMxNParam(32, 32, &vpx_sad32x32_c),
  419. SadMxNParam(32, 16, &vpx_sad32x16_c),
  420. SadMxNParam(16, 32, &vpx_sad16x32_c),
  421. SadMxNParam(16, 16, &vpx_sad16x16_c),
  422. SadMxNParam(16, 8, &vpx_sad16x8_c),
  423. SadMxNParam(8, 16, &vpx_sad8x16_c),
  424. SadMxNParam(8, 8, &vpx_sad8x8_c),
  425. SadMxNParam(8, 4, &vpx_sad8x4_c),
  426. SadMxNParam(4, 8, &vpx_sad4x8_c),
  427. SadMxNParam(4, 4, &vpx_sad4x4_c),
  428. #if CONFIG_VP9_HIGHBITDEPTH
  429. SadMxNParam(64, 64, &vpx_highbd_sad64x64_c, 8),
  430. SadMxNParam(64, 32, &vpx_highbd_sad64x32_c, 8),
  431. SadMxNParam(32, 64, &vpx_highbd_sad32x64_c, 8),
  432. SadMxNParam(32, 32, &vpx_highbd_sad32x32_c, 8),
  433. SadMxNParam(32, 16, &vpx_highbd_sad32x16_c, 8),
  434. SadMxNParam(16, 32, &vpx_highbd_sad16x32_c, 8),
  435. SadMxNParam(16, 16, &vpx_highbd_sad16x16_c, 8),
  436. SadMxNParam(16, 8, &vpx_highbd_sad16x8_c, 8),
  437. SadMxNParam(8, 16, &vpx_highbd_sad8x16_c, 8),
  438. SadMxNParam(8, 8, &vpx_highbd_sad8x8_c, 8),
  439. SadMxNParam(8, 4, &vpx_highbd_sad8x4_c, 8),
  440. SadMxNParam(4, 8, &vpx_highbd_sad4x8_c, 8),
  441. SadMxNParam(4, 4, &vpx_highbd_sad4x4_c, 8),
  442. SadMxNParam(64, 64, &vpx_highbd_sad64x64_c, 10),
  443. SadMxNParam(64, 32, &vpx_highbd_sad64x32_c, 10),
  444. SadMxNParam(32, 64, &vpx_highbd_sad32x64_c, 10),
  445. SadMxNParam(32, 32, &vpx_highbd_sad32x32_c, 10),
  446. SadMxNParam(32, 16, &vpx_highbd_sad32x16_c, 10),
  447. SadMxNParam(16, 32, &vpx_highbd_sad16x32_c, 10),
  448. SadMxNParam(16, 16, &vpx_highbd_sad16x16_c, 10),
  449. SadMxNParam(16, 8, &vpx_highbd_sad16x8_c, 10),
  450. SadMxNParam(8, 16, &vpx_highbd_sad8x16_c, 10),
  451. SadMxNParam(8, 8, &vpx_highbd_sad8x8_c, 10),
  452. SadMxNParam(8, 4, &vpx_highbd_sad8x4_c, 10),
  453. SadMxNParam(4, 8, &vpx_highbd_sad4x8_c, 10),
  454. SadMxNParam(4, 4, &vpx_highbd_sad4x4_c, 10),
  455. SadMxNParam(64, 64, &vpx_highbd_sad64x64_c, 12),
  456. SadMxNParam(64, 32, &vpx_highbd_sad64x32_c, 12),
  457. SadMxNParam(32, 64, &vpx_highbd_sad32x64_c, 12),
  458. SadMxNParam(32, 32, &vpx_highbd_sad32x32_c, 12),
  459. SadMxNParam(32, 16, &vpx_highbd_sad32x16_c, 12),
  460. SadMxNParam(16, 32, &vpx_highbd_sad16x32_c, 12),
  461. SadMxNParam(16, 16, &vpx_highbd_sad16x16_c, 12),
  462. SadMxNParam(16, 8, &vpx_highbd_sad16x8_c, 12),
  463. SadMxNParam(8, 16, &vpx_highbd_sad8x16_c, 12),
  464. SadMxNParam(8, 8, &vpx_highbd_sad8x8_c, 12),
  465. SadMxNParam(8, 4, &vpx_highbd_sad8x4_c, 12),
  466. SadMxNParam(4, 8, &vpx_highbd_sad4x8_c, 12),
  467. SadMxNParam(4, 4, &vpx_highbd_sad4x4_c, 12),
  468. #endif // CONFIG_VP9_HIGHBITDEPTH
  469. };
  470. INSTANTIATE_TEST_CASE_P(C, SADTest, ::testing::ValuesIn(c_tests));
  471. const SadMxNAvgParam avg_c_tests[] = {
  472. SadMxNAvgParam(64, 64, &vpx_sad64x64_avg_c),
  473. SadMxNAvgParam(64, 32, &vpx_sad64x32_avg_c),
  474. SadMxNAvgParam(32, 64, &vpx_sad32x64_avg_c),
  475. SadMxNAvgParam(32, 32, &vpx_sad32x32_avg_c),
  476. SadMxNAvgParam(32, 16, &vpx_sad32x16_avg_c),
  477. SadMxNAvgParam(16, 32, &vpx_sad16x32_avg_c),
  478. SadMxNAvgParam(16, 16, &vpx_sad16x16_avg_c),
  479. SadMxNAvgParam(16, 8, &vpx_sad16x8_avg_c),
  480. SadMxNAvgParam(8, 16, &vpx_sad8x16_avg_c),
  481. SadMxNAvgParam(8, 8, &vpx_sad8x8_avg_c),
  482. SadMxNAvgParam(8, 4, &vpx_sad8x4_avg_c),
  483. SadMxNAvgParam(4, 8, &vpx_sad4x8_avg_c),
  484. SadMxNAvgParam(4, 4, &vpx_sad4x4_avg_c),
  485. #if CONFIG_VP9_HIGHBITDEPTH
  486. SadMxNAvgParam(64, 64, &vpx_highbd_sad64x64_avg_c, 8),
  487. SadMxNAvgParam(64, 32, &vpx_highbd_sad64x32_avg_c, 8),
  488. SadMxNAvgParam(32, 64, &vpx_highbd_sad32x64_avg_c, 8),
  489. SadMxNAvgParam(32, 32, &vpx_highbd_sad32x32_avg_c, 8),
  490. SadMxNAvgParam(32, 16, &vpx_highbd_sad32x16_avg_c, 8),
  491. SadMxNAvgParam(16, 32, &vpx_highbd_sad16x32_avg_c, 8),
  492. SadMxNAvgParam(16, 16, &vpx_highbd_sad16x16_avg_c, 8),
  493. SadMxNAvgParam(16, 8, &vpx_highbd_sad16x8_avg_c, 8),
  494. SadMxNAvgParam(8, 16, &vpx_highbd_sad8x16_avg_c, 8),
  495. SadMxNAvgParam(8, 8, &vpx_highbd_sad8x8_avg_c, 8),
  496. SadMxNAvgParam(8, 4, &vpx_highbd_sad8x4_avg_c, 8),
  497. SadMxNAvgParam(4, 8, &vpx_highbd_sad4x8_avg_c, 8),
  498. SadMxNAvgParam(4, 4, &vpx_highbd_sad4x4_avg_c, 8),
  499. SadMxNAvgParam(64, 64, &vpx_highbd_sad64x64_avg_c, 10),
  500. SadMxNAvgParam(64, 32, &vpx_highbd_sad64x32_avg_c, 10),
  501. SadMxNAvgParam(32, 64, &vpx_highbd_sad32x64_avg_c, 10),
  502. SadMxNAvgParam(32, 32, &vpx_highbd_sad32x32_avg_c, 10),
  503. SadMxNAvgParam(32, 16, &vpx_highbd_sad32x16_avg_c, 10),
  504. SadMxNAvgParam(16, 32, &vpx_highbd_sad16x32_avg_c, 10),
  505. SadMxNAvgParam(16, 16, &vpx_highbd_sad16x16_avg_c, 10),
  506. SadMxNAvgParam(16, 8, &vpx_highbd_sad16x8_avg_c, 10),
  507. SadMxNAvgParam(8, 16, &vpx_highbd_sad8x16_avg_c, 10),
  508. SadMxNAvgParam(8, 8, &vpx_highbd_sad8x8_avg_c, 10),
  509. SadMxNAvgParam(8, 4, &vpx_highbd_sad8x4_avg_c, 10),
  510. SadMxNAvgParam(4, 8, &vpx_highbd_sad4x8_avg_c, 10),
  511. SadMxNAvgParam(4, 4, &vpx_highbd_sad4x4_avg_c, 10),
  512. SadMxNAvgParam(64, 64, &vpx_highbd_sad64x64_avg_c, 12),
  513. SadMxNAvgParam(64, 32, &vpx_highbd_sad64x32_avg_c, 12),
  514. SadMxNAvgParam(32, 64, &vpx_highbd_sad32x64_avg_c, 12),
  515. SadMxNAvgParam(32, 32, &vpx_highbd_sad32x32_avg_c, 12),
  516. SadMxNAvgParam(32, 16, &vpx_highbd_sad32x16_avg_c, 12),
  517. SadMxNAvgParam(16, 32, &vpx_highbd_sad16x32_avg_c, 12),
  518. SadMxNAvgParam(16, 16, &vpx_highbd_sad16x16_avg_c, 12),
  519. SadMxNAvgParam(16, 8, &vpx_highbd_sad16x8_avg_c, 12),
  520. SadMxNAvgParam(8, 16, &vpx_highbd_sad8x16_avg_c, 12),
  521. SadMxNAvgParam(8, 8, &vpx_highbd_sad8x8_avg_c, 12),
  522. SadMxNAvgParam(8, 4, &vpx_highbd_sad8x4_avg_c, 12),
  523. SadMxNAvgParam(4, 8, &vpx_highbd_sad4x8_avg_c, 12),
  524. SadMxNAvgParam(4, 4, &vpx_highbd_sad4x4_avg_c, 12),
  525. #endif // CONFIG_VP9_HIGHBITDEPTH
  526. };
  527. INSTANTIATE_TEST_CASE_P(C, SADavgTest, ::testing::ValuesIn(avg_c_tests));
  528. const SadMxNx4Param x4d_c_tests[] = {
  529. SadMxNx4Param(64, 64, &vpx_sad64x64x4d_c),
  530. SadMxNx4Param(64, 32, &vpx_sad64x32x4d_c),
  531. SadMxNx4Param(32, 64, &vpx_sad32x64x4d_c),
  532. SadMxNx4Param(32, 32, &vpx_sad32x32x4d_c),
  533. SadMxNx4Param(32, 16, &vpx_sad32x16x4d_c),
  534. SadMxNx4Param(16, 32, &vpx_sad16x32x4d_c),
  535. SadMxNx4Param(16, 16, &vpx_sad16x16x4d_c),
  536. SadMxNx4Param(16, 8, &vpx_sad16x8x4d_c),
  537. SadMxNx4Param(8, 16, &vpx_sad8x16x4d_c),
  538. SadMxNx4Param(8, 8, &vpx_sad8x8x4d_c),
  539. SadMxNx4Param(8, 4, &vpx_sad8x4x4d_c),
  540. SadMxNx4Param(4, 8, &vpx_sad4x8x4d_c),
  541. SadMxNx4Param(4, 4, &vpx_sad4x4x4d_c),
  542. #if CONFIG_VP9_HIGHBITDEPTH
  543. SadMxNx4Param(64, 64, &vpx_highbd_sad64x64x4d_c, 8),
  544. SadMxNx4Param(64, 32, &vpx_highbd_sad64x32x4d_c, 8),
  545. SadMxNx4Param(32, 64, &vpx_highbd_sad32x64x4d_c, 8),
  546. SadMxNx4Param(32, 32, &vpx_highbd_sad32x32x4d_c, 8),
  547. SadMxNx4Param(32, 16, &vpx_highbd_sad32x16x4d_c, 8),
  548. SadMxNx4Param(16, 32, &vpx_highbd_sad16x32x4d_c, 8),
  549. SadMxNx4Param(16, 16, &vpx_highbd_sad16x16x4d_c, 8),
  550. SadMxNx4Param(16, 8, &vpx_highbd_sad16x8x4d_c, 8),
  551. SadMxNx4Param(8, 16, &vpx_highbd_sad8x16x4d_c, 8),
  552. SadMxNx4Param(8, 8, &vpx_highbd_sad8x8x4d_c, 8),
  553. SadMxNx4Param(8, 4, &vpx_highbd_sad8x4x4d_c, 8),
  554. SadMxNx4Param(4, 8, &vpx_highbd_sad4x8x4d_c, 8),
  555. SadMxNx4Param(4, 4, &vpx_highbd_sad4x4x4d_c, 8),
  556. SadMxNx4Param(64, 64, &vpx_highbd_sad64x64x4d_c, 10),
  557. SadMxNx4Param(64, 32, &vpx_highbd_sad64x32x4d_c, 10),
  558. SadMxNx4Param(32, 64, &vpx_highbd_sad32x64x4d_c, 10),
  559. SadMxNx4Param(32, 32, &vpx_highbd_sad32x32x4d_c, 10),
  560. SadMxNx4Param(32, 16, &vpx_highbd_sad32x16x4d_c, 10),
  561. SadMxNx4Param(16, 32, &vpx_highbd_sad16x32x4d_c, 10),
  562. SadMxNx4Param(16, 16, &vpx_highbd_sad16x16x4d_c, 10),
  563. SadMxNx4Param(16, 8, &vpx_highbd_sad16x8x4d_c, 10),
  564. SadMxNx4Param(8, 16, &vpx_highbd_sad8x16x4d_c, 10),
  565. SadMxNx4Param(8, 8, &vpx_highbd_sad8x8x4d_c, 10),
  566. SadMxNx4Param(8, 4, &vpx_highbd_sad8x4x4d_c, 10),
  567. SadMxNx4Param(4, 8, &vpx_highbd_sad4x8x4d_c, 10),
  568. SadMxNx4Param(4, 4, &vpx_highbd_sad4x4x4d_c, 10),
  569. SadMxNx4Param(64, 64, &vpx_highbd_sad64x64x4d_c, 12),
  570. SadMxNx4Param(64, 32, &vpx_highbd_sad64x32x4d_c, 12),
  571. SadMxNx4Param(32, 64, &vpx_highbd_sad32x64x4d_c, 12),
  572. SadMxNx4Param(32, 32, &vpx_highbd_sad32x32x4d_c, 12),
  573. SadMxNx4Param(32, 16, &vpx_highbd_sad32x16x4d_c, 12),
  574. SadMxNx4Param(16, 32, &vpx_highbd_sad16x32x4d_c, 12),
  575. SadMxNx4Param(16, 16, &vpx_highbd_sad16x16x4d_c, 12),
  576. SadMxNx4Param(16, 8, &vpx_highbd_sad16x8x4d_c, 12),
  577. SadMxNx4Param(8, 16, &vpx_highbd_sad8x16x4d_c, 12),
  578. SadMxNx4Param(8, 8, &vpx_highbd_sad8x8x4d_c, 12),
  579. SadMxNx4Param(8, 4, &vpx_highbd_sad8x4x4d_c, 12),
  580. SadMxNx4Param(4, 8, &vpx_highbd_sad4x8x4d_c, 12),
  581. SadMxNx4Param(4, 4, &vpx_highbd_sad4x4x4d_c, 12),
  582. #endif // CONFIG_VP9_HIGHBITDEPTH
  583. };
  584. INSTANTIATE_TEST_CASE_P(C, SADx4Test, ::testing::ValuesIn(x4d_c_tests));
  585. //------------------------------------------------------------------------------
  586. // ARM functions
  587. #if HAVE_NEON
  588. const SadMxNParam neon_tests[] = {
  589. SadMxNParam(64, 64, &vpx_sad64x64_neon),
  590. SadMxNParam(64, 32, &vpx_sad64x32_neon),
  591. SadMxNParam(32, 32, &vpx_sad32x32_neon),
  592. SadMxNParam(16, 32, &vpx_sad16x32_neon),
  593. SadMxNParam(16, 16, &vpx_sad16x16_neon),
  594. SadMxNParam(16, 8, &vpx_sad16x8_neon),
  595. SadMxNParam(8, 16, &vpx_sad8x16_neon),
  596. SadMxNParam(8, 8, &vpx_sad8x8_neon),
  597. SadMxNParam(8, 4, &vpx_sad8x4_neon),
  598. SadMxNParam(4, 8, &vpx_sad4x8_neon),
  599. SadMxNParam(4, 4, &vpx_sad4x4_neon),
  600. };
  601. INSTANTIATE_TEST_CASE_P(NEON, SADTest, ::testing::ValuesIn(neon_tests));
  602. const SadMxNAvgParam avg_neon_tests[] = {
  603. SadMxNAvgParam(64, 64, &vpx_sad64x64_avg_neon),
  604. SadMxNAvgParam(64, 32, &vpx_sad64x32_avg_neon),
  605. SadMxNAvgParam(32, 64, &vpx_sad32x64_avg_neon),
  606. SadMxNAvgParam(32, 32, &vpx_sad32x32_avg_neon),
  607. SadMxNAvgParam(32, 16, &vpx_sad32x16_avg_neon),
  608. SadMxNAvgParam(16, 32, &vpx_sad16x32_avg_neon),
  609. SadMxNAvgParam(16, 16, &vpx_sad16x16_avg_neon),
  610. SadMxNAvgParam(16, 8, &vpx_sad16x8_avg_neon),
  611. SadMxNAvgParam(8, 16, &vpx_sad8x16_avg_neon),
  612. SadMxNAvgParam(8, 8, &vpx_sad8x8_avg_neon),
  613. SadMxNAvgParam(8, 4, &vpx_sad8x4_avg_neon),
  614. SadMxNAvgParam(4, 8, &vpx_sad4x8_avg_neon),
  615. SadMxNAvgParam(4, 4, &vpx_sad4x4_avg_neon),
  616. };
  617. INSTANTIATE_TEST_CASE_P(NEON, SADavgTest, ::testing::ValuesIn(avg_neon_tests));
  618. const SadMxNx4Param x4d_neon_tests[] = {
  619. SadMxNx4Param(64, 64, &vpx_sad64x64x4d_neon),
  620. SadMxNx4Param(64, 32, &vpx_sad64x32x4d_neon),
  621. SadMxNx4Param(32, 64, &vpx_sad32x64x4d_neon),
  622. SadMxNx4Param(32, 32, &vpx_sad32x32x4d_neon),
  623. SadMxNx4Param(32, 16, &vpx_sad32x16x4d_neon),
  624. SadMxNx4Param(16, 32, &vpx_sad16x32x4d_neon),
  625. SadMxNx4Param(16, 16, &vpx_sad16x16x4d_neon),
  626. SadMxNx4Param(16, 8, &vpx_sad16x8x4d_neon),
  627. SadMxNx4Param(8, 16, &vpx_sad8x16x4d_neon),
  628. SadMxNx4Param(8, 8, &vpx_sad8x8x4d_neon),
  629. SadMxNx4Param(8, 4, &vpx_sad8x4x4d_neon),
  630. SadMxNx4Param(4, 8, &vpx_sad4x8x4d_neon),
  631. SadMxNx4Param(4, 4, &vpx_sad4x4x4d_neon),
  632. };
  633. INSTANTIATE_TEST_CASE_P(NEON, SADx4Test, ::testing::ValuesIn(x4d_neon_tests));
  634. #endif // HAVE_NEON
  635. //------------------------------------------------------------------------------
  636. // x86 functions
  637. #if HAVE_SSE2
  638. const SadMxNParam sse2_tests[] = {
  639. SadMxNParam(64, 64, &vpx_sad64x64_sse2),
  640. SadMxNParam(64, 32, &vpx_sad64x32_sse2),
  641. SadMxNParam(32, 64, &vpx_sad32x64_sse2),
  642. SadMxNParam(32, 32, &vpx_sad32x32_sse2),
  643. SadMxNParam(32, 16, &vpx_sad32x16_sse2),
  644. SadMxNParam(16, 32, &vpx_sad16x32_sse2),
  645. SadMxNParam(16, 16, &vpx_sad16x16_sse2),
  646. SadMxNParam(16, 8, &vpx_sad16x8_sse2),
  647. SadMxNParam(8, 16, &vpx_sad8x16_sse2),
  648. SadMxNParam(8, 8, &vpx_sad8x8_sse2),
  649. SadMxNParam(8, 4, &vpx_sad8x4_sse2),
  650. SadMxNParam(4, 8, &vpx_sad4x8_sse2),
  651. SadMxNParam(4, 4, &vpx_sad4x4_sse2),
  652. #if CONFIG_VP9_HIGHBITDEPTH
  653. SadMxNParam(64, 64, &vpx_highbd_sad64x64_sse2, 8),
  654. SadMxNParam(64, 32, &vpx_highbd_sad64x32_sse2, 8),
  655. SadMxNParam(32, 64, &vpx_highbd_sad32x64_sse2, 8),
  656. SadMxNParam(32, 32, &vpx_highbd_sad32x32_sse2, 8),
  657. SadMxNParam(32, 16, &vpx_highbd_sad32x16_sse2, 8),
  658. SadMxNParam(16, 32, &vpx_highbd_sad16x32_sse2, 8),
  659. SadMxNParam(16, 16, &vpx_highbd_sad16x16_sse2, 8),
  660. SadMxNParam(16, 8, &vpx_highbd_sad16x8_sse2, 8),
  661. SadMxNParam(8, 16, &vpx_highbd_sad8x16_sse2, 8),
  662. SadMxNParam(8, 8, &vpx_highbd_sad8x8_sse2, 8),
  663. SadMxNParam(8, 4, &vpx_highbd_sad8x4_sse2, 8),
  664. SadMxNParam(64, 64, &vpx_highbd_sad64x64_sse2, 10),
  665. SadMxNParam(64, 32, &vpx_highbd_sad64x32_sse2, 10),
  666. SadMxNParam(32, 64, &vpx_highbd_sad32x64_sse2, 10),
  667. SadMxNParam(32, 32, &vpx_highbd_sad32x32_sse2, 10),
  668. SadMxNParam(32, 16, &vpx_highbd_sad32x16_sse2, 10),
  669. SadMxNParam(16, 32, &vpx_highbd_sad16x32_sse2, 10),
  670. SadMxNParam(16, 16, &vpx_highbd_sad16x16_sse2, 10),
  671. SadMxNParam(16, 8, &vpx_highbd_sad16x8_sse2, 10),
  672. SadMxNParam(8, 16, &vpx_highbd_sad8x16_sse2, 10),
  673. SadMxNParam(8, 8, &vpx_highbd_sad8x8_sse2, 10),
  674. SadMxNParam(8, 4, &vpx_highbd_sad8x4_sse2, 10),
  675. SadMxNParam(64, 64, &vpx_highbd_sad64x64_sse2, 12),
  676. SadMxNParam(64, 32, &vpx_highbd_sad64x32_sse2, 12),
  677. SadMxNParam(32, 64, &vpx_highbd_sad32x64_sse2, 12),
  678. SadMxNParam(32, 32, &vpx_highbd_sad32x32_sse2, 12),
  679. SadMxNParam(32, 16, &vpx_highbd_sad32x16_sse2, 12),
  680. SadMxNParam(16, 32, &vpx_highbd_sad16x32_sse2, 12),
  681. SadMxNParam(16, 16, &vpx_highbd_sad16x16_sse2, 12),
  682. SadMxNParam(16, 8, &vpx_highbd_sad16x8_sse2, 12),
  683. SadMxNParam(8, 16, &vpx_highbd_sad8x16_sse2, 12),
  684. SadMxNParam(8, 8, &vpx_highbd_sad8x8_sse2, 12),
  685. SadMxNParam(8, 4, &vpx_highbd_sad8x4_sse2, 12),
  686. #endif // CONFIG_VP9_HIGHBITDEPTH
  687. };
  688. INSTANTIATE_TEST_CASE_P(SSE2, SADTest, ::testing::ValuesIn(sse2_tests));
  689. const SadMxNAvgParam avg_sse2_tests[] = {
  690. SadMxNAvgParam(64, 64, &vpx_sad64x64_avg_sse2),
  691. SadMxNAvgParam(64, 32, &vpx_sad64x32_avg_sse2),
  692. SadMxNAvgParam(32, 64, &vpx_sad32x64_avg_sse2),
  693. SadMxNAvgParam(32, 32, &vpx_sad32x32_avg_sse2),
  694. SadMxNAvgParam(32, 16, &vpx_sad32x16_avg_sse2),
  695. SadMxNAvgParam(16, 32, &vpx_sad16x32_avg_sse2),
  696. SadMxNAvgParam(16, 16, &vpx_sad16x16_avg_sse2),
  697. SadMxNAvgParam(16, 8, &vpx_sad16x8_avg_sse2),
  698. SadMxNAvgParam(8, 16, &vpx_sad8x16_avg_sse2),
  699. SadMxNAvgParam(8, 8, &vpx_sad8x8_avg_sse2),
  700. SadMxNAvgParam(8, 4, &vpx_sad8x4_avg_sse2),
  701. SadMxNAvgParam(4, 8, &vpx_sad4x8_avg_sse2),
  702. SadMxNAvgParam(4, 4, &vpx_sad4x4_avg_sse2),
  703. #if CONFIG_VP9_HIGHBITDEPTH
  704. SadMxNAvgParam(64, 64, &vpx_highbd_sad64x64_avg_sse2, 8),
  705. SadMxNAvgParam(64, 32, &vpx_highbd_sad64x32_avg_sse2, 8),
  706. SadMxNAvgParam(32, 64, &vpx_highbd_sad32x64_avg_sse2, 8),
  707. SadMxNAvgParam(32, 32, &vpx_highbd_sad32x32_avg_sse2, 8),
  708. SadMxNAvgParam(32, 16, &vpx_highbd_sad32x16_avg_sse2, 8),
  709. SadMxNAvgParam(16, 32, &vpx_highbd_sad16x32_avg_sse2, 8),
  710. SadMxNAvgParam(16, 16, &vpx_highbd_sad16x16_avg_sse2, 8),
  711. SadMxNAvgParam(16, 8, &vpx_highbd_sad16x8_avg_sse2, 8),
  712. SadMxNAvgParam(8, 16, &vpx_highbd_sad8x16_avg_sse2, 8),
  713. SadMxNAvgParam(8, 8, &vpx_highbd_sad8x8_avg_sse2, 8),
  714. SadMxNAvgParam(8, 4, &vpx_highbd_sad8x4_avg_sse2, 8),
  715. SadMxNAvgParam(64, 64, &vpx_highbd_sad64x64_avg_sse2, 10),
  716. SadMxNAvgParam(64, 32, &vpx_highbd_sad64x32_avg_sse2, 10),
  717. SadMxNAvgParam(32, 64, &vpx_highbd_sad32x64_avg_sse2, 10),
  718. SadMxNAvgParam(32, 32, &vpx_highbd_sad32x32_avg_sse2, 10),
  719. SadMxNAvgParam(32, 16, &vpx_highbd_sad32x16_avg_sse2, 10),
  720. SadMxNAvgParam(16, 32, &vpx_highbd_sad16x32_avg_sse2, 10),
  721. SadMxNAvgParam(16, 16, &vpx_highbd_sad16x16_avg_sse2, 10),
  722. SadMxNAvgParam(16, 8, &vpx_highbd_sad16x8_avg_sse2, 10),
  723. SadMxNAvgParam(8, 16, &vpx_highbd_sad8x16_avg_sse2, 10),
  724. SadMxNAvgParam(8, 8, &vpx_highbd_sad8x8_avg_sse2, 10),
  725. SadMxNAvgParam(8, 4, &vpx_highbd_sad8x4_avg_sse2, 10),
  726. SadMxNAvgParam(64, 64, &vpx_highbd_sad64x64_avg_sse2, 12),
  727. SadMxNAvgParam(64, 32, &vpx_highbd_sad64x32_avg_sse2, 12),
  728. SadMxNAvgParam(32, 64, &vpx_highbd_sad32x64_avg_sse2, 12),
  729. SadMxNAvgParam(32, 32, &vpx_highbd_sad32x32_avg_sse2, 12),
  730. SadMxNAvgParam(32, 16, &vpx_highbd_sad32x16_avg_sse2, 12),
  731. SadMxNAvgParam(16, 32, &vpx_highbd_sad16x32_avg_sse2, 12),
  732. SadMxNAvgParam(16, 16, &vpx_highbd_sad16x16_avg_sse2, 12),
  733. SadMxNAvgParam(16, 8, &vpx_highbd_sad16x8_avg_sse2, 12),
  734. SadMxNAvgParam(8, 16, &vpx_highbd_sad8x16_avg_sse2, 12),
  735. SadMxNAvgParam(8, 8, &vpx_highbd_sad8x8_avg_sse2, 12),
  736. SadMxNAvgParam(8, 4, &vpx_highbd_sad8x4_avg_sse2, 12),
  737. #endif // CONFIG_VP9_HIGHBITDEPTH
  738. };
  739. INSTANTIATE_TEST_CASE_P(SSE2, SADavgTest, ::testing::ValuesIn(avg_sse2_tests));
  740. const SadMxNx4Param x4d_sse2_tests[] = {
  741. SadMxNx4Param(64, 64, &vpx_sad64x64x4d_sse2),
  742. SadMxNx4Param(64, 32, &vpx_sad64x32x4d_sse2),
  743. SadMxNx4Param(32, 64, &vpx_sad32x64x4d_sse2),
  744. SadMxNx4Param(32, 32, &vpx_sad32x32x4d_sse2),
  745. SadMxNx4Param(32, 16, &vpx_sad32x16x4d_sse2),
  746. SadMxNx4Param(16, 32, &vpx_sad16x32x4d_sse2),
  747. SadMxNx4Param(16, 16, &vpx_sad16x16x4d_sse2),
  748. SadMxNx4Param(16, 8, &vpx_sad16x8x4d_sse2),
  749. SadMxNx4Param(8, 16, &vpx_sad8x16x4d_sse2),
  750. SadMxNx4Param(8, 8, &vpx_sad8x8x4d_sse2),
  751. SadMxNx4Param(8, 4, &vpx_sad8x4x4d_sse2),
  752. SadMxNx4Param(4, 8, &vpx_sad4x8x4d_sse2),
  753. SadMxNx4Param(4, 4, &vpx_sad4x4x4d_sse2),
  754. #if CONFIG_VP9_HIGHBITDEPTH
  755. SadMxNx4Param(64, 64, &vpx_highbd_sad64x64x4d_sse2, 8),
  756. SadMxNx4Param(64, 32, &vpx_highbd_sad64x32x4d_sse2, 8),
  757. SadMxNx4Param(32, 64, &vpx_highbd_sad32x64x4d_sse2, 8),
  758. SadMxNx4Param(32, 32, &vpx_highbd_sad32x32x4d_sse2, 8),
  759. SadMxNx4Param(32, 16, &vpx_highbd_sad32x16x4d_sse2, 8),
  760. SadMxNx4Param(16, 32, &vpx_highbd_sad16x32x4d_sse2, 8),
  761. SadMxNx4Param(16, 16, &vpx_highbd_sad16x16x4d_sse2, 8),
  762. SadMxNx4Param(16, 8, &vpx_highbd_sad16x8x4d_sse2, 8),
  763. SadMxNx4Param(8, 16, &vpx_highbd_sad8x16x4d_sse2, 8),
  764. SadMxNx4Param(8, 8, &vpx_highbd_sad8x8x4d_sse2, 8),
  765. SadMxNx4Param(8, 4, &vpx_highbd_sad8x4x4d_sse2, 8),
  766. SadMxNx4Param(4, 8, &vpx_highbd_sad4x8x4d_sse2, 8),
  767. SadMxNx4Param(4, 4, &vpx_highbd_sad4x4x4d_sse2, 8),
  768. SadMxNx4Param(64, 64, &vpx_highbd_sad64x64x4d_sse2, 10),
  769. SadMxNx4Param(64, 32, &vpx_highbd_sad64x32x4d_sse2, 10),
  770. SadMxNx4Param(32, 64, &vpx_highbd_sad32x64x4d_sse2, 10),
  771. SadMxNx4Param(32, 32, &vpx_highbd_sad32x32x4d_sse2, 10),
  772. SadMxNx4Param(32, 16, &vpx_highbd_sad32x16x4d_sse2, 10),
  773. SadMxNx4Param(16, 32, &vpx_highbd_sad16x32x4d_sse2, 10),
  774. SadMxNx4Param(16, 16, &vpx_highbd_sad16x16x4d_sse2, 10),
  775. SadMxNx4Param(16, 8, &vpx_highbd_sad16x8x4d_sse2, 10),
  776. SadMxNx4Param(8, 16, &vpx_highbd_sad8x16x4d_sse2, 10),
  777. SadMxNx4Param(8, 8, &vpx_highbd_sad8x8x4d_sse2, 10),
  778. SadMxNx4Param(8, 4, &vpx_highbd_sad8x4x4d_sse2, 10),
  779. SadMxNx4Param(4, 8, &vpx_highbd_sad4x8x4d_sse2, 10),
  780. SadMxNx4Param(4, 4, &vpx_highbd_sad4x4x4d_sse2, 10),
  781. SadMxNx4Param(64, 64, &vpx_highbd_sad64x64x4d_sse2, 12),
  782. SadMxNx4Param(64, 32, &vpx_highbd_sad64x32x4d_sse2, 12),
  783. SadMxNx4Param(32, 64, &vpx_highbd_sad32x64x4d_sse2, 12),
  784. SadMxNx4Param(32, 32, &vpx_highbd_sad32x32x4d_sse2, 12),
  785. SadMxNx4Param(32, 16, &vpx_highbd_sad32x16x4d_sse2, 12),
  786. SadMxNx4Param(16, 32, &vpx_highbd_sad16x32x4d_sse2, 12),
  787. SadMxNx4Param(16, 16, &vpx_highbd_sad16x16x4d_sse2, 12),
  788. SadMxNx4Param(16, 8, &vpx_highbd_sad16x8x4d_sse2, 12),
  789. SadMxNx4Param(8, 16, &vpx_highbd_sad8x16x4d_sse2, 12),
  790. SadMxNx4Param(8, 8, &vpx_highbd_sad8x8x4d_sse2, 12),
  791. SadMxNx4Param(8, 4, &vpx_highbd_sad8x4x4d_sse2, 12),
  792. SadMxNx4Param(4, 8, &vpx_highbd_sad4x8x4d_sse2, 12),
  793. SadMxNx4Param(4, 4, &vpx_highbd_sad4x4x4d_sse2, 12),
  794. #endif // CONFIG_VP9_HIGHBITDEPTH
  795. };
  796. INSTANTIATE_TEST_CASE_P(SSE2, SADx4Test, ::testing::ValuesIn(x4d_sse2_tests));
  797. #endif // HAVE_SSE2
  798. #if HAVE_SSE3
  799. // Only functions are x3, which do not have tests.
  800. #endif // HAVE_SSE3
  801. #if HAVE_SSSE3
  802. // Only functions are x3, which do not have tests.
  803. #endif // HAVE_SSSE3
  804. #if HAVE_SSE4_1
  805. // Only functions are x8, which do not have tests.
  806. #endif // HAVE_SSE4_1
  807. #if HAVE_AVX2
  808. const SadMxNParam avx2_tests[] = {
  809. SadMxNParam(64, 64, &vpx_sad64x64_avx2),
  810. SadMxNParam(64, 32, &vpx_sad64x32_avx2),
  811. SadMxNParam(32, 64, &vpx_sad32x64_avx2),
  812. SadMxNParam(32, 32, &vpx_sad32x32_avx2),
  813. SadMxNParam(32, 16, &vpx_sad32x16_avx2),
  814. };
  815. INSTANTIATE_TEST_CASE_P(AVX2, SADTest, ::testing::ValuesIn(avx2_tests));
  816. const SadMxNAvgParam avg_avx2_tests[] = {
  817. SadMxNAvgParam(64, 64, &vpx_sad64x64_avg_avx2),
  818. SadMxNAvgParam(64, 32, &vpx_sad64x32_avg_avx2),
  819. SadMxNAvgParam(32, 64, &vpx_sad32x64_avg_avx2),
  820. SadMxNAvgParam(32, 32, &vpx_sad32x32_avg_avx2),
  821. SadMxNAvgParam(32, 16, &vpx_sad32x16_avg_avx2),
  822. };
  823. INSTANTIATE_TEST_CASE_P(AVX2, SADavgTest, ::testing::ValuesIn(avg_avx2_tests));
  824. const SadMxNx4Param x4d_avx2_tests[] = {
  825. SadMxNx4Param(64, 64, &vpx_sad64x64x4d_avx2),
  826. SadMxNx4Param(32, 32, &vpx_sad32x32x4d_avx2),
  827. };
  828. INSTANTIATE_TEST_CASE_P(AVX2, SADx4Test, ::testing::ValuesIn(x4d_avx2_tests));
  829. #endif // HAVE_AVX2
  830. //------------------------------------------------------------------------------
  831. // MIPS functions
  832. #if HAVE_MSA
  833. const SadMxNParam msa_tests[] = {
  834. SadMxNParam(64, 64, &vpx_sad64x64_msa),
  835. SadMxNParam(64, 32, &vpx_sad64x32_msa),
  836. SadMxNParam(32, 64, &vpx_sad32x64_msa),
  837. SadMxNParam(32, 32, &vpx_sad32x32_msa),
  838. SadMxNParam(32, 16, &vpx_sad32x16_msa),
  839. SadMxNParam(16, 32, &vpx_sad16x32_msa),
  840. SadMxNParam(16, 16, &vpx_sad16x16_msa),
  841. SadMxNParam(16, 8, &vpx_sad16x8_msa),
  842. SadMxNParam(8, 16, &vpx_sad8x16_msa),
  843. SadMxNParam(8, 8, &vpx_sad8x8_msa),
  844. SadMxNParam(8, 4, &vpx_sad8x4_msa),
  845. SadMxNParam(4, 8, &vpx_sad4x8_msa),
  846. SadMxNParam(4, 4, &vpx_sad4x4_msa),
  847. };
  848. INSTANTIATE_TEST_CASE_P(MSA, SADTest, ::testing::ValuesIn(msa_tests));
  849. const SadMxNAvgParam avg_msa_tests[] = {
  850. SadMxNAvgParam(64, 64, &vpx_sad64x64_avg_msa),
  851. SadMxNAvgParam(64, 32, &vpx_sad64x32_avg_msa),
  852. SadMxNAvgParam(32, 64, &vpx_sad32x64_avg_msa),
  853. SadMxNAvgParam(32, 32, &vpx_sad32x32_avg_msa),
  854. SadMxNAvgParam(32, 16, &vpx_sad32x16_avg_msa),
  855. SadMxNAvgParam(16, 32, &vpx_sad16x32_avg_msa),
  856. SadMxNAvgParam(16, 16, &vpx_sad16x16_avg_msa),
  857. SadMxNAvgParam(16, 8, &vpx_sad16x8_avg_msa),
  858. SadMxNAvgParam(8, 16, &vpx_sad8x16_avg_msa),
  859. SadMxNAvgParam(8, 8, &vpx_sad8x8_avg_msa),
  860. SadMxNAvgParam(8, 4, &vpx_sad8x4_avg_msa),
  861. SadMxNAvgParam(4, 8, &vpx_sad4x8_avg_msa),
  862. SadMxNAvgParam(4, 4, &vpx_sad4x4_avg_msa),
  863. };
  864. INSTANTIATE_TEST_CASE_P(MSA, SADavgTest, ::testing::ValuesIn(avg_msa_tests));
  865. const SadMxNx4Param x4d_msa_tests[] = {
  866. SadMxNx4Param(64, 64, &vpx_sad64x64x4d_msa),
  867. SadMxNx4Param(64, 32, &vpx_sad64x32x4d_msa),
  868. SadMxNx4Param(32, 64, &vpx_sad32x64x4d_msa),
  869. SadMxNx4Param(32, 32, &vpx_sad32x32x4d_msa),
  870. SadMxNx4Param(32, 16, &vpx_sad32x16x4d_msa),
  871. SadMxNx4Param(16, 32, &vpx_sad16x32x4d_msa),
  872. SadMxNx4Param(16, 16, &vpx_sad16x16x4d_msa),
  873. SadMxNx4Param(16, 8, &vpx_sad16x8x4d_msa),
  874. SadMxNx4Param(8, 16, &vpx_sad8x16x4d_msa),
  875. SadMxNx4Param(8, 8, &vpx_sad8x8x4d_msa),
  876. SadMxNx4Param(8, 4, &vpx_sad8x4x4d_msa),
  877. SadMxNx4Param(4, 8, &vpx_sad4x8x4d_msa),
  878. SadMxNx4Param(4, 4, &vpx_sad4x4x4d_msa),
  879. };
  880. INSTANTIATE_TEST_CASE_P(MSA, SADx4Test, ::testing::ValuesIn(x4d_msa_tests));
  881. #endif // HAVE_MSA
  882. //------------------------------------------------------------------------------
  883. // VSX functions
  884. #if HAVE_VSX
  885. const SadMxNParam vsx_tests[] = {
  886. SadMxNParam(64, 64, &vpx_sad64x64_vsx),
  887. SadMxNParam(64, 32, &vpx_sad64x32_vsx),
  888. SadMxNParam(32, 64, &vpx_sad32x64_vsx),
  889. SadMxNParam(32, 32, &vpx_sad32x32_vsx),
  890. SadMxNParam(32, 16, &vpx_sad32x16_vsx),
  891. SadMxNParam(16, 32, &vpx_sad16x32_vsx),
  892. SadMxNParam(16, 16, &vpx_sad16x16_vsx),
  893. SadMxNParam(16, 8, &vpx_sad16x8_vsx),
  894. };
  895. INSTANTIATE_TEST_CASE_P(VSX, SADTest, ::testing::ValuesIn(vsx_tests));
  896. const SadMxNAvgParam avg_vsx_tests[] = {
  897. SadMxNAvgParam(64, 64, &vpx_sad64x64_avg_vsx),
  898. SadMxNAvgParam(64, 32, &vpx_sad64x32_avg_vsx),
  899. SadMxNAvgParam(32, 64, &vpx_sad32x64_avg_vsx),
  900. SadMxNAvgParam(32, 32, &vpx_sad32x32_avg_vsx),
  901. SadMxNAvgParam(32, 16, &vpx_sad32x16_avg_vsx),
  902. SadMxNAvgParam(16, 32, &vpx_sad16x32_avg_vsx),
  903. SadMxNAvgParam(16, 16, &vpx_sad16x16_avg_vsx),
  904. SadMxNAvgParam(16, 8, &vpx_sad16x8_avg_vsx),
  905. };
  906. INSTANTIATE_TEST_CASE_P(VSX, SADavgTest, ::testing::ValuesIn(avg_vsx_tests));
  907. const SadMxNx4Param x4d_vsx_tests[] = {
  908. SadMxNx4Param(64, 64, &vpx_sad64x64x4d_vsx),
  909. SadMxNx4Param(64, 32, &vpx_sad64x32x4d_vsx),
  910. SadMxNx4Param(32, 64, &vpx_sad32x64x4d_vsx),
  911. SadMxNx4Param(32, 32, &vpx_sad32x32x4d_vsx),
  912. SadMxNx4Param(32, 16, &vpx_sad32x16x4d_vsx),
  913. SadMxNx4Param(16, 32, &vpx_sad16x32x4d_vsx),
  914. SadMxNx4Param(16, 16, &vpx_sad16x16x4d_vsx),
  915. SadMxNx4Param(16, 8, &vpx_sad16x8x4d_vsx),
  916. };
  917. INSTANTIATE_TEST_CASE_P(VSX, SADx4Test, ::testing::ValuesIn(x4d_vsx_tests));
  918. #endif // HAVE_VSX
  919. //------------------------------------------------------------------------------
  920. // Loongson functions
  921. #if HAVE_MMI
  922. const SadMxNParam mmi_tests[] = {
  923. SadMxNParam(64, 64, &vpx_sad64x64_mmi),
  924. SadMxNParam(64, 32, &vpx_sad64x32_mmi),
  925. SadMxNParam(32, 64, &vpx_sad32x64_mmi),
  926. SadMxNParam(32, 32, &vpx_sad32x32_mmi),
  927. SadMxNParam(32, 16, &vpx_sad32x16_mmi),
  928. SadMxNParam(16, 32, &vpx_sad16x32_mmi),
  929. SadMxNParam(16, 16, &vpx_sad16x16_mmi),
  930. SadMxNParam(16, 8, &vpx_sad16x8_mmi),
  931. SadMxNParam(8, 16, &vpx_sad8x16_mmi),
  932. SadMxNParam(8, 8, &vpx_sad8x8_mmi),
  933. SadMxNParam(8, 4, &vpx_sad8x4_mmi),
  934. SadMxNParam(4, 8, &vpx_sad4x8_mmi),
  935. SadMxNParam(4, 4, &vpx_sad4x4_mmi),
  936. };
  937. INSTANTIATE_TEST_CASE_P(MMI, SADTest, ::testing::ValuesIn(mmi_tests));
  938. const SadMxNAvgParam avg_mmi_tests[] = {
  939. SadMxNAvgParam(64, 64, &vpx_sad64x64_avg_mmi),
  940. SadMxNAvgParam(64, 32, &vpx_sad64x32_avg_mmi),
  941. SadMxNAvgParam(32, 64, &vpx_sad32x64_avg_mmi),
  942. SadMxNAvgParam(32, 32, &vpx_sad32x32_avg_mmi),
  943. SadMxNAvgParam(32, 16, &vpx_sad32x16_avg_mmi),
  944. SadMxNAvgParam(16, 32, &vpx_sad16x32_avg_mmi),
  945. SadMxNAvgParam(16, 16, &vpx_sad16x16_avg_mmi),
  946. SadMxNAvgParam(16, 8, &vpx_sad16x8_avg_mmi),
  947. SadMxNAvgParam(8, 16, &vpx_sad8x16_avg_mmi),
  948. SadMxNAvgParam(8, 8, &vpx_sad8x8_avg_mmi),
  949. SadMxNAvgParam(8, 4, &vpx_sad8x4_avg_mmi),
  950. SadMxNAvgParam(4, 8, &vpx_sad4x8_avg_mmi),
  951. SadMxNAvgParam(4, 4, &vpx_sad4x4_avg_mmi),
  952. };
  953. INSTANTIATE_TEST_CASE_P(MMI, SADavgTest, ::testing::ValuesIn(avg_mmi_tests));
  954. const SadMxNx4Param x4d_mmi_tests[] = {
  955. SadMxNx4Param(64, 64, &vpx_sad64x64x4d_mmi),
  956. SadMxNx4Param(64, 32, &vpx_sad64x32x4d_mmi),
  957. SadMxNx4Param(32, 64, &vpx_sad32x64x4d_mmi),
  958. SadMxNx4Param(32, 32, &vpx_sad32x32x4d_mmi),
  959. SadMxNx4Param(32, 16, &vpx_sad32x16x4d_mmi),
  960. SadMxNx4Param(16, 32, &vpx_sad16x32x4d_mmi),
  961. SadMxNx4Param(16, 16, &vpx_sad16x16x4d_mmi),
  962. SadMxNx4Param(16, 8, &vpx_sad16x8x4d_mmi),
  963. SadMxNx4Param(8, 16, &vpx_sad8x16x4d_mmi),
  964. SadMxNx4Param(8, 8, &vpx_sad8x8x4d_mmi),
  965. SadMxNx4Param(8, 4, &vpx_sad8x4x4d_mmi),
  966. SadMxNx4Param(4, 8, &vpx_sad4x8x4d_mmi),
  967. SadMxNx4Param(4, 4, &vpx_sad4x4x4d_mmi),
  968. };
  969. INSTANTIATE_TEST_CASE_P(MMI, SADx4Test, ::testing::ValuesIn(x4d_mmi_tests));
  970. #endif // HAVE_MMI
  971. } // namespace