variance_test.cc 73 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394959697989910010110210310410510610710810911011111211311411511611711811912012112212312412512612712812913013113213313413513613713813914014114214314414514614714814915015115215315415515615715815916016116216316416516616716816917017117217317417517617717817918018118218318418518618718818919019119219319419519619719819920020120220320420520620720820921021121221321421521621721821922022122222322422522622722822923023123223323423523623723823924024124224324424524624724824925025125225325425525625725825926026126226326426526626726826927027127227327427527627727827928028128228328428528628728828929029129229329429529629729829930030130230330430530630730830931031131231331431531631731831932032132232332432532632732832933033133233333433533633733833934034134234334434534634734834935035135235335435535635735835936036136236336436536636736836937037137237337437537637737837938038138238338438538638738838939039139239339439539639739839940040140240340440540640740840941041141241341441541641741841942042142242342442542642742842943043143243343443543643743843944044144244344444544644744844945045145245345445545645745845946046146246346446546646746846947047147247347447547647747847948048148248348448548648748848949049149249349449549649749849950050150250350450550650750850951051151251351451551651751851952052152252352452552652752852953053153253353453553653753853954054154254354454554654754854955055155255355455555655755855956056156256356456556656756856957057157257357457557657757857958058158258358458558658758858959059159259359459559659759859960060160260360460560660760860961061161261361461561661761861962062162262362462562662762862963063163263363463563663763863964064164264364464564664764864965065165265365465565665765865966066166266366466566666766866967067167267367467567667767867968068168268368468568668768868969069169269369469569669769869970070170270370470570670770870971071171271371471571671771871972072172272372472572672772872973073173273373473573673773873974074174274374474574674774874975075175275375475575675775875976076176276376476576676776876977077177277377477577677777877978078178278378478578678778878979079179279379479579679779879980080180280380480580680780880981081181281381481581681781881982082182282382482582682782882983083183283383483583683783883984084184284384484584684784884985085185285385485585685785885986086186286386486586686786886987087187287387487587687787887988088188288388488588688788888989089189289389489589689789889990090190290390490590690790890991091191291391491591691791891992092192292392492592692792892993093193293393493593693793893994094194294394494594694794894995095195295395495595695795895996096196296396496596696796896997097197297397497597697797897998098198298398498598698798898999099199299399499599699799899910001001100210031004100510061007100810091010101110121013101410151016101710181019102010211022102310241025102610271028102910301031103210331034103510361037103810391040104110421043104410451046104710481049105010511052105310541055105610571058105910601061106210631064106510661067106810691070107110721073107410751076107710781079108010811082108310841085108610871088108910901091109210931094109510961097109810991100110111021103110411051106110711081109111011111112111311141115111611171118111911201121112211231124112511261127112811291130113111321133113411351136113711381139114011411142114311441145114611471148114911501151115211531154115511561157115811591160116111621163116411651166116711681169117011711172117311741175117611771178117911801181118211831184118511861187118811891190119111921193119411951196119711981199120012011202120312041205120612071208120912101211121212131214121512161217121812191220122112221223122412251226122712281229123012311232123312341235123612371238123912401241124212431244124512461247124812491250125112521253125412551256125712581259126012611262126312641265126612671268126912701271127212731274127512761277127812791280128112821283128412851286128712881289129012911292129312941295129612971298129913001301130213031304130513061307130813091310131113121313131413151316131713181319132013211322132313241325132613271328132913301331133213331334133513361337133813391340134113421343134413451346134713481349135013511352135313541355135613571358135913601361136213631364136513661367136813691370137113721373137413751376137713781379138013811382138313841385138613871388138913901391139213931394139513961397139813991400140114021403140414051406140714081409141014111412141314141415141614171418141914201421142214231424142514261427142814291430143114321433143414351436143714381439144014411442144314441445144614471448144914501451145214531454145514561457145814591460146114621463146414651466146714681469147014711472147314741475147614771478147914801481148214831484148514861487148814891490149114921493149414951496149714981499150015011502150315041505150615071508150915101511151215131514151515161517151815191520152115221523152415251526152715281529153015311532153315341535153615371538153915401541154215431544154515461547154815491550155115521553155415551556155715581559156015611562156315641565156615671568156915701571157215731574157515761577157815791580158115821583158415851586158715881589159015911592159315941595159615971598159916001601
  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 <cstdlib>
  11. #include <new>
  12. #include "third_party/googletest/src/include/gtest/gtest.h"
  13. #include "./vpx_config.h"
  14. #include "./vpx_dsp_rtcd.h"
  15. #include "test/acm_random.h"
  16. #include "test/clear_system_state.h"
  17. #include "test/register_state_check.h"
  18. #include "vpx/vpx_codec.h"
  19. #include "vpx/vpx_integer.h"
  20. #include "vpx_mem/vpx_mem.h"
  21. #include "vpx_ports/mem.h"
  22. #include "vpx_ports/vpx_timer.h"
  23. namespace {
  24. typedef unsigned int (*VarianceMxNFunc)(const uint8_t *a, int a_stride,
  25. const uint8_t *b, int b_stride,
  26. unsigned int *sse);
  27. typedef unsigned int (*SubpixVarMxNFunc)(const uint8_t *a, int a_stride,
  28. int xoffset, int yoffset,
  29. const uint8_t *b, int b_stride,
  30. unsigned int *sse);
  31. typedef unsigned int (*SubpixAvgVarMxNFunc)(const uint8_t *a, int a_stride,
  32. int xoffset, int yoffset,
  33. const uint8_t *b, int b_stride,
  34. uint32_t *sse,
  35. const uint8_t *second_pred);
  36. typedef unsigned int (*Get4x4SseFunc)(const uint8_t *a, int a_stride,
  37. const uint8_t *b, int b_stride);
  38. typedef unsigned int (*SumOfSquaresFunction)(const int16_t *src);
  39. using libvpx_test::ACMRandom;
  40. // Truncate high bit depth results by downshifting (with rounding) by:
  41. // 2 * (bit_depth - 8) for sse
  42. // (bit_depth - 8) for se
  43. static void RoundHighBitDepth(int bit_depth, int64_t *se, uint64_t *sse) {
  44. switch (bit_depth) {
  45. case VPX_BITS_12:
  46. *sse = (*sse + 128) >> 8;
  47. *se = (*se + 8) >> 4;
  48. break;
  49. case VPX_BITS_10:
  50. *sse = (*sse + 8) >> 4;
  51. *se = (*se + 2) >> 2;
  52. break;
  53. case VPX_BITS_8:
  54. default: break;
  55. }
  56. }
  57. static unsigned int mb_ss_ref(const int16_t *src) {
  58. unsigned int res = 0;
  59. for (int i = 0; i < 256; ++i) {
  60. res += src[i] * src[i];
  61. }
  62. return res;
  63. }
  64. /* Note:
  65. * Our codebase calculates the "diff" value in the variance algorithm by
  66. * (src - ref).
  67. */
  68. static uint32_t variance_ref(const uint8_t *src, const uint8_t *ref, int l2w,
  69. int l2h, int src_stride, int ref_stride,
  70. uint32_t *sse_ptr, bool use_high_bit_depth_,
  71. vpx_bit_depth_t bit_depth) {
  72. int64_t se = 0;
  73. uint64_t sse = 0;
  74. const int w = 1 << l2w;
  75. const int h = 1 << l2h;
  76. for (int y = 0; y < h; y++) {
  77. for (int x = 0; x < w; x++) {
  78. int diff;
  79. if (!use_high_bit_depth_) {
  80. diff = src[y * src_stride + x] - ref[y * ref_stride + x];
  81. se += diff;
  82. sse += diff * diff;
  83. #if CONFIG_VP9_HIGHBITDEPTH
  84. } else {
  85. diff = CONVERT_TO_SHORTPTR(src)[y * src_stride + x] -
  86. CONVERT_TO_SHORTPTR(ref)[y * ref_stride + x];
  87. se += diff;
  88. sse += diff * diff;
  89. #endif // CONFIG_VP9_HIGHBITDEPTH
  90. }
  91. }
  92. }
  93. RoundHighBitDepth(bit_depth, &se, &sse);
  94. *sse_ptr = static_cast<uint32_t>(sse);
  95. return static_cast<uint32_t>(
  96. sse - ((static_cast<int64_t>(se) * se) >> (l2w + l2h)));
  97. }
  98. /* The subpel reference functions differ from the codec version in one aspect:
  99. * they calculate the bilinear factors directly instead of using a lookup table
  100. * and therefore upshift xoff and yoff by 1. Only every other calculated value
  101. * is used so the codec version shrinks the table to save space and maintain
  102. * compatibility with vp8.
  103. */
  104. static uint32_t subpel_variance_ref(const uint8_t *ref, const uint8_t *src,
  105. int l2w, int l2h, int xoff, int yoff,
  106. uint32_t *sse_ptr, bool use_high_bit_depth_,
  107. vpx_bit_depth_t bit_depth) {
  108. int64_t se = 0;
  109. uint64_t sse = 0;
  110. const int w = 1 << l2w;
  111. const int h = 1 << l2h;
  112. xoff <<= 1;
  113. yoff <<= 1;
  114. for (int y = 0; y < h; y++) {
  115. for (int x = 0; x < w; x++) {
  116. // Bilinear interpolation at a 16th pel step.
  117. if (!use_high_bit_depth_) {
  118. const int a1 = ref[(w + 1) * (y + 0) + x + 0];
  119. const int a2 = ref[(w + 1) * (y + 0) + x + 1];
  120. const int b1 = ref[(w + 1) * (y + 1) + x + 0];
  121. const int b2 = ref[(w + 1) * (y + 1) + x + 1];
  122. const int a = a1 + (((a2 - a1) * xoff + 8) >> 4);
  123. const int b = b1 + (((b2 - b1) * xoff + 8) >> 4);
  124. const int r = a + (((b - a) * yoff + 8) >> 4);
  125. const int diff = r - src[w * y + x];
  126. se += diff;
  127. sse += diff * diff;
  128. #if CONFIG_VP9_HIGHBITDEPTH
  129. } else {
  130. uint16_t *ref16 = CONVERT_TO_SHORTPTR(ref);
  131. uint16_t *src16 = CONVERT_TO_SHORTPTR(src);
  132. const int a1 = ref16[(w + 1) * (y + 0) + x + 0];
  133. const int a2 = ref16[(w + 1) * (y + 0) + x + 1];
  134. const int b1 = ref16[(w + 1) * (y + 1) + x + 0];
  135. const int b2 = ref16[(w + 1) * (y + 1) + x + 1];
  136. const int a = a1 + (((a2 - a1) * xoff + 8) >> 4);
  137. const int b = b1 + (((b2 - b1) * xoff + 8) >> 4);
  138. const int r = a + (((b - a) * yoff + 8) >> 4);
  139. const int diff = r - src16[w * y + x];
  140. se += diff;
  141. sse += diff * diff;
  142. #endif // CONFIG_VP9_HIGHBITDEPTH
  143. }
  144. }
  145. }
  146. RoundHighBitDepth(bit_depth, &se, &sse);
  147. *sse_ptr = static_cast<uint32_t>(sse);
  148. return static_cast<uint32_t>(
  149. sse - ((static_cast<int64_t>(se) * se) >> (l2w + l2h)));
  150. }
  151. static uint32_t subpel_avg_variance_ref(const uint8_t *ref, const uint8_t *src,
  152. const uint8_t *second_pred, int l2w,
  153. int l2h, int xoff, int yoff,
  154. uint32_t *sse_ptr,
  155. bool use_high_bit_depth,
  156. vpx_bit_depth_t bit_depth) {
  157. int64_t se = 0;
  158. uint64_t sse = 0;
  159. const int w = 1 << l2w;
  160. const int h = 1 << l2h;
  161. xoff <<= 1;
  162. yoff <<= 1;
  163. for (int y = 0; y < h; y++) {
  164. for (int x = 0; x < w; x++) {
  165. // bilinear interpolation at a 16th pel step
  166. if (!use_high_bit_depth) {
  167. const int a1 = ref[(w + 1) * (y + 0) + x + 0];
  168. const int a2 = ref[(w + 1) * (y + 0) + x + 1];
  169. const int b1 = ref[(w + 1) * (y + 1) + x + 0];
  170. const int b2 = ref[(w + 1) * (y + 1) + x + 1];
  171. const int a = a1 + (((a2 - a1) * xoff + 8) >> 4);
  172. const int b = b1 + (((b2 - b1) * xoff + 8) >> 4);
  173. const int r = a + (((b - a) * yoff + 8) >> 4);
  174. const int diff =
  175. ((r + second_pred[w * y + x] + 1) >> 1) - src[w * y + x];
  176. se += diff;
  177. sse += diff * diff;
  178. #if CONFIG_VP9_HIGHBITDEPTH
  179. } else {
  180. const uint16_t *ref16 = CONVERT_TO_SHORTPTR(ref);
  181. const uint16_t *src16 = CONVERT_TO_SHORTPTR(src);
  182. const uint16_t *sec16 = CONVERT_TO_SHORTPTR(second_pred);
  183. const int a1 = ref16[(w + 1) * (y + 0) + x + 0];
  184. const int a2 = ref16[(w + 1) * (y + 0) + x + 1];
  185. const int b1 = ref16[(w + 1) * (y + 1) + x + 0];
  186. const int b2 = ref16[(w + 1) * (y + 1) + x + 1];
  187. const int a = a1 + (((a2 - a1) * xoff + 8) >> 4);
  188. const int b = b1 + (((b2 - b1) * xoff + 8) >> 4);
  189. const int r = a + (((b - a) * yoff + 8) >> 4);
  190. const int diff = ((r + sec16[w * y + x] + 1) >> 1) - src16[w * y + x];
  191. se += diff;
  192. sse += diff * diff;
  193. #endif // CONFIG_VP9_HIGHBITDEPTH
  194. }
  195. }
  196. }
  197. RoundHighBitDepth(bit_depth, &se, &sse);
  198. *sse_ptr = static_cast<uint32_t>(sse);
  199. return static_cast<uint32_t>(
  200. sse - ((static_cast<int64_t>(se) * se) >> (l2w + l2h)));
  201. }
  202. ////////////////////////////////////////////////////////////////////////////////
  203. class SumOfSquaresTest : public ::testing::TestWithParam<SumOfSquaresFunction> {
  204. public:
  205. SumOfSquaresTest() : func_(GetParam()) {}
  206. virtual ~SumOfSquaresTest() { libvpx_test::ClearSystemState(); }
  207. protected:
  208. void ConstTest();
  209. void RefTest();
  210. SumOfSquaresFunction func_;
  211. ACMRandom rnd_;
  212. };
  213. void SumOfSquaresTest::ConstTest() {
  214. int16_t mem[256];
  215. unsigned int res;
  216. for (int v = 0; v < 256; ++v) {
  217. for (int i = 0; i < 256; ++i) {
  218. mem[i] = v;
  219. }
  220. ASM_REGISTER_STATE_CHECK(res = func_(mem));
  221. EXPECT_EQ(256u * (v * v), res);
  222. }
  223. }
  224. void SumOfSquaresTest::RefTest() {
  225. int16_t mem[256];
  226. for (int i = 0; i < 100; ++i) {
  227. for (int j = 0; j < 256; ++j) {
  228. mem[j] = rnd_.Rand8() - rnd_.Rand8();
  229. }
  230. const unsigned int expected = mb_ss_ref(mem);
  231. unsigned int res;
  232. ASM_REGISTER_STATE_CHECK(res = func_(mem));
  233. EXPECT_EQ(expected, res);
  234. }
  235. }
  236. ////////////////////////////////////////////////////////////////////////////////
  237. // Encapsulating struct to store the function to test along with
  238. // some testing context.
  239. // Can be used for MSE, SSE, Variance, etc.
  240. template <typename Func>
  241. struct TestParams {
  242. TestParams(int log2w = 0, int log2h = 0, Func function = NULL,
  243. int bit_depth_value = 0)
  244. : log2width(log2w), log2height(log2h), func(function) {
  245. use_high_bit_depth = (bit_depth_value > 0);
  246. if (use_high_bit_depth) {
  247. bit_depth = static_cast<vpx_bit_depth_t>(bit_depth_value);
  248. } else {
  249. bit_depth = VPX_BITS_8;
  250. }
  251. width = 1 << log2width;
  252. height = 1 << log2height;
  253. block_size = width * height;
  254. mask = (1u << bit_depth) - 1;
  255. }
  256. int log2width, log2height;
  257. int width, height;
  258. int block_size;
  259. Func func;
  260. vpx_bit_depth_t bit_depth;
  261. bool use_high_bit_depth;
  262. uint32_t mask;
  263. };
  264. template <typename Func>
  265. std::ostream &operator<<(std::ostream &os, const TestParams<Func> &p) {
  266. return os << "log2width/height:" << p.log2width << "/" << p.log2height
  267. << " function:" << reinterpret_cast<const void *>(p.func)
  268. << " bit-depth:" << p.bit_depth;
  269. }
  270. // Main class for testing a function type
  271. template <typename FunctionType>
  272. class MainTestClass
  273. : public ::testing::TestWithParam<TestParams<FunctionType> > {
  274. public:
  275. virtual void SetUp() {
  276. params_ = this->GetParam();
  277. rnd_.Reset(ACMRandom::DeterministicSeed());
  278. const size_t unit =
  279. use_high_bit_depth() ? sizeof(uint16_t) : sizeof(uint8_t);
  280. src_ = reinterpret_cast<uint8_t *>(vpx_memalign(16, block_size() * unit));
  281. ref_ = new uint8_t[block_size() * unit];
  282. ASSERT_TRUE(src_ != NULL);
  283. ASSERT_TRUE(ref_ != NULL);
  284. #if CONFIG_VP9_HIGHBITDEPTH
  285. if (use_high_bit_depth()) {
  286. // TODO(skal): remove!
  287. src_ = CONVERT_TO_BYTEPTR(src_);
  288. ref_ = CONVERT_TO_BYTEPTR(ref_);
  289. }
  290. #endif
  291. }
  292. virtual void TearDown() {
  293. #if CONFIG_VP9_HIGHBITDEPTH
  294. if (use_high_bit_depth()) {
  295. // TODO(skal): remove!
  296. src_ = reinterpret_cast<uint8_t *>(CONVERT_TO_SHORTPTR(src_));
  297. ref_ = reinterpret_cast<uint8_t *>(CONVERT_TO_SHORTPTR(ref_));
  298. }
  299. #endif
  300. vpx_free(src_);
  301. delete[] ref_;
  302. src_ = NULL;
  303. ref_ = NULL;
  304. libvpx_test::ClearSystemState();
  305. }
  306. protected:
  307. // We could sub-class MainTestClass into dedicated class for Variance
  308. // and MSE/SSE, but it involves a lot of 'this->xxx' dereferencing
  309. // to access top class fields xxx. That's cumbersome, so for now we'll just
  310. // implement the testing methods here:
  311. // Variance tests
  312. void ZeroTest();
  313. void RefTest();
  314. void RefStrideTest();
  315. void OneQuarterTest();
  316. void SpeedTest();
  317. // MSE/SSE tests
  318. void RefTestMse();
  319. void RefTestSse();
  320. void MaxTestMse();
  321. void MaxTestSse();
  322. protected:
  323. ACMRandom rnd_;
  324. uint8_t *src_;
  325. uint8_t *ref_;
  326. TestParams<FunctionType> params_;
  327. // some relay helpers
  328. bool use_high_bit_depth() const { return params_.use_high_bit_depth; }
  329. int byte_shift() const { return params_.bit_depth - 8; }
  330. int block_size() const { return params_.block_size; }
  331. int width() const { return params_.width; }
  332. int height() const { return params_.height; }
  333. uint32_t mask() const { return params_.mask; }
  334. };
  335. ////////////////////////////////////////////////////////////////////////////////
  336. // Tests related to variance.
  337. template <typename VarianceFunctionType>
  338. void MainTestClass<VarianceFunctionType>::ZeroTest() {
  339. for (int i = 0; i <= 255; ++i) {
  340. if (!use_high_bit_depth()) {
  341. memset(src_, i, block_size());
  342. } else {
  343. uint16_t *const src16 = CONVERT_TO_SHORTPTR(src_);
  344. for (int k = 0; k < block_size(); ++k) src16[k] = i << byte_shift();
  345. }
  346. for (int j = 0; j <= 255; ++j) {
  347. if (!use_high_bit_depth()) {
  348. memset(ref_, j, block_size());
  349. } else {
  350. uint16_t *const ref16 = CONVERT_TO_SHORTPTR(ref_);
  351. for (int k = 0; k < block_size(); ++k) ref16[k] = j << byte_shift();
  352. }
  353. unsigned int sse, var;
  354. ASM_REGISTER_STATE_CHECK(
  355. var = params_.func(src_, width(), ref_, width(), &sse));
  356. EXPECT_EQ(0u, var) << "src values: " << i << " ref values: " << j;
  357. }
  358. }
  359. }
  360. template <typename VarianceFunctionType>
  361. void MainTestClass<VarianceFunctionType>::RefTest() {
  362. for (int i = 0; i < 10; ++i) {
  363. for (int j = 0; j < block_size(); j++) {
  364. if (!use_high_bit_depth()) {
  365. src_[j] = rnd_.Rand8();
  366. ref_[j] = rnd_.Rand8();
  367. #if CONFIG_VP9_HIGHBITDEPTH
  368. } else {
  369. CONVERT_TO_SHORTPTR(src_)[j] = rnd_.Rand16() & mask();
  370. CONVERT_TO_SHORTPTR(ref_)[j] = rnd_.Rand16() & mask();
  371. #endif // CONFIG_VP9_HIGHBITDEPTH
  372. }
  373. }
  374. unsigned int sse1, sse2, var1, var2;
  375. const int stride = width();
  376. ASM_REGISTER_STATE_CHECK(
  377. var1 = params_.func(src_, stride, ref_, stride, &sse1));
  378. var2 =
  379. variance_ref(src_, ref_, params_.log2width, params_.log2height, stride,
  380. stride, &sse2, use_high_bit_depth(), params_.bit_depth);
  381. EXPECT_EQ(sse1, sse2) << "Error at test index: " << i;
  382. EXPECT_EQ(var1, var2) << "Error at test index: " << i;
  383. }
  384. }
  385. template <typename VarianceFunctionType>
  386. void MainTestClass<VarianceFunctionType>::RefStrideTest() {
  387. for (int i = 0; i < 10; ++i) {
  388. const int ref_stride = (i & 1) * width();
  389. const int src_stride = ((i >> 1) & 1) * width();
  390. for (int j = 0; j < block_size(); j++) {
  391. const int ref_ind = (j / width()) * ref_stride + j % width();
  392. const int src_ind = (j / width()) * src_stride + j % width();
  393. if (!use_high_bit_depth()) {
  394. src_[src_ind] = rnd_.Rand8();
  395. ref_[ref_ind] = rnd_.Rand8();
  396. #if CONFIG_VP9_HIGHBITDEPTH
  397. } else {
  398. CONVERT_TO_SHORTPTR(src_)[src_ind] = rnd_.Rand16() & mask();
  399. CONVERT_TO_SHORTPTR(ref_)[ref_ind] = rnd_.Rand16() & mask();
  400. #endif // CONFIG_VP9_HIGHBITDEPTH
  401. }
  402. }
  403. unsigned int sse1, sse2;
  404. unsigned int var1, var2;
  405. ASM_REGISTER_STATE_CHECK(
  406. var1 = params_.func(src_, src_stride, ref_, ref_stride, &sse1));
  407. var2 = variance_ref(src_, ref_, params_.log2width, params_.log2height,
  408. src_stride, ref_stride, &sse2, use_high_bit_depth(),
  409. params_.bit_depth);
  410. EXPECT_EQ(sse1, sse2) << "Error at test index: " << i;
  411. EXPECT_EQ(var1, var2) << "Error at test index: " << i;
  412. }
  413. }
  414. template <typename VarianceFunctionType>
  415. void MainTestClass<VarianceFunctionType>::OneQuarterTest() {
  416. const int half = block_size() / 2;
  417. if (!use_high_bit_depth()) {
  418. memset(src_, 255, block_size());
  419. memset(ref_, 255, half);
  420. memset(ref_ + half, 0, half);
  421. #if CONFIG_VP9_HIGHBITDEPTH
  422. } else {
  423. vpx_memset16(CONVERT_TO_SHORTPTR(src_), 255 << byte_shift(), block_size());
  424. vpx_memset16(CONVERT_TO_SHORTPTR(ref_), 255 << byte_shift(), half);
  425. vpx_memset16(CONVERT_TO_SHORTPTR(ref_) + half, 0, half);
  426. #endif // CONFIG_VP9_HIGHBITDEPTH
  427. }
  428. unsigned int sse, var, expected;
  429. ASM_REGISTER_STATE_CHECK(
  430. var = params_.func(src_, width(), ref_, width(), &sse));
  431. expected = block_size() * 255 * 255 / 4;
  432. EXPECT_EQ(expected, var);
  433. }
  434. template <typename VarianceFunctionType>
  435. void MainTestClass<VarianceFunctionType>::SpeedTest() {
  436. const int half = block_size() / 2;
  437. if (!use_high_bit_depth()) {
  438. memset(src_, 255, block_size());
  439. memset(ref_, 255, half);
  440. memset(ref_ + half, 0, half);
  441. #if CONFIG_VP9_HIGHBITDEPTH
  442. } else {
  443. vpx_memset16(CONVERT_TO_SHORTPTR(src_), 255 << byte_shift(), block_size());
  444. vpx_memset16(CONVERT_TO_SHORTPTR(ref_), 255 << byte_shift(), half);
  445. vpx_memset16(CONVERT_TO_SHORTPTR(ref_) + half, 0, half);
  446. #endif // CONFIG_VP9_HIGHBITDEPTH
  447. }
  448. unsigned int sse;
  449. vpx_usec_timer timer;
  450. vpx_usec_timer_start(&timer);
  451. for (int i = 0; i < 100000000 / block_size(); ++i) {
  452. const uint32_t variance = params_.func(src_, width(), ref_, width(), &sse);
  453. // Ignore return value.
  454. (void)variance;
  455. }
  456. vpx_usec_timer_mark(&timer);
  457. const int elapsed_time = static_cast<int>(vpx_usec_timer_elapsed(&timer));
  458. printf("Variance %dx%d time: %5d ms\n", width(), height(),
  459. elapsed_time / 1000);
  460. }
  461. ////////////////////////////////////////////////////////////////////////////////
  462. // Tests related to MSE / SSE.
  463. template <typename FunctionType>
  464. void MainTestClass<FunctionType>::RefTestMse() {
  465. for (int i = 0; i < 10; ++i) {
  466. for (int j = 0; j < block_size(); ++j) {
  467. src_[j] = rnd_.Rand8();
  468. ref_[j] = rnd_.Rand8();
  469. }
  470. unsigned int sse1, sse2;
  471. const int stride = width();
  472. ASM_REGISTER_STATE_CHECK(params_.func(src_, stride, ref_, stride, &sse1));
  473. variance_ref(src_, ref_, params_.log2width, params_.log2height, stride,
  474. stride, &sse2, false, VPX_BITS_8);
  475. EXPECT_EQ(sse1, sse2);
  476. }
  477. }
  478. template <typename FunctionType>
  479. void MainTestClass<FunctionType>::RefTestSse() {
  480. for (int i = 0; i < 10; ++i) {
  481. for (int j = 0; j < block_size(); ++j) {
  482. src_[j] = rnd_.Rand8();
  483. ref_[j] = rnd_.Rand8();
  484. }
  485. unsigned int sse2;
  486. unsigned int var1;
  487. const int stride = width();
  488. ASM_REGISTER_STATE_CHECK(var1 = params_.func(src_, stride, ref_, stride));
  489. variance_ref(src_, ref_, params_.log2width, params_.log2height, stride,
  490. stride, &sse2, false, VPX_BITS_8);
  491. EXPECT_EQ(var1, sse2);
  492. }
  493. }
  494. template <typename FunctionType>
  495. void MainTestClass<FunctionType>::MaxTestMse() {
  496. memset(src_, 255, block_size());
  497. memset(ref_, 0, block_size());
  498. unsigned int sse;
  499. ASM_REGISTER_STATE_CHECK(params_.func(src_, width(), ref_, width(), &sse));
  500. const unsigned int expected = block_size() * 255 * 255;
  501. EXPECT_EQ(expected, sse);
  502. }
  503. template <typename FunctionType>
  504. void MainTestClass<FunctionType>::MaxTestSse() {
  505. memset(src_, 255, block_size());
  506. memset(ref_, 0, block_size());
  507. unsigned int var;
  508. ASM_REGISTER_STATE_CHECK(var = params_.func(src_, width(), ref_, width()));
  509. const unsigned int expected = block_size() * 255 * 255;
  510. EXPECT_EQ(expected, var);
  511. }
  512. ////////////////////////////////////////////////////////////////////////////////
  513. template <typename FunctionType>
  514. class SubpelVarianceTest
  515. : public ::testing::TestWithParam<TestParams<FunctionType> > {
  516. public:
  517. virtual void SetUp() {
  518. params_ = this->GetParam();
  519. rnd_.Reset(ACMRandom::DeterministicSeed());
  520. if (!use_high_bit_depth()) {
  521. src_ = reinterpret_cast<uint8_t *>(vpx_memalign(16, block_size()));
  522. sec_ = reinterpret_cast<uint8_t *>(vpx_memalign(16, block_size()));
  523. ref_ = new uint8_t[block_size() + width() + height() + 1];
  524. #if CONFIG_VP9_HIGHBITDEPTH
  525. } else {
  526. src_ = CONVERT_TO_BYTEPTR(reinterpret_cast<uint16_t *>(
  527. vpx_memalign(16, block_size() * sizeof(uint16_t))));
  528. sec_ = CONVERT_TO_BYTEPTR(reinterpret_cast<uint16_t *>(
  529. vpx_memalign(16, block_size() * sizeof(uint16_t))));
  530. ref_ = CONVERT_TO_BYTEPTR(
  531. new uint16_t[block_size() + width() + height() + 1]);
  532. #endif // CONFIG_VP9_HIGHBITDEPTH
  533. }
  534. ASSERT_TRUE(src_ != NULL);
  535. ASSERT_TRUE(sec_ != NULL);
  536. ASSERT_TRUE(ref_ != NULL);
  537. }
  538. virtual void TearDown() {
  539. if (!use_high_bit_depth()) {
  540. vpx_free(src_);
  541. delete[] ref_;
  542. vpx_free(sec_);
  543. #if CONFIG_VP9_HIGHBITDEPTH
  544. } else {
  545. vpx_free(CONVERT_TO_SHORTPTR(src_));
  546. delete[] CONVERT_TO_SHORTPTR(ref_);
  547. vpx_free(CONVERT_TO_SHORTPTR(sec_));
  548. #endif // CONFIG_VP9_HIGHBITDEPTH
  549. }
  550. libvpx_test::ClearSystemState();
  551. }
  552. protected:
  553. void RefTest();
  554. void ExtremeRefTest();
  555. ACMRandom rnd_;
  556. uint8_t *src_;
  557. uint8_t *ref_;
  558. uint8_t *sec_;
  559. TestParams<FunctionType> params_;
  560. // some relay helpers
  561. bool use_high_bit_depth() const { return params_.use_high_bit_depth; }
  562. int byte_shift() const { return params_.bit_depth - 8; }
  563. int block_size() const { return params_.block_size; }
  564. int width() const { return params_.width; }
  565. int height() const { return params_.height; }
  566. uint32_t mask() const { return params_.mask; }
  567. };
  568. template <typename SubpelVarianceFunctionType>
  569. void SubpelVarianceTest<SubpelVarianceFunctionType>::RefTest() {
  570. for (int x = 0; x < 8; ++x) {
  571. for (int y = 0; y < 8; ++y) {
  572. if (!use_high_bit_depth()) {
  573. for (int j = 0; j < block_size(); j++) {
  574. src_[j] = rnd_.Rand8();
  575. }
  576. for (int j = 0; j < block_size() + width() + height() + 1; j++) {
  577. ref_[j] = rnd_.Rand8();
  578. }
  579. #if CONFIG_VP9_HIGHBITDEPTH
  580. } else {
  581. for (int j = 0; j < block_size(); j++) {
  582. CONVERT_TO_SHORTPTR(src_)[j] = rnd_.Rand16() & mask();
  583. }
  584. for (int j = 0; j < block_size() + width() + height() + 1; j++) {
  585. CONVERT_TO_SHORTPTR(ref_)[j] = rnd_.Rand16() & mask();
  586. }
  587. #endif // CONFIG_VP9_HIGHBITDEPTH
  588. }
  589. unsigned int sse1, sse2;
  590. unsigned int var1;
  591. ASM_REGISTER_STATE_CHECK(
  592. var1 = params_.func(ref_, width() + 1, x, y, src_, width(), &sse1));
  593. const unsigned int var2 = subpel_variance_ref(
  594. ref_, src_, params_.log2width, params_.log2height, x, y, &sse2,
  595. use_high_bit_depth(), params_.bit_depth);
  596. EXPECT_EQ(sse1, sse2) << "at position " << x << ", " << y;
  597. EXPECT_EQ(var1, var2) << "at position " << x << ", " << y;
  598. }
  599. }
  600. }
  601. template <typename SubpelVarianceFunctionType>
  602. void SubpelVarianceTest<SubpelVarianceFunctionType>::ExtremeRefTest() {
  603. // Compare against reference.
  604. // Src: Set the first half of values to 0, the second half to the maximum.
  605. // Ref: Set the first half of values to the maximum, the second half to 0.
  606. for (int x = 0; x < 8; ++x) {
  607. for (int y = 0; y < 8; ++y) {
  608. const int half = block_size() / 2;
  609. if (!use_high_bit_depth()) {
  610. memset(src_, 0, half);
  611. memset(src_ + half, 255, half);
  612. memset(ref_, 255, half);
  613. memset(ref_ + half, 0, half + width() + height() + 1);
  614. #if CONFIG_VP9_HIGHBITDEPTH
  615. } else {
  616. vpx_memset16(CONVERT_TO_SHORTPTR(src_), mask(), half);
  617. vpx_memset16(CONVERT_TO_SHORTPTR(src_) + half, 0, half);
  618. vpx_memset16(CONVERT_TO_SHORTPTR(ref_), 0, half);
  619. vpx_memset16(CONVERT_TO_SHORTPTR(ref_) + half, mask(),
  620. half + width() + height() + 1);
  621. #endif // CONFIG_VP9_HIGHBITDEPTH
  622. }
  623. unsigned int sse1, sse2;
  624. unsigned int var1;
  625. ASM_REGISTER_STATE_CHECK(
  626. var1 = params_.func(ref_, width() + 1, x, y, src_, width(), &sse1));
  627. const unsigned int var2 = subpel_variance_ref(
  628. ref_, src_, params_.log2width, params_.log2height, x, y, &sse2,
  629. use_high_bit_depth(), params_.bit_depth);
  630. EXPECT_EQ(sse1, sse2) << "for xoffset " << x << " and yoffset " << y;
  631. EXPECT_EQ(var1, var2) << "for xoffset " << x << " and yoffset " << y;
  632. }
  633. }
  634. }
  635. template <>
  636. void SubpelVarianceTest<SubpixAvgVarMxNFunc>::RefTest() {
  637. for (int x = 0; x < 8; ++x) {
  638. for (int y = 0; y < 8; ++y) {
  639. if (!use_high_bit_depth()) {
  640. for (int j = 0; j < block_size(); j++) {
  641. src_[j] = rnd_.Rand8();
  642. sec_[j] = rnd_.Rand8();
  643. }
  644. for (int j = 0; j < block_size() + width() + height() + 1; j++) {
  645. ref_[j] = rnd_.Rand8();
  646. }
  647. #if CONFIG_VP9_HIGHBITDEPTH
  648. } else {
  649. for (int j = 0; j < block_size(); j++) {
  650. CONVERT_TO_SHORTPTR(src_)[j] = rnd_.Rand16() & mask();
  651. CONVERT_TO_SHORTPTR(sec_)[j] = rnd_.Rand16() & mask();
  652. }
  653. for (int j = 0; j < block_size() + width() + height() + 1; j++) {
  654. CONVERT_TO_SHORTPTR(ref_)[j] = rnd_.Rand16() & mask();
  655. }
  656. #endif // CONFIG_VP9_HIGHBITDEPTH
  657. }
  658. uint32_t sse1, sse2;
  659. uint32_t var1, var2;
  660. ASM_REGISTER_STATE_CHECK(var1 = params_.func(ref_, width() + 1, x, y,
  661. src_, width(), &sse1, sec_));
  662. var2 = subpel_avg_variance_ref(ref_, src_, sec_, params_.log2width,
  663. params_.log2height, x, y, &sse2,
  664. use_high_bit_depth(), params_.bit_depth);
  665. EXPECT_EQ(sse1, sse2) << "at position " << x << ", " << y;
  666. EXPECT_EQ(var1, var2) << "at position " << x << ", " << y;
  667. }
  668. }
  669. }
  670. typedef MainTestClass<Get4x4SseFunc> VpxSseTest;
  671. typedef MainTestClass<VarianceMxNFunc> VpxMseTest;
  672. typedef MainTestClass<VarianceMxNFunc> VpxVarianceTest;
  673. typedef SubpelVarianceTest<SubpixVarMxNFunc> VpxSubpelVarianceTest;
  674. typedef SubpelVarianceTest<SubpixAvgVarMxNFunc> VpxSubpelAvgVarianceTest;
  675. TEST_P(VpxSseTest, RefSse) { RefTestSse(); }
  676. TEST_P(VpxSseTest, MaxSse) { MaxTestSse(); }
  677. TEST_P(VpxMseTest, RefMse) { RefTestMse(); }
  678. TEST_P(VpxMseTest, MaxMse) { MaxTestMse(); }
  679. TEST_P(VpxVarianceTest, Zero) { ZeroTest(); }
  680. TEST_P(VpxVarianceTest, Ref) { RefTest(); }
  681. TEST_P(VpxVarianceTest, RefStride) { RefStrideTest(); }
  682. TEST_P(VpxVarianceTest, OneQuarter) { OneQuarterTest(); }
  683. TEST_P(VpxVarianceTest, DISABLED_Speed) { SpeedTest(); }
  684. TEST_P(SumOfSquaresTest, Const) { ConstTest(); }
  685. TEST_P(SumOfSquaresTest, Ref) { RefTest(); }
  686. TEST_P(VpxSubpelVarianceTest, Ref) { RefTest(); }
  687. TEST_P(VpxSubpelVarianceTest, ExtremeRef) { ExtremeRefTest(); }
  688. TEST_P(VpxSubpelAvgVarianceTest, Ref) { RefTest(); }
  689. INSTANTIATE_TEST_CASE_P(C, SumOfSquaresTest,
  690. ::testing::Values(vpx_get_mb_ss_c));
  691. typedef TestParams<Get4x4SseFunc> SseParams;
  692. INSTANTIATE_TEST_CASE_P(C, VpxSseTest,
  693. ::testing::Values(SseParams(2, 2,
  694. &vpx_get4x4sse_cs_c)));
  695. typedef TestParams<VarianceMxNFunc> MseParams;
  696. INSTANTIATE_TEST_CASE_P(C, VpxMseTest,
  697. ::testing::Values(MseParams(4, 4, &vpx_mse16x16_c),
  698. MseParams(4, 3, &vpx_mse16x8_c),
  699. MseParams(3, 4, &vpx_mse8x16_c),
  700. MseParams(3, 3, &vpx_mse8x8_c)));
  701. typedef TestParams<VarianceMxNFunc> VarianceParams;
  702. INSTANTIATE_TEST_CASE_P(
  703. C, VpxVarianceTest,
  704. ::testing::Values(VarianceParams(6, 6, &vpx_variance64x64_c),
  705. VarianceParams(6, 5, &vpx_variance64x32_c),
  706. VarianceParams(5, 6, &vpx_variance32x64_c),
  707. VarianceParams(5, 5, &vpx_variance32x32_c),
  708. VarianceParams(5, 4, &vpx_variance32x16_c),
  709. VarianceParams(4, 5, &vpx_variance16x32_c),
  710. VarianceParams(4, 4, &vpx_variance16x16_c),
  711. VarianceParams(4, 3, &vpx_variance16x8_c),
  712. VarianceParams(3, 4, &vpx_variance8x16_c),
  713. VarianceParams(3, 3, &vpx_variance8x8_c),
  714. VarianceParams(3, 2, &vpx_variance8x4_c),
  715. VarianceParams(2, 3, &vpx_variance4x8_c),
  716. VarianceParams(2, 2, &vpx_variance4x4_c)));
  717. typedef TestParams<SubpixVarMxNFunc> SubpelVarianceParams;
  718. INSTANTIATE_TEST_CASE_P(
  719. C, VpxSubpelVarianceTest,
  720. ::testing::Values(
  721. SubpelVarianceParams(6, 6, &vpx_sub_pixel_variance64x64_c, 0),
  722. SubpelVarianceParams(6, 5, &vpx_sub_pixel_variance64x32_c, 0),
  723. SubpelVarianceParams(5, 6, &vpx_sub_pixel_variance32x64_c, 0),
  724. SubpelVarianceParams(5, 5, &vpx_sub_pixel_variance32x32_c, 0),
  725. SubpelVarianceParams(5, 4, &vpx_sub_pixel_variance32x16_c, 0),
  726. SubpelVarianceParams(4, 5, &vpx_sub_pixel_variance16x32_c, 0),
  727. SubpelVarianceParams(4, 4, &vpx_sub_pixel_variance16x16_c, 0),
  728. SubpelVarianceParams(4, 3, &vpx_sub_pixel_variance16x8_c, 0),
  729. SubpelVarianceParams(3, 4, &vpx_sub_pixel_variance8x16_c, 0),
  730. SubpelVarianceParams(3, 3, &vpx_sub_pixel_variance8x8_c, 0),
  731. SubpelVarianceParams(3, 2, &vpx_sub_pixel_variance8x4_c, 0),
  732. SubpelVarianceParams(2, 3, &vpx_sub_pixel_variance4x8_c, 0),
  733. SubpelVarianceParams(2, 2, &vpx_sub_pixel_variance4x4_c, 0)));
  734. typedef TestParams<SubpixAvgVarMxNFunc> SubpelAvgVarianceParams;
  735. INSTANTIATE_TEST_CASE_P(
  736. C, VpxSubpelAvgVarianceTest,
  737. ::testing::Values(
  738. SubpelAvgVarianceParams(6, 6, &vpx_sub_pixel_avg_variance64x64_c, 0),
  739. SubpelAvgVarianceParams(6, 5, &vpx_sub_pixel_avg_variance64x32_c, 0),
  740. SubpelAvgVarianceParams(5, 6, &vpx_sub_pixel_avg_variance32x64_c, 0),
  741. SubpelAvgVarianceParams(5, 5, &vpx_sub_pixel_avg_variance32x32_c, 0),
  742. SubpelAvgVarianceParams(5, 4, &vpx_sub_pixel_avg_variance32x16_c, 0),
  743. SubpelAvgVarianceParams(4, 5, &vpx_sub_pixel_avg_variance16x32_c, 0),
  744. SubpelAvgVarianceParams(4, 4, &vpx_sub_pixel_avg_variance16x16_c, 0),
  745. SubpelAvgVarianceParams(4, 3, &vpx_sub_pixel_avg_variance16x8_c, 0),
  746. SubpelAvgVarianceParams(3, 4, &vpx_sub_pixel_avg_variance8x16_c, 0),
  747. SubpelAvgVarianceParams(3, 3, &vpx_sub_pixel_avg_variance8x8_c, 0),
  748. SubpelAvgVarianceParams(3, 2, &vpx_sub_pixel_avg_variance8x4_c, 0),
  749. SubpelAvgVarianceParams(2, 3, &vpx_sub_pixel_avg_variance4x8_c, 0),
  750. SubpelAvgVarianceParams(2, 2, &vpx_sub_pixel_avg_variance4x4_c, 0)));
  751. #if CONFIG_VP9_HIGHBITDEPTH
  752. typedef MainTestClass<VarianceMxNFunc> VpxHBDMseTest;
  753. typedef MainTestClass<VarianceMxNFunc> VpxHBDVarianceTest;
  754. typedef SubpelVarianceTest<SubpixVarMxNFunc> VpxHBDSubpelVarianceTest;
  755. typedef SubpelVarianceTest<SubpixAvgVarMxNFunc> VpxHBDSubpelAvgVarianceTest;
  756. TEST_P(VpxHBDMseTest, RefMse) { RefTestMse(); }
  757. TEST_P(VpxHBDMseTest, MaxMse) { MaxTestMse(); }
  758. TEST_P(VpxHBDVarianceTest, Zero) { ZeroTest(); }
  759. TEST_P(VpxHBDVarianceTest, Ref) { RefTest(); }
  760. TEST_P(VpxHBDVarianceTest, RefStride) { RefStrideTest(); }
  761. TEST_P(VpxHBDVarianceTest, OneQuarter) { OneQuarterTest(); }
  762. TEST_P(VpxHBDVarianceTest, DISABLED_Speed) { SpeedTest(); }
  763. TEST_P(VpxHBDSubpelVarianceTest, Ref) { RefTest(); }
  764. TEST_P(VpxHBDSubpelVarianceTest, ExtremeRef) { ExtremeRefTest(); }
  765. TEST_P(VpxHBDSubpelAvgVarianceTest, Ref) { RefTest(); }
  766. /* TODO(debargha): This test does not support the highbd version
  767. INSTANTIATE_TEST_CASE_P(
  768. C, VpxHBDMseTest,
  769. ::testing::Values(MseParams(4, 4, &vpx_highbd_12_mse16x16_c),
  770. MseParams(4, 4, &vpx_highbd_12_mse16x8_c),
  771. MseParams(4, 4, &vpx_highbd_12_mse8x16_c),
  772. MseParams(4, 4, &vpx_highbd_12_mse8x8_c),
  773. MseParams(4, 4, &vpx_highbd_10_mse16x16_c),
  774. MseParams(4, 4, &vpx_highbd_10_mse16x8_c),
  775. MseParams(4, 4, &vpx_highbd_10_mse8x16_c),
  776. MseParams(4, 4, &vpx_highbd_10_mse8x8_c),
  777. MseParams(4, 4, &vpx_highbd_8_mse16x16_c),
  778. MseParams(4, 4, &vpx_highbd_8_mse16x8_c),
  779. MseParams(4, 4, &vpx_highbd_8_mse8x16_c),
  780. MseParams(4, 4, &vpx_highbd_8_mse8x8_c)));
  781. */
  782. INSTANTIATE_TEST_CASE_P(
  783. C, VpxHBDVarianceTest,
  784. ::testing::Values(VarianceParams(6, 6, &vpx_highbd_12_variance64x64_c, 12),
  785. VarianceParams(6, 5, &vpx_highbd_12_variance64x32_c, 12),
  786. VarianceParams(5, 6, &vpx_highbd_12_variance32x64_c, 12),
  787. VarianceParams(5, 5, &vpx_highbd_12_variance32x32_c, 12),
  788. VarianceParams(5, 4, &vpx_highbd_12_variance32x16_c, 12),
  789. VarianceParams(4, 5, &vpx_highbd_12_variance16x32_c, 12),
  790. VarianceParams(4, 4, &vpx_highbd_12_variance16x16_c, 12),
  791. VarianceParams(4, 3, &vpx_highbd_12_variance16x8_c, 12),
  792. VarianceParams(3, 4, &vpx_highbd_12_variance8x16_c, 12),
  793. VarianceParams(3, 3, &vpx_highbd_12_variance8x8_c, 12),
  794. VarianceParams(3, 2, &vpx_highbd_12_variance8x4_c, 12),
  795. VarianceParams(2, 3, &vpx_highbd_12_variance4x8_c, 12),
  796. VarianceParams(2, 2, &vpx_highbd_12_variance4x4_c, 12),
  797. VarianceParams(6, 6, &vpx_highbd_10_variance64x64_c, 10),
  798. VarianceParams(6, 5, &vpx_highbd_10_variance64x32_c, 10),
  799. VarianceParams(5, 6, &vpx_highbd_10_variance32x64_c, 10),
  800. VarianceParams(5, 5, &vpx_highbd_10_variance32x32_c, 10),
  801. VarianceParams(5, 4, &vpx_highbd_10_variance32x16_c, 10),
  802. VarianceParams(4, 5, &vpx_highbd_10_variance16x32_c, 10),
  803. VarianceParams(4, 4, &vpx_highbd_10_variance16x16_c, 10),
  804. VarianceParams(4, 3, &vpx_highbd_10_variance16x8_c, 10),
  805. VarianceParams(3, 4, &vpx_highbd_10_variance8x16_c, 10),
  806. VarianceParams(3, 3, &vpx_highbd_10_variance8x8_c, 10),
  807. VarianceParams(3, 2, &vpx_highbd_10_variance8x4_c, 10),
  808. VarianceParams(2, 3, &vpx_highbd_10_variance4x8_c, 10),
  809. VarianceParams(2, 2, &vpx_highbd_10_variance4x4_c, 10),
  810. VarianceParams(6, 6, &vpx_highbd_8_variance64x64_c, 8),
  811. VarianceParams(6, 5, &vpx_highbd_8_variance64x32_c, 8),
  812. VarianceParams(5, 6, &vpx_highbd_8_variance32x64_c, 8),
  813. VarianceParams(5, 5, &vpx_highbd_8_variance32x32_c, 8),
  814. VarianceParams(5, 4, &vpx_highbd_8_variance32x16_c, 8),
  815. VarianceParams(4, 5, &vpx_highbd_8_variance16x32_c, 8),
  816. VarianceParams(4, 4, &vpx_highbd_8_variance16x16_c, 8),
  817. VarianceParams(4, 3, &vpx_highbd_8_variance16x8_c, 8),
  818. VarianceParams(3, 4, &vpx_highbd_8_variance8x16_c, 8),
  819. VarianceParams(3, 3, &vpx_highbd_8_variance8x8_c, 8),
  820. VarianceParams(3, 2, &vpx_highbd_8_variance8x4_c, 8),
  821. VarianceParams(2, 3, &vpx_highbd_8_variance4x8_c, 8),
  822. VarianceParams(2, 2, &vpx_highbd_8_variance4x4_c, 8)));
  823. INSTANTIATE_TEST_CASE_P(
  824. C, VpxHBDSubpelVarianceTest,
  825. ::testing::Values(
  826. SubpelVarianceParams(6, 6, &vpx_highbd_8_sub_pixel_variance64x64_c, 8),
  827. SubpelVarianceParams(6, 5, &vpx_highbd_8_sub_pixel_variance64x32_c, 8),
  828. SubpelVarianceParams(5, 6, &vpx_highbd_8_sub_pixel_variance32x64_c, 8),
  829. SubpelVarianceParams(5, 5, &vpx_highbd_8_sub_pixel_variance32x32_c, 8),
  830. SubpelVarianceParams(5, 4, &vpx_highbd_8_sub_pixel_variance32x16_c, 8),
  831. SubpelVarianceParams(4, 5, &vpx_highbd_8_sub_pixel_variance16x32_c, 8),
  832. SubpelVarianceParams(4, 4, &vpx_highbd_8_sub_pixel_variance16x16_c, 8),
  833. SubpelVarianceParams(4, 3, &vpx_highbd_8_sub_pixel_variance16x8_c, 8),
  834. SubpelVarianceParams(3, 4, &vpx_highbd_8_sub_pixel_variance8x16_c, 8),
  835. SubpelVarianceParams(3, 3, &vpx_highbd_8_sub_pixel_variance8x8_c, 8),
  836. SubpelVarianceParams(3, 2, &vpx_highbd_8_sub_pixel_variance8x4_c, 8),
  837. SubpelVarianceParams(2, 3, &vpx_highbd_8_sub_pixel_variance4x8_c, 8),
  838. SubpelVarianceParams(2, 2, &vpx_highbd_8_sub_pixel_variance4x4_c, 8),
  839. SubpelVarianceParams(6, 6, &vpx_highbd_10_sub_pixel_variance64x64_c,
  840. 10),
  841. SubpelVarianceParams(6, 5, &vpx_highbd_10_sub_pixel_variance64x32_c,
  842. 10),
  843. SubpelVarianceParams(5, 6, &vpx_highbd_10_sub_pixel_variance32x64_c,
  844. 10),
  845. SubpelVarianceParams(5, 5, &vpx_highbd_10_sub_pixel_variance32x32_c,
  846. 10),
  847. SubpelVarianceParams(5, 4, &vpx_highbd_10_sub_pixel_variance32x16_c,
  848. 10),
  849. SubpelVarianceParams(4, 5, &vpx_highbd_10_sub_pixel_variance16x32_c,
  850. 10),
  851. SubpelVarianceParams(4, 4, &vpx_highbd_10_sub_pixel_variance16x16_c,
  852. 10),
  853. SubpelVarianceParams(4, 3, &vpx_highbd_10_sub_pixel_variance16x8_c, 10),
  854. SubpelVarianceParams(3, 4, &vpx_highbd_10_sub_pixel_variance8x16_c, 10),
  855. SubpelVarianceParams(3, 3, &vpx_highbd_10_sub_pixel_variance8x8_c, 10),
  856. SubpelVarianceParams(3, 2, &vpx_highbd_10_sub_pixel_variance8x4_c, 10),
  857. SubpelVarianceParams(2, 3, &vpx_highbd_10_sub_pixel_variance4x8_c, 10),
  858. SubpelVarianceParams(2, 2, &vpx_highbd_10_sub_pixel_variance4x4_c, 10),
  859. SubpelVarianceParams(6, 6, &vpx_highbd_12_sub_pixel_variance64x64_c,
  860. 12),
  861. SubpelVarianceParams(6, 5, &vpx_highbd_12_sub_pixel_variance64x32_c,
  862. 12),
  863. SubpelVarianceParams(5, 6, &vpx_highbd_12_sub_pixel_variance32x64_c,
  864. 12),
  865. SubpelVarianceParams(5, 5, &vpx_highbd_12_sub_pixel_variance32x32_c,
  866. 12),
  867. SubpelVarianceParams(5, 4, &vpx_highbd_12_sub_pixel_variance32x16_c,
  868. 12),
  869. SubpelVarianceParams(4, 5, &vpx_highbd_12_sub_pixel_variance16x32_c,
  870. 12),
  871. SubpelVarianceParams(4, 4, &vpx_highbd_12_sub_pixel_variance16x16_c,
  872. 12),
  873. SubpelVarianceParams(4, 3, &vpx_highbd_12_sub_pixel_variance16x8_c, 12),
  874. SubpelVarianceParams(3, 4, &vpx_highbd_12_sub_pixel_variance8x16_c, 12),
  875. SubpelVarianceParams(3, 3, &vpx_highbd_12_sub_pixel_variance8x8_c, 12),
  876. SubpelVarianceParams(3, 2, &vpx_highbd_12_sub_pixel_variance8x4_c, 12),
  877. SubpelVarianceParams(2, 3, &vpx_highbd_12_sub_pixel_variance4x8_c, 12),
  878. SubpelVarianceParams(2, 2, &vpx_highbd_12_sub_pixel_variance4x4_c,
  879. 12)));
  880. INSTANTIATE_TEST_CASE_P(
  881. C, VpxHBDSubpelAvgVarianceTest,
  882. ::testing::Values(
  883. SubpelAvgVarianceParams(6, 6,
  884. &vpx_highbd_8_sub_pixel_avg_variance64x64_c, 8),
  885. SubpelAvgVarianceParams(6, 5,
  886. &vpx_highbd_8_sub_pixel_avg_variance64x32_c, 8),
  887. SubpelAvgVarianceParams(5, 6,
  888. &vpx_highbd_8_sub_pixel_avg_variance32x64_c, 8),
  889. SubpelAvgVarianceParams(5, 5,
  890. &vpx_highbd_8_sub_pixel_avg_variance32x32_c, 8),
  891. SubpelAvgVarianceParams(5, 4,
  892. &vpx_highbd_8_sub_pixel_avg_variance32x16_c, 8),
  893. SubpelAvgVarianceParams(4, 5,
  894. &vpx_highbd_8_sub_pixel_avg_variance16x32_c, 8),
  895. SubpelAvgVarianceParams(4, 4,
  896. &vpx_highbd_8_sub_pixel_avg_variance16x16_c, 8),
  897. SubpelAvgVarianceParams(4, 3,
  898. &vpx_highbd_8_sub_pixel_avg_variance16x8_c, 8),
  899. SubpelAvgVarianceParams(3, 4,
  900. &vpx_highbd_8_sub_pixel_avg_variance8x16_c, 8),
  901. SubpelAvgVarianceParams(3, 3, &vpx_highbd_8_sub_pixel_avg_variance8x8_c,
  902. 8),
  903. SubpelAvgVarianceParams(3, 2, &vpx_highbd_8_sub_pixel_avg_variance8x4_c,
  904. 8),
  905. SubpelAvgVarianceParams(2, 3, &vpx_highbd_8_sub_pixel_avg_variance4x8_c,
  906. 8),
  907. SubpelAvgVarianceParams(2, 2, &vpx_highbd_8_sub_pixel_avg_variance4x4_c,
  908. 8),
  909. SubpelAvgVarianceParams(6, 6,
  910. &vpx_highbd_10_sub_pixel_avg_variance64x64_c,
  911. 10),
  912. SubpelAvgVarianceParams(6, 5,
  913. &vpx_highbd_10_sub_pixel_avg_variance64x32_c,
  914. 10),
  915. SubpelAvgVarianceParams(5, 6,
  916. &vpx_highbd_10_sub_pixel_avg_variance32x64_c,
  917. 10),
  918. SubpelAvgVarianceParams(5, 5,
  919. &vpx_highbd_10_sub_pixel_avg_variance32x32_c,
  920. 10),
  921. SubpelAvgVarianceParams(5, 4,
  922. &vpx_highbd_10_sub_pixel_avg_variance32x16_c,
  923. 10),
  924. SubpelAvgVarianceParams(4, 5,
  925. &vpx_highbd_10_sub_pixel_avg_variance16x32_c,
  926. 10),
  927. SubpelAvgVarianceParams(4, 4,
  928. &vpx_highbd_10_sub_pixel_avg_variance16x16_c,
  929. 10),
  930. SubpelAvgVarianceParams(4, 3,
  931. &vpx_highbd_10_sub_pixel_avg_variance16x8_c,
  932. 10),
  933. SubpelAvgVarianceParams(3, 4,
  934. &vpx_highbd_10_sub_pixel_avg_variance8x16_c,
  935. 10),
  936. SubpelAvgVarianceParams(3, 3,
  937. &vpx_highbd_10_sub_pixel_avg_variance8x8_c, 10),
  938. SubpelAvgVarianceParams(3, 2,
  939. &vpx_highbd_10_sub_pixel_avg_variance8x4_c, 10),
  940. SubpelAvgVarianceParams(2, 3,
  941. &vpx_highbd_10_sub_pixel_avg_variance4x8_c, 10),
  942. SubpelAvgVarianceParams(2, 2,
  943. &vpx_highbd_10_sub_pixel_avg_variance4x4_c, 10),
  944. SubpelAvgVarianceParams(6, 6,
  945. &vpx_highbd_12_sub_pixel_avg_variance64x64_c,
  946. 12),
  947. SubpelAvgVarianceParams(6, 5,
  948. &vpx_highbd_12_sub_pixel_avg_variance64x32_c,
  949. 12),
  950. SubpelAvgVarianceParams(5, 6,
  951. &vpx_highbd_12_sub_pixel_avg_variance32x64_c,
  952. 12),
  953. SubpelAvgVarianceParams(5, 5,
  954. &vpx_highbd_12_sub_pixel_avg_variance32x32_c,
  955. 12),
  956. SubpelAvgVarianceParams(5, 4,
  957. &vpx_highbd_12_sub_pixel_avg_variance32x16_c,
  958. 12),
  959. SubpelAvgVarianceParams(4, 5,
  960. &vpx_highbd_12_sub_pixel_avg_variance16x32_c,
  961. 12),
  962. SubpelAvgVarianceParams(4, 4,
  963. &vpx_highbd_12_sub_pixel_avg_variance16x16_c,
  964. 12),
  965. SubpelAvgVarianceParams(4, 3,
  966. &vpx_highbd_12_sub_pixel_avg_variance16x8_c,
  967. 12),
  968. SubpelAvgVarianceParams(3, 4,
  969. &vpx_highbd_12_sub_pixel_avg_variance8x16_c,
  970. 12),
  971. SubpelAvgVarianceParams(3, 3,
  972. &vpx_highbd_12_sub_pixel_avg_variance8x8_c, 12),
  973. SubpelAvgVarianceParams(3, 2,
  974. &vpx_highbd_12_sub_pixel_avg_variance8x4_c, 12),
  975. SubpelAvgVarianceParams(2, 3,
  976. &vpx_highbd_12_sub_pixel_avg_variance4x8_c, 12),
  977. SubpelAvgVarianceParams(2, 2,
  978. &vpx_highbd_12_sub_pixel_avg_variance4x4_c,
  979. 12)));
  980. #endif // CONFIG_VP9_HIGHBITDEPTH
  981. #if HAVE_SSE2
  982. INSTANTIATE_TEST_CASE_P(SSE2, SumOfSquaresTest,
  983. ::testing::Values(vpx_get_mb_ss_sse2));
  984. INSTANTIATE_TEST_CASE_P(SSE2, VpxMseTest,
  985. ::testing::Values(MseParams(4, 4, &vpx_mse16x16_sse2),
  986. MseParams(4, 3, &vpx_mse16x8_sse2),
  987. MseParams(3, 4, &vpx_mse8x16_sse2),
  988. MseParams(3, 3, &vpx_mse8x8_sse2)));
  989. INSTANTIATE_TEST_CASE_P(
  990. SSE2, VpxVarianceTest,
  991. ::testing::Values(VarianceParams(6, 6, &vpx_variance64x64_sse2),
  992. VarianceParams(6, 5, &vpx_variance64x32_sse2),
  993. VarianceParams(5, 6, &vpx_variance32x64_sse2),
  994. VarianceParams(5, 5, &vpx_variance32x32_sse2),
  995. VarianceParams(5, 4, &vpx_variance32x16_sse2),
  996. VarianceParams(4, 5, &vpx_variance16x32_sse2),
  997. VarianceParams(4, 4, &vpx_variance16x16_sse2),
  998. VarianceParams(4, 3, &vpx_variance16x8_sse2),
  999. VarianceParams(3, 4, &vpx_variance8x16_sse2),
  1000. VarianceParams(3, 3, &vpx_variance8x8_sse2),
  1001. VarianceParams(3, 2, &vpx_variance8x4_sse2),
  1002. VarianceParams(2, 3, &vpx_variance4x8_sse2),
  1003. VarianceParams(2, 2, &vpx_variance4x4_sse2)));
  1004. INSTANTIATE_TEST_CASE_P(
  1005. SSE2, VpxSubpelVarianceTest,
  1006. ::testing::Values(
  1007. SubpelVarianceParams(6, 6, &vpx_sub_pixel_variance64x64_sse2, 0),
  1008. SubpelVarianceParams(6, 5, &vpx_sub_pixel_variance64x32_sse2, 0),
  1009. SubpelVarianceParams(5, 6, &vpx_sub_pixel_variance32x64_sse2, 0),
  1010. SubpelVarianceParams(5, 5, &vpx_sub_pixel_variance32x32_sse2, 0),
  1011. SubpelVarianceParams(5, 4, &vpx_sub_pixel_variance32x16_sse2, 0),
  1012. SubpelVarianceParams(4, 5, &vpx_sub_pixel_variance16x32_sse2, 0),
  1013. SubpelVarianceParams(4, 4, &vpx_sub_pixel_variance16x16_sse2, 0),
  1014. SubpelVarianceParams(4, 3, &vpx_sub_pixel_variance16x8_sse2, 0),
  1015. SubpelVarianceParams(3, 4, &vpx_sub_pixel_variance8x16_sse2, 0),
  1016. SubpelVarianceParams(3, 3, &vpx_sub_pixel_variance8x8_sse2, 0),
  1017. SubpelVarianceParams(3, 2, &vpx_sub_pixel_variance8x4_sse2, 0),
  1018. SubpelVarianceParams(2, 3, &vpx_sub_pixel_variance4x8_sse2, 0),
  1019. SubpelVarianceParams(2, 2, &vpx_sub_pixel_variance4x4_sse2, 0)));
  1020. INSTANTIATE_TEST_CASE_P(
  1021. SSE2, VpxSubpelAvgVarianceTest,
  1022. ::testing::Values(
  1023. SubpelAvgVarianceParams(6, 6, &vpx_sub_pixel_avg_variance64x64_sse2, 0),
  1024. SubpelAvgVarianceParams(6, 5, &vpx_sub_pixel_avg_variance64x32_sse2, 0),
  1025. SubpelAvgVarianceParams(5, 6, &vpx_sub_pixel_avg_variance32x64_sse2, 0),
  1026. SubpelAvgVarianceParams(5, 5, &vpx_sub_pixel_avg_variance32x32_sse2, 0),
  1027. SubpelAvgVarianceParams(5, 4, &vpx_sub_pixel_avg_variance32x16_sse2, 0),
  1028. SubpelAvgVarianceParams(4, 5, &vpx_sub_pixel_avg_variance16x32_sse2, 0),
  1029. SubpelAvgVarianceParams(4, 4, &vpx_sub_pixel_avg_variance16x16_sse2, 0),
  1030. SubpelAvgVarianceParams(4, 3, &vpx_sub_pixel_avg_variance16x8_sse2, 0),
  1031. SubpelAvgVarianceParams(3, 4, &vpx_sub_pixel_avg_variance8x16_sse2, 0),
  1032. SubpelAvgVarianceParams(3, 3, &vpx_sub_pixel_avg_variance8x8_sse2, 0),
  1033. SubpelAvgVarianceParams(3, 2, &vpx_sub_pixel_avg_variance8x4_sse2, 0),
  1034. SubpelAvgVarianceParams(2, 3, &vpx_sub_pixel_avg_variance4x8_sse2, 0),
  1035. SubpelAvgVarianceParams(2, 2, &vpx_sub_pixel_avg_variance4x4_sse2, 0)));
  1036. #if CONFIG_VP9_HIGHBITDEPTH
  1037. /* TODO(debargha): This test does not support the highbd version
  1038. INSTANTIATE_TEST_CASE_P(
  1039. SSE2, VpxHBDMseTest,
  1040. ::testing::Values(MseParams(4, 4, &vpx_highbd_12_mse16x16_sse2),
  1041. MseParams(4, 3, &vpx_highbd_12_mse16x8_sse2),
  1042. MseParams(3, 4, &vpx_highbd_12_mse8x16_sse2),
  1043. MseParams(3, 3, &vpx_highbd_12_mse8x8_sse2),
  1044. MseParams(4, 4, &vpx_highbd_10_mse16x16_sse2),
  1045. MseParams(4, 3, &vpx_highbd_10_mse16x8_sse2),
  1046. MseParams(3, 4, &vpx_highbd_10_mse8x16_sse2),
  1047. MseParams(3, 3, &vpx_highbd_10_mse8x8_sse2),
  1048. MseParams(4, 4, &vpx_highbd_8_mse16x16_sse2),
  1049. MseParams(4, 3, &vpx_highbd_8_mse16x8_sse2),
  1050. MseParams(3, 4, &vpx_highbd_8_mse8x16_sse2),
  1051. MseParams(3, 3, &vpx_highbd_8_mse8x8_sse2)));
  1052. */
  1053. INSTANTIATE_TEST_CASE_P(
  1054. SSE2, VpxHBDVarianceTest,
  1055. ::testing::Values(
  1056. VarianceParams(6, 6, &vpx_highbd_12_variance64x64_sse2, 12),
  1057. VarianceParams(6, 5, &vpx_highbd_12_variance64x32_sse2, 12),
  1058. VarianceParams(5, 6, &vpx_highbd_12_variance32x64_sse2, 12),
  1059. VarianceParams(5, 5, &vpx_highbd_12_variance32x32_sse2, 12),
  1060. VarianceParams(5, 4, &vpx_highbd_12_variance32x16_sse2, 12),
  1061. VarianceParams(4, 5, &vpx_highbd_12_variance16x32_sse2, 12),
  1062. VarianceParams(4, 4, &vpx_highbd_12_variance16x16_sse2, 12),
  1063. VarianceParams(4, 3, &vpx_highbd_12_variance16x8_sse2, 12),
  1064. VarianceParams(3, 4, &vpx_highbd_12_variance8x16_sse2, 12),
  1065. VarianceParams(3, 3, &vpx_highbd_12_variance8x8_sse2, 12),
  1066. VarianceParams(6, 6, &vpx_highbd_10_variance64x64_sse2, 10),
  1067. VarianceParams(6, 5, &vpx_highbd_10_variance64x32_sse2, 10),
  1068. VarianceParams(5, 6, &vpx_highbd_10_variance32x64_sse2, 10),
  1069. VarianceParams(5, 5, &vpx_highbd_10_variance32x32_sse2, 10),
  1070. VarianceParams(5, 4, &vpx_highbd_10_variance32x16_sse2, 10),
  1071. VarianceParams(4, 5, &vpx_highbd_10_variance16x32_sse2, 10),
  1072. VarianceParams(4, 4, &vpx_highbd_10_variance16x16_sse2, 10),
  1073. VarianceParams(4, 3, &vpx_highbd_10_variance16x8_sse2, 10),
  1074. VarianceParams(3, 4, &vpx_highbd_10_variance8x16_sse2, 10),
  1075. VarianceParams(3, 3, &vpx_highbd_10_variance8x8_sse2, 10),
  1076. VarianceParams(6, 6, &vpx_highbd_8_variance64x64_sse2, 8),
  1077. VarianceParams(6, 5, &vpx_highbd_8_variance64x32_sse2, 8),
  1078. VarianceParams(5, 6, &vpx_highbd_8_variance32x64_sse2, 8),
  1079. VarianceParams(5, 5, &vpx_highbd_8_variance32x32_sse2, 8),
  1080. VarianceParams(5, 4, &vpx_highbd_8_variance32x16_sse2, 8),
  1081. VarianceParams(4, 5, &vpx_highbd_8_variance16x32_sse2, 8),
  1082. VarianceParams(4, 4, &vpx_highbd_8_variance16x16_sse2, 8),
  1083. VarianceParams(4, 3, &vpx_highbd_8_variance16x8_sse2, 8),
  1084. VarianceParams(3, 4, &vpx_highbd_8_variance8x16_sse2, 8),
  1085. VarianceParams(3, 3, &vpx_highbd_8_variance8x8_sse2, 8)));
  1086. INSTANTIATE_TEST_CASE_P(
  1087. SSE2, VpxHBDSubpelVarianceTest,
  1088. ::testing::Values(
  1089. SubpelVarianceParams(6, 6, &vpx_highbd_12_sub_pixel_variance64x64_sse2,
  1090. 12),
  1091. SubpelVarianceParams(6, 5, &vpx_highbd_12_sub_pixel_variance64x32_sse2,
  1092. 12),
  1093. SubpelVarianceParams(5, 6, &vpx_highbd_12_sub_pixel_variance32x64_sse2,
  1094. 12),
  1095. SubpelVarianceParams(5, 5, &vpx_highbd_12_sub_pixel_variance32x32_sse2,
  1096. 12),
  1097. SubpelVarianceParams(5, 4, &vpx_highbd_12_sub_pixel_variance32x16_sse2,
  1098. 12),
  1099. SubpelVarianceParams(4, 5, &vpx_highbd_12_sub_pixel_variance16x32_sse2,
  1100. 12),
  1101. SubpelVarianceParams(4, 4, &vpx_highbd_12_sub_pixel_variance16x16_sse2,
  1102. 12),
  1103. SubpelVarianceParams(4, 3, &vpx_highbd_12_sub_pixel_variance16x8_sse2,
  1104. 12),
  1105. SubpelVarianceParams(3, 4, &vpx_highbd_12_sub_pixel_variance8x16_sse2,
  1106. 12),
  1107. SubpelVarianceParams(3, 3, &vpx_highbd_12_sub_pixel_variance8x8_sse2,
  1108. 12),
  1109. SubpelVarianceParams(3, 2, &vpx_highbd_12_sub_pixel_variance8x4_sse2,
  1110. 12),
  1111. SubpelVarianceParams(6, 6, &vpx_highbd_10_sub_pixel_variance64x64_sse2,
  1112. 10),
  1113. SubpelVarianceParams(6, 5, &vpx_highbd_10_sub_pixel_variance64x32_sse2,
  1114. 10),
  1115. SubpelVarianceParams(5, 6, &vpx_highbd_10_sub_pixel_variance32x64_sse2,
  1116. 10),
  1117. SubpelVarianceParams(5, 5, &vpx_highbd_10_sub_pixel_variance32x32_sse2,
  1118. 10),
  1119. SubpelVarianceParams(5, 4, &vpx_highbd_10_sub_pixel_variance32x16_sse2,
  1120. 10),
  1121. SubpelVarianceParams(4, 5, &vpx_highbd_10_sub_pixel_variance16x32_sse2,
  1122. 10),
  1123. SubpelVarianceParams(4, 4, &vpx_highbd_10_sub_pixel_variance16x16_sse2,
  1124. 10),
  1125. SubpelVarianceParams(4, 3, &vpx_highbd_10_sub_pixel_variance16x8_sse2,
  1126. 10),
  1127. SubpelVarianceParams(3, 4, &vpx_highbd_10_sub_pixel_variance8x16_sse2,
  1128. 10),
  1129. SubpelVarianceParams(3, 3, &vpx_highbd_10_sub_pixel_variance8x8_sse2,
  1130. 10),
  1131. SubpelVarianceParams(3, 2, &vpx_highbd_10_sub_pixel_variance8x4_sse2,
  1132. 10),
  1133. SubpelVarianceParams(6, 6, &vpx_highbd_8_sub_pixel_variance64x64_sse2,
  1134. 8),
  1135. SubpelVarianceParams(6, 5, &vpx_highbd_8_sub_pixel_variance64x32_sse2,
  1136. 8),
  1137. SubpelVarianceParams(5, 6, &vpx_highbd_8_sub_pixel_variance32x64_sse2,
  1138. 8),
  1139. SubpelVarianceParams(5, 5, &vpx_highbd_8_sub_pixel_variance32x32_sse2,
  1140. 8),
  1141. SubpelVarianceParams(5, 4, &vpx_highbd_8_sub_pixel_variance32x16_sse2,
  1142. 8),
  1143. SubpelVarianceParams(4, 5, &vpx_highbd_8_sub_pixel_variance16x32_sse2,
  1144. 8),
  1145. SubpelVarianceParams(4, 4, &vpx_highbd_8_sub_pixel_variance16x16_sse2,
  1146. 8),
  1147. SubpelVarianceParams(4, 3, &vpx_highbd_8_sub_pixel_variance16x8_sse2,
  1148. 8),
  1149. SubpelVarianceParams(3, 4, &vpx_highbd_8_sub_pixel_variance8x16_sse2,
  1150. 8),
  1151. SubpelVarianceParams(3, 3, &vpx_highbd_8_sub_pixel_variance8x8_sse2, 8),
  1152. SubpelVarianceParams(3, 2, &vpx_highbd_8_sub_pixel_variance8x4_sse2,
  1153. 8)));
  1154. INSTANTIATE_TEST_CASE_P(
  1155. SSE2, VpxHBDSubpelAvgVarianceTest,
  1156. ::testing::Values(
  1157. SubpelAvgVarianceParams(6, 6,
  1158. &vpx_highbd_12_sub_pixel_avg_variance64x64_sse2,
  1159. 12),
  1160. SubpelAvgVarianceParams(6, 5,
  1161. &vpx_highbd_12_sub_pixel_avg_variance64x32_sse2,
  1162. 12),
  1163. SubpelAvgVarianceParams(5, 6,
  1164. &vpx_highbd_12_sub_pixel_avg_variance32x64_sse2,
  1165. 12),
  1166. SubpelAvgVarianceParams(5, 5,
  1167. &vpx_highbd_12_sub_pixel_avg_variance32x32_sse2,
  1168. 12),
  1169. SubpelAvgVarianceParams(5, 4,
  1170. &vpx_highbd_12_sub_pixel_avg_variance32x16_sse2,
  1171. 12),
  1172. SubpelAvgVarianceParams(4, 5,
  1173. &vpx_highbd_12_sub_pixel_avg_variance16x32_sse2,
  1174. 12),
  1175. SubpelAvgVarianceParams(4, 4,
  1176. &vpx_highbd_12_sub_pixel_avg_variance16x16_sse2,
  1177. 12),
  1178. SubpelAvgVarianceParams(4, 3,
  1179. &vpx_highbd_12_sub_pixel_avg_variance16x8_sse2,
  1180. 12),
  1181. SubpelAvgVarianceParams(3, 4,
  1182. &vpx_highbd_12_sub_pixel_avg_variance8x16_sse2,
  1183. 12),
  1184. SubpelAvgVarianceParams(3, 3,
  1185. &vpx_highbd_12_sub_pixel_avg_variance8x8_sse2,
  1186. 12),
  1187. SubpelAvgVarianceParams(3, 2,
  1188. &vpx_highbd_12_sub_pixel_avg_variance8x4_sse2,
  1189. 12),
  1190. SubpelAvgVarianceParams(6, 6,
  1191. &vpx_highbd_10_sub_pixel_avg_variance64x64_sse2,
  1192. 10),
  1193. SubpelAvgVarianceParams(6, 5,
  1194. &vpx_highbd_10_sub_pixel_avg_variance64x32_sse2,
  1195. 10),
  1196. SubpelAvgVarianceParams(5, 6,
  1197. &vpx_highbd_10_sub_pixel_avg_variance32x64_sse2,
  1198. 10),
  1199. SubpelAvgVarianceParams(5, 5,
  1200. &vpx_highbd_10_sub_pixel_avg_variance32x32_sse2,
  1201. 10),
  1202. SubpelAvgVarianceParams(5, 4,
  1203. &vpx_highbd_10_sub_pixel_avg_variance32x16_sse2,
  1204. 10),
  1205. SubpelAvgVarianceParams(4, 5,
  1206. &vpx_highbd_10_sub_pixel_avg_variance16x32_sse2,
  1207. 10),
  1208. SubpelAvgVarianceParams(4, 4,
  1209. &vpx_highbd_10_sub_pixel_avg_variance16x16_sse2,
  1210. 10),
  1211. SubpelAvgVarianceParams(4, 3,
  1212. &vpx_highbd_10_sub_pixel_avg_variance16x8_sse2,
  1213. 10),
  1214. SubpelAvgVarianceParams(3, 4,
  1215. &vpx_highbd_10_sub_pixel_avg_variance8x16_sse2,
  1216. 10),
  1217. SubpelAvgVarianceParams(3, 3,
  1218. &vpx_highbd_10_sub_pixel_avg_variance8x8_sse2,
  1219. 10),
  1220. SubpelAvgVarianceParams(3, 2,
  1221. &vpx_highbd_10_sub_pixel_avg_variance8x4_sse2,
  1222. 10),
  1223. SubpelAvgVarianceParams(6, 6,
  1224. &vpx_highbd_8_sub_pixel_avg_variance64x64_sse2,
  1225. 8),
  1226. SubpelAvgVarianceParams(6, 5,
  1227. &vpx_highbd_8_sub_pixel_avg_variance64x32_sse2,
  1228. 8),
  1229. SubpelAvgVarianceParams(5, 6,
  1230. &vpx_highbd_8_sub_pixel_avg_variance32x64_sse2,
  1231. 8),
  1232. SubpelAvgVarianceParams(5, 5,
  1233. &vpx_highbd_8_sub_pixel_avg_variance32x32_sse2,
  1234. 8),
  1235. SubpelAvgVarianceParams(5, 4,
  1236. &vpx_highbd_8_sub_pixel_avg_variance32x16_sse2,
  1237. 8),
  1238. SubpelAvgVarianceParams(4, 5,
  1239. &vpx_highbd_8_sub_pixel_avg_variance16x32_sse2,
  1240. 8),
  1241. SubpelAvgVarianceParams(4, 4,
  1242. &vpx_highbd_8_sub_pixel_avg_variance16x16_sse2,
  1243. 8),
  1244. SubpelAvgVarianceParams(4, 3,
  1245. &vpx_highbd_8_sub_pixel_avg_variance16x8_sse2,
  1246. 8),
  1247. SubpelAvgVarianceParams(3, 4,
  1248. &vpx_highbd_8_sub_pixel_avg_variance8x16_sse2,
  1249. 8),
  1250. SubpelAvgVarianceParams(3, 3,
  1251. &vpx_highbd_8_sub_pixel_avg_variance8x8_sse2,
  1252. 8),
  1253. SubpelAvgVarianceParams(3, 2,
  1254. &vpx_highbd_8_sub_pixel_avg_variance8x4_sse2,
  1255. 8)));
  1256. #endif // CONFIG_VP9_HIGHBITDEPTH
  1257. #endif // HAVE_SSE2
  1258. #if HAVE_SSSE3
  1259. INSTANTIATE_TEST_CASE_P(
  1260. SSSE3, VpxSubpelVarianceTest,
  1261. ::testing::Values(
  1262. SubpelVarianceParams(6, 6, &vpx_sub_pixel_variance64x64_ssse3, 0),
  1263. SubpelVarianceParams(6, 5, &vpx_sub_pixel_variance64x32_ssse3, 0),
  1264. SubpelVarianceParams(5, 6, &vpx_sub_pixel_variance32x64_ssse3, 0),
  1265. SubpelVarianceParams(5, 5, &vpx_sub_pixel_variance32x32_ssse3, 0),
  1266. SubpelVarianceParams(5, 4, &vpx_sub_pixel_variance32x16_ssse3, 0),
  1267. SubpelVarianceParams(4, 5, &vpx_sub_pixel_variance16x32_ssse3, 0),
  1268. SubpelVarianceParams(4, 4, &vpx_sub_pixel_variance16x16_ssse3, 0),
  1269. SubpelVarianceParams(4, 3, &vpx_sub_pixel_variance16x8_ssse3, 0),
  1270. SubpelVarianceParams(3, 4, &vpx_sub_pixel_variance8x16_ssse3, 0),
  1271. SubpelVarianceParams(3, 3, &vpx_sub_pixel_variance8x8_ssse3, 0),
  1272. SubpelVarianceParams(3, 2, &vpx_sub_pixel_variance8x4_ssse3, 0),
  1273. SubpelVarianceParams(2, 3, &vpx_sub_pixel_variance4x8_ssse3, 0),
  1274. SubpelVarianceParams(2, 2, &vpx_sub_pixel_variance4x4_ssse3, 0)));
  1275. INSTANTIATE_TEST_CASE_P(
  1276. SSSE3, VpxSubpelAvgVarianceTest,
  1277. ::testing::Values(
  1278. SubpelAvgVarianceParams(6, 6, &vpx_sub_pixel_avg_variance64x64_ssse3,
  1279. 0),
  1280. SubpelAvgVarianceParams(6, 5, &vpx_sub_pixel_avg_variance64x32_ssse3,
  1281. 0),
  1282. SubpelAvgVarianceParams(5, 6, &vpx_sub_pixel_avg_variance32x64_ssse3,
  1283. 0),
  1284. SubpelAvgVarianceParams(5, 5, &vpx_sub_pixel_avg_variance32x32_ssse3,
  1285. 0),
  1286. SubpelAvgVarianceParams(5, 4, &vpx_sub_pixel_avg_variance32x16_ssse3,
  1287. 0),
  1288. SubpelAvgVarianceParams(4, 5, &vpx_sub_pixel_avg_variance16x32_ssse3,
  1289. 0),
  1290. SubpelAvgVarianceParams(4, 4, &vpx_sub_pixel_avg_variance16x16_ssse3,
  1291. 0),
  1292. SubpelAvgVarianceParams(4, 3, &vpx_sub_pixel_avg_variance16x8_ssse3, 0),
  1293. SubpelAvgVarianceParams(3, 4, &vpx_sub_pixel_avg_variance8x16_ssse3, 0),
  1294. SubpelAvgVarianceParams(3, 3, &vpx_sub_pixel_avg_variance8x8_ssse3, 0),
  1295. SubpelAvgVarianceParams(3, 2, &vpx_sub_pixel_avg_variance8x4_ssse3, 0),
  1296. SubpelAvgVarianceParams(2, 3, &vpx_sub_pixel_avg_variance4x8_ssse3, 0),
  1297. SubpelAvgVarianceParams(2, 2, &vpx_sub_pixel_avg_variance4x4_ssse3,
  1298. 0)));
  1299. #endif // HAVE_SSSE3
  1300. #if HAVE_AVX2
  1301. INSTANTIATE_TEST_CASE_P(AVX2, VpxMseTest,
  1302. ::testing::Values(MseParams(4, 4, &vpx_mse16x16_avx2)));
  1303. INSTANTIATE_TEST_CASE_P(
  1304. AVX2, VpxVarianceTest,
  1305. ::testing::Values(VarianceParams(6, 6, &vpx_variance64x64_avx2),
  1306. VarianceParams(6, 5, &vpx_variance64x32_avx2),
  1307. VarianceParams(5, 5, &vpx_variance32x32_avx2),
  1308. VarianceParams(5, 4, &vpx_variance32x16_avx2),
  1309. VarianceParams(4, 4, &vpx_variance16x16_avx2)));
  1310. INSTANTIATE_TEST_CASE_P(
  1311. AVX2, VpxSubpelVarianceTest,
  1312. ::testing::Values(
  1313. SubpelVarianceParams(6, 6, &vpx_sub_pixel_variance64x64_avx2, 0),
  1314. SubpelVarianceParams(5, 5, &vpx_sub_pixel_variance32x32_avx2, 0)));
  1315. INSTANTIATE_TEST_CASE_P(
  1316. AVX2, VpxSubpelAvgVarianceTest,
  1317. ::testing::Values(
  1318. SubpelAvgVarianceParams(6, 6, &vpx_sub_pixel_avg_variance64x64_avx2, 0),
  1319. SubpelAvgVarianceParams(5, 5, &vpx_sub_pixel_avg_variance32x32_avx2,
  1320. 0)));
  1321. #endif // HAVE_AVX2
  1322. #if HAVE_NEON
  1323. INSTANTIATE_TEST_CASE_P(NEON, VpxSseTest,
  1324. ::testing::Values(SseParams(2, 2,
  1325. &vpx_get4x4sse_cs_neon)));
  1326. INSTANTIATE_TEST_CASE_P(NEON, VpxMseTest,
  1327. ::testing::Values(MseParams(4, 4, &vpx_mse16x16_neon)));
  1328. INSTANTIATE_TEST_CASE_P(
  1329. NEON, VpxVarianceTest,
  1330. ::testing::Values(VarianceParams(6, 6, &vpx_variance64x64_neon),
  1331. VarianceParams(6, 5, &vpx_variance64x32_neon),
  1332. VarianceParams(5, 6, &vpx_variance32x64_neon),
  1333. VarianceParams(5, 5, &vpx_variance32x32_neon),
  1334. VarianceParams(5, 4, &vpx_variance32x16_neon),
  1335. VarianceParams(4, 5, &vpx_variance16x32_neon),
  1336. VarianceParams(4, 4, &vpx_variance16x16_neon),
  1337. VarianceParams(4, 3, &vpx_variance16x8_neon),
  1338. VarianceParams(3, 4, &vpx_variance8x16_neon),
  1339. VarianceParams(3, 3, &vpx_variance8x8_neon),
  1340. VarianceParams(3, 2, &vpx_variance8x4_neon),
  1341. VarianceParams(2, 3, &vpx_variance4x8_neon),
  1342. VarianceParams(2, 2, &vpx_variance4x4_neon)));
  1343. INSTANTIATE_TEST_CASE_P(
  1344. NEON, VpxSubpelVarianceTest,
  1345. ::testing::Values(
  1346. SubpelVarianceParams(6, 6, &vpx_sub_pixel_variance64x64_neon, 0),
  1347. SubpelVarianceParams(6, 5, &vpx_sub_pixel_variance64x32_neon, 0),
  1348. SubpelVarianceParams(5, 6, &vpx_sub_pixel_variance32x64_neon, 0),
  1349. SubpelVarianceParams(5, 5, &vpx_sub_pixel_variance32x32_neon, 0),
  1350. SubpelVarianceParams(5, 4, &vpx_sub_pixel_variance32x16_neon, 0),
  1351. SubpelVarianceParams(4, 5, &vpx_sub_pixel_variance16x32_neon, 0),
  1352. SubpelVarianceParams(4, 4, &vpx_sub_pixel_variance16x16_neon, 0),
  1353. SubpelVarianceParams(4, 3, &vpx_sub_pixel_variance16x8_neon, 0),
  1354. SubpelVarianceParams(3, 4, &vpx_sub_pixel_variance8x16_neon, 0),
  1355. SubpelVarianceParams(3, 3, &vpx_sub_pixel_variance8x8_neon, 0),
  1356. SubpelVarianceParams(3, 2, &vpx_sub_pixel_variance8x4_neon, 0),
  1357. SubpelVarianceParams(2, 3, &vpx_sub_pixel_variance4x8_neon, 0),
  1358. SubpelVarianceParams(2, 2, &vpx_sub_pixel_variance4x4_neon, 0)));
  1359. INSTANTIATE_TEST_CASE_P(
  1360. NEON, VpxSubpelAvgVarianceTest,
  1361. ::testing::Values(
  1362. SubpelAvgVarianceParams(6, 6, &vpx_sub_pixel_avg_variance64x64_neon, 0),
  1363. SubpelAvgVarianceParams(6, 5, &vpx_sub_pixel_avg_variance64x32_neon, 0),
  1364. SubpelAvgVarianceParams(5, 6, &vpx_sub_pixel_avg_variance32x64_neon, 0),
  1365. SubpelAvgVarianceParams(5, 5, &vpx_sub_pixel_avg_variance32x32_neon, 0),
  1366. SubpelAvgVarianceParams(5, 4, &vpx_sub_pixel_avg_variance32x16_neon, 0),
  1367. SubpelAvgVarianceParams(4, 5, &vpx_sub_pixel_avg_variance16x32_neon, 0),
  1368. SubpelAvgVarianceParams(4, 4, &vpx_sub_pixel_avg_variance16x16_neon, 0),
  1369. SubpelAvgVarianceParams(4, 3, &vpx_sub_pixel_avg_variance16x8_neon, 0),
  1370. SubpelAvgVarianceParams(3, 4, &vpx_sub_pixel_avg_variance8x16_neon, 0),
  1371. SubpelAvgVarianceParams(3, 3, &vpx_sub_pixel_avg_variance8x8_neon, 0),
  1372. SubpelAvgVarianceParams(3, 2, &vpx_sub_pixel_avg_variance8x4_neon, 0),
  1373. SubpelAvgVarianceParams(2, 3, &vpx_sub_pixel_avg_variance4x8_neon, 0),
  1374. SubpelAvgVarianceParams(2, 2, &vpx_sub_pixel_avg_variance4x4_neon, 0)));
  1375. #endif // HAVE_NEON
  1376. #if HAVE_MSA
  1377. INSTANTIATE_TEST_CASE_P(MSA, SumOfSquaresTest,
  1378. ::testing::Values(vpx_get_mb_ss_msa));
  1379. INSTANTIATE_TEST_CASE_P(MSA, VpxSseTest,
  1380. ::testing::Values(SseParams(2, 2,
  1381. &vpx_get4x4sse_cs_msa)));
  1382. INSTANTIATE_TEST_CASE_P(MSA, VpxMseTest,
  1383. ::testing::Values(MseParams(4, 4, &vpx_mse16x16_msa),
  1384. MseParams(4, 3, &vpx_mse16x8_msa),
  1385. MseParams(3, 4, &vpx_mse8x16_msa),
  1386. MseParams(3, 3, &vpx_mse8x8_msa)));
  1387. INSTANTIATE_TEST_CASE_P(
  1388. MSA, VpxVarianceTest,
  1389. ::testing::Values(VarianceParams(6, 6, &vpx_variance64x64_msa),
  1390. VarianceParams(6, 5, &vpx_variance64x32_msa),
  1391. VarianceParams(5, 6, &vpx_variance32x64_msa),
  1392. VarianceParams(5, 5, &vpx_variance32x32_msa),
  1393. VarianceParams(5, 4, &vpx_variance32x16_msa),
  1394. VarianceParams(4, 5, &vpx_variance16x32_msa),
  1395. VarianceParams(4, 4, &vpx_variance16x16_msa),
  1396. VarianceParams(4, 3, &vpx_variance16x8_msa),
  1397. VarianceParams(3, 4, &vpx_variance8x16_msa),
  1398. VarianceParams(3, 3, &vpx_variance8x8_msa),
  1399. VarianceParams(3, 2, &vpx_variance8x4_msa),
  1400. VarianceParams(2, 3, &vpx_variance4x8_msa),
  1401. VarianceParams(2, 2, &vpx_variance4x4_msa)));
  1402. INSTANTIATE_TEST_CASE_P(
  1403. MSA, VpxSubpelVarianceTest,
  1404. ::testing::Values(
  1405. SubpelVarianceParams(2, 2, &vpx_sub_pixel_variance4x4_msa, 0),
  1406. SubpelVarianceParams(2, 3, &vpx_sub_pixel_variance4x8_msa, 0),
  1407. SubpelVarianceParams(3, 2, &vpx_sub_pixel_variance8x4_msa, 0),
  1408. SubpelVarianceParams(3, 3, &vpx_sub_pixel_variance8x8_msa, 0),
  1409. SubpelVarianceParams(3, 4, &vpx_sub_pixel_variance8x16_msa, 0),
  1410. SubpelVarianceParams(4, 3, &vpx_sub_pixel_variance16x8_msa, 0),
  1411. SubpelVarianceParams(4, 4, &vpx_sub_pixel_variance16x16_msa, 0),
  1412. SubpelVarianceParams(4, 5, &vpx_sub_pixel_variance16x32_msa, 0),
  1413. SubpelVarianceParams(5, 4, &vpx_sub_pixel_variance32x16_msa, 0),
  1414. SubpelVarianceParams(5, 5, &vpx_sub_pixel_variance32x32_msa, 0),
  1415. SubpelVarianceParams(5, 6, &vpx_sub_pixel_variance32x64_msa, 0),
  1416. SubpelVarianceParams(6, 5, &vpx_sub_pixel_variance64x32_msa, 0),
  1417. SubpelVarianceParams(6, 6, &vpx_sub_pixel_variance64x64_msa, 0)));
  1418. INSTANTIATE_TEST_CASE_P(
  1419. MSA, VpxSubpelAvgVarianceTest,
  1420. ::testing::Values(
  1421. SubpelAvgVarianceParams(6, 6, &vpx_sub_pixel_avg_variance64x64_msa, 0),
  1422. SubpelAvgVarianceParams(6, 5, &vpx_sub_pixel_avg_variance64x32_msa, 0),
  1423. SubpelAvgVarianceParams(5, 6, &vpx_sub_pixel_avg_variance32x64_msa, 0),
  1424. SubpelAvgVarianceParams(5, 5, &vpx_sub_pixel_avg_variance32x32_msa, 0),
  1425. SubpelAvgVarianceParams(5, 4, &vpx_sub_pixel_avg_variance32x16_msa, 0),
  1426. SubpelAvgVarianceParams(4, 5, &vpx_sub_pixel_avg_variance16x32_msa, 0),
  1427. SubpelAvgVarianceParams(4, 4, &vpx_sub_pixel_avg_variance16x16_msa, 0),
  1428. SubpelAvgVarianceParams(4, 3, &vpx_sub_pixel_avg_variance16x8_msa, 0),
  1429. SubpelAvgVarianceParams(3, 4, &vpx_sub_pixel_avg_variance8x16_msa, 0),
  1430. SubpelAvgVarianceParams(3, 3, &vpx_sub_pixel_avg_variance8x8_msa, 0),
  1431. SubpelAvgVarianceParams(3, 2, &vpx_sub_pixel_avg_variance8x4_msa, 0),
  1432. SubpelAvgVarianceParams(2, 3, &vpx_sub_pixel_avg_variance4x8_msa, 0),
  1433. SubpelAvgVarianceParams(2, 2, &vpx_sub_pixel_avg_variance4x4_msa, 0)));
  1434. #endif // HAVE_MSA
  1435. #if HAVE_VSX
  1436. INSTANTIATE_TEST_CASE_P(VSX, SumOfSquaresTest,
  1437. ::testing::Values(vpx_get_mb_ss_vsx));
  1438. INSTANTIATE_TEST_CASE_P(VSX, VpxSseTest,
  1439. ::testing::Values(SseParams(2, 2,
  1440. &vpx_get4x4sse_cs_vsx)));
  1441. #endif // HAVE_VSX
  1442. #if HAVE_MMI
  1443. INSTANTIATE_TEST_CASE_P(MMI, VpxMseTest,
  1444. ::testing::Values(MseParams(4, 4, &vpx_mse16x16_mmi),
  1445. MseParams(4, 3, &vpx_mse16x8_mmi),
  1446. MseParams(3, 4, &vpx_mse8x16_mmi),
  1447. MseParams(3, 3, &vpx_mse8x8_mmi)));
  1448. INSTANTIATE_TEST_CASE_P(
  1449. MMI, VpxVarianceTest,
  1450. ::testing::Values(VarianceParams(6, 6, &vpx_variance64x64_mmi),
  1451. VarianceParams(6, 5, &vpx_variance64x32_mmi),
  1452. VarianceParams(5, 6, &vpx_variance32x64_mmi),
  1453. VarianceParams(5, 5, &vpx_variance32x32_mmi),
  1454. VarianceParams(5, 4, &vpx_variance32x16_mmi),
  1455. VarianceParams(4, 5, &vpx_variance16x32_mmi),
  1456. VarianceParams(4, 4, &vpx_variance16x16_mmi),
  1457. VarianceParams(4, 3, &vpx_variance16x8_mmi),
  1458. VarianceParams(3, 4, &vpx_variance8x16_mmi),
  1459. VarianceParams(3, 3, &vpx_variance8x8_mmi),
  1460. VarianceParams(3, 2, &vpx_variance8x4_mmi),
  1461. VarianceParams(2, 3, &vpx_variance4x8_mmi),
  1462. VarianceParams(2, 2, &vpx_variance4x4_mmi)));
  1463. INSTANTIATE_TEST_CASE_P(
  1464. MMI, VpxSubpelVarianceTest,
  1465. ::testing::Values(
  1466. SubpelVarianceParams(6, 6, &vpx_sub_pixel_variance64x64_mmi, 0),
  1467. SubpelVarianceParams(6, 5, &vpx_sub_pixel_variance64x32_mmi, 0),
  1468. SubpelVarianceParams(5, 6, &vpx_sub_pixel_variance32x64_mmi, 0),
  1469. SubpelVarianceParams(5, 5, &vpx_sub_pixel_variance32x32_mmi, 0),
  1470. SubpelVarianceParams(5, 4, &vpx_sub_pixel_variance32x16_mmi, 0),
  1471. SubpelVarianceParams(4, 5, &vpx_sub_pixel_variance16x32_mmi, 0),
  1472. SubpelVarianceParams(4, 4, &vpx_sub_pixel_variance16x16_mmi, 0),
  1473. SubpelVarianceParams(4, 3, &vpx_sub_pixel_variance16x8_mmi, 0),
  1474. SubpelVarianceParams(3, 4, &vpx_sub_pixel_variance8x16_mmi, 0),
  1475. SubpelVarianceParams(3, 3, &vpx_sub_pixel_variance8x8_mmi, 0),
  1476. SubpelVarianceParams(3, 2, &vpx_sub_pixel_variance8x4_mmi, 0),
  1477. SubpelVarianceParams(2, 3, &vpx_sub_pixel_variance4x8_mmi, 0),
  1478. SubpelVarianceParams(2, 2, &vpx_sub_pixel_variance4x4_mmi, 0)));
  1479. INSTANTIATE_TEST_CASE_P(
  1480. MMI, VpxSubpelAvgVarianceTest,
  1481. ::testing::Values(
  1482. SubpelAvgVarianceParams(6, 6, &vpx_sub_pixel_avg_variance64x64_mmi, 0),
  1483. SubpelAvgVarianceParams(6, 5, &vpx_sub_pixel_avg_variance64x32_mmi, 0),
  1484. SubpelAvgVarianceParams(5, 6, &vpx_sub_pixel_avg_variance32x64_mmi, 0),
  1485. SubpelAvgVarianceParams(5, 5, &vpx_sub_pixel_avg_variance32x32_mmi, 0),
  1486. SubpelAvgVarianceParams(5, 4, &vpx_sub_pixel_avg_variance32x16_mmi, 0),
  1487. SubpelAvgVarianceParams(4, 5, &vpx_sub_pixel_avg_variance16x32_mmi, 0),
  1488. SubpelAvgVarianceParams(4, 4, &vpx_sub_pixel_avg_variance16x16_mmi, 0),
  1489. SubpelAvgVarianceParams(4, 3, &vpx_sub_pixel_avg_variance16x8_mmi, 0),
  1490. SubpelAvgVarianceParams(3, 4, &vpx_sub_pixel_avg_variance8x16_mmi, 0),
  1491. SubpelAvgVarianceParams(3, 3, &vpx_sub_pixel_avg_variance8x8_mmi, 0),
  1492. SubpelAvgVarianceParams(3, 2, &vpx_sub_pixel_avg_variance8x4_mmi, 0),
  1493. SubpelAvgVarianceParams(2, 3, &vpx_sub_pixel_avg_variance4x8_mmi, 0),
  1494. SubpelAvgVarianceParams(2, 2, &vpx_sub_pixel_avg_variance4x4_mmi, 0)));
  1495. #endif // HAVE_MMI
  1496. } // namespace