shithub: libvpx

Download patch

ref: 8de0404ed99ffd99fd8ee5cd7dbddfc8d9ec011f
parent: 167594414ffc806ac2da4ef6d9dd2e134948ec28
parent: 90d54a15fb2d09cfa4d280e62fe067a7bb791c7c
author: Linfeng Zhang <linfengz@google.com>
date: Fri Feb 23 20:24:32 EST 2018

Merge "Clean test/dct_test.cc with testing::Combine"

--- a/test/dct_test.cc
+++ b/test/dct_test.cc
@@ -85,8 +85,15 @@
 }
 #endif  // CONFIG_VP9_HIGHBITDEPTH
 
+struct FuncInfo {
+  FhtFunc ft_func;
+  IhtWithBdFunc it_func;
+  int size;
+  int pixel_size;
+};
+
 /* forward transform, inverse transform, size, transform type, bit depth */
-typedef tuple<FhtFunc, IhtWithBdFunc, int, int, vpx_bit_depth_t, int> DctParam;
+typedef tuple<int, const FuncInfo *, int, vpx_bit_depth_t> DctParam;
 
 void fdct_ref(const Buffer<int16_t> &in, Buffer<tran_low_t> *out, int size,
               int /*tx_type*/) {
@@ -128,12 +135,14 @@
  public:
   virtual void SetUp() {
     rnd_.Reset(ACMRandom::DeterministicSeed());
-    fwd_txfm_ = GET_PARAM(0);
-    inv_txfm_ = GET_PARAM(1);
-    size_ = GET_PARAM(2);
-    tx_type_ = GET_PARAM(3);
-    bit_depth_ = GET_PARAM(4);
-    pixel_size_ = GET_PARAM(5);
+    const int idx = GET_PARAM(0);
+    const FuncInfo *func_info = &(GET_PARAM(1)[idx]);
+    tx_type_ = GET_PARAM(2);
+    bit_depth_ = GET_PARAM(3);
+    fwd_txfm_ = func_info->ft_func;
+    inv_txfm_ = func_info->it_func;
+    size_ = func_info->size;
+    pixel_size_ = func_info->pixel_size;
     max_pixel_value_ = (1 << bit_depth_) - 1;
 
     // Randomize stride_ to a value less than or equal to 1024
@@ -165,6 +174,7 @@
   }
 
   void InitMem() {
+    if (pixel_size_ == 1 && bit_depth_ > VPX_BITS_8) return;
     if (pixel_size_ == 1) {
       for (int j = 0; j < block_size_; ++j) {
         src_[j] = rnd_.Rand16() & max_pixel_value_;
@@ -195,6 +205,7 @@
 
  protected:
   void RunAccuracyCheck(int limit) {
+    if (pixel_size_ == 1 && bit_depth_ > VPX_BITS_8) return;
     ACMRandom rnd(ACMRandom::DeterministicSeed());
     Buffer<int16_t> test_input_block =
         Buffer<int16_t>(size_, size_, 8, size_ == 4 ? 0 : 16);
@@ -252,6 +263,7 @@
   }
 
   void RunCoeffCheck() {
+    if (pixel_size_ == 1 && bit_depth_ > VPX_BITS_8) return;
     ACMRandom rnd(ACMRandom::DeterministicSeed());
     const int count_test_block = 5000;
     Buffer<int16_t> input_block =
@@ -281,6 +293,7 @@
   }
 
   void RunMemCheck() {
+    if (pixel_size_ == 1 && bit_depth_ > VPX_BITS_8) return;
     ACMRandom rnd(ACMRandom::DeterministicSeed());
     const int count_test_block = 5000;
     Buffer<int16_t> input_extreme_block =
@@ -331,6 +344,7 @@
   }
 
   void RunInvAccuracyCheck(int limit) {
+    if (pixel_size_ == 1 && bit_depth_ > VPX_BITS_8) return;
     ACMRandom rnd(ACMRandom::DeterministicSeed());
     const int count_test_block = 1000;
     Buffer<int16_t> in = Buffer<int16_t>(size_, size_, 4);
@@ -411,7 +425,15 @@
   TransDCT() { fwd_txfm_ref = fdct_ref; }
 };
 
-TEST_P(TransDCT, AccuracyCheck) { RunAccuracyCheck(1); }
+TEST_P(TransDCT, AccuracyCheck) {
+  int t = 1;
+  if (size_ == 16 && bit_depth_ > 10 && pixel_size_ == 2) {
+    t = 2;
+  } else if (size_ == 32 && bit_depth_ > 10 && pixel_size_ == 2) {
+    t = 7;
+  }
+  RunAccuracyCheck(t);
+}
 
 TEST_P(TransDCT, CoeffCheck) { RunCoeffCheck(); }
 
@@ -419,173 +441,136 @@
 
 TEST_P(TransDCT, InvAccuracyCheck) { RunInvAccuracyCheck(1); }
 
-/* TODO:(johannkoenig) Determine why these fail AccuracyCheck
-  make_tuple(&fdct_wrapper<vpx_highbd_fdct32x32_c>,
-  &highbd_idct_wrapper<vpx_highbd_idct32x32_1024_add_c>, 32, 0, VPX_BITS_12, 2),
-  make_tuple(&fdct_wrapper<vpx_highbd_fdct16x16_c>,
-  &highbd_idct_wrapper<vpx_highbd_idct16x16_256_add_c>, 16, 0, VPX_BITS_12, 2),
-  make_tuple(&fdct_wrapper<vpx_highbd_fdct32x32_sse2>,
-  &highbd_idct_wrapper<vpx_highbd_idct32x32_1024_add_sse2>, 32, 0, VPX_BITS_12,
-  2),
-  make_tuple(&fdct_wrapper<vpx_highbd_fdct16x16_sse2>,
-  &highbd_idct_wrapper<vpx_highbd_idct32x32_1024_add_sse2>, 16, 0, VPX_BITS_12,
-  2),
-*/
-
-const DctParam c_dct_tests[] = {
+static const FuncInfo dct_c_func_info[] = {
 #if CONFIG_VP9_HIGHBITDEPTH
-  make_tuple(&fdct_wrapper<vpx_highbd_fdct32x32_c>,
-             &highbd_idct_wrapper<vpx_highbd_idct32x32_1024_add_c>, 32, 0,
-             VPX_BITS_8, 2),
-  make_tuple(&fdct_wrapper<vpx_highbd_fdct32x32_c>,
-             &highbd_idct_wrapper<vpx_highbd_idct32x32_1024_add_c>, 32, 0,
-             VPX_BITS_10, 2),
-  make_tuple(&fdct_wrapper<vpx_highbd_fdct16x16_c>,
-             &highbd_idct_wrapper<vpx_highbd_idct16x16_256_add_c>, 16, 0,
-             VPX_BITS_8, 2),
-  make_tuple(&fdct_wrapper<vpx_highbd_fdct16x16_c>,
-             &highbd_idct_wrapper<vpx_highbd_idct16x16_256_add_c>, 16, 0,
-             VPX_BITS_10, 2),
-  make_tuple(&fdct_wrapper<vpx_highbd_fdct8x8_c>,
-             &highbd_idct_wrapper<vpx_highbd_idct8x8_64_add_c>, 8, 0,
-             VPX_BITS_8, 2),
-  make_tuple(&fdct_wrapper<vpx_highbd_fdct8x8_c>,
-             &highbd_idct_wrapper<vpx_highbd_idct8x8_64_add_c>, 8, 0,
-             VPX_BITS_10, 2),
-  make_tuple(&fdct_wrapper<vpx_highbd_fdct8x8_c>,
-             &highbd_idct_wrapper<vpx_highbd_idct8x8_64_add_c>, 8, 0,
-             VPX_BITS_12, 2),
-  make_tuple(&fdct_wrapper<vpx_highbd_fdct4x4_c>,
-             &highbd_idct_wrapper<vpx_highbd_idct4x4_16_add_c>, 4, 0,
-             VPX_BITS_8, 2),
-  make_tuple(&fdct_wrapper<vpx_highbd_fdct4x4_c>,
-             &highbd_idct_wrapper<vpx_highbd_idct4x4_16_add_c>, 4, 0,
-             VPX_BITS_10, 2),
-  make_tuple(&fdct_wrapper<vpx_highbd_fdct4x4_c>,
-             &highbd_idct_wrapper<vpx_highbd_idct4x4_16_add_c>, 4, 0,
-             VPX_BITS_12, 2),
-#endif  // CONFIG_VP9_HIGHBITDEPTH
-  make_tuple(&fdct_wrapper<vpx_fdct32x32_c>,
-             &idct_wrapper<vpx_idct32x32_1024_add_c>, 32, 0, VPX_BITS_8, 1),
-  make_tuple(&fdct_wrapper<vpx_fdct16x16_c>,
-             &idct_wrapper<vpx_idct16x16_256_add_c>, 16, 0, VPX_BITS_8, 1),
-  make_tuple(&fdct_wrapper<vpx_fdct8x8_c>, &idct_wrapper<vpx_idct8x8_64_add_c>,
-             8, 0, VPX_BITS_8, 1),
-  make_tuple(&fdct_wrapper<vpx_fdct4x4_c>, &idct_wrapper<vpx_idct4x4_16_add_c>,
-             4, 0, VPX_BITS_8, 1)
+  { &fdct_wrapper<vpx_highbd_fdct4x4_c>,
+    &highbd_idct_wrapper<vpx_highbd_idct4x4_16_add_c>, 4, 2 },
+  { &fdct_wrapper<vpx_highbd_fdct8x8_c>,
+    &highbd_idct_wrapper<vpx_highbd_idct8x8_64_add_c>, 8, 2 },
+  { &fdct_wrapper<vpx_highbd_fdct16x16_c>,
+    &highbd_idct_wrapper<vpx_highbd_idct16x16_256_add_c>, 16, 2 },
+  { &fdct_wrapper<vpx_highbd_fdct32x32_c>,
+    &highbd_idct_wrapper<vpx_highbd_idct32x32_1024_add_c>, 32, 2 },
+#endif
+  { &fdct_wrapper<vpx_fdct4x4_c>, &idct_wrapper<vpx_idct4x4_16_add_c>, 4, 1 },
+  { &fdct_wrapper<vpx_fdct8x8_c>, &idct_wrapper<vpx_idct8x8_64_add_c>, 8, 1 },
+  { &fdct_wrapper<vpx_fdct16x16_c>, &idct_wrapper<vpx_idct16x16_256_add_c>, 16,
+    1 },
+  { &fdct_wrapper<vpx_fdct32x32_c>, &idct_wrapper<vpx_idct32x32_1024_add_c>, 32,
+    1 }
 };
 
-INSTANTIATE_TEST_CASE_P(C, TransDCT, ::testing::ValuesIn(c_dct_tests));
+INSTANTIATE_TEST_CASE_P(
+    C, TransDCT,
+    ::testing::Combine(
+        ::testing::Range(0, static_cast<int>(sizeof(dct_c_func_info) /
+                                             sizeof(dct_c_func_info[0]))),
+        ::testing::Values(dct_c_func_info), ::testing::Values(0),
+        ::testing::Values(VPX_BITS_8, VPX_BITS_10, VPX_BITS_12)));
 
 #if !CONFIG_EMULATE_HARDWARE
 
 #if HAVE_SSE2
-const DctParam sse2_dct_tests[] = {
+static const FuncInfo dct_sse2_func_info[] = {
 #if CONFIG_VP9_HIGHBITDEPTH
-  make_tuple(&fdct_wrapper<vpx_highbd_fdct32x32_sse2>,
-             &highbd_idct_wrapper<vpx_highbd_idct32x32_1024_add_sse2>, 32, 0,
-             VPX_BITS_8, 2),
-  make_tuple(&fdct_wrapper<vpx_highbd_fdct32x32_sse2>,
-             &highbd_idct_wrapper<vpx_highbd_idct32x32_1024_add_sse2>, 32, 0,
-             VPX_BITS_10, 2),
-  make_tuple(&fdct_wrapper<vpx_highbd_fdct16x16_sse2>,
-             &highbd_idct_wrapper<vpx_highbd_idct16x16_256_add_sse2>, 16, 0,
-             VPX_BITS_8, 2),
-  make_tuple(&fdct_wrapper<vpx_highbd_fdct16x16_sse2>,
-             &highbd_idct_wrapper<vpx_highbd_idct16x16_256_add_sse2>, 16, 0,
-             VPX_BITS_10, 2),
-  make_tuple(&fdct_wrapper<vpx_highbd_fdct8x8_sse2>,
-             &highbd_idct_wrapper<vpx_highbd_idct8x8_64_add_sse2>, 8, 0,
-             VPX_BITS_8, 2),
-  make_tuple(&fdct_wrapper<vpx_highbd_fdct8x8_sse2>,
-             &highbd_idct_wrapper<vpx_highbd_idct8x8_64_add_sse2>, 8, 0,
-             VPX_BITS_10, 2),
-  make_tuple(&fdct_wrapper<vpx_highbd_fdct8x8_sse2>,
-             &highbd_idct_wrapper<vpx_highbd_idct8x8_64_add_sse2>, 8, 0,
-             VPX_BITS_12, 2),
-  make_tuple(&fdct_wrapper<vpx_highbd_fdct4x4_sse2>,
-             &highbd_idct_wrapper<vpx_highbd_idct4x4_16_add_sse2>, 4, 0,
-             VPX_BITS_8, 2),
-  make_tuple(&fdct_wrapper<vpx_highbd_fdct4x4_sse2>,
-             &highbd_idct_wrapper<vpx_highbd_idct4x4_16_add_sse2>, 4, 0,
-             VPX_BITS_10, 2),
-  make_tuple(&fdct_wrapper<vpx_highbd_fdct4x4_sse2>,
-             &highbd_idct_wrapper<vpx_highbd_idct4x4_16_add_sse2>, 4, 0,
-             VPX_BITS_12, 2),
-#endif  // CONFIG_VP9_HIGHBITDEPTH
-  make_tuple(&fdct_wrapper<vpx_fdct32x32_sse2>,
-             &idct_wrapper<vpx_idct32x32_1024_add_sse2>, 32, 0, VPX_BITS_8, 1),
-  make_tuple(&fdct_wrapper<vpx_fdct16x16_sse2>,
-             &idct_wrapper<vpx_idct16x16_256_add_sse2>, 16, 0, VPX_BITS_8, 1),
-  make_tuple(&fdct_wrapper<vpx_fdct8x8_sse2>,
-             &idct_wrapper<vpx_idct8x8_64_add_sse2>, 8, 0, VPX_BITS_8, 1),
-  make_tuple(&fdct_wrapper<vpx_fdct4x4_sse2>,
-             &idct_wrapper<vpx_idct4x4_16_add_sse2>, 4, 0, VPX_BITS_8, 1)
+  { &fdct_wrapper<vpx_highbd_fdct4x4_sse2>,
+    &highbd_idct_wrapper<vpx_highbd_idct4x4_16_add_sse2>, 4, 2 },
+  { &fdct_wrapper<vpx_highbd_fdct8x8_sse2>,
+    &highbd_idct_wrapper<vpx_highbd_idct8x8_64_add_sse2>, 8, 2 },
+  { &fdct_wrapper<vpx_highbd_fdct16x16_sse2>,
+    &highbd_idct_wrapper<vpx_highbd_idct16x16_256_add_sse2>, 16, 2 },
+  { &fdct_wrapper<vpx_highbd_fdct32x32_sse2>,
+    &highbd_idct_wrapper<vpx_highbd_idct32x32_1024_add_sse2>, 32, 2 },
+#endif
+  { &fdct_wrapper<vpx_fdct4x4_sse2>, &idct_wrapper<vpx_idct4x4_16_add_sse2>, 4,
+    1 },
+  { &fdct_wrapper<vpx_fdct8x8_sse2>, &idct_wrapper<vpx_idct8x8_64_add_sse2>, 8,
+    1 },
+  { &fdct_wrapper<vpx_fdct16x16_sse2>,
+    &idct_wrapper<vpx_idct16x16_256_add_sse2>, 16, 1 },
+  { &fdct_wrapper<vpx_fdct32x32_sse2>,
+    &idct_wrapper<vpx_idct32x32_1024_add_sse2>, 32, 1 }
 };
 
-INSTANTIATE_TEST_CASE_P(SSE2, TransDCT, ::testing::ValuesIn(sse2_dct_tests));
+INSTANTIATE_TEST_CASE_P(
+    SSE2, TransDCT,
+    ::testing::Combine(
+        ::testing::Range(0, static_cast<int>(sizeof(dct_sse2_func_info) /
+                                             sizeof(dct_sse2_func_info[0]))),
+        ::testing::Values(dct_sse2_func_info), ::testing::Values(0),
+        ::testing::Values(VPX_BITS_8, VPX_BITS_10, VPX_BITS_12)));
 #endif  // HAVE_SSE2
 
 #if HAVE_SSSE3 && !CONFIG_VP9_HIGHBITDEPTH && ARCH_X86_64
+// vpx_fdct8x8_ssse3 is only available in 64 bit builds.
+static const FuncInfo dct_ssse3_func_info = {
+  &fdct_wrapper<vpx_fdct8x8_ssse3>, &idct_wrapper<vpx_idct8x8_64_add_sse2>, 8, 1
+};
+
 // TODO(johannkoenig): high bit depth fdct8x8.
-INSTANTIATE_TEST_CASE_P(
-    SSSE3, TransDCT,
-    ::testing::Values(
-        // vpx_fdct8x8_ssse3 is only available in 64 bit builds.
-        make_tuple(&fdct_wrapper<vpx_fdct8x8_ssse3>,
-                   &idct_wrapper<vpx_idct8x8_64_add_sse2>, 8, 0, VPX_BITS_8,
-                   1)));
+INSTANTIATE_TEST_CASE_P(SSSE3, TransDCT,
+                        ::testing::Values(make_tuple(0, &dct_ssse3_func_info, 0,
+                                                     VPX_BITS_8)));
 #endif  // HAVE_SSSE3 && !CONFIG_VP9_HIGHBITDEPTH && ARCH_X86_64
 
 #if HAVE_AVX2 && !CONFIG_VP9_HIGHBITDEPTH
+static const FuncInfo dct_avx2_func_info = {
+  &fdct_wrapper<vpx_fdct32x32_avx2>, &idct_wrapper<vpx_idct32x32_1024_add_sse2>,
+  32, 1
+};
+
 // TODO(johannkoenig): high bit depth fdct32x32.
-INSTANTIATE_TEST_CASE_P(
-    AVX2, TransDCT,
-    ::testing::Values(make_tuple(&fdct_wrapper<vpx_fdct32x32_avx2>,
-                                 &idct_wrapper<vpx_idct32x32_1024_add_sse2>, 32,
-                                 0, VPX_BITS_8, 1)));
+INSTANTIATE_TEST_CASE_P(AVX2, TransDCT,
+                        ::testing::Values(make_tuple(0, &dct_avx2_func_info, 0,
+                                                     VPX_BITS_8)));
 #endif  // HAVE_AVX2 && !CONFIG_VP9_HIGHBITDEPTH
 
 #if HAVE_NEON
+static const FuncInfo dct_neon_func_info[4] = {
+  { &fdct_wrapper<vpx_fdct4x4_neon>, &idct_wrapper<vpx_idct4x4_16_add_neon>, 4,
+    1 },
+  { &fdct_wrapper<vpx_fdct8x8_neon>, &idct_wrapper<vpx_idct8x8_64_add_neon>, 8,
+    1 },
+  { &fdct_wrapper<vpx_fdct16x16_neon>,
+    &idct_wrapper<vpx_idct16x16_256_add_neon>, 16, 1 },
+  { &fdct_wrapper<vpx_fdct32x32_neon>,
+    &idct_wrapper<vpx_idct32x32_1024_add_neon>, 32, 1 }
+};
+
 INSTANTIATE_TEST_CASE_P(
     NEON, TransDCT,
-    ::testing::Values(make_tuple(&fdct_wrapper<vpx_fdct32x32_neon>,
-                                 &idct_wrapper<vpx_idct32x32_1024_add_neon>, 32,
-                                 0, VPX_BITS_8, 1),
-                      make_tuple(&fdct_wrapper<vpx_fdct16x16_neon>,
-                                 &idct_wrapper<vpx_idct16x16_256_add_neon>, 16,
-                                 0, VPX_BITS_8, 1),
-                      make_tuple(&fdct_wrapper<vpx_fdct8x8_neon>,
-                                 &idct_wrapper<vpx_idct8x8_64_add_neon>, 8, 0,
-                                 VPX_BITS_8, 1),
-                      make_tuple(&fdct_wrapper<vpx_fdct4x4_neon>,
-                                 &idct_wrapper<vpx_idct4x4_16_add_neon>, 4, 0,
-                                 VPX_BITS_8, 1)));
+    ::testing::Combine(::testing::Range(0, 4),
+                       ::testing::Values(dct_neon_func_info),
+                       ::testing::Values(0), ::testing::Values(VPX_BITS_8)));
 #endif  // HAVE_NEON
 
 #if HAVE_MSA && !CONFIG_VP9_HIGHBITDEPTH
-INSTANTIATE_TEST_CASE_P(
-    MSA, TransDCT,
-    ::testing::Values(make_tuple(&fdct_wrapper<vpx_fdct32x32_msa>,
-                                 &idct_wrapper<vpx_idct32x32_1024_add_msa>, 32,
-                                 0, VPX_BITS_8, 1),
-                      make_tuple(&fdct_wrapper<vpx_fdct16x16_msa>,
-                                 &idct_wrapper<vpx_idct16x16_256_add_msa>, 16,
-                                 0, VPX_BITS_8, 1),
-                      make_tuple(&fdct_wrapper<vpx_fdct8x8_msa>,
-                                 &idct_wrapper<vpx_idct8x8_64_add_msa>, 8, 0,
-                                 VPX_BITS_8, 1),
-                      make_tuple(&fdct_wrapper<vpx_fdct4x4_msa>,
-                                 &idct_wrapper<vpx_idct4x4_16_add_msa>, 4, 0,
-                                 VPX_BITS_8, 1)));
+static const FuncInfo dct_msa_func_info[4] = {
+  { &fdct_wrapper<vpx_fdct4x4_msa>, &idct_wrapper<vpx_idct4x4_16_add_msa>, 4,
+    1 },
+  { &fdct_wrapper<vpx_fdct8x8_msa>, &idct_wrapper<vpx_idct8x8_64_add_msa>, 8,
+    1 },
+  { &fdct_wrapper<vpx_fdct16x16_msa>, &idct_wrapper<vpx_idct16x16_256_add_msa>,
+    16, 1 },
+  { &fdct_wrapper<vpx_fdct32x32_msa>, &idct_wrapper<vpx_idct32x32_1024_add_msa>,
+    32, 1 }
+};
+
+INSTANTIATE_TEST_CASE_P(MSA, TransDCT,
+                        ::testing::Combine(::testing::Range(0, 4),
+                                           ::testing::Values(dct_msa_func_info),
+                                           ::testing::Values(0),
+                                           ::testing::Values(VPX_BITS_8)));
 #endif  // HAVE_MSA && !CONFIG_VP9_HIGHBITDEPTH
 
 #if HAVE_VSX && !CONFIG_VP9_HIGHBITDEPTH
-INSTANTIATE_TEST_CASE_P(
-    VSX, TransDCT,
-    ::testing::Values(make_tuple(&fdct_wrapper<vpx_fdct4x4_c>,
-                                 &idct_wrapper<vpx_idct4x4_16_add_vsx>, 4, 0,
-                                 VPX_BITS_8, 1)));
+static const FuncInfo dct_vsx_func_info = {
+  &fdct_wrapper<vpx_fdct4x4_c>, &idct_wrapper<vpx_idct4x4_16_add_vsx>, 4, 1
+};
+
+INSTANTIATE_TEST_CASE_P(VSX, TransDCT,
+                        ::testing::Values(make_tuple(0, &dct_vsx_func_info, 0,
+                                                     VPX_BITS_8)));
 #endif  // HAVE_VSX && !CONFIG_VP9_HIGHBITDEPTH &&
 
 #endif  // !CONFIG_EMULATE_HARDWARE
@@ -598,7 +583,7 @@
 };
 
 TEST_P(TransHT, AccuracyCheck) {
-  RunAccuracyCheck(size_ == 16 && bit_depth_ > 10 ? 2 : 1);
+  RunAccuracyCheck(size_ == 16 && bit_depth_ > 10 && pixel_size_ == 2 ? 2 : 1);
 }
 
 TEST_P(TransHT, CoeffCheck) { RunCoeffCheck(); }
@@ -607,397 +592,84 @@
 
 TEST_P(TransHT, InvAccuracyCheck) { RunInvAccuracyCheck(1); }
 
-const DctParam c_ht_tests[] = {
+static const FuncInfo ht_c_func_info[] = {
 #if CONFIG_VP9_HIGHBITDEPTH
-  make_tuple(&vp9_highbd_fht16x16_c,
-             &highbd_iht_wrapper<vp9_highbd_iht16x16_256_add_c>, 16, 0,
-             VPX_BITS_8, 2),
-  make_tuple(&vp9_highbd_fht16x16_c,
-             &highbd_iht_wrapper<vp9_highbd_iht16x16_256_add_c>, 16, 1,
-             VPX_BITS_8, 2),
-  make_tuple(&vp9_highbd_fht16x16_c,
-             &highbd_iht_wrapper<vp9_highbd_iht16x16_256_add_c>, 16, 2,
-             VPX_BITS_8, 2),
-  make_tuple(&vp9_highbd_fht16x16_c,
-             &highbd_iht_wrapper<vp9_highbd_iht16x16_256_add_c>, 16, 3,
-             VPX_BITS_8, 2),
-  make_tuple(&vp9_highbd_fht16x16_c,
-             &highbd_iht_wrapper<vp9_highbd_iht16x16_256_add_c>, 16, 0,
-             VPX_BITS_10, 2),
-  make_tuple(&vp9_highbd_fht16x16_c,
-             &highbd_iht_wrapper<vp9_highbd_iht16x16_256_add_c>, 16, 1,
-             VPX_BITS_10, 2),
-  make_tuple(&vp9_highbd_fht16x16_c,
-             &highbd_iht_wrapper<vp9_highbd_iht16x16_256_add_c>, 16, 2,
-             VPX_BITS_10, 2),
-  make_tuple(&vp9_highbd_fht16x16_c,
-             &highbd_iht_wrapper<vp9_highbd_iht16x16_256_add_c>, 16, 3,
-             VPX_BITS_10, 2),
-  make_tuple(&vp9_highbd_fht16x16_c,
-             &highbd_iht_wrapper<vp9_highbd_iht16x16_256_add_c>, 16, 0,
-             VPX_BITS_12, 2),
-  make_tuple(&vp9_highbd_fht16x16_c,
-             &highbd_iht_wrapper<vp9_highbd_iht16x16_256_add_c>, 16, 1,
-             VPX_BITS_12, 2),
-  make_tuple(&vp9_highbd_fht16x16_c,
-             &highbd_iht_wrapper<vp9_highbd_iht16x16_256_add_c>, 16, 2,
-             VPX_BITS_12, 2),
-  make_tuple(&vp9_highbd_fht16x16_c,
-             &highbd_iht_wrapper<vp9_highbd_iht16x16_256_add_c>, 16, 3,
-             VPX_BITS_12, 2),
-
-  make_tuple(&vp9_highbd_fht8x8_c,
-             &highbd_iht_wrapper<vp9_highbd_iht8x8_64_add_c>, 8, 0, VPX_BITS_8,
-             2),
-  make_tuple(&vp9_highbd_fht8x8_c,
-             &highbd_iht_wrapper<vp9_highbd_iht8x8_64_add_c>, 8, 1, VPX_BITS_8,
-             2),
-  make_tuple(&vp9_highbd_fht8x8_c,
-             &highbd_iht_wrapper<vp9_highbd_iht8x8_64_add_c>, 8, 2, VPX_BITS_8,
-             2),
-  make_tuple(&vp9_highbd_fht8x8_c,
-             &highbd_iht_wrapper<vp9_highbd_iht8x8_64_add_c>, 8, 3, VPX_BITS_8,
-             2),
-  make_tuple(&vp9_highbd_fht8x8_c,
-             &highbd_iht_wrapper<vp9_highbd_iht8x8_64_add_c>, 8, 0, VPX_BITS_10,
-             2),
-  make_tuple(&vp9_highbd_fht8x8_c,
-             &highbd_iht_wrapper<vp9_highbd_iht8x8_64_add_c>, 8, 1, VPX_BITS_10,
-             2),
-  make_tuple(&vp9_highbd_fht8x8_c,
-             &highbd_iht_wrapper<vp9_highbd_iht8x8_64_add_c>, 8, 2, VPX_BITS_10,
-             2),
-  make_tuple(&vp9_highbd_fht8x8_c,
-             &highbd_iht_wrapper<vp9_highbd_iht8x8_64_add_c>, 8, 3, VPX_BITS_10,
-             2),
-  make_tuple(&vp9_highbd_fht8x8_c,
-             &highbd_iht_wrapper<vp9_highbd_iht8x8_64_add_c>, 8, 0, VPX_BITS_12,
-             2),
-  make_tuple(&vp9_highbd_fht8x8_c,
-             &highbd_iht_wrapper<vp9_highbd_iht8x8_64_add_c>, 8, 1, VPX_BITS_12,
-             2),
-  make_tuple(&vp9_highbd_fht8x8_c,
-             &highbd_iht_wrapper<vp9_highbd_iht8x8_64_add_c>, 8, 2, VPX_BITS_12,
-             2),
-  make_tuple(&vp9_highbd_fht8x8_c,
-             &highbd_iht_wrapper<vp9_highbd_iht8x8_64_add_c>, 8, 3, VPX_BITS_12,
-             2),
-
-  make_tuple(&vp9_highbd_fht4x4_c,
-             &highbd_iht_wrapper<vp9_highbd_iht4x4_16_add_c>, 4, 0, VPX_BITS_8,
-             2),
-  make_tuple(&vp9_highbd_fht4x4_c,
-             &highbd_iht_wrapper<vp9_highbd_iht4x4_16_add_c>, 4, 1, VPX_BITS_8,
-             2),
-  make_tuple(&vp9_highbd_fht4x4_c,
-             &highbd_iht_wrapper<vp9_highbd_iht4x4_16_add_c>, 4, 2, VPX_BITS_8,
-             2),
-  make_tuple(&vp9_highbd_fht4x4_c,
-             &highbd_iht_wrapper<vp9_highbd_iht4x4_16_add_c>, 4, 3, VPX_BITS_8,
-             2),
-  make_tuple(&vp9_highbd_fht4x4_c,
-             &highbd_iht_wrapper<vp9_highbd_iht4x4_16_add_c>, 4, 0, VPX_BITS_10,
-             2),
-  make_tuple(&vp9_highbd_fht4x4_c,
-             &highbd_iht_wrapper<vp9_highbd_iht4x4_16_add_c>, 4, 1, VPX_BITS_10,
-             2),
-  make_tuple(&vp9_highbd_fht4x4_c,
-             &highbd_iht_wrapper<vp9_highbd_iht4x4_16_add_c>, 4, 2, VPX_BITS_10,
-             2),
-  make_tuple(&vp9_highbd_fht4x4_c,
-             &highbd_iht_wrapper<vp9_highbd_iht4x4_16_add_c>, 4, 3, VPX_BITS_10,
-             2),
-  make_tuple(&vp9_highbd_fht4x4_c,
-             &highbd_iht_wrapper<vp9_highbd_iht4x4_16_add_c>, 4, 0, VPX_BITS_12,
-             2),
-  make_tuple(&vp9_highbd_fht4x4_c,
-             &highbd_iht_wrapper<vp9_highbd_iht4x4_16_add_c>, 4, 1, VPX_BITS_12,
-             2),
-  make_tuple(&vp9_highbd_fht4x4_c,
-             &highbd_iht_wrapper<vp9_highbd_iht4x4_16_add_c>, 4, 2, VPX_BITS_12,
-             2),
-  make_tuple(&vp9_highbd_fht4x4_c,
-             &highbd_iht_wrapper<vp9_highbd_iht4x4_16_add_c>, 4, 3, VPX_BITS_12,
-             2),
-#endif  // CONFIG_VP9_HIGHBITDEPTH
-  make_tuple(&vp9_fht16x16_c, &iht_wrapper<vp9_iht16x16_256_add_c>, 16, 0,
-             VPX_BITS_8, 1),
-  make_tuple(&vp9_fht16x16_c, &iht_wrapper<vp9_iht16x16_256_add_c>, 16, 1,
-             VPX_BITS_8, 1),
-  make_tuple(&vp9_fht16x16_c, &iht_wrapper<vp9_iht16x16_256_add_c>, 16, 2,
-             VPX_BITS_8, 1),
-  make_tuple(&vp9_fht16x16_c, &iht_wrapper<vp9_iht16x16_256_add_c>, 16, 3,
-             VPX_BITS_8, 1),
-
-  make_tuple(&vp9_fht8x8_c, &iht_wrapper<vp9_iht8x8_64_add_c>, 8, 0, VPX_BITS_8,
-             1),
-  make_tuple(&vp9_fht8x8_c, &iht_wrapper<vp9_iht8x8_64_add_c>, 8, 1, VPX_BITS_8,
-             1),
-  make_tuple(&vp9_fht8x8_c, &iht_wrapper<vp9_iht8x8_64_add_c>, 8, 2, VPX_BITS_8,
-             1),
-  make_tuple(&vp9_fht8x8_c, &iht_wrapper<vp9_iht8x8_64_add_c>, 8, 3, VPX_BITS_8,
-             1),
-
-  make_tuple(&vp9_fht4x4_c, &iht_wrapper<vp9_iht4x4_16_add_c>, 4, 0, VPX_BITS_8,
-             1),
-  make_tuple(&vp9_fht4x4_c, &iht_wrapper<vp9_iht4x4_16_add_c>, 4, 1, VPX_BITS_8,
-             1),
-  make_tuple(&vp9_fht4x4_c, &iht_wrapper<vp9_iht4x4_16_add_c>, 4, 2, VPX_BITS_8,
-             1),
-  make_tuple(&vp9_fht4x4_c, &iht_wrapper<vp9_iht4x4_16_add_c>, 4, 3, VPX_BITS_8,
-             1)
+  { &vp9_highbd_fht4x4_c, &highbd_iht_wrapper<vp9_highbd_iht4x4_16_add_c>, 4,
+    2 },
+  { &vp9_highbd_fht8x8_c, &highbd_iht_wrapper<vp9_highbd_iht8x8_64_add_c>, 8,
+    2 },
+  { &vp9_highbd_fht16x16_c, &highbd_iht_wrapper<vp9_highbd_iht16x16_256_add_c>,
+    16, 2 },
+#endif
+  { &vp9_fht4x4_c, &iht_wrapper<vp9_iht4x4_16_add_c>, 4, 1 },
+  { &vp9_fht8x8_c, &iht_wrapper<vp9_iht8x8_64_add_c>, 8, 1 },
+  { &vp9_fht16x16_c, &iht_wrapper<vp9_iht16x16_256_add_c>, 16, 1 }
 };
 
-INSTANTIATE_TEST_CASE_P(C, TransHT, ::testing::ValuesIn(c_ht_tests));
+INSTANTIATE_TEST_CASE_P(
+    C, TransHT,
+    ::testing::Combine(
+        ::testing::Range(0, static_cast<int>(sizeof(ht_c_func_info) /
+                                             sizeof(ht_c_func_info[0]))),
+        ::testing::Values(ht_c_func_info), ::testing::Range(0, 4),
+        ::testing::Values(VPX_BITS_8, VPX_BITS_10, VPX_BITS_12)));
 
 #if !CONFIG_EMULATE_HARDWARE
 
 #if HAVE_NEON
 
-const DctParam neon_ht_tests[] = {
+static const FuncInfo ht_neon_func_info[] = {
 #if CONFIG_VP9_HIGHBITDEPTH
-  make_tuple(&vp9_highbd_fht4x4_c,
-             &highbd_iht_wrapper<vp9_highbd_iht4x4_16_add_neon>, 4, 0,
-             VPX_BITS_8, 2),
-  make_tuple(&vp9_highbd_fht4x4_c,
-             &highbd_iht_wrapper<vp9_highbd_iht4x4_16_add_neon>, 4, 1,
-             VPX_BITS_8, 2),
-  make_tuple(&vp9_highbd_fht4x4_c,
-             &highbd_iht_wrapper<vp9_highbd_iht4x4_16_add_neon>, 4, 2,
-             VPX_BITS_8, 2),
-  make_tuple(&vp9_highbd_fht4x4_c,
-             &highbd_iht_wrapper<vp9_highbd_iht4x4_16_add_neon>, 4, 3,
-             VPX_BITS_8, 2),
-  make_tuple(&vp9_highbd_fht4x4_c,
-             &highbd_iht_wrapper<vp9_highbd_iht4x4_16_add_neon>, 4, 0,
-             VPX_BITS_10, 2),
-  make_tuple(&vp9_highbd_fht4x4_c,
-             &highbd_iht_wrapper<vp9_highbd_iht4x4_16_add_neon>, 4, 1,
-             VPX_BITS_10, 2),
-  make_tuple(&vp9_highbd_fht4x4_c,
-             &highbd_iht_wrapper<vp9_highbd_iht4x4_16_add_neon>, 4, 2,
-             VPX_BITS_10, 2),
-  make_tuple(&vp9_highbd_fht4x4_c,
-             &highbd_iht_wrapper<vp9_highbd_iht4x4_16_add_neon>, 4, 3,
-             VPX_BITS_10, 2),
-  make_tuple(&vp9_highbd_fht4x4_c,
-             &highbd_iht_wrapper<vp9_highbd_iht4x4_16_add_neon>, 4, 0,
-             VPX_BITS_12, 2),
-  make_tuple(&vp9_highbd_fht4x4_c,
-             &highbd_iht_wrapper<vp9_highbd_iht4x4_16_add_neon>, 4, 1,
-             VPX_BITS_12, 2),
-  make_tuple(&vp9_highbd_fht4x4_c,
-             &highbd_iht_wrapper<vp9_highbd_iht4x4_16_add_neon>, 4, 2,
-             VPX_BITS_12, 2),
-  make_tuple(&vp9_highbd_fht4x4_c,
-             &highbd_iht_wrapper<vp9_highbd_iht4x4_16_add_neon>, 4, 3,
-             VPX_BITS_12, 2),
-
-  make_tuple(&vp9_highbd_fht8x8_c,
-             &highbd_iht_wrapper<vp9_highbd_iht8x8_64_add_neon>, 8, 0,
-             VPX_BITS_8, 2),
-  make_tuple(&vp9_highbd_fht8x8_c,
-             &highbd_iht_wrapper<vp9_highbd_iht8x8_64_add_neon>, 8, 1,
-             VPX_BITS_8, 2),
-  make_tuple(&vp9_highbd_fht8x8_c,
-             &highbd_iht_wrapper<vp9_highbd_iht8x8_64_add_neon>, 8, 2,
-             VPX_BITS_8, 2),
-  make_tuple(&vp9_highbd_fht8x8_c,
-             &highbd_iht_wrapper<vp9_highbd_iht8x8_64_add_neon>, 8, 3,
-             VPX_BITS_8, 2),
-  make_tuple(&vp9_highbd_fht8x8_c,
-             &highbd_iht_wrapper<vp9_highbd_iht8x8_64_add_neon>, 8, 0,
-             VPX_BITS_10, 2),
-  make_tuple(&vp9_highbd_fht8x8_c,
-             &highbd_iht_wrapper<vp9_highbd_iht8x8_64_add_neon>, 8, 1,
-             VPX_BITS_10, 2),
-  make_tuple(&vp9_highbd_fht8x8_c,
-             &highbd_iht_wrapper<vp9_highbd_iht8x8_64_add_neon>, 8, 2,
-             VPX_BITS_10, 2),
-  make_tuple(&vp9_highbd_fht8x8_c,
-             &highbd_iht_wrapper<vp9_highbd_iht8x8_64_add_neon>, 8, 3,
-             VPX_BITS_10, 2),
-  make_tuple(&vp9_highbd_fht8x8_c,
-             &highbd_iht_wrapper<vp9_highbd_iht8x8_64_add_neon>, 8, 0,
-             VPX_BITS_12, 2),
-  make_tuple(&vp9_highbd_fht8x8_c,
-             &highbd_iht_wrapper<vp9_highbd_iht8x8_64_add_neon>, 8, 1,
-             VPX_BITS_12, 2),
-  make_tuple(&vp9_highbd_fht8x8_c,
-             &highbd_iht_wrapper<vp9_highbd_iht8x8_64_add_neon>, 8, 2,
-             VPX_BITS_12, 2),
-  make_tuple(&vp9_highbd_fht8x8_c,
-             &highbd_iht_wrapper<vp9_highbd_iht8x8_64_add_neon>, 8, 3,
-             VPX_BITS_12, 2),
-#endif  // CONFIG_VP9_HIGHBITDEPTH
-  make_tuple(&vp9_fht8x8_c, &iht_wrapper<vp9_iht8x8_64_add_neon>, 8, 0,
-             VPX_BITS_8, 1),
-  make_tuple(&vp9_fht8x8_c, &iht_wrapper<vp9_iht8x8_64_add_neon>, 8, 1,
-             VPX_BITS_8, 1),
-  make_tuple(&vp9_fht8x8_c, &iht_wrapper<vp9_iht8x8_64_add_neon>, 8, 2,
-             VPX_BITS_8, 1),
-  make_tuple(&vp9_fht8x8_c, &iht_wrapper<vp9_iht8x8_64_add_neon>, 8, 3,
-             VPX_BITS_8, 1),
-
-  make_tuple(&vp9_fht4x4_c, &iht_wrapper<vp9_iht4x4_16_add_neon>, 4, 0,
-             VPX_BITS_8, 1),
-  make_tuple(&vp9_fht4x4_c, &iht_wrapper<vp9_iht4x4_16_add_neon>, 4, 1,
-             VPX_BITS_8, 1),
-  make_tuple(&vp9_fht4x4_c, &iht_wrapper<vp9_iht4x4_16_add_neon>, 4, 2,
-             VPX_BITS_8, 1),
-  make_tuple(&vp9_fht4x4_c, &iht_wrapper<vp9_iht4x4_16_add_neon>, 4, 3,
-             VPX_BITS_8, 1)
+  { &vp9_highbd_fht4x4_c, &highbd_iht_wrapper<vp9_highbd_iht4x4_16_add_neon>, 4,
+    2 },
+  { &vp9_highbd_fht8x8_c, &highbd_iht_wrapper<vp9_highbd_iht8x8_64_add_neon>, 8,
+    2 },
+#endif
+  { &vp9_fht4x4_c, &iht_wrapper<vp9_iht4x4_16_add_neon>, 4, 1 },
+  { &vp9_fht8x8_c, &iht_wrapper<vp9_iht8x8_64_add_neon>, 8, 1 }
 };
 
-INSTANTIATE_TEST_CASE_P(NEON, TransHT, ::testing::ValuesIn(neon_ht_tests));
+INSTANTIATE_TEST_CASE_P(
+    NEON, TransHT,
+    ::testing::Combine(
+        ::testing::Range(0, static_cast<int>(sizeof(ht_neon_func_info) /
+                                             sizeof(ht_neon_func_info[0]))),
+        ::testing::Values(ht_neon_func_info), ::testing::Range(0, 4),
+        ::testing::Values(VPX_BITS_8, VPX_BITS_10, VPX_BITS_12)));
 #endif  // HAVE_NEON
 
 #if HAVE_SSE2
-INSTANTIATE_TEST_CASE_P(
-    SSE2, TransHT,
-    ::testing::Values(
-        make_tuple(&vp9_fht16x16_sse2, &iht_wrapper<vp9_iht16x16_256_add_sse2>,
-                   16, 0, VPX_BITS_8, 1),
-        make_tuple(&vp9_fht16x16_sse2, &iht_wrapper<vp9_iht16x16_256_add_sse2>,
-                   16, 1, VPX_BITS_8, 1),
-        make_tuple(&vp9_fht16x16_sse2, &iht_wrapper<vp9_iht16x16_256_add_sse2>,
-                   16, 2, VPX_BITS_8, 1),
-        make_tuple(&vp9_fht16x16_sse2, &iht_wrapper<vp9_iht16x16_256_add_sse2>,
-                   16, 3, VPX_BITS_8, 1),
 
-        make_tuple(&vp9_fht8x8_sse2, &iht_wrapper<vp9_iht8x8_64_add_sse2>, 8, 0,
-                   VPX_BITS_8, 1),
-        make_tuple(&vp9_fht8x8_sse2, &iht_wrapper<vp9_iht8x8_64_add_sse2>, 8, 1,
-                   VPX_BITS_8, 1),
-        make_tuple(&vp9_fht8x8_sse2, &iht_wrapper<vp9_iht8x8_64_add_sse2>, 8, 2,
-                   VPX_BITS_8, 1),
-        make_tuple(&vp9_fht8x8_sse2, &iht_wrapper<vp9_iht8x8_64_add_sse2>, 8, 3,
-                   VPX_BITS_8, 1),
+static const FuncInfo ht_sse2_func_info[3] = {
+  { &vp9_fht4x4_sse2, &iht_wrapper<vp9_iht4x4_16_add_sse2>, 4, 1 },
+  { &vp9_fht8x8_sse2, &iht_wrapper<vp9_iht8x8_64_add_sse2>, 8, 1 },
+  { &vp9_fht16x16_sse2, &iht_wrapper<vp9_iht16x16_256_add_sse2>, 16, 1 }
+};
 
-        make_tuple(&vp9_fht4x4_sse2, &iht_wrapper<vp9_iht4x4_16_add_sse2>, 4, 0,
-                   VPX_BITS_8, 1),
-        make_tuple(&vp9_fht4x4_sse2, &iht_wrapper<vp9_iht4x4_16_add_sse2>, 4, 1,
-                   VPX_BITS_8, 1),
-        make_tuple(&vp9_fht4x4_sse2, &iht_wrapper<vp9_iht4x4_16_add_sse2>, 4, 2,
-                   VPX_BITS_8, 1),
-        make_tuple(&vp9_fht4x4_sse2, &iht_wrapper<vp9_iht4x4_16_add_sse2>, 4, 3,
-                   VPX_BITS_8, 1)));
+INSTANTIATE_TEST_CASE_P(SSE2, TransHT,
+                        ::testing::Combine(::testing::Range(0, 3),
+                                           ::testing::Values(ht_sse2_func_info),
+                                           ::testing::Range(0, 4),
+                                           ::testing::Values(VPX_BITS_8)));
 #endif  // HAVE_SSE2
 
 #if HAVE_SSE4_1 && CONFIG_VP9_HIGHBITDEPTH
+static const FuncInfo ht_sse4_1_func_info[3] = {
+  { &vp9_highbd_fht4x4_c, &highbd_iht_wrapper<vp9_highbd_iht4x4_16_add_sse4_1>,
+    4, 2 },
+  { vp9_highbd_fht8x8_c, &highbd_iht_wrapper<vp9_highbd_iht8x8_64_add_sse4_1>,
+    8, 2 },
+  { &vp9_highbd_fht16x16_c,
+    &highbd_iht_wrapper<vp9_highbd_iht16x16_256_add_sse4_1>, 16, 2 }
+};
+
 INSTANTIATE_TEST_CASE_P(
     SSE4_1, TransHT,
-    ::testing::Values(
-        make_tuple(&vp9_highbd_fht16x16_c,
-                   &highbd_iht_wrapper<vp9_highbd_iht16x16_256_add_sse4_1>, 16,
-                   0, VPX_BITS_8, 2),
-        make_tuple(&vp9_highbd_fht16x16_c,
-                   &highbd_iht_wrapper<vp9_highbd_iht16x16_256_add_sse4_1>, 16,
-                   1, VPX_BITS_8, 2),
-        make_tuple(&vp9_highbd_fht16x16_c,
-                   &highbd_iht_wrapper<vp9_highbd_iht16x16_256_add_sse4_1>, 16,
-                   2, VPX_BITS_8, 2),
-        make_tuple(&vp9_highbd_fht16x16_c,
-                   &highbd_iht_wrapper<vp9_highbd_iht16x16_256_add_sse4_1>, 16,
-                   3, VPX_BITS_8, 2),
-        make_tuple(&vp9_highbd_fht16x16_c,
-                   &highbd_iht_wrapper<vp9_highbd_iht16x16_256_add_sse4_1>, 16,
-                   0, VPX_BITS_10, 2),
-        make_tuple(&vp9_highbd_fht16x16_c,
-                   &highbd_iht_wrapper<vp9_highbd_iht16x16_256_add_sse4_1>, 16,
-                   1, VPX_BITS_10, 2),
-        make_tuple(&vp9_highbd_fht16x16_c,
-                   &highbd_iht_wrapper<vp9_highbd_iht16x16_256_add_sse4_1>, 16,
-                   2, VPX_BITS_10, 2),
-        make_tuple(&vp9_highbd_fht16x16_c,
-                   &highbd_iht_wrapper<vp9_highbd_iht16x16_256_add_sse4_1>, 16,
-                   3, VPX_BITS_10, 2),
-        make_tuple(&vp9_highbd_fht16x16_c,
-                   &highbd_iht_wrapper<vp9_highbd_iht16x16_256_add_sse4_1>, 16,
-                   0, VPX_BITS_12, 2),
-        make_tuple(&vp9_highbd_fht16x16_c,
-                   &highbd_iht_wrapper<vp9_highbd_iht16x16_256_add_sse4_1>, 16,
-                   1, VPX_BITS_12, 2),
-        make_tuple(&vp9_highbd_fht16x16_c,
-                   &highbd_iht_wrapper<vp9_highbd_iht16x16_256_add_sse4_1>, 16,
-                   2, VPX_BITS_12, 2),
-        make_tuple(&vp9_highbd_fht16x16_c,
-                   &highbd_iht_wrapper<vp9_highbd_iht16x16_256_add_sse4_1>, 16,
-                   3, VPX_BITS_12, 2),
-
-        make_tuple(&vp9_highbd_fht8x8_c,
-                   &highbd_iht_wrapper<vp9_highbd_iht8x8_64_add_sse4_1>, 8, 0,
-                   VPX_BITS_8, 2),
-        make_tuple(&vp9_highbd_fht8x8_c,
-                   &highbd_iht_wrapper<vp9_highbd_iht8x8_64_add_sse4_1>, 8, 1,
-                   VPX_BITS_8, 2),
-        make_tuple(&vp9_highbd_fht8x8_c,
-                   &highbd_iht_wrapper<vp9_highbd_iht8x8_64_add_sse4_1>, 8, 2,
-                   VPX_BITS_8, 2),
-        make_tuple(&vp9_highbd_fht8x8_c,
-                   &highbd_iht_wrapper<vp9_highbd_iht8x8_64_add_sse4_1>, 8, 3,
-                   VPX_BITS_8, 2),
-        make_tuple(&vp9_highbd_fht8x8_c,
-                   &highbd_iht_wrapper<vp9_highbd_iht8x8_64_add_sse4_1>, 8, 0,
-                   VPX_BITS_10, 2),
-        make_tuple(&vp9_highbd_fht8x8_c,
-                   &highbd_iht_wrapper<vp9_highbd_iht8x8_64_add_sse4_1>, 8, 1,
-                   VPX_BITS_10, 2),
-        make_tuple(&vp9_highbd_fht8x8_c,
-                   &highbd_iht_wrapper<vp9_highbd_iht8x8_64_add_sse4_1>, 8, 2,
-                   VPX_BITS_10, 2),
-        make_tuple(&vp9_highbd_fht8x8_c,
-                   &highbd_iht_wrapper<vp9_highbd_iht8x8_64_add_sse4_1>, 8, 3,
-                   VPX_BITS_10, 2),
-        make_tuple(&vp9_highbd_fht8x8_c,
-                   &highbd_iht_wrapper<vp9_highbd_iht8x8_64_add_sse4_1>, 8, 0,
-                   VPX_BITS_12, 2),
-        make_tuple(&vp9_highbd_fht8x8_c,
-                   &highbd_iht_wrapper<vp9_highbd_iht8x8_64_add_sse4_1>, 8, 1,
-                   VPX_BITS_12, 2),
-        make_tuple(&vp9_highbd_fht8x8_c,
-                   &highbd_iht_wrapper<vp9_highbd_iht8x8_64_add_sse4_1>, 8, 2,
-                   VPX_BITS_12, 2),
-        make_tuple(&vp9_highbd_fht8x8_c,
-                   &highbd_iht_wrapper<vp9_highbd_iht8x8_64_add_sse4_1>, 8, 3,
-                   VPX_BITS_12, 2),
-
-        make_tuple(&vp9_highbd_fht4x4_c,
-                   &highbd_iht_wrapper<vp9_highbd_iht4x4_16_add_sse4_1>, 4, 0,
-                   VPX_BITS_8, 2),
-        make_tuple(&vp9_highbd_fht4x4_c,
-                   &highbd_iht_wrapper<vp9_highbd_iht4x4_16_add_sse4_1>, 4, 1,
-                   VPX_BITS_8, 2),
-        make_tuple(&vp9_highbd_fht4x4_c,
-                   &highbd_iht_wrapper<vp9_highbd_iht4x4_16_add_sse4_1>, 4, 2,
-                   VPX_BITS_8, 2),
-        make_tuple(&vp9_highbd_fht4x4_c,
-                   &highbd_iht_wrapper<vp9_highbd_iht4x4_16_add_sse4_1>, 4, 3,
-                   VPX_BITS_8, 2),
-        make_tuple(&vp9_highbd_fht4x4_c,
-                   &highbd_iht_wrapper<vp9_highbd_iht4x4_16_add_sse4_1>, 4, 0,
-                   VPX_BITS_10, 2),
-        make_tuple(&vp9_highbd_fht4x4_c,
-                   &highbd_iht_wrapper<vp9_highbd_iht4x4_16_add_sse4_1>, 4, 1,
-                   VPX_BITS_10, 2),
-        make_tuple(&vp9_highbd_fht4x4_c,
-                   &highbd_iht_wrapper<vp9_highbd_iht4x4_16_add_sse4_1>, 4, 2,
-                   VPX_BITS_10, 2),
-        make_tuple(&vp9_highbd_fht4x4_c,
-                   &highbd_iht_wrapper<vp9_highbd_iht4x4_16_add_sse4_1>, 4, 3,
-                   VPX_BITS_10, 2),
-        make_tuple(&vp9_highbd_fht4x4_c,
-                   &highbd_iht_wrapper<vp9_highbd_iht4x4_16_add_sse4_1>, 4, 0,
-                   VPX_BITS_12, 2),
-        make_tuple(&vp9_highbd_fht4x4_c,
-                   &highbd_iht_wrapper<vp9_highbd_iht4x4_16_add_sse4_1>, 4, 1,
-                   VPX_BITS_12, 2),
-        make_tuple(&vp9_highbd_fht4x4_c,
-                   &highbd_iht_wrapper<vp9_highbd_iht4x4_16_add_sse4_1>, 4, 2,
-                   VPX_BITS_12, 2),
-        make_tuple(&vp9_highbd_fht4x4_c,
-                   &highbd_iht_wrapper<vp9_highbd_iht4x4_16_add_sse4_1>, 4, 3,
-                   VPX_BITS_12, 2)));
+    ::testing::Combine(::testing::Range(0, 3),
+                       ::testing::Values(ht_sse4_1_func_info),
+                       ::testing::Range(0, 4),
+                       ::testing::Values(VPX_BITS_8, VPX_BITS_10,
+                                         VPX_BITS_12)));
 #endif  // HAVE_SSE4_1 && CONFIG_VP9_HIGHBITDEPTH
 
 #endif  // !CONFIG_EMULATE_HARDWARE
@@ -1017,29 +689,29 @@
 
 TEST_P(TransWHT, InvAccuracyCheck) { RunInvAccuracyCheck(0); }
 
-const DctParam c_wht_tests[] = {
+static const FuncInfo wht_c_func_info[] = {
 #if CONFIG_VP9_HIGHBITDEPTH
-  make_tuple(&fdct_wrapper<vp9_highbd_fwht4x4_c>,
-             &highbd_idct_wrapper<vpx_highbd_iwht4x4_16_add_c>, 4, 0,
-             VPX_BITS_8, 2),
-  make_tuple(&fdct_wrapper<vp9_highbd_fwht4x4_c>,
-             &highbd_idct_wrapper<vpx_highbd_iwht4x4_16_add_c>, 4, 0,
-             VPX_BITS_10, 2),
-  make_tuple(&fdct_wrapper<vp9_highbd_fwht4x4_c>,
-             &highbd_idct_wrapper<vpx_highbd_iwht4x4_16_add_c>, 4, 0,
-             VPX_BITS_12, 2),
-#endif  // CONFIG_VP9_HIGHBITDEPTH
-  make_tuple(&fdct_wrapper<vp9_fwht4x4_c>, &idct_wrapper<vpx_iwht4x4_16_add_c>,
-             4, 0, VPX_BITS_8, 1)
+  { &fdct_wrapper<vp9_highbd_fwht4x4_c>,
+    &highbd_idct_wrapper<vpx_highbd_iwht4x4_16_add_c>, 4, 2 },
+#endif
+  { &fdct_wrapper<vp9_fwht4x4_c>, &idct_wrapper<vpx_iwht4x4_16_add_c>, 4, 1 }
 };
 
-INSTANTIATE_TEST_CASE_P(C, TransWHT, ::testing::ValuesIn(c_wht_tests));
+INSTANTIATE_TEST_CASE_P(
+    C, TransWHT,
+    ::testing::Combine(
+        ::testing::Range(0, static_cast<int>(sizeof(wht_c_func_info) /
+                                             sizeof(wht_c_func_info[0]))),
+        ::testing::Values(wht_c_func_info), ::testing::Values(0),
+        ::testing::Values(VPX_BITS_8, VPX_BITS_10, VPX_BITS_12)));
 
 #if HAVE_SSE2 && !CONFIG_EMULATE_HARDWARE
-INSTANTIATE_TEST_CASE_P(
-    SSE2, TransWHT,
-    ::testing::Values(make_tuple(&fdct_wrapper<vp9_fwht4x4_sse2>,
-                                 &idct_wrapper<vpx_iwht4x4_16_add_sse2>, 4, 0,
-                                 VPX_BITS_8, 1)));
+static const FuncInfo wht_sse2_func_info = {
+  &fdct_wrapper<vp9_fwht4x4_sse2>, &idct_wrapper<vpx_iwht4x4_16_add_sse2>, 4, 1
+};
+
+INSTANTIATE_TEST_CASE_P(SSE2, TransWHT,
+                        ::testing::Values(make_tuple(0, &wht_sse2_func_info, 0,
+                                                     VPX_BITS_8)));
 #endif  // HAVE_SSE2 && !CONFIG_EMULATE_HARDWARE
 }  // namespace