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