2 * Copyright (c) 2012 The WebM project authors. All Rights Reserved.
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.
15 #include "third_party/googletest/src/include/gtest/gtest.h"
17 #include "./vp9_rtcd.h"
18 #include "./vpx_dsp_rtcd.h"
19 #include "test/acm_random.h"
20 #include "test/clear_system_state.h"
21 #include "test/register_state_check.h"
22 #include "test/util.h"
23 #include "vp9/common/vp9_entropy.h"
24 #include "vpx/vpx_codec.h"
25 #include "vpx/vpx_integer.h"
26 #include "vpx_ports/mem.h"
28 using libvpx_test::ACMRandom
;
31 const int kNumCoeffs
= 16;
32 typedef void (*FdctFunc
)(const int16_t *in
, tran_low_t
*out
, int stride
);
33 typedef void (*IdctFunc
)(const tran_low_t
*in
, uint8_t *out
, int stride
);
34 typedef void (*FhtFunc
)(const int16_t *in
, tran_low_t
*out
, int stride
,
36 typedef void (*IhtFunc
)(const tran_low_t
*in
, uint8_t *out
, int stride
,
39 typedef std::tr1::tuple
<FdctFunc
, IdctFunc
, int, vpx_bit_depth_t
> Dct4x4Param
;
40 typedef std::tr1::tuple
<FhtFunc
, IhtFunc
, int, vpx_bit_depth_t
> Ht4x4Param
;
42 void fdct4x4_ref(const int16_t *in
, tran_low_t
*out
, int stride
,
44 vpx_fdct4x4_c(in
, out
, stride
);
47 void fht4x4_ref(const int16_t *in
, tran_low_t
*out
, int stride
, int tx_type
) {
48 vp9_fht4x4_c(in
, out
, stride
, tx_type
);
51 void fwht4x4_ref(const int16_t *in
, tran_low_t
*out
, int stride
,
53 vp9_fwht4x4_c(in
, out
, stride
);
56 #if CONFIG_VP9_HIGHBITDEPTH
57 void idct4x4_10(const tran_low_t
*in
, uint8_t *out
, int stride
) {
58 vpx_highbd_idct4x4_16_add_c(in
, out
, stride
, 10);
61 void idct4x4_12(const tran_low_t
*in
, uint8_t *out
, int stride
) {
62 vpx_highbd_idct4x4_16_add_c(in
, out
, stride
, 12);
65 void iht4x4_10(const tran_low_t
*in
, uint8_t *out
, int stride
, int tx_type
) {
66 vp9_highbd_iht4x4_16_add_c(in
, out
, stride
, tx_type
, 10);
69 void iht4x4_12(const tran_low_t
*in
, uint8_t *out
, int stride
, int tx_type
) {
70 vp9_highbd_iht4x4_16_add_c(in
, out
, stride
, tx_type
, 12);
73 void iwht4x4_10(const tran_low_t
*in
, uint8_t *out
, int stride
) {
74 vpx_highbd_iwht4x4_16_add_c(in
, out
, stride
, 10);
77 void iwht4x4_12(const tran_low_t
*in
, uint8_t *out
, int stride
) {
78 vpx_highbd_iwht4x4_16_add_c(in
, out
, stride
, 12);
82 void idct4x4_10_sse2(const tran_low_t
*in
, uint8_t *out
, int stride
) {
83 vpx_highbd_idct4x4_16_add_sse2(in
, out
, stride
, 10);
86 void idct4x4_12_sse2(const tran_low_t
*in
, uint8_t *out
, int stride
) {
87 vpx_highbd_idct4x4_16_add_sse2(in
, out
, stride
, 12);
90 #endif // CONFIG_VP9_HIGHBITDEPTH
92 class Trans4x4TestBase
{
94 virtual ~Trans4x4TestBase() {}
97 virtual void RunFwdTxfm(const int16_t *in
, tran_low_t
*out
, int stride
) = 0;
99 virtual void RunInvTxfm(const tran_low_t
*out
, uint8_t *dst
, int stride
) = 0;
101 void RunAccuracyCheck(int limit
) {
102 ACMRandom
rnd(ACMRandom::DeterministicSeed());
103 uint32_t max_error
= 0;
104 int64_t total_error
= 0;
105 const int count_test_block
= 10000;
106 for (int i
= 0; i
< count_test_block
; ++i
) {
107 DECLARE_ALIGNED(16, int16_t, test_input_block
[kNumCoeffs
]);
108 DECLARE_ALIGNED(16, tran_low_t
, test_temp_block
[kNumCoeffs
]);
109 DECLARE_ALIGNED(16, uint8_t, dst
[kNumCoeffs
]);
110 DECLARE_ALIGNED(16, uint8_t, src
[kNumCoeffs
]);
111 #if CONFIG_VP9_HIGHBITDEPTH
112 DECLARE_ALIGNED(16, uint16_t, dst16
[kNumCoeffs
]);
113 DECLARE_ALIGNED(16, uint16_t, src16
[kNumCoeffs
]);
116 // Initialize a test block with input range [-255, 255].
117 for (int j
= 0; j
< kNumCoeffs
; ++j
) {
118 if (bit_depth_
== VPX_BITS_8
) {
119 src
[j
] = rnd
.Rand8();
120 dst
[j
] = rnd
.Rand8();
121 test_input_block
[j
] = src
[j
] - dst
[j
];
122 #if CONFIG_VP9_HIGHBITDEPTH
124 src16
[j
] = rnd
.Rand16() & mask_
;
125 dst16
[j
] = rnd
.Rand16() & mask_
;
126 test_input_block
[j
] = src16
[j
] - dst16
[j
];
131 ASM_REGISTER_STATE_CHECK(RunFwdTxfm(test_input_block
,
132 test_temp_block
, pitch_
));
133 if (bit_depth_
== VPX_BITS_8
) {
134 ASM_REGISTER_STATE_CHECK(RunInvTxfm(test_temp_block
, dst
, pitch_
));
135 #if CONFIG_VP9_HIGHBITDEPTH
137 ASM_REGISTER_STATE_CHECK(RunInvTxfm(test_temp_block
,
138 CONVERT_TO_BYTEPTR(dst16
), pitch_
));
142 for (int j
= 0; j
< kNumCoeffs
; ++j
) {
143 #if CONFIG_VP9_HIGHBITDEPTH
144 const uint32_t diff
=
145 bit_depth_
== VPX_BITS_8
? dst
[j
] - src
[j
] : dst16
[j
] - src16
[j
];
147 ASSERT_EQ(VPX_BITS_8
, bit_depth_
);
148 const uint32_t diff
= dst
[j
] - src
[j
];
150 const uint32_t error
= diff
* diff
;
151 if (max_error
< error
)
153 total_error
+= error
;
157 EXPECT_GE(static_cast<uint32_t>(limit
), max_error
)
158 << "Error: 4x4 FHT/IHT has an individual round trip error > "
161 EXPECT_GE(count_test_block
* limit
, total_error
)
162 << "Error: 4x4 FHT/IHT has average round trip error > " << limit
166 void RunCoeffCheck() {
167 ACMRandom
rnd(ACMRandom::DeterministicSeed());
168 const int count_test_block
= 5000;
169 DECLARE_ALIGNED(16, int16_t, input_block
[kNumCoeffs
]);
170 DECLARE_ALIGNED(16, tran_low_t
, output_ref_block
[kNumCoeffs
]);
171 DECLARE_ALIGNED(16, tran_low_t
, output_block
[kNumCoeffs
]);
173 for (int i
= 0; i
< count_test_block
; ++i
) {
174 // Initialize a test block with input range [-mask_, mask_].
175 for (int j
= 0; j
< kNumCoeffs
; ++j
)
176 input_block
[j
] = (rnd
.Rand16() & mask_
) - (rnd
.Rand16() & mask_
);
178 fwd_txfm_ref(input_block
, output_ref_block
, pitch_
, tx_type_
);
179 ASM_REGISTER_STATE_CHECK(RunFwdTxfm(input_block
, output_block
, pitch_
));
181 // The minimum quant value is 4.
182 for (int j
= 0; j
< kNumCoeffs
; ++j
)
183 EXPECT_EQ(output_block
[j
], output_ref_block
[j
]);
188 ACMRandom
rnd(ACMRandom::DeterministicSeed());
189 const int count_test_block
= 5000;
190 DECLARE_ALIGNED(16, int16_t, input_extreme_block
[kNumCoeffs
]);
191 DECLARE_ALIGNED(16, tran_low_t
, output_ref_block
[kNumCoeffs
]);
192 DECLARE_ALIGNED(16, tran_low_t
, output_block
[kNumCoeffs
]);
194 for (int i
= 0; i
< count_test_block
; ++i
) {
195 // Initialize a test block with input range [-mask_, mask_].
196 for (int j
= 0; j
< kNumCoeffs
; ++j
) {
197 input_extreme_block
[j
] = rnd
.Rand8() % 2 ? mask_
: -mask_
;
200 for (int j
= 0; j
< kNumCoeffs
; ++j
)
201 input_extreme_block
[j
] = mask_
;
203 for (int j
= 0; j
< kNumCoeffs
; ++j
)
204 input_extreme_block
[j
] = -mask_
;
207 fwd_txfm_ref(input_extreme_block
, output_ref_block
, pitch_
, tx_type_
);
208 ASM_REGISTER_STATE_CHECK(RunFwdTxfm(input_extreme_block
,
209 output_block
, pitch_
));
211 // The minimum quant value is 4.
212 for (int j
= 0; j
< kNumCoeffs
; ++j
) {
213 EXPECT_EQ(output_block
[j
], output_ref_block
[j
]);
214 EXPECT_GE(4 * DCT_MAX_VALUE
<< (bit_depth_
- 8), abs(output_block
[j
]))
215 << "Error: 4x4 FDCT has coefficient larger than 4*DCT_MAX_VALUE";
220 void RunInvAccuracyCheck(int limit
) {
221 ACMRandom
rnd(ACMRandom::DeterministicSeed());
222 const int count_test_block
= 1000;
223 DECLARE_ALIGNED(16, int16_t, in
[kNumCoeffs
]);
224 DECLARE_ALIGNED(16, tran_low_t
, coeff
[kNumCoeffs
]);
225 DECLARE_ALIGNED(16, uint8_t, dst
[kNumCoeffs
]);
226 DECLARE_ALIGNED(16, uint8_t, src
[kNumCoeffs
]);
227 #if CONFIG_VP9_HIGHBITDEPTH
228 DECLARE_ALIGNED(16, uint16_t, dst16
[kNumCoeffs
]);
229 DECLARE_ALIGNED(16, uint16_t, src16
[kNumCoeffs
]);
232 for (int i
= 0; i
< count_test_block
; ++i
) {
233 // Initialize a test block with input range [-mask_, mask_].
234 for (int j
= 0; j
< kNumCoeffs
; ++j
) {
235 if (bit_depth_
== VPX_BITS_8
) {
236 src
[j
] = rnd
.Rand8();
237 dst
[j
] = rnd
.Rand8();
238 in
[j
] = src
[j
] - dst
[j
];
239 #if CONFIG_VP9_HIGHBITDEPTH
241 src16
[j
] = rnd
.Rand16() & mask_
;
242 dst16
[j
] = rnd
.Rand16() & mask_
;
243 in
[j
] = src16
[j
] - dst16
[j
];
248 fwd_txfm_ref(in
, coeff
, pitch_
, tx_type_
);
250 if (bit_depth_
== VPX_BITS_8
) {
251 ASM_REGISTER_STATE_CHECK(RunInvTxfm(coeff
, dst
, pitch_
));
252 #if CONFIG_VP9_HIGHBITDEPTH
254 ASM_REGISTER_STATE_CHECK(RunInvTxfm(coeff
, CONVERT_TO_BYTEPTR(dst16
),
259 for (int j
= 0; j
< kNumCoeffs
; ++j
) {
260 #if CONFIG_VP9_HIGHBITDEPTH
261 const uint32_t diff
=
262 bit_depth_
== VPX_BITS_8
? dst
[j
] - src
[j
] : dst16
[j
] - src16
[j
];
264 const uint32_t diff
= dst
[j
] - src
[j
];
266 const uint32_t error
= diff
* diff
;
267 EXPECT_GE(static_cast<uint32_t>(limit
), error
)
268 << "Error: 4x4 IDCT has error " << error
269 << " at index " << j
;
276 FhtFunc fwd_txfm_ref
;
277 vpx_bit_depth_t bit_depth_
;
282 : public Trans4x4TestBase
,
283 public ::testing::TestWithParam
<Dct4x4Param
> {
285 virtual ~Trans4x4DCT() {}
287 virtual void SetUp() {
288 fwd_txfm_
= GET_PARAM(0);
289 inv_txfm_
= GET_PARAM(1);
290 tx_type_
= GET_PARAM(2);
292 fwd_txfm_ref
= fdct4x4_ref
;
293 bit_depth_
= GET_PARAM(3);
294 mask_
= (1 << bit_depth_
) - 1;
296 virtual void TearDown() { libvpx_test::ClearSystemState(); }
299 void RunFwdTxfm(const int16_t *in
, tran_low_t
*out
, int stride
) {
300 fwd_txfm_(in
, out
, stride
);
302 void RunInvTxfm(const tran_low_t
*out
, uint8_t *dst
, int stride
) {
303 inv_txfm_(out
, dst
, stride
);
310 TEST_P(Trans4x4DCT
, AccuracyCheck
) {
314 TEST_P(Trans4x4DCT
, CoeffCheck
) {
318 TEST_P(Trans4x4DCT
, MemCheck
) {
322 TEST_P(Trans4x4DCT
, InvAccuracyCheck
) {
323 RunInvAccuracyCheck(1);
327 : public Trans4x4TestBase
,
328 public ::testing::TestWithParam
<Ht4x4Param
> {
330 virtual ~Trans4x4HT() {}
332 virtual void SetUp() {
333 fwd_txfm_
= GET_PARAM(0);
334 inv_txfm_
= GET_PARAM(1);
335 tx_type_
= GET_PARAM(2);
337 fwd_txfm_ref
= fht4x4_ref
;
338 bit_depth_
= GET_PARAM(3);
339 mask_
= (1 << bit_depth_
) - 1;
341 virtual void TearDown() { libvpx_test::ClearSystemState(); }
344 void RunFwdTxfm(const int16_t *in
, tran_low_t
*out
, int stride
) {
345 fwd_txfm_(in
, out
, stride
, tx_type_
);
348 void RunInvTxfm(const tran_low_t
*out
, uint8_t *dst
, int stride
) {
349 inv_txfm_(out
, dst
, stride
, tx_type_
);
356 TEST_P(Trans4x4HT
, AccuracyCheck
) {
360 TEST_P(Trans4x4HT
, CoeffCheck
) {
364 TEST_P(Trans4x4HT
, MemCheck
) {
368 TEST_P(Trans4x4HT
, InvAccuracyCheck
) {
369 RunInvAccuracyCheck(1);
373 : public Trans4x4TestBase
,
374 public ::testing::TestWithParam
<Dct4x4Param
> {
376 virtual ~Trans4x4WHT() {}
378 virtual void SetUp() {
379 fwd_txfm_
= GET_PARAM(0);
380 inv_txfm_
= GET_PARAM(1);
381 tx_type_
= GET_PARAM(2);
383 fwd_txfm_ref
= fwht4x4_ref
;
384 bit_depth_
= GET_PARAM(3);
385 mask_
= (1 << bit_depth_
) - 1;
387 virtual void TearDown() { libvpx_test::ClearSystemState(); }
390 void RunFwdTxfm(const int16_t *in
, tran_low_t
*out
, int stride
) {
391 fwd_txfm_(in
, out
, stride
);
393 void RunInvTxfm(const tran_low_t
*out
, uint8_t *dst
, int stride
) {
394 inv_txfm_(out
, dst
, stride
);
401 TEST_P(Trans4x4WHT
, AccuracyCheck
) {
405 TEST_P(Trans4x4WHT
, CoeffCheck
) {
409 TEST_P(Trans4x4WHT
, MemCheck
) {
413 TEST_P(Trans4x4WHT
, InvAccuracyCheck
) {
414 RunInvAccuracyCheck(0);
416 using std::tr1::make_tuple
;
418 #if CONFIG_VP9_HIGHBITDEPTH
419 INSTANTIATE_TEST_CASE_P(
422 make_tuple(&vpx_highbd_fdct4x4_c
, &idct4x4_10
, 0, VPX_BITS_10
),
423 make_tuple(&vpx_highbd_fdct4x4_c
, &idct4x4_12
, 0, VPX_BITS_12
),
424 make_tuple(&vpx_fdct4x4_c
, &vpx_idct4x4_16_add_c
, 0, VPX_BITS_8
)));
426 INSTANTIATE_TEST_CASE_P(
429 make_tuple(&vpx_fdct4x4_c
, &vpx_idct4x4_16_add_c
, 0, VPX_BITS_8
)));
430 #endif // CONFIG_VP9_HIGHBITDEPTH
432 #if CONFIG_VP9_HIGHBITDEPTH
433 INSTANTIATE_TEST_CASE_P(
436 make_tuple(&vp9_highbd_fht4x4_c
, &iht4x4_10
, 0, VPX_BITS_10
),
437 make_tuple(&vp9_highbd_fht4x4_c
, &iht4x4_10
, 1, VPX_BITS_10
),
438 make_tuple(&vp9_highbd_fht4x4_c
, &iht4x4_10
, 2, VPX_BITS_10
),
439 make_tuple(&vp9_highbd_fht4x4_c
, &iht4x4_10
, 3, VPX_BITS_10
),
440 make_tuple(&vp9_highbd_fht4x4_c
, &iht4x4_12
, 0, VPX_BITS_12
),
441 make_tuple(&vp9_highbd_fht4x4_c
, &iht4x4_12
, 1, VPX_BITS_12
),
442 make_tuple(&vp9_highbd_fht4x4_c
, &iht4x4_12
, 2, VPX_BITS_12
),
443 make_tuple(&vp9_highbd_fht4x4_c
, &iht4x4_12
, 3, VPX_BITS_12
),
444 make_tuple(&vp9_fht4x4_c
, &vp9_iht4x4_16_add_c
, 0, VPX_BITS_8
),
445 make_tuple(&vp9_fht4x4_c
, &vp9_iht4x4_16_add_c
, 1, VPX_BITS_8
),
446 make_tuple(&vp9_fht4x4_c
, &vp9_iht4x4_16_add_c
, 2, VPX_BITS_8
),
447 make_tuple(&vp9_fht4x4_c
, &vp9_iht4x4_16_add_c
, 3, VPX_BITS_8
)));
449 INSTANTIATE_TEST_CASE_P(
452 make_tuple(&vp9_fht4x4_c
, &vp9_iht4x4_16_add_c
, 0, VPX_BITS_8
),
453 make_tuple(&vp9_fht4x4_c
, &vp9_iht4x4_16_add_c
, 1, VPX_BITS_8
),
454 make_tuple(&vp9_fht4x4_c
, &vp9_iht4x4_16_add_c
, 2, VPX_BITS_8
),
455 make_tuple(&vp9_fht4x4_c
, &vp9_iht4x4_16_add_c
, 3, VPX_BITS_8
)));
456 #endif // CONFIG_VP9_HIGHBITDEPTH
458 #if CONFIG_VP9_HIGHBITDEPTH
459 INSTANTIATE_TEST_CASE_P(
462 make_tuple(&vp9_highbd_fwht4x4_c
, &iwht4x4_10
, 0, VPX_BITS_10
),
463 make_tuple(&vp9_highbd_fwht4x4_c
, &iwht4x4_12
, 0, VPX_BITS_12
),
464 make_tuple(&vp9_fwht4x4_c
, &vpx_iwht4x4_16_add_c
, 0, VPX_BITS_8
)));
466 INSTANTIATE_TEST_CASE_P(
469 make_tuple(&vp9_fwht4x4_c
, &vpx_iwht4x4_16_add_c
, 0, VPX_BITS_8
)));
470 #endif // CONFIG_VP9_HIGHBITDEPTH
472 #if HAVE_NEON_ASM && !CONFIG_VP9_HIGHBITDEPTH && !CONFIG_EMULATE_HARDWARE
473 INSTANTIATE_TEST_CASE_P(
476 make_tuple(&vpx_fdct4x4_c
,
477 &vpx_idct4x4_16_add_neon
, 0, VPX_BITS_8
)));
478 #endif // HAVE_NEON_ASM && !CONFIG_VP9_HIGHBITDEPTH && !CONFIG_EMULATE_HARDWARE
480 #if HAVE_NEON && !CONFIG_VP9_HIGHBITDEPTH && !CONFIG_EMULATE_HARDWARE
481 INSTANTIATE_TEST_CASE_P(
484 make_tuple(&vp9_fht4x4_c
, &vp9_iht4x4_16_add_neon
, 0, VPX_BITS_8
),
485 make_tuple(&vp9_fht4x4_c
, &vp9_iht4x4_16_add_neon
, 1, VPX_BITS_8
),
486 make_tuple(&vp9_fht4x4_c
, &vp9_iht4x4_16_add_neon
, 2, VPX_BITS_8
),
487 make_tuple(&vp9_fht4x4_c
, &vp9_iht4x4_16_add_neon
, 3, VPX_BITS_8
)));
488 #endif // HAVE_NEON && !CONFIG_VP9_HIGHBITDEPTH && !CONFIG_EMULATE_HARDWARE
490 #if CONFIG_USE_X86INC && HAVE_MMX && !CONFIG_VP9_HIGHBITDEPTH && \
491 !CONFIG_EMULATE_HARDWARE
492 INSTANTIATE_TEST_CASE_P(
495 make_tuple(&vp9_fwht4x4_mmx
, &vpx_iwht4x4_16_add_c
, 0, VPX_BITS_8
)));
498 #if CONFIG_USE_X86INC && HAVE_SSE2 && !CONFIG_VP9_HIGHBITDEPTH && \
499 !CONFIG_EMULATE_HARDWARE
500 INSTANTIATE_TEST_CASE_P(
503 make_tuple(&vp9_fwht4x4_c
, &vpx_iwht4x4_16_add_sse2
, 0, VPX_BITS_8
)));
506 #if HAVE_SSE2 && !CONFIG_VP9_HIGHBITDEPTH && !CONFIG_EMULATE_HARDWARE
507 INSTANTIATE_TEST_CASE_P(
510 make_tuple(&vpx_fdct4x4_sse2
,
511 &vpx_idct4x4_16_add_sse2
, 0, VPX_BITS_8
)));
512 INSTANTIATE_TEST_CASE_P(
515 make_tuple(&vp9_fht4x4_sse2
, &vp9_iht4x4_16_add_sse2
, 0, VPX_BITS_8
),
516 make_tuple(&vp9_fht4x4_sse2
, &vp9_iht4x4_16_add_sse2
, 1, VPX_BITS_8
),
517 make_tuple(&vp9_fht4x4_sse2
, &vp9_iht4x4_16_add_sse2
, 2, VPX_BITS_8
),
518 make_tuple(&vp9_fht4x4_sse2
, &vp9_iht4x4_16_add_sse2
, 3, VPX_BITS_8
)));
519 #endif // HAVE_SSE2 && !CONFIG_VP9_HIGHBITDEPTH && !CONFIG_EMULATE_HARDWARE
521 #if HAVE_SSE2 && CONFIG_VP9_HIGHBITDEPTH && !CONFIG_EMULATE_HARDWARE
522 INSTANTIATE_TEST_CASE_P(
525 make_tuple(&vpx_highbd_fdct4x4_c
, &idct4x4_10_sse2
, 0, VPX_BITS_10
),
526 make_tuple(&vpx_highbd_fdct4x4_sse2
, &idct4x4_10_sse2
, 0, VPX_BITS_10
),
527 make_tuple(&vpx_highbd_fdct4x4_c
, &idct4x4_12_sse2
, 0, VPX_BITS_12
),
528 make_tuple(&vpx_highbd_fdct4x4_sse2
, &idct4x4_12_sse2
, 0, VPX_BITS_12
),
529 make_tuple(&vpx_fdct4x4_sse2
, &vpx_idct4x4_16_add_c
, 0,
532 INSTANTIATE_TEST_CASE_P(
535 make_tuple(&vp9_fht4x4_sse2
, &vp9_iht4x4_16_add_c
, 0, VPX_BITS_8
),
536 make_tuple(&vp9_fht4x4_sse2
, &vp9_iht4x4_16_add_c
, 1, VPX_BITS_8
),
537 make_tuple(&vp9_fht4x4_sse2
, &vp9_iht4x4_16_add_c
, 2, VPX_BITS_8
),
538 make_tuple(&vp9_fht4x4_sse2
, &vp9_iht4x4_16_add_c
, 3, VPX_BITS_8
)));
539 #endif // HAVE_SSE2 && CONFIG_VP9_HIGHBITDEPTH && !CONFIG_EMULATE_HARDWARE
541 #if HAVE_MSA && !CONFIG_VP9_HIGHBITDEPTH && !CONFIG_EMULATE_HARDWARE
542 INSTANTIATE_TEST_CASE_P(
545 make_tuple(&vpx_fdct4x4_msa
, &vpx_idct4x4_16_add_msa
, 0, VPX_BITS_8
)));
546 INSTANTIATE_TEST_CASE_P(
549 make_tuple(&vp9_fht4x4_msa
, &vp9_iht4x4_16_add_msa
, 0, VPX_BITS_8
),
550 make_tuple(&vp9_fht4x4_msa
, &vp9_iht4x4_16_add_msa
, 1, VPX_BITS_8
),
551 make_tuple(&vp9_fht4x4_msa
, &vp9_iht4x4_16_add_msa
, 2, VPX_BITS_8
),
552 make_tuple(&vp9_fht4x4_msa
, &vp9_iht4x4_16_add_msa
, 3, VPX_BITS_8
)));
553 #endif // HAVE_MSA && !CONFIG_VP9_HIGHBITDEPTH && !CONFIG_EMULATE_HARDWARE