partial_idct_test.cc 45 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927928929930931932933934935936937938939940941942943944945946947948949950951952953954955956957958959
  1. /*
  2. * Copyright (c) 2013 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 <math.h>
  11. #include <stdlib.h>
  12. #include <string.h>
  13. #include <limits>
  14. #include "third_party/googletest/src/include/gtest/gtest.h"
  15. #include "./vp9_rtcd.h"
  16. #include "./vpx_dsp_rtcd.h"
  17. #include "test/acm_random.h"
  18. #include "test/clear_system_state.h"
  19. #include "test/register_state_check.h"
  20. #include "test/util.h"
  21. #include "vp9/common/vp9_blockd.h"
  22. #include "vp9/common/vp9_scan.h"
  23. #include "vpx/vpx_integer.h"
  24. #include "vpx_ports/vpx_timer.h"
  25. using libvpx_test::ACMRandom;
  26. namespace {
  27. typedef void (*FwdTxfmFunc)(const int16_t *in, tran_low_t *out, int stride);
  28. typedef void (*InvTxfmFunc)(const tran_low_t *in, uint8_t *out, int stride);
  29. typedef void (*InvTxfmWithBdFunc)(const tran_low_t *in, uint8_t *out,
  30. int stride, int bd);
  31. template <InvTxfmFunc fn>
  32. void wrapper(const tran_low_t *in, uint8_t *out, int stride, int bd) {
  33. (void)bd;
  34. fn(in, out, stride);
  35. }
  36. #if CONFIG_VP9_HIGHBITDEPTH
  37. typedef void (*InvTxfmHighbdFunc)(const tran_low_t *in, uint16_t *out,
  38. int stride, int bd);
  39. template <InvTxfmHighbdFunc fn>
  40. void highbd_wrapper(const tran_low_t *in, uint8_t *out, int stride, int bd) {
  41. fn(in, CAST_TO_SHORTPTR(out), stride, bd);
  42. }
  43. #endif
  44. typedef std::tr1::tuple<FwdTxfmFunc, InvTxfmWithBdFunc, InvTxfmWithBdFunc,
  45. TX_SIZE, int, int, int>
  46. PartialInvTxfmParam;
  47. const int kMaxNumCoeffs = 1024;
  48. const int kCountTestBlock = 1000;
  49. class PartialIDctTest : public ::testing::TestWithParam<PartialInvTxfmParam> {
  50. public:
  51. virtual ~PartialIDctTest() {}
  52. virtual void SetUp() {
  53. rnd_.Reset(ACMRandom::DeterministicSeed());
  54. fwd_txfm_ = GET_PARAM(0);
  55. full_inv_txfm_ = GET_PARAM(1);
  56. partial_inv_txfm_ = GET_PARAM(2);
  57. tx_size_ = GET_PARAM(3);
  58. last_nonzero_ = GET_PARAM(4);
  59. bit_depth_ = GET_PARAM(5);
  60. pixel_size_ = GET_PARAM(6);
  61. mask_ = (1 << bit_depth_) - 1;
  62. switch (tx_size_) {
  63. case TX_4X4: size_ = 4; break;
  64. case TX_8X8: size_ = 8; break;
  65. case TX_16X16: size_ = 16; break;
  66. case TX_32X32: size_ = 32; break;
  67. default: FAIL() << "Wrong Size!"; break;
  68. }
  69. // Randomize stride_ to a value less than or equal to 1024
  70. stride_ = rnd_(1024) + 1;
  71. if (stride_ < size_) {
  72. stride_ = size_;
  73. }
  74. // Align stride_ to 16 if it's bigger than 16.
  75. if (stride_ > 16) {
  76. stride_ &= ~15;
  77. }
  78. input_block_size_ = size_ * size_;
  79. output_block_size_ = size_ * stride_;
  80. input_block_ = reinterpret_cast<tran_low_t *>(
  81. vpx_memalign(16, sizeof(*input_block_) * input_block_size_));
  82. output_block_ = reinterpret_cast<uint8_t *>(
  83. vpx_memalign(16, pixel_size_ * output_block_size_));
  84. output_block_ref_ = reinterpret_cast<uint8_t *>(
  85. vpx_memalign(16, pixel_size_ * output_block_size_));
  86. }
  87. virtual void TearDown() {
  88. vpx_free(input_block_);
  89. input_block_ = NULL;
  90. vpx_free(output_block_);
  91. output_block_ = NULL;
  92. vpx_free(output_block_ref_);
  93. output_block_ref_ = NULL;
  94. libvpx_test::ClearSystemState();
  95. }
  96. void InitMem() {
  97. memset(input_block_, 0, sizeof(*input_block_) * input_block_size_);
  98. if (pixel_size_ == 1) {
  99. for (int j = 0; j < output_block_size_; ++j) {
  100. output_block_[j] = output_block_ref_[j] = rnd_.Rand16() & mask_;
  101. }
  102. } else {
  103. ASSERT_EQ(2, pixel_size_);
  104. uint16_t *const output = reinterpret_cast<uint16_t *>(output_block_);
  105. uint16_t *const output_ref =
  106. reinterpret_cast<uint16_t *>(output_block_ref_);
  107. for (int j = 0; j < output_block_size_; ++j) {
  108. output[j] = output_ref[j] = rnd_.Rand16() & mask_;
  109. }
  110. }
  111. }
  112. void InitInput() {
  113. const int64_t max_coeff = (32766 << (bit_depth_ - 8)) / 4;
  114. int64_t max_energy_leftover = max_coeff * max_coeff;
  115. for (int j = 0; j < last_nonzero_; ++j) {
  116. tran_low_t coeff = static_cast<tran_low_t>(
  117. sqrt(1.0 * max_energy_leftover) * (rnd_.Rand16() - 32768) / 65536);
  118. max_energy_leftover -= static_cast<int64_t>(coeff) * coeff;
  119. if (max_energy_leftover < 0) {
  120. max_energy_leftover = 0;
  121. coeff = 0;
  122. }
  123. input_block_[vp9_default_scan_orders[tx_size_].scan[j]] = coeff;
  124. }
  125. }
  126. void PrintDiff() {
  127. if (memcmp(output_block_ref_, output_block_,
  128. pixel_size_ * output_block_size_)) {
  129. uint16_t ref, opt;
  130. for (int y = 0; y < size_; y++) {
  131. for (int x = 0; x < size_; x++) {
  132. if (pixel_size_ == 1) {
  133. ref = output_block_ref_[y * stride_ + x];
  134. opt = output_block_[y * stride_ + x];
  135. } else {
  136. ref = reinterpret_cast<uint16_t *>(
  137. output_block_ref_)[y * stride_ + x];
  138. opt = reinterpret_cast<uint16_t *>(output_block_)[y * stride_ + x];
  139. }
  140. if (ref != opt) {
  141. printf("dest[%d][%d] diff:%6d (ref),%6d (opt)\n", y, x, ref, opt);
  142. }
  143. }
  144. }
  145. printf("\ninput_block_:\n");
  146. for (int y = 0; y < size_; y++) {
  147. for (int x = 0; x < size_; x++) {
  148. printf("%6d,", input_block_[y * size_ + x]);
  149. }
  150. printf("\n");
  151. }
  152. }
  153. }
  154. protected:
  155. int last_nonzero_;
  156. TX_SIZE tx_size_;
  157. tran_low_t *input_block_;
  158. uint8_t *output_block_;
  159. uint8_t *output_block_ref_;
  160. int size_;
  161. int stride_;
  162. int pixel_size_;
  163. int input_block_size_;
  164. int output_block_size_;
  165. int bit_depth_;
  166. int mask_;
  167. FwdTxfmFunc fwd_txfm_;
  168. InvTxfmWithBdFunc full_inv_txfm_;
  169. InvTxfmWithBdFunc partial_inv_txfm_;
  170. ACMRandom rnd_;
  171. };
  172. TEST_P(PartialIDctTest, RunQuantCheck) {
  173. const int count_test_block = (size_ != 4) ? kCountTestBlock : 65536;
  174. DECLARE_ALIGNED(16, int16_t, input_extreme_block[kMaxNumCoeffs]);
  175. DECLARE_ALIGNED(16, tran_low_t, output_ref_block[kMaxNumCoeffs]);
  176. InitMem();
  177. for (int i = 0; i < count_test_block; ++i) {
  178. // Initialize a test block with input range [-mask_, mask_].
  179. if (size_ != 4) {
  180. if (i == 0) {
  181. for (int k = 0; k < input_block_size_; ++k) {
  182. input_extreme_block[k] = mask_;
  183. }
  184. } else if (i == 1) {
  185. for (int k = 0; k < input_block_size_; ++k) {
  186. input_extreme_block[k] = -mask_;
  187. }
  188. } else {
  189. for (int k = 0; k < input_block_size_; ++k) {
  190. input_extreme_block[k] = rnd_.Rand8() % 2 ? mask_ : -mask_;
  191. }
  192. }
  193. } else {
  194. // Try all possible combinations.
  195. for (int k = 0; k < input_block_size_; ++k) {
  196. input_extreme_block[k] = (i & (1 << k)) ? mask_ : -mask_;
  197. }
  198. }
  199. fwd_txfm_(input_extreme_block, output_ref_block, size_);
  200. // quantization with minimum allowed step sizes
  201. input_block_[0] = (output_ref_block[0] / 4) * 4;
  202. for (int k = 1; k < last_nonzero_; ++k) {
  203. const int pos = vp9_default_scan_orders[tx_size_].scan[k];
  204. input_block_[pos] = (output_ref_block[pos] / 4) * 4;
  205. }
  206. ASM_REGISTER_STATE_CHECK(
  207. full_inv_txfm_(input_block_, output_block_ref_, stride_, bit_depth_));
  208. ASM_REGISTER_STATE_CHECK(
  209. partial_inv_txfm_(input_block_, output_block_, stride_, bit_depth_));
  210. ASSERT_EQ(0, memcmp(output_block_ref_, output_block_,
  211. pixel_size_ * output_block_size_))
  212. << "Error: partial inverse transform produces different results";
  213. }
  214. }
  215. TEST_P(PartialIDctTest, ResultsMatch) {
  216. for (int i = 0; i < kCountTestBlock; ++i) {
  217. InitMem();
  218. InitInput();
  219. ASM_REGISTER_STATE_CHECK(
  220. full_inv_txfm_(input_block_, output_block_ref_, stride_, bit_depth_));
  221. ASM_REGISTER_STATE_CHECK(
  222. partial_inv_txfm_(input_block_, output_block_, stride_, bit_depth_));
  223. ASSERT_EQ(0, memcmp(output_block_ref_, output_block_,
  224. pixel_size_ * output_block_size_))
  225. << "Error: partial inverse transform produces different results";
  226. }
  227. }
  228. TEST_P(PartialIDctTest, AddOutputBlock) {
  229. for (int i = 0; i < kCountTestBlock; ++i) {
  230. InitMem();
  231. for (int j = 0; j < last_nonzero_; ++j) {
  232. input_block_[vp9_default_scan_orders[tx_size_].scan[j]] = 10;
  233. }
  234. ASM_REGISTER_STATE_CHECK(
  235. full_inv_txfm_(input_block_, output_block_ref_, stride_, bit_depth_));
  236. ASM_REGISTER_STATE_CHECK(
  237. partial_inv_txfm_(input_block_, output_block_, stride_, bit_depth_));
  238. ASSERT_EQ(0, memcmp(output_block_ref_, output_block_,
  239. pixel_size_ * output_block_size_))
  240. << "Error: Transform results are not correctly added to output.";
  241. }
  242. }
  243. TEST_P(PartialIDctTest, SingleExtremeCoeff) {
  244. const int16_t max_coeff = std::numeric_limits<int16_t>::max();
  245. const int16_t min_coeff = std::numeric_limits<int16_t>::min();
  246. for (int i = 0; i < last_nonzero_; ++i) {
  247. memset(input_block_, 0, sizeof(*input_block_) * input_block_size_);
  248. // Run once for min and once for max.
  249. for (int j = 0; j < 2; ++j) {
  250. const int coeff = j ? min_coeff : max_coeff;
  251. memset(output_block_, 0, pixel_size_ * output_block_size_);
  252. memset(output_block_ref_, 0, pixel_size_ * output_block_size_);
  253. input_block_[vp9_default_scan_orders[tx_size_].scan[i]] = coeff;
  254. ASM_REGISTER_STATE_CHECK(
  255. full_inv_txfm_(input_block_, output_block_ref_, stride_, bit_depth_));
  256. ASM_REGISTER_STATE_CHECK(
  257. partial_inv_txfm_(input_block_, output_block_, stride_, bit_depth_));
  258. ASSERT_EQ(0, memcmp(output_block_ref_, output_block_,
  259. pixel_size_ * output_block_size_))
  260. << "Error: Fails with single coeff of " << coeff << " at " << i
  261. << ".";
  262. }
  263. }
  264. }
  265. TEST_P(PartialIDctTest, DISABLED_Speed) {
  266. // Keep runtime stable with transform size.
  267. const int kCountSpeedTestBlock = 500000000 / input_block_size_;
  268. InitMem();
  269. InitInput();
  270. for (int i = 0; i < kCountSpeedTestBlock; ++i) {
  271. ASM_REGISTER_STATE_CHECK(
  272. full_inv_txfm_(input_block_, output_block_ref_, stride_, bit_depth_));
  273. }
  274. vpx_usec_timer timer;
  275. vpx_usec_timer_start(&timer);
  276. for (int i = 0; i < kCountSpeedTestBlock; ++i) {
  277. partial_inv_txfm_(input_block_, output_block_, stride_, bit_depth_);
  278. }
  279. libvpx_test::ClearSystemState();
  280. vpx_usec_timer_mark(&timer);
  281. const int elapsed_time =
  282. static_cast<int>(vpx_usec_timer_elapsed(&timer) / 1000);
  283. printf("idct%dx%d_%d (%s %d) time: %5d ms\n", size_, size_, last_nonzero_,
  284. (pixel_size_ == 1) ? "bitdepth" : "high bitdepth", bit_depth_,
  285. elapsed_time);
  286. ASSERT_EQ(0, memcmp(output_block_ref_, output_block_,
  287. pixel_size_ * output_block_size_))
  288. << "Error: partial inverse transform produces different results";
  289. }
  290. using std::tr1::make_tuple;
  291. const PartialInvTxfmParam c_partial_idct_tests[] = {
  292. #if CONFIG_VP9_HIGHBITDEPTH
  293. make_tuple(
  294. &vpx_highbd_fdct32x32_c, &highbd_wrapper<vpx_highbd_idct32x32_1024_add_c>,
  295. &highbd_wrapper<vpx_highbd_idct32x32_1024_add_c>, TX_32X32, 1024, 8, 2),
  296. make_tuple(
  297. &vpx_highbd_fdct32x32_c, &highbd_wrapper<vpx_highbd_idct32x32_1024_add_c>,
  298. &highbd_wrapper<vpx_highbd_idct32x32_1024_add_c>, TX_32X32, 1024, 10, 2),
  299. make_tuple(
  300. &vpx_highbd_fdct32x32_c, &highbd_wrapper<vpx_highbd_idct32x32_1024_add_c>,
  301. &highbd_wrapper<vpx_highbd_idct32x32_1024_add_c>, TX_32X32, 1024, 12, 2),
  302. make_tuple(
  303. &vpx_highbd_fdct32x32_c, &highbd_wrapper<vpx_highbd_idct32x32_1024_add_c>,
  304. &highbd_wrapper<vpx_highbd_idct32x32_135_add_c>, TX_32X32, 135, 8, 2),
  305. make_tuple(
  306. &vpx_highbd_fdct32x32_c, &highbd_wrapper<vpx_highbd_idct32x32_1024_add_c>,
  307. &highbd_wrapper<vpx_highbd_idct32x32_135_add_c>, TX_32X32, 135, 10, 2),
  308. make_tuple(
  309. &vpx_highbd_fdct32x32_c, &highbd_wrapper<vpx_highbd_idct32x32_1024_add_c>,
  310. &highbd_wrapper<vpx_highbd_idct32x32_135_add_c>, TX_32X32, 135, 12, 2),
  311. make_tuple(
  312. &vpx_highbd_fdct32x32_c, &highbd_wrapper<vpx_highbd_idct32x32_1024_add_c>,
  313. &highbd_wrapper<vpx_highbd_idct32x32_34_add_c>, TX_32X32, 34, 8, 2),
  314. make_tuple(
  315. &vpx_highbd_fdct32x32_c, &highbd_wrapper<vpx_highbd_idct32x32_1024_add_c>,
  316. &highbd_wrapper<vpx_highbd_idct32x32_34_add_c>, TX_32X32, 34, 10, 2),
  317. make_tuple(
  318. &vpx_highbd_fdct32x32_c, &highbd_wrapper<vpx_highbd_idct32x32_1024_add_c>,
  319. &highbd_wrapper<vpx_highbd_idct32x32_34_add_c>, TX_32X32, 34, 12, 2),
  320. make_tuple(&vpx_highbd_fdct32x32_c,
  321. &highbd_wrapper<vpx_highbd_idct32x32_1024_add_c>,
  322. &highbd_wrapper<vpx_highbd_idct32x32_1_add_c>, TX_32X32, 1, 8, 2),
  323. make_tuple(&vpx_highbd_fdct32x32_c,
  324. &highbd_wrapper<vpx_highbd_idct32x32_1024_add_c>,
  325. &highbd_wrapper<vpx_highbd_idct32x32_1_add_c>, TX_32X32, 1, 10, 2),
  326. make_tuple(&vpx_highbd_fdct32x32_c,
  327. &highbd_wrapper<vpx_highbd_idct32x32_1024_add_c>,
  328. &highbd_wrapper<vpx_highbd_idct32x32_1_add_c>, TX_32X32, 1, 12, 2),
  329. make_tuple(
  330. &vpx_highbd_fdct16x16_c, &highbd_wrapper<vpx_highbd_idct16x16_256_add_c>,
  331. &highbd_wrapper<vpx_highbd_idct16x16_256_add_c>, TX_16X16, 256, 8, 2),
  332. make_tuple(
  333. &vpx_highbd_fdct16x16_c, &highbd_wrapper<vpx_highbd_idct16x16_256_add_c>,
  334. &highbd_wrapper<vpx_highbd_idct16x16_256_add_c>, TX_16X16, 256, 10, 2),
  335. make_tuple(
  336. &vpx_highbd_fdct16x16_c, &highbd_wrapper<vpx_highbd_idct16x16_256_add_c>,
  337. &highbd_wrapper<vpx_highbd_idct16x16_256_add_c>, TX_16X16, 256, 12, 2),
  338. make_tuple(
  339. &vpx_highbd_fdct16x16_c, &highbd_wrapper<vpx_highbd_idct16x16_256_add_c>,
  340. &highbd_wrapper<vpx_highbd_idct16x16_38_add_c>, TX_16X16, 38, 8, 2),
  341. make_tuple(
  342. &vpx_highbd_fdct16x16_c, &highbd_wrapper<vpx_highbd_idct16x16_256_add_c>,
  343. &highbd_wrapper<vpx_highbd_idct16x16_38_add_c>, TX_16X16, 38, 10, 2),
  344. make_tuple(
  345. &vpx_highbd_fdct16x16_c, &highbd_wrapper<vpx_highbd_idct16x16_256_add_c>,
  346. &highbd_wrapper<vpx_highbd_idct16x16_38_add_c>, TX_16X16, 38, 12, 2),
  347. make_tuple(
  348. &vpx_highbd_fdct16x16_c, &highbd_wrapper<vpx_highbd_idct16x16_256_add_c>,
  349. &highbd_wrapper<vpx_highbd_idct16x16_10_add_c>, TX_16X16, 10, 8, 2),
  350. make_tuple(
  351. &vpx_highbd_fdct16x16_c, &highbd_wrapper<vpx_highbd_idct16x16_256_add_c>,
  352. &highbd_wrapper<vpx_highbd_idct16x16_10_add_c>, TX_16X16, 10, 10, 2),
  353. make_tuple(
  354. &vpx_highbd_fdct16x16_c, &highbd_wrapper<vpx_highbd_idct16x16_256_add_c>,
  355. &highbd_wrapper<vpx_highbd_idct16x16_10_add_c>, TX_16X16, 10, 12, 2),
  356. make_tuple(&vpx_highbd_fdct16x16_c,
  357. &highbd_wrapper<vpx_highbd_idct16x16_256_add_c>,
  358. &highbd_wrapper<vpx_highbd_idct16x16_1_add_c>, TX_16X16, 1, 8, 2),
  359. make_tuple(&vpx_highbd_fdct16x16_c,
  360. &highbd_wrapper<vpx_highbd_idct16x16_256_add_c>,
  361. &highbd_wrapper<vpx_highbd_idct16x16_1_add_c>, TX_16X16, 1, 10, 2),
  362. make_tuple(&vpx_highbd_fdct16x16_c,
  363. &highbd_wrapper<vpx_highbd_idct16x16_256_add_c>,
  364. &highbd_wrapper<vpx_highbd_idct16x16_1_add_c>, TX_16X16, 1, 12, 2),
  365. make_tuple(&vpx_highbd_fdct8x8_c,
  366. &highbd_wrapper<vpx_highbd_idct8x8_64_add_c>,
  367. &highbd_wrapper<vpx_highbd_idct8x8_64_add_c>, TX_8X8, 64, 8, 2),
  368. make_tuple(&vpx_highbd_fdct8x8_c,
  369. &highbd_wrapper<vpx_highbd_idct8x8_64_add_c>,
  370. &highbd_wrapper<vpx_highbd_idct8x8_64_add_c>, TX_8X8, 64, 10, 2),
  371. make_tuple(&vpx_highbd_fdct8x8_c,
  372. &highbd_wrapper<vpx_highbd_idct8x8_64_add_c>,
  373. &highbd_wrapper<vpx_highbd_idct8x8_64_add_c>, TX_8X8, 64, 12, 2),
  374. make_tuple(&vpx_highbd_fdct8x8_c,
  375. &highbd_wrapper<vpx_highbd_idct8x8_64_add_c>,
  376. &highbd_wrapper<vpx_highbd_idct8x8_12_add_c>, TX_8X8, 12, 8, 2),
  377. make_tuple(&vpx_highbd_fdct8x8_c,
  378. &highbd_wrapper<vpx_highbd_idct8x8_64_add_c>,
  379. &highbd_wrapper<vpx_highbd_idct8x8_12_add_c>, TX_8X8, 12, 10, 2),
  380. make_tuple(&vpx_highbd_fdct8x8_c,
  381. &highbd_wrapper<vpx_highbd_idct8x8_64_add_c>,
  382. &highbd_wrapper<vpx_highbd_idct8x8_12_add_c>, TX_8X8, 12, 12, 2),
  383. make_tuple(&vpx_highbd_fdct8x8_c,
  384. &highbd_wrapper<vpx_highbd_idct8x8_64_add_c>,
  385. &highbd_wrapper<vpx_highbd_idct8x8_1_add_c>, TX_8X8, 1, 8, 2),
  386. make_tuple(&vpx_highbd_fdct8x8_c,
  387. &highbd_wrapper<vpx_highbd_idct8x8_64_add_c>,
  388. &highbd_wrapper<vpx_highbd_idct8x8_1_add_c>, TX_8X8, 1, 10, 2),
  389. make_tuple(&vpx_highbd_fdct8x8_c,
  390. &highbd_wrapper<vpx_highbd_idct8x8_64_add_c>,
  391. &highbd_wrapper<vpx_highbd_idct8x8_1_add_c>, TX_8X8, 1, 12, 2),
  392. make_tuple(&vpx_highbd_fdct4x4_c,
  393. &highbd_wrapper<vpx_highbd_idct4x4_16_add_c>,
  394. &highbd_wrapper<vpx_highbd_idct4x4_16_add_c>, TX_4X4, 16, 8, 2),
  395. make_tuple(&vpx_highbd_fdct4x4_c,
  396. &highbd_wrapper<vpx_highbd_idct4x4_16_add_c>,
  397. &highbd_wrapper<vpx_highbd_idct4x4_16_add_c>, TX_4X4, 16, 10, 2),
  398. make_tuple(&vpx_highbd_fdct4x4_c,
  399. &highbd_wrapper<vpx_highbd_idct4x4_16_add_c>,
  400. &highbd_wrapper<vpx_highbd_idct4x4_16_add_c>, TX_4X4, 16, 12, 2),
  401. make_tuple(&vpx_highbd_fdct4x4_c,
  402. &highbd_wrapper<vpx_highbd_idct4x4_16_add_c>,
  403. &highbd_wrapper<vpx_highbd_idct4x4_1_add_c>, TX_4X4, 1, 8, 2),
  404. make_tuple(&vpx_highbd_fdct4x4_c,
  405. &highbd_wrapper<vpx_highbd_idct4x4_16_add_c>,
  406. &highbd_wrapper<vpx_highbd_idct4x4_1_add_c>, TX_4X4, 1, 10, 2),
  407. make_tuple(&vpx_highbd_fdct4x4_c,
  408. &highbd_wrapper<vpx_highbd_idct4x4_16_add_c>,
  409. &highbd_wrapper<vpx_highbd_idct4x4_1_add_c>, TX_4X4, 1, 12, 2),
  410. #endif // CONFIG_VP9_HIGHBITDEPTH
  411. make_tuple(&vpx_fdct32x32_c, &wrapper<vpx_idct32x32_1024_add_c>,
  412. &wrapper<vpx_idct32x32_1024_add_c>, TX_32X32, 1024, 8, 1),
  413. make_tuple(&vpx_fdct32x32_c, &wrapper<vpx_idct32x32_1024_add_c>,
  414. &wrapper<vpx_idct32x32_135_add_c>, TX_32X32, 135, 8, 1),
  415. make_tuple(&vpx_fdct32x32_c, &wrapper<vpx_idct32x32_1024_add_c>,
  416. &wrapper<vpx_idct32x32_34_add_c>, TX_32X32, 34, 8, 1),
  417. make_tuple(&vpx_fdct32x32_c, &wrapper<vpx_idct32x32_1024_add_c>,
  418. &wrapper<vpx_idct32x32_1_add_c>, TX_32X32, 1, 8, 1),
  419. make_tuple(&vpx_fdct16x16_c, &wrapper<vpx_idct16x16_256_add_c>,
  420. &wrapper<vpx_idct16x16_256_add_c>, TX_16X16, 256, 8, 1),
  421. make_tuple(&vpx_fdct16x16_c, &wrapper<vpx_idct16x16_256_add_c>,
  422. &wrapper<vpx_idct16x16_38_add_c>, TX_16X16, 38, 8, 1),
  423. make_tuple(&vpx_fdct16x16_c, &wrapper<vpx_idct16x16_256_add_c>,
  424. &wrapper<vpx_idct16x16_10_add_c>, TX_16X16, 10, 8, 1),
  425. make_tuple(&vpx_fdct16x16_c, &wrapper<vpx_idct16x16_256_add_c>,
  426. &wrapper<vpx_idct16x16_1_add_c>, TX_16X16, 1, 8, 1),
  427. make_tuple(&vpx_fdct8x8_c, &wrapper<vpx_idct8x8_64_add_c>,
  428. &wrapper<vpx_idct8x8_64_add_c>, TX_8X8, 64, 8, 1),
  429. make_tuple(&vpx_fdct8x8_c, &wrapper<vpx_idct8x8_64_add_c>,
  430. &wrapper<vpx_idct8x8_12_add_c>, TX_8X8, 12, 8, 1),
  431. make_tuple(&vpx_fdct8x8_c, &wrapper<vpx_idct8x8_64_add_c>,
  432. &wrapper<vpx_idct8x8_1_add_c>, TX_8X8, 1, 8, 1),
  433. make_tuple(&vpx_fdct4x4_c, &wrapper<vpx_idct4x4_16_add_c>,
  434. &wrapper<vpx_idct4x4_16_add_c>, TX_4X4, 16, 8, 1),
  435. make_tuple(&vpx_fdct4x4_c, &wrapper<vpx_idct4x4_16_add_c>,
  436. &wrapper<vpx_idct4x4_1_add_c>, TX_4X4, 1, 8, 1)
  437. };
  438. INSTANTIATE_TEST_CASE_P(C, PartialIDctTest,
  439. ::testing::ValuesIn(c_partial_idct_tests));
  440. #if !CONFIG_EMULATE_HARDWARE
  441. #if HAVE_NEON
  442. const PartialInvTxfmParam neon_partial_idct_tests[] = {
  443. #if CONFIG_VP9_HIGHBITDEPTH
  444. make_tuple(&vpx_highbd_fdct32x32_c,
  445. &highbd_wrapper<vpx_highbd_idct32x32_1024_add_c>,
  446. &highbd_wrapper<vpx_highbd_idct32x32_1024_add_neon>, TX_32X32,
  447. 1024, 8, 2),
  448. make_tuple(&vpx_highbd_fdct32x32_c,
  449. &highbd_wrapper<vpx_highbd_idct32x32_1024_add_c>,
  450. &highbd_wrapper<vpx_highbd_idct32x32_1024_add_neon>, TX_32X32,
  451. 1024, 10, 2),
  452. make_tuple(&vpx_highbd_fdct32x32_c,
  453. &highbd_wrapper<vpx_highbd_idct32x32_1024_add_c>,
  454. &highbd_wrapper<vpx_highbd_idct32x32_1024_add_neon>, TX_32X32,
  455. 1024, 12, 2),
  456. make_tuple(
  457. &vpx_highbd_fdct32x32_c, &highbd_wrapper<vpx_highbd_idct32x32_135_add_c>,
  458. &highbd_wrapper<vpx_highbd_idct32x32_135_add_neon>, TX_32X32, 135, 8, 2),
  459. make_tuple(
  460. &vpx_highbd_fdct32x32_c, &highbd_wrapper<vpx_highbd_idct32x32_135_add_c>,
  461. &highbd_wrapper<vpx_highbd_idct32x32_135_add_neon>, TX_32X32, 135, 10, 2),
  462. make_tuple(
  463. &vpx_highbd_fdct32x32_c, &highbd_wrapper<vpx_highbd_idct32x32_135_add_c>,
  464. &highbd_wrapper<vpx_highbd_idct32x32_135_add_neon>, TX_32X32, 135, 12, 2),
  465. make_tuple(
  466. &vpx_highbd_fdct32x32_c, &highbd_wrapper<vpx_highbd_idct32x32_34_add_c>,
  467. &highbd_wrapper<vpx_highbd_idct32x32_34_add_neon>, TX_32X32, 34, 8, 2),
  468. make_tuple(
  469. &vpx_highbd_fdct32x32_c, &highbd_wrapper<vpx_highbd_idct32x32_34_add_c>,
  470. &highbd_wrapper<vpx_highbd_idct32x32_34_add_neon>, TX_32X32, 34, 10, 2),
  471. make_tuple(
  472. &vpx_highbd_fdct32x32_c, &highbd_wrapper<vpx_highbd_idct32x32_34_add_c>,
  473. &highbd_wrapper<vpx_highbd_idct32x32_34_add_neon>, TX_32X32, 34, 12, 2),
  474. make_tuple(
  475. &vpx_highbd_fdct32x32_c, &highbd_wrapper<vpx_highbd_idct32x32_1_add_c>,
  476. &highbd_wrapper<vpx_highbd_idct32x32_1_add_neon>, TX_32X32, 1, 8, 2),
  477. make_tuple(
  478. &vpx_highbd_fdct32x32_c, &highbd_wrapper<vpx_highbd_idct32x32_1_add_c>,
  479. &highbd_wrapper<vpx_highbd_idct32x32_1_add_neon>, TX_32X32, 1, 10, 2),
  480. make_tuple(
  481. &vpx_highbd_fdct32x32_c, &highbd_wrapper<vpx_highbd_idct32x32_1_add_c>,
  482. &highbd_wrapper<vpx_highbd_idct32x32_1_add_neon>, TX_32X32, 1, 12, 2),
  483. make_tuple(
  484. &vpx_highbd_fdct16x16_c, &highbd_wrapper<vpx_highbd_idct16x16_256_add_c>,
  485. &highbd_wrapper<vpx_highbd_idct16x16_256_add_neon>, TX_16X16, 256, 8, 2),
  486. make_tuple(
  487. &vpx_highbd_fdct16x16_c, &highbd_wrapper<vpx_highbd_idct16x16_256_add_c>,
  488. &highbd_wrapper<vpx_highbd_idct16x16_256_add_neon>, TX_16X16, 256, 10, 2),
  489. make_tuple(
  490. &vpx_highbd_fdct16x16_c, &highbd_wrapper<vpx_highbd_idct16x16_256_add_c>,
  491. &highbd_wrapper<vpx_highbd_idct16x16_256_add_neon>, TX_16X16, 256, 12, 2),
  492. make_tuple(
  493. &vpx_highbd_fdct16x16_c, &highbd_wrapper<vpx_highbd_idct16x16_38_add_c>,
  494. &highbd_wrapper<vpx_highbd_idct16x16_38_add_neon>, TX_16X16, 38, 8, 2),
  495. make_tuple(
  496. &vpx_highbd_fdct16x16_c, &highbd_wrapper<vpx_highbd_idct16x16_38_add_c>,
  497. &highbd_wrapper<vpx_highbd_idct16x16_38_add_neon>, TX_16X16, 38, 10, 2),
  498. make_tuple(
  499. &vpx_highbd_fdct16x16_c, &highbd_wrapper<vpx_highbd_idct16x16_38_add_c>,
  500. &highbd_wrapper<vpx_highbd_idct16x16_38_add_neon>, TX_16X16, 38, 12, 2),
  501. make_tuple(
  502. &vpx_highbd_fdct16x16_c, &highbd_wrapper<vpx_highbd_idct16x16_10_add_c>,
  503. &highbd_wrapper<vpx_highbd_idct16x16_10_add_neon>, TX_16X16, 10, 8, 2),
  504. make_tuple(
  505. &vpx_highbd_fdct16x16_c, &highbd_wrapper<vpx_highbd_idct16x16_10_add_c>,
  506. &highbd_wrapper<vpx_highbd_idct16x16_10_add_neon>, TX_16X16, 10, 10, 2),
  507. make_tuple(
  508. &vpx_highbd_fdct16x16_c, &highbd_wrapper<vpx_highbd_idct16x16_10_add_c>,
  509. &highbd_wrapper<vpx_highbd_idct16x16_10_add_neon>, TX_16X16, 10, 12, 2),
  510. make_tuple(
  511. &vpx_highbd_fdct16x16_c, &highbd_wrapper<vpx_highbd_idct16x16_1_add_c>,
  512. &highbd_wrapper<vpx_highbd_idct16x16_1_add_neon>, TX_16X16, 1, 8, 2),
  513. make_tuple(
  514. &vpx_highbd_fdct16x16_c, &highbd_wrapper<vpx_highbd_idct16x16_1_add_c>,
  515. &highbd_wrapper<vpx_highbd_idct16x16_1_add_neon>, TX_16X16, 1, 10, 2),
  516. make_tuple(
  517. &vpx_highbd_fdct16x16_c, &highbd_wrapper<vpx_highbd_idct16x16_1_add_c>,
  518. &highbd_wrapper<vpx_highbd_idct16x16_1_add_neon>, TX_16X16, 1, 12, 2),
  519. make_tuple(&vpx_highbd_fdct8x8_c,
  520. &highbd_wrapper<vpx_highbd_idct8x8_64_add_c>,
  521. &highbd_wrapper<vpx_highbd_idct8x8_64_add_neon>, TX_8X8, 64, 8, 2),
  522. make_tuple(
  523. &vpx_highbd_fdct8x8_c, &highbd_wrapper<vpx_highbd_idct8x8_64_add_c>,
  524. &highbd_wrapper<vpx_highbd_idct8x8_64_add_neon>, TX_8X8, 64, 10, 2),
  525. make_tuple(
  526. &vpx_highbd_fdct8x8_c, &highbd_wrapper<vpx_highbd_idct8x8_64_add_c>,
  527. &highbd_wrapper<vpx_highbd_idct8x8_64_add_neon>, TX_8X8, 64, 12, 2),
  528. make_tuple(&vpx_highbd_fdct8x8_c,
  529. &highbd_wrapper<vpx_highbd_idct8x8_12_add_c>,
  530. &highbd_wrapper<vpx_highbd_idct8x8_12_add_neon>, TX_8X8, 12, 8, 2),
  531. make_tuple(
  532. &vpx_highbd_fdct8x8_c, &highbd_wrapper<vpx_highbd_idct8x8_12_add_c>,
  533. &highbd_wrapper<vpx_highbd_idct8x8_12_add_neon>, TX_8X8, 12, 10, 2),
  534. make_tuple(
  535. &vpx_highbd_fdct8x8_c, &highbd_wrapper<vpx_highbd_idct8x8_12_add_c>,
  536. &highbd_wrapper<vpx_highbd_idct8x8_12_add_neon>, TX_8X8, 12, 12, 2),
  537. make_tuple(&vpx_highbd_fdct8x8_c, &highbd_wrapper<vpx_highbd_idct8x8_1_add_c>,
  538. &highbd_wrapper<vpx_highbd_idct8x8_1_add_neon>, TX_8X8, 1, 8, 2),
  539. make_tuple(&vpx_highbd_fdct8x8_c, &highbd_wrapper<vpx_highbd_idct8x8_1_add_c>,
  540. &highbd_wrapper<vpx_highbd_idct8x8_1_add_neon>, TX_8X8, 1, 10, 2),
  541. make_tuple(&vpx_highbd_fdct8x8_c, &highbd_wrapper<vpx_highbd_idct8x8_1_add_c>,
  542. &highbd_wrapper<vpx_highbd_idct8x8_1_add_neon>, TX_8X8, 1, 12, 2),
  543. make_tuple(&vpx_highbd_fdct4x4_c,
  544. &highbd_wrapper<vpx_highbd_idct4x4_16_add_c>,
  545. &highbd_wrapper<vpx_highbd_idct4x4_16_add_neon>, TX_4X4, 16, 8, 2),
  546. make_tuple(
  547. &vpx_highbd_fdct4x4_c, &highbd_wrapper<vpx_highbd_idct4x4_16_add_c>,
  548. &highbd_wrapper<vpx_highbd_idct4x4_16_add_neon>, TX_4X4, 16, 10, 2),
  549. make_tuple(
  550. &vpx_highbd_fdct4x4_c, &highbd_wrapper<vpx_highbd_idct4x4_16_add_c>,
  551. &highbd_wrapper<vpx_highbd_idct4x4_16_add_neon>, TX_4X4, 16, 12, 2),
  552. make_tuple(&vpx_highbd_fdct4x4_c, &highbd_wrapper<vpx_highbd_idct4x4_1_add_c>,
  553. &highbd_wrapper<vpx_highbd_idct4x4_1_add_neon>, TX_4X4, 1, 8, 2),
  554. make_tuple(&vpx_highbd_fdct4x4_c, &highbd_wrapper<vpx_highbd_idct4x4_1_add_c>,
  555. &highbd_wrapper<vpx_highbd_idct4x4_1_add_neon>, TX_4X4, 1, 10, 2),
  556. make_tuple(&vpx_highbd_fdct4x4_c, &highbd_wrapper<vpx_highbd_idct4x4_1_add_c>,
  557. &highbd_wrapper<vpx_highbd_idct4x4_1_add_neon>, TX_4X4, 1, 12, 2),
  558. #endif // CONFIG_VP9_HIGHBITDEPTH
  559. make_tuple(&vpx_fdct32x32_c, &wrapper<vpx_idct32x32_1024_add_c>,
  560. &wrapper<vpx_idct32x32_1024_add_neon>, TX_32X32, 1024, 8, 1),
  561. make_tuple(&vpx_fdct32x32_c, &wrapper<vpx_idct32x32_135_add_c>,
  562. &wrapper<vpx_idct32x32_135_add_neon>, TX_32X32, 135, 8, 1),
  563. make_tuple(&vpx_fdct32x32_c, &wrapper<vpx_idct32x32_34_add_c>,
  564. &wrapper<vpx_idct32x32_34_add_neon>, TX_32X32, 34, 8, 1),
  565. make_tuple(&vpx_fdct32x32_c, &wrapper<vpx_idct32x32_1_add_c>,
  566. &wrapper<vpx_idct32x32_1_add_neon>, TX_32X32, 1, 8, 1),
  567. make_tuple(&vpx_fdct16x16_c, &wrapper<vpx_idct16x16_256_add_c>,
  568. &wrapper<vpx_idct16x16_256_add_neon>, TX_16X16, 256, 8, 1),
  569. make_tuple(&vpx_fdct16x16_c, &wrapper<vpx_idct16x16_38_add_c>,
  570. &wrapper<vpx_idct16x16_38_add_neon>, TX_16X16, 38, 8, 1),
  571. make_tuple(&vpx_fdct16x16_c, &wrapper<vpx_idct16x16_10_add_c>,
  572. &wrapper<vpx_idct16x16_10_add_neon>, TX_16X16, 10, 8, 1),
  573. make_tuple(&vpx_fdct16x16_c, &wrapper<vpx_idct16x16_1_add_c>,
  574. &wrapper<vpx_idct16x16_1_add_neon>, TX_16X16, 1, 8, 1),
  575. make_tuple(&vpx_fdct8x8_c, &wrapper<vpx_idct8x8_64_add_c>,
  576. &wrapper<vpx_idct8x8_64_add_neon>, TX_8X8, 64, 8, 1),
  577. make_tuple(&vpx_fdct8x8_c, &wrapper<vpx_idct8x8_12_add_c>,
  578. &wrapper<vpx_idct8x8_12_add_neon>, TX_8X8, 12, 8, 1),
  579. make_tuple(&vpx_fdct8x8_c, &wrapper<vpx_idct8x8_1_add_c>,
  580. &wrapper<vpx_idct8x8_1_add_neon>, TX_8X8, 1, 8, 1),
  581. make_tuple(&vpx_fdct4x4_c, &wrapper<vpx_idct4x4_16_add_c>,
  582. &wrapper<vpx_idct4x4_16_add_neon>, TX_4X4, 16, 8, 1),
  583. make_tuple(&vpx_fdct4x4_c, &wrapper<vpx_idct4x4_1_add_c>,
  584. &wrapper<vpx_idct4x4_1_add_neon>, TX_4X4, 1, 8, 1)
  585. };
  586. INSTANTIATE_TEST_CASE_P(NEON, PartialIDctTest,
  587. ::testing::ValuesIn(neon_partial_idct_tests));
  588. #endif // HAVE_NEON
  589. #if HAVE_SSE2
  590. // 32x32_135_ is implemented using the 1024 version.
  591. const PartialInvTxfmParam sse2_partial_idct_tests[] = {
  592. #if CONFIG_VP9_HIGHBITDEPTH
  593. make_tuple(&vpx_highbd_fdct32x32_c,
  594. &highbd_wrapper<vpx_highbd_idct32x32_1024_add_c>,
  595. &highbd_wrapper<vpx_highbd_idct32x32_1024_add_sse2>, TX_32X32,
  596. 1024, 8, 2),
  597. make_tuple(&vpx_highbd_fdct32x32_c,
  598. &highbd_wrapper<vpx_highbd_idct32x32_1024_add_c>,
  599. &highbd_wrapper<vpx_highbd_idct32x32_1024_add_sse2>, TX_32X32,
  600. 1024, 10, 2),
  601. make_tuple(&vpx_highbd_fdct32x32_c,
  602. &highbd_wrapper<vpx_highbd_idct32x32_1024_add_c>,
  603. &highbd_wrapper<vpx_highbd_idct32x32_1024_add_sse2>, TX_32X32,
  604. 1024, 12, 2),
  605. make_tuple(
  606. &vpx_highbd_fdct32x32_c, &highbd_wrapper<vpx_highbd_idct32x32_135_add_c>,
  607. &highbd_wrapper<vpx_highbd_idct32x32_135_add_sse2>, TX_32X32, 135, 8, 2),
  608. make_tuple(
  609. &vpx_highbd_fdct32x32_c, &highbd_wrapper<vpx_highbd_idct32x32_135_add_c>,
  610. &highbd_wrapper<vpx_highbd_idct32x32_135_add_sse2>, TX_32X32, 135, 10, 2),
  611. make_tuple(
  612. &vpx_highbd_fdct32x32_c, &highbd_wrapper<vpx_highbd_idct32x32_135_add_c>,
  613. &highbd_wrapper<vpx_highbd_idct32x32_135_add_sse2>, TX_32X32, 135, 12, 2),
  614. make_tuple(
  615. &vpx_highbd_fdct32x32_c, &highbd_wrapper<vpx_highbd_idct32x32_34_add_c>,
  616. &highbd_wrapper<vpx_highbd_idct32x32_34_add_sse2>, TX_32X32, 34, 8, 2),
  617. make_tuple(
  618. &vpx_highbd_fdct32x32_c, &highbd_wrapper<vpx_highbd_idct32x32_34_add_c>,
  619. &highbd_wrapper<vpx_highbd_idct32x32_34_add_sse2>, TX_32X32, 34, 10, 2),
  620. make_tuple(
  621. &vpx_highbd_fdct32x32_c, &highbd_wrapper<vpx_highbd_idct32x32_34_add_c>,
  622. &highbd_wrapper<vpx_highbd_idct32x32_34_add_sse2>, TX_32X32, 34, 12, 2),
  623. make_tuple(
  624. &vpx_highbd_fdct32x32_c, &highbd_wrapper<vpx_highbd_idct32x32_1_add_c>,
  625. &highbd_wrapper<vpx_highbd_idct32x32_1_add_sse2>, TX_32X32, 1, 8, 2),
  626. make_tuple(
  627. &vpx_highbd_fdct32x32_c, &highbd_wrapper<vpx_highbd_idct32x32_1_add_c>,
  628. &highbd_wrapper<vpx_highbd_idct32x32_1_add_sse2>, TX_32X32, 1, 10, 2),
  629. make_tuple(
  630. &vpx_highbd_fdct32x32_c, &highbd_wrapper<vpx_highbd_idct32x32_1_add_c>,
  631. &highbd_wrapper<vpx_highbd_idct32x32_1_add_sse2>, TX_32X32, 1, 12, 2),
  632. make_tuple(
  633. &vpx_highbd_fdct16x16_c, &highbd_wrapper<vpx_highbd_idct16x16_256_add_c>,
  634. &highbd_wrapper<vpx_highbd_idct16x16_256_add_sse2>, TX_16X16, 256, 8, 2),
  635. make_tuple(
  636. &vpx_highbd_fdct16x16_c, &highbd_wrapper<vpx_highbd_idct16x16_256_add_c>,
  637. &highbd_wrapper<vpx_highbd_idct16x16_256_add_sse2>, TX_16X16, 256, 10, 2),
  638. make_tuple(
  639. &vpx_highbd_fdct16x16_c, &highbd_wrapper<vpx_highbd_idct16x16_256_add_c>,
  640. &highbd_wrapper<vpx_highbd_idct16x16_256_add_sse2>, TX_16X16, 256, 12, 2),
  641. make_tuple(
  642. &vpx_highbd_fdct16x16_c, &highbd_wrapper<vpx_highbd_idct16x16_38_add_c>,
  643. &highbd_wrapper<vpx_highbd_idct16x16_38_add_sse2>, TX_16X16, 38, 8, 2),
  644. make_tuple(
  645. &vpx_highbd_fdct16x16_c, &highbd_wrapper<vpx_highbd_idct16x16_38_add_c>,
  646. &highbd_wrapper<vpx_highbd_idct16x16_38_add_sse2>, TX_16X16, 38, 10, 2),
  647. make_tuple(
  648. &vpx_highbd_fdct16x16_c, &highbd_wrapper<vpx_highbd_idct16x16_38_add_c>,
  649. &highbd_wrapper<vpx_highbd_idct16x16_38_add_sse2>, TX_16X16, 38, 12, 2),
  650. make_tuple(
  651. &vpx_highbd_fdct16x16_c, &highbd_wrapper<vpx_highbd_idct16x16_10_add_c>,
  652. &highbd_wrapper<vpx_highbd_idct16x16_10_add_sse2>, TX_16X16, 10, 8, 2),
  653. make_tuple(
  654. &vpx_highbd_fdct16x16_c, &highbd_wrapper<vpx_highbd_idct16x16_10_add_c>,
  655. &highbd_wrapper<vpx_highbd_idct16x16_10_add_sse2>, TX_16X16, 10, 10, 2),
  656. make_tuple(
  657. &vpx_highbd_fdct16x16_c, &highbd_wrapper<vpx_highbd_idct16x16_10_add_c>,
  658. &highbd_wrapper<vpx_highbd_idct16x16_10_add_sse2>, TX_16X16, 10, 12, 2),
  659. make_tuple(
  660. &vpx_highbd_fdct16x16_c, &highbd_wrapper<vpx_highbd_idct16x16_1_add_c>,
  661. &highbd_wrapper<vpx_highbd_idct16x16_1_add_sse2>, TX_16X16, 1, 8, 2),
  662. make_tuple(
  663. &vpx_highbd_fdct16x16_c, &highbd_wrapper<vpx_highbd_idct16x16_1_add_c>,
  664. &highbd_wrapper<vpx_highbd_idct16x16_1_add_sse2>, TX_16X16, 1, 10, 2),
  665. make_tuple(
  666. &vpx_highbd_fdct16x16_c, &highbd_wrapper<vpx_highbd_idct16x16_1_add_c>,
  667. &highbd_wrapper<vpx_highbd_idct16x16_1_add_sse2>, TX_16X16, 1, 12, 2),
  668. make_tuple(&vpx_highbd_fdct8x8_c,
  669. &highbd_wrapper<vpx_highbd_idct8x8_64_add_c>,
  670. &highbd_wrapper<vpx_highbd_idct8x8_64_add_sse2>, TX_8X8, 64, 8, 2),
  671. make_tuple(
  672. &vpx_highbd_fdct8x8_c, &highbd_wrapper<vpx_highbd_idct8x8_64_add_c>,
  673. &highbd_wrapper<vpx_highbd_idct8x8_64_add_sse2>, TX_8X8, 64, 10, 2),
  674. make_tuple(
  675. &vpx_highbd_fdct8x8_c, &highbd_wrapper<vpx_highbd_idct8x8_64_add_c>,
  676. &highbd_wrapper<vpx_highbd_idct8x8_64_add_sse2>, TX_8X8, 64, 12, 2),
  677. make_tuple(&vpx_highbd_fdct8x8_c,
  678. &highbd_wrapper<vpx_highbd_idct8x8_12_add_c>,
  679. &highbd_wrapper<vpx_highbd_idct8x8_12_add_sse2>, TX_8X8, 12, 8, 2),
  680. make_tuple(
  681. &vpx_highbd_fdct8x8_c, &highbd_wrapper<vpx_highbd_idct8x8_12_add_c>,
  682. &highbd_wrapper<vpx_highbd_idct8x8_12_add_sse2>, TX_8X8, 12, 10, 2),
  683. make_tuple(
  684. &vpx_highbd_fdct8x8_c, &highbd_wrapper<vpx_highbd_idct8x8_12_add_c>,
  685. &highbd_wrapper<vpx_highbd_idct8x8_12_add_sse2>, TX_8X8, 12, 12, 2),
  686. make_tuple(&vpx_highbd_fdct8x8_c, &highbd_wrapper<vpx_highbd_idct8x8_1_add_c>,
  687. &highbd_wrapper<vpx_highbd_idct8x8_1_add_sse2>, TX_8X8, 1, 8, 2),
  688. make_tuple(&vpx_highbd_fdct8x8_c, &highbd_wrapper<vpx_highbd_idct8x8_1_add_c>,
  689. &highbd_wrapper<vpx_highbd_idct8x8_1_add_sse2>, TX_8X8, 1, 10, 2),
  690. make_tuple(&vpx_highbd_fdct8x8_c, &highbd_wrapper<vpx_highbd_idct8x8_1_add_c>,
  691. &highbd_wrapper<vpx_highbd_idct8x8_1_add_sse2>, TX_8X8, 1, 12, 2),
  692. make_tuple(&vpx_highbd_fdct4x4_c,
  693. &highbd_wrapper<vpx_highbd_idct4x4_16_add_c>,
  694. &highbd_wrapper<vpx_highbd_idct4x4_16_add_sse2>, TX_4X4, 16, 8, 2),
  695. make_tuple(
  696. &vpx_highbd_fdct4x4_c, &highbd_wrapper<vpx_highbd_idct4x4_16_add_c>,
  697. &highbd_wrapper<vpx_highbd_idct4x4_16_add_sse2>, TX_4X4, 16, 10, 2),
  698. make_tuple(
  699. &vpx_highbd_fdct4x4_c, &highbd_wrapper<vpx_highbd_idct4x4_16_add_c>,
  700. &highbd_wrapper<vpx_highbd_idct4x4_16_add_sse2>, TX_4X4, 16, 12, 2),
  701. make_tuple(&vpx_highbd_fdct4x4_c, &highbd_wrapper<vpx_highbd_idct4x4_1_add_c>,
  702. &highbd_wrapper<vpx_highbd_idct4x4_1_add_sse2>, TX_4X4, 1, 8, 2),
  703. make_tuple(&vpx_highbd_fdct4x4_c, &highbd_wrapper<vpx_highbd_idct4x4_1_add_c>,
  704. &highbd_wrapper<vpx_highbd_idct4x4_1_add_sse2>, TX_4X4, 1, 10, 2),
  705. make_tuple(&vpx_highbd_fdct4x4_c, &highbd_wrapper<vpx_highbd_idct4x4_1_add_c>,
  706. &highbd_wrapper<vpx_highbd_idct4x4_1_add_sse2>, TX_4X4, 1, 12, 2),
  707. #endif // CONFIG_VP9_HIGHBITDEPTH
  708. make_tuple(&vpx_fdct32x32_c, &wrapper<vpx_idct32x32_1024_add_c>,
  709. &wrapper<vpx_idct32x32_1024_add_sse2>, TX_32X32, 1024, 8, 1),
  710. make_tuple(&vpx_fdct32x32_c, &wrapper<vpx_idct32x32_135_add_c>,
  711. &wrapper<vpx_idct32x32_135_add_sse2>, TX_32X32, 135, 8, 1),
  712. make_tuple(&vpx_fdct32x32_c, &wrapper<vpx_idct32x32_34_add_c>,
  713. &wrapper<vpx_idct32x32_34_add_sse2>, TX_32X32, 34, 8, 1),
  714. make_tuple(&vpx_fdct32x32_c, &wrapper<vpx_idct32x32_1_add_c>,
  715. &wrapper<vpx_idct32x32_1_add_sse2>, TX_32X32, 1, 8, 1),
  716. make_tuple(&vpx_fdct16x16_c, &wrapper<vpx_idct16x16_256_add_c>,
  717. &wrapper<vpx_idct16x16_256_add_sse2>, TX_16X16, 256, 8, 1),
  718. make_tuple(&vpx_fdct16x16_c, &wrapper<vpx_idct16x16_38_add_c>,
  719. &wrapper<vpx_idct16x16_38_add_sse2>, TX_16X16, 38, 8, 1),
  720. make_tuple(&vpx_fdct16x16_c, &wrapper<vpx_idct16x16_10_add_c>,
  721. &wrapper<vpx_idct16x16_10_add_sse2>, TX_16X16, 10, 8, 1),
  722. make_tuple(&vpx_fdct16x16_c, &wrapper<vpx_idct16x16_1_add_c>,
  723. &wrapper<vpx_idct16x16_1_add_sse2>, TX_16X16, 1, 8, 1),
  724. make_tuple(&vpx_fdct8x8_c, &wrapper<vpx_idct8x8_64_add_c>,
  725. &wrapper<vpx_idct8x8_64_add_sse2>, TX_8X8, 64, 8, 1),
  726. make_tuple(&vpx_fdct8x8_c, &wrapper<vpx_idct8x8_12_add_c>,
  727. &wrapper<vpx_idct8x8_12_add_sse2>, TX_8X8, 12, 8, 1),
  728. make_tuple(&vpx_fdct8x8_c, &wrapper<vpx_idct8x8_1_add_c>,
  729. &wrapper<vpx_idct8x8_1_add_sse2>, TX_8X8, 1, 8, 1),
  730. make_tuple(&vpx_fdct4x4_c, &wrapper<vpx_idct4x4_16_add_c>,
  731. &wrapper<vpx_idct4x4_16_add_sse2>, TX_4X4, 16, 8, 1),
  732. make_tuple(&vpx_fdct4x4_c, &wrapper<vpx_idct4x4_1_add_c>,
  733. &wrapper<vpx_idct4x4_1_add_sse2>, TX_4X4, 1, 8, 1)
  734. };
  735. INSTANTIATE_TEST_CASE_P(SSE2, PartialIDctTest,
  736. ::testing::ValuesIn(sse2_partial_idct_tests));
  737. #endif // HAVE_SSE2
  738. #if HAVE_SSSE3
  739. const PartialInvTxfmParam ssse3_partial_idct_tests[] = {
  740. make_tuple(&vpx_fdct32x32_c, &wrapper<vpx_idct32x32_135_add_c>,
  741. &wrapper<vpx_idct32x32_135_add_ssse3>, TX_32X32, 135, 8, 1),
  742. make_tuple(&vpx_fdct32x32_c, &wrapper<vpx_idct32x32_34_add_c>,
  743. &wrapper<vpx_idct32x32_34_add_ssse3>, TX_32X32, 34, 8, 1),
  744. make_tuple(&vpx_fdct8x8_c, &wrapper<vpx_idct8x8_12_add_c>,
  745. &wrapper<vpx_idct8x8_12_add_ssse3>, TX_8X8, 12, 8, 1)
  746. };
  747. INSTANTIATE_TEST_CASE_P(SSSE3, PartialIDctTest,
  748. ::testing::ValuesIn(ssse3_partial_idct_tests));
  749. #endif // HAVE_SSSE3
  750. #if HAVE_SSE4_1 && CONFIG_VP9_HIGHBITDEPTH
  751. const PartialInvTxfmParam sse4_1_partial_idct_tests[] = {
  752. make_tuple(&vpx_highbd_fdct32x32_c,
  753. &highbd_wrapper<vpx_highbd_idct32x32_1024_add_c>,
  754. &highbd_wrapper<vpx_highbd_idct32x32_1024_add_sse4_1>, TX_32X32,
  755. 1024, 8, 2),
  756. make_tuple(&vpx_highbd_fdct32x32_c,
  757. &highbd_wrapper<vpx_highbd_idct32x32_1024_add_c>,
  758. &highbd_wrapper<vpx_highbd_idct32x32_1024_add_sse4_1>, TX_32X32,
  759. 1024, 10, 2),
  760. make_tuple(&vpx_highbd_fdct32x32_c,
  761. &highbd_wrapper<vpx_highbd_idct32x32_1024_add_c>,
  762. &highbd_wrapper<vpx_highbd_idct32x32_1024_add_sse4_1>, TX_32X32,
  763. 1024, 12, 2),
  764. make_tuple(&vpx_highbd_fdct32x32_c,
  765. &highbd_wrapper<vpx_highbd_idct32x32_135_add_c>,
  766. &highbd_wrapper<vpx_highbd_idct32x32_135_add_sse4_1>, TX_32X32,
  767. 135, 8, 2),
  768. make_tuple(&vpx_highbd_fdct32x32_c,
  769. &highbd_wrapper<vpx_highbd_idct32x32_135_add_c>,
  770. &highbd_wrapper<vpx_highbd_idct32x32_135_add_sse4_1>, TX_32X32,
  771. 135, 10, 2),
  772. make_tuple(&vpx_highbd_fdct32x32_c,
  773. &highbd_wrapper<vpx_highbd_idct32x32_135_add_c>,
  774. &highbd_wrapper<vpx_highbd_idct32x32_135_add_sse4_1>, TX_32X32,
  775. 135, 12, 2),
  776. make_tuple(
  777. &vpx_highbd_fdct32x32_c, &highbd_wrapper<vpx_highbd_idct32x32_34_add_c>,
  778. &highbd_wrapper<vpx_highbd_idct32x32_34_add_sse4_1>, TX_32X32, 34, 8, 2),
  779. make_tuple(
  780. &vpx_highbd_fdct32x32_c, &highbd_wrapper<vpx_highbd_idct32x32_34_add_c>,
  781. &highbd_wrapper<vpx_highbd_idct32x32_34_add_sse4_1>, TX_32X32, 34, 10, 2),
  782. make_tuple(
  783. &vpx_highbd_fdct32x32_c, &highbd_wrapper<vpx_highbd_idct32x32_34_add_c>,
  784. &highbd_wrapper<vpx_highbd_idct32x32_34_add_sse4_1>, TX_32X32, 34, 12, 2),
  785. make_tuple(&vpx_highbd_fdct16x16_c,
  786. &highbd_wrapper<vpx_highbd_idct16x16_256_add_c>,
  787. &highbd_wrapper<vpx_highbd_idct16x16_256_add_sse4_1>, TX_16X16,
  788. 256, 8, 2),
  789. make_tuple(&vpx_highbd_fdct16x16_c,
  790. &highbd_wrapper<vpx_highbd_idct16x16_256_add_c>,
  791. &highbd_wrapper<vpx_highbd_idct16x16_256_add_sse4_1>, TX_16X16,
  792. 256, 10, 2),
  793. make_tuple(&vpx_highbd_fdct16x16_c,
  794. &highbd_wrapper<vpx_highbd_idct16x16_256_add_c>,
  795. &highbd_wrapper<vpx_highbd_idct16x16_256_add_sse4_1>, TX_16X16,
  796. 256, 12, 2),
  797. make_tuple(
  798. &vpx_highbd_fdct16x16_c, &highbd_wrapper<vpx_highbd_idct16x16_38_add_c>,
  799. &highbd_wrapper<vpx_highbd_idct16x16_38_add_sse4_1>, TX_16X16, 38, 8, 2),
  800. make_tuple(
  801. &vpx_highbd_fdct16x16_c, &highbd_wrapper<vpx_highbd_idct16x16_38_add_c>,
  802. &highbd_wrapper<vpx_highbd_idct16x16_38_add_sse4_1>, TX_16X16, 38, 10, 2),
  803. make_tuple(
  804. &vpx_highbd_fdct16x16_c, &highbd_wrapper<vpx_highbd_idct16x16_38_add_c>,
  805. &highbd_wrapper<vpx_highbd_idct16x16_38_add_sse4_1>, TX_16X16, 38, 12, 2),
  806. make_tuple(
  807. &vpx_highbd_fdct16x16_c, &highbd_wrapper<vpx_highbd_idct16x16_10_add_c>,
  808. &highbd_wrapper<vpx_highbd_idct16x16_10_add_sse4_1>, TX_16X16, 10, 8, 2),
  809. make_tuple(
  810. &vpx_highbd_fdct16x16_c, &highbd_wrapper<vpx_highbd_idct16x16_10_add_c>,
  811. &highbd_wrapper<vpx_highbd_idct16x16_10_add_sse4_1>, TX_16X16, 10, 10, 2),
  812. make_tuple(
  813. &vpx_highbd_fdct16x16_c, &highbd_wrapper<vpx_highbd_idct16x16_10_add_c>,
  814. &highbd_wrapper<vpx_highbd_idct16x16_10_add_sse4_1>, TX_16X16, 10, 12, 2),
  815. make_tuple(
  816. &vpx_highbd_fdct8x8_c, &highbd_wrapper<vpx_highbd_idct8x8_64_add_c>,
  817. &highbd_wrapper<vpx_highbd_idct8x8_64_add_sse4_1>, TX_8X8, 64, 8, 2),
  818. make_tuple(
  819. &vpx_highbd_fdct8x8_c, &highbd_wrapper<vpx_highbd_idct8x8_64_add_c>,
  820. &highbd_wrapper<vpx_highbd_idct8x8_64_add_sse4_1>, TX_8X8, 64, 10, 2),
  821. make_tuple(
  822. &vpx_highbd_fdct8x8_c, &highbd_wrapper<vpx_highbd_idct8x8_64_add_c>,
  823. &highbd_wrapper<vpx_highbd_idct8x8_64_add_sse4_1>, TX_8X8, 64, 12, 2),
  824. make_tuple(
  825. &vpx_highbd_fdct8x8_c, &highbd_wrapper<vpx_highbd_idct8x8_12_add_c>,
  826. &highbd_wrapper<vpx_highbd_idct8x8_12_add_sse4_1>, TX_8X8, 12, 8, 2),
  827. make_tuple(
  828. &vpx_highbd_fdct8x8_c, &highbd_wrapper<vpx_highbd_idct8x8_12_add_c>,
  829. &highbd_wrapper<vpx_highbd_idct8x8_12_add_sse4_1>, TX_8X8, 12, 10, 2),
  830. make_tuple(
  831. &vpx_highbd_fdct8x8_c, &highbd_wrapper<vpx_highbd_idct8x8_12_add_c>,
  832. &highbd_wrapper<vpx_highbd_idct8x8_12_add_sse4_1>, TX_8X8, 12, 12, 2),
  833. make_tuple(
  834. &vpx_highbd_fdct4x4_c, &highbd_wrapper<vpx_highbd_idct4x4_16_add_c>,
  835. &highbd_wrapper<vpx_highbd_idct4x4_16_add_sse4_1>, TX_4X4, 16, 8, 2),
  836. make_tuple(
  837. &vpx_highbd_fdct4x4_c, &highbd_wrapper<vpx_highbd_idct4x4_16_add_c>,
  838. &highbd_wrapper<vpx_highbd_idct4x4_16_add_sse4_1>, TX_4X4, 16, 10, 2),
  839. make_tuple(
  840. &vpx_highbd_fdct4x4_c, &highbd_wrapper<vpx_highbd_idct4x4_16_add_c>,
  841. &highbd_wrapper<vpx_highbd_idct4x4_16_add_sse4_1>, TX_4X4, 16, 12, 2)
  842. };
  843. INSTANTIATE_TEST_CASE_P(SSE4_1, PartialIDctTest,
  844. ::testing::ValuesIn(sse4_1_partial_idct_tests));
  845. #endif // HAVE_SSE4_1 && CONFIG_VP9_HIGHBITDEPTH
  846. #if HAVE_DSPR2 && !CONFIG_VP9_HIGHBITDEPTH
  847. const PartialInvTxfmParam dspr2_partial_idct_tests[] = {
  848. make_tuple(&vpx_fdct32x32_c, &wrapper<vpx_idct32x32_1024_add_c>,
  849. &wrapper<vpx_idct32x32_1024_add_dspr2>, TX_32X32, 1024, 8, 1),
  850. make_tuple(&vpx_fdct32x32_c, &wrapper<vpx_idct32x32_34_add_c>,
  851. &wrapper<vpx_idct32x32_34_add_dspr2>, TX_32X32, 34, 8, 1),
  852. make_tuple(&vpx_fdct32x32_c, &wrapper<vpx_idct32x32_1_add_c>,
  853. &wrapper<vpx_idct32x32_1_add_dspr2>, TX_32X32, 1, 8, 1),
  854. make_tuple(&vpx_fdct16x16_c, &wrapper<vpx_idct16x16_256_add_c>,
  855. &wrapper<vpx_idct16x16_256_add_dspr2>, TX_16X16, 256, 8, 1),
  856. make_tuple(&vpx_fdct16x16_c, &wrapper<vpx_idct16x16_10_add_c>,
  857. &wrapper<vpx_idct16x16_10_add_dspr2>, TX_16X16, 10, 8, 1),
  858. make_tuple(&vpx_fdct16x16_c, &wrapper<vpx_idct16x16_1_add_c>,
  859. &wrapper<vpx_idct16x16_1_add_dspr2>, TX_16X16, 1, 8, 1),
  860. make_tuple(&vpx_fdct8x8_c, &wrapper<vpx_idct8x8_64_add_c>,
  861. &wrapper<vpx_idct8x8_64_add_dspr2>, TX_8X8, 64, 8, 1),
  862. make_tuple(&vpx_fdct8x8_c, &wrapper<vpx_idct8x8_12_add_c>,
  863. &wrapper<vpx_idct8x8_12_add_dspr2>, TX_8X8, 12, 8, 1),
  864. make_tuple(&vpx_fdct8x8_c, &wrapper<vpx_idct8x8_1_add_c>,
  865. &wrapper<vpx_idct8x8_1_add_dspr2>, TX_8X8, 1, 8, 1),
  866. make_tuple(&vpx_fdct4x4_c, &wrapper<vpx_idct4x4_16_add_c>,
  867. &wrapper<vpx_idct4x4_16_add_dspr2>, TX_4X4, 16, 8, 1),
  868. make_tuple(&vpx_fdct4x4_c, &wrapper<vpx_idct4x4_1_add_c>,
  869. &wrapper<vpx_idct4x4_1_add_dspr2>, TX_4X4, 1, 8, 1)
  870. };
  871. INSTANTIATE_TEST_CASE_P(DSPR2, PartialIDctTest,
  872. ::testing::ValuesIn(dspr2_partial_idct_tests));
  873. #endif // HAVE_DSPR2 && !CONFIG_VP9_HIGHBITDEPTH
  874. #if HAVE_MSA && !CONFIG_VP9_HIGHBITDEPTH
  875. // 32x32_135_ is implemented using the 1024 version.
  876. const PartialInvTxfmParam msa_partial_idct_tests[] = {
  877. make_tuple(&vpx_fdct32x32_c, &wrapper<vpx_idct32x32_1024_add_c>,
  878. &wrapper<vpx_idct32x32_1024_add_msa>, TX_32X32, 1024, 8, 1),
  879. make_tuple(&vpx_fdct32x32_c, &wrapper<vpx_idct32x32_34_add_c>,
  880. &wrapper<vpx_idct32x32_34_add_msa>, TX_32X32, 34, 8, 1),
  881. make_tuple(&vpx_fdct32x32_c, &wrapper<vpx_idct32x32_1_add_c>,
  882. &wrapper<vpx_idct32x32_1_add_msa>, TX_32X32, 1, 8, 1),
  883. make_tuple(&vpx_fdct16x16_c, &wrapper<vpx_idct16x16_256_add_c>,
  884. &wrapper<vpx_idct16x16_256_add_msa>, TX_16X16, 256, 8, 1),
  885. make_tuple(&vpx_fdct16x16_c, &wrapper<vpx_idct16x16_10_add_c>,
  886. &wrapper<vpx_idct16x16_10_add_msa>, TX_16X16, 10, 8, 1),
  887. make_tuple(&vpx_fdct16x16_c, &wrapper<vpx_idct16x16_1_add_c>,
  888. &wrapper<vpx_idct16x16_1_add_msa>, TX_16X16, 1, 8, 1),
  889. make_tuple(&vpx_fdct8x8_c, &wrapper<vpx_idct8x8_64_add_c>,
  890. &wrapper<vpx_idct8x8_64_add_msa>, TX_8X8, 64, 8, 1),
  891. make_tuple(&vpx_fdct8x8_c, &wrapper<vpx_idct8x8_12_add_c>,
  892. &wrapper<vpx_idct8x8_12_add_msa>, TX_8X8, 12, 8, 1),
  893. make_tuple(&vpx_fdct8x8_c, &wrapper<vpx_idct8x8_1_add_c>,
  894. &wrapper<vpx_idct8x8_1_add_msa>, TX_8X8, 1, 8, 1),
  895. make_tuple(&vpx_fdct4x4_c, &wrapper<vpx_idct4x4_16_add_c>,
  896. &wrapper<vpx_idct4x4_16_add_msa>, TX_4X4, 16, 8, 1),
  897. make_tuple(&vpx_fdct4x4_c, &wrapper<vpx_idct4x4_1_add_c>,
  898. &wrapper<vpx_idct4x4_1_add_msa>, TX_4X4, 1, 8, 1)
  899. };
  900. INSTANTIATE_TEST_CASE_P(MSA, PartialIDctTest,
  901. ::testing::ValuesIn(msa_partial_idct_tests));
  902. #endif // HAVE_MSA && !CONFIG_VP9_HIGHBITDEPTH
  903. #endif // !CONFIG_EMULATE_HARDWARE
  904. } // namespace