Speed rgbtoyuvtest up (#2009)

Split it into avifrgbtoyuvthreadingtest.
diff --git a/tests/CMakeLists.txt b/tests/CMakeLists.txt
index 3106260..0f5d330 100644
--- a/tests/CMakeLists.txt
+++ b/tests/CMakeLists.txt
@@ -145,6 +145,7 @@
     add_avif_gtest_with_data(avifreadimagetest)
     add_avif_internal_gtest(avifrgbtest)
     add_avif_gtest(avifrgbtoyuvtest)
+    add_avif_gtest(avifrgbtoyuvthreadingtest)
     add_avif_gtest_with_data(avifscaletest)
     add_avif_internal_gtest(avifstreamtest)
     add_avif_internal_gtest(aviftilingtest)
diff --git a/tests/gtest/avifrgbtoyuvtest.cc b/tests/gtest/avifrgbtoyuvtest.cc
index b966484..d03e5ef 100644
--- a/tests/gtest/avifrgbtoyuvtest.cc
+++ b/tests/gtest/avifrgbtoyuvtest.cc
@@ -478,7 +478,7 @@
 // bring any loss in the roundtrip.
 INSTANTIATE_TEST_SUITE_P(Identity8b, RGBToYUVTest,
                          Combine(/*rgb_depth=*/Values(8),
-                                 /*yuv_depth=*/Values(8, 10, 12, 16),
+                                 /*yuv_depth=*/Values(8, 12, 16),
                                  Values(AVIF_RGB_FORMAT_RGBA),
                                  Values(AVIF_PIXEL_FORMAT_YUV444),
                                  Values(AVIF_RANGE_FULL),
@@ -531,8 +531,7 @@
     Combine(
         /*rgb_depth=*/Values(8),
         /*yuv_depth=*/Values(8), Values(AVIF_RGB_FORMAT_RGBA),
-        Values(AVIF_PIXEL_FORMAT_YUV444, AVIF_PIXEL_FORMAT_YUV422,
-               AVIF_PIXEL_FORMAT_YUV420),
+        Values(AVIF_PIXEL_FORMAT_YUV444, AVIF_PIXEL_FORMAT_YUV420),
         Values(AVIF_RANGE_FULL), Values(kMatrixCoefficientsBT601),
         Values(AVIF_CHROMA_DOWNSAMPLING_AUTOMATIC),
         /*add_noise=*/Values(false),
@@ -546,7 +545,7 @@
 // depth should be lossless.
 INSTANTIATE_TEST_SUITE_P(MonochromeLossless8b, RGBToYUVTest,
                          Combine(/*rgb_depth=*/Values(8),
-                                 /*yuv_depth=*/Values(8, 10, 12, 16),
+                                 /*yuv_depth=*/Values(8),
                                  Values(AVIF_RGB_FORMAT_RGBA),
                                  Values(AVIF_PIXEL_FORMAT_YUV400),
                                  Values(AVIF_RANGE_FULL),
@@ -558,7 +557,7 @@
                                  /*min_psnr=*/Values(99.)));
 INSTANTIATE_TEST_SUITE_P(MonochromeLossless10b, RGBToYUVTest,
                          Combine(/*rgb_depth=*/Values(10),
-                                 /*yuv_depth=*/Values(10, 12, 16),
+                                 /*yuv_depth=*/Values(10),
                                  Values(AVIF_RGB_FORMAT_RGBA),
                                  Values(AVIF_PIXEL_FORMAT_YUV400),
                                  Values(AVIF_RANGE_FULL),
@@ -570,7 +569,7 @@
                                  /*min_psnr=*/Values(99.)));
 INSTANTIATE_TEST_SUITE_P(MonochromeLossless12b, RGBToYUVTest,
                          Combine(/*rgb_depth=*/Values(12),
-                                 /*yuv_depth=*/Values(12, 16),
+                                 /*yuv_depth=*/Values(12),
                                  Values(AVIF_RGB_FORMAT_RGBA),
                                  Values(AVIF_PIXEL_FORMAT_YUV400),
                                  Values(AVIF_RANGE_FULL),
@@ -599,8 +598,36 @@
     Combine(
         /*rgb_depth=*/Values(8),
         /*yuv_depth=*/Values(8, 10, 12), Values(AVIF_RGB_FORMAT_RGBA),
+        Values(AVIF_PIXEL_FORMAT_YUV420), Values(AVIF_RANGE_FULL),
+        Values(kMatrixCoefficientsBT601),
+        Values(AVIF_CHROMA_DOWNSAMPLING_SHARP_YUV),
+        /*add_noise=*/Values(true),
+        /*rgb_step=*/Values(17),
+        /*max_abs_average_diff=*/Values(1.2),  // Sharp YUV introduces some
+                                               // color shift.
+        /*min_psnr=*/Values(34.)  // SharpYuv distortion is acceptable.
+        ));
+INSTANTIATE_TEST_SUITE_P(
+    SharpYuv8BitRanges, RGBToYUVTest,
+    Combine(
+        /*rgb_depth=*/Values(8),
+        /*yuv_depth=*/Values(8), Values(AVIF_RGB_FORMAT_RGBA),
         Values(AVIF_PIXEL_FORMAT_YUV420),
         Values(AVIF_RANGE_LIMITED, AVIF_RANGE_FULL),
+        Values(kMatrixCoefficientsBT601),
+        Values(AVIF_CHROMA_DOWNSAMPLING_SHARP_YUV),
+        /*add_noise=*/Values(true),
+        /*rgb_step=*/Values(17),
+        /*max_abs_average_diff=*/Values(1.2),  // Sharp YUV introduces some
+                                               // color shift.
+        /*min_psnr=*/Values(34.)  // SharpYuv distortion is acceptable.
+        ));
+INSTANTIATE_TEST_SUITE_P(
+    SharpYuv8BitMatrixCoefficients, RGBToYUVTest,
+    Combine(
+        /*rgb_depth=*/Values(8),
+        /*yuv_depth=*/Values(8), Values(AVIF_RGB_FORMAT_RGBA),
+        Values(AVIF_PIXEL_FORMAT_YUV420), Values(AVIF_RANGE_FULL),
         Values(kMatrixCoefficientsBT601, kMatrixCoefficientsBT709),
         Values(AVIF_CHROMA_DOWNSAMPLING_SHARP_YUV),
         /*add_noise=*/Values(true),
@@ -613,9 +640,8 @@
     SharpYuv10Bit, RGBToYUVTest,
     Combine(
         /*rgb_depth=*/Values(10),
-        /*yuv_depth=*/Values(8, 10, 12), Values(AVIF_RGB_FORMAT_RGBA),
-        Values(AVIF_PIXEL_FORMAT_YUV420),
-        Values(AVIF_RANGE_LIMITED, AVIF_RANGE_FULL),
+        /*yuv_depth=*/Values(10), Values(AVIF_RGB_FORMAT_RGBA),
+        Values(AVIF_PIXEL_FORMAT_YUV420), Values(AVIF_RANGE_FULL),
         Values(kMatrixCoefficientsBT601),
         Values(AVIF_CHROMA_DOWNSAMPLING_SHARP_YUV),
         /*add_noise=*/Values(true),
@@ -629,8 +655,7 @@
     Combine(
         /*rgb_depth=*/Values(12),
         /*yuv_depth=*/Values(8, 10, 12), Values(AVIF_RGB_FORMAT_RGBA),
-        Values(AVIF_PIXEL_FORMAT_YUV420),
-        Values(AVIF_RANGE_LIMITED, AVIF_RANGE_FULL),
+        Values(AVIF_PIXEL_FORMAT_YUV420), Values(AVIF_RANGE_FULL),
         Values(kMatrixCoefficientsBT601),
         Values(AVIF_CHROMA_DOWNSAMPLING_SHARP_YUV),
         /*add_noise=*/Values(true),
@@ -645,8 +670,7 @@
         /*rgb_depth=*/Values(16),
         // TODO(yguyon): Why max_abs_average_diff>28 if RGB16 to YUV10 full rng?
         /*yuv_depth=*/Values(8, /*10,*/ 12), Values(AVIF_RGB_FORMAT_RGBA),
-        Values(AVIF_PIXEL_FORMAT_YUV420),
-        Values(AVIF_RANGE_LIMITED, AVIF_RANGE_FULL),
+        Values(AVIF_PIXEL_FORMAT_YUV420), Values(AVIF_RANGE_FULL),
         Values(kMatrixCoefficientsBT601),
         Values(AVIF_CHROMA_DOWNSAMPLING_SHARP_YUV),
         /*add_noise=*/Values(true),
@@ -659,14 +683,13 @@
 // Can be used to print the drift of all RGB to YUV conversion possibilities.
 // Also used for coverage.
 INSTANTIATE_TEST_SUITE_P(
-    All8b, RGBToYUVTest,
+    All8bTo8b, RGBToYUVTest,
     Combine(/*rgb_depth=*/Values(8),
-            /*yuv_depth=*/Values(8, 10, 12, 16),
+            /*yuv_depth=*/Values(8),
             Values(AVIF_RGB_FORMAT_RGBA, AVIF_RGB_FORMAT_BGR),
             Values(AVIF_PIXEL_FORMAT_YUV444, AVIF_PIXEL_FORMAT_YUV422,
                    AVIF_PIXEL_FORMAT_YUV420),
-            Values(AVIF_RANGE_LIMITED, AVIF_RANGE_FULL),
-            Values(kMatrixCoefficientsBT601),
+            Values(AVIF_RANGE_LIMITED), Values(kMatrixCoefficientsBT601),
             Values(AVIF_CHROMA_DOWNSAMPLING_AUTOMATIC),
             /*add_noise=*/Bool(),
             /*rgb_step=*/Values(61),  // High or it would be too slow.
@@ -676,11 +699,9 @@
 INSTANTIATE_TEST_SUITE_P(
     All10b, RGBToYUVTest,
     Combine(/*rgb_depth=*/Values(10),
-            /*yuv_depth=*/Values(8, 10, 12, 16), Values(AVIF_RGB_FORMAT_RGBA),
-            Values(AVIF_PIXEL_FORMAT_YUV444, AVIF_PIXEL_FORMAT_YUV422,
-                   AVIF_PIXEL_FORMAT_YUV420),
-            Values(AVIF_RANGE_LIMITED, AVIF_RANGE_FULL),
-            Values(kMatrixCoefficientsBT601),
+            /*yuv_depth=*/Values(10), Values(AVIF_RGB_FORMAT_RGBA),
+            Values(AVIF_PIXEL_FORMAT_YUV444, AVIF_PIXEL_FORMAT_YUV420),
+            Values(AVIF_RANGE_FULL), Values(kMatrixCoefficientsBT601),
             Values(AVIF_CHROMA_DOWNSAMPLING_AUTOMATIC),
             /*add_noise=*/Bool(),
             /*rgb_step=*/Values(211),  // High or it would be too slow.
@@ -690,11 +711,9 @@
 INSTANTIATE_TEST_SUITE_P(
     All12b, RGBToYUVTest,
     Combine(/*rgb_depth=*/Values(12),
-            /*yuv_depth=*/Values(8, 10, 12, 16), Values(AVIF_RGB_FORMAT_RGBA),
-            Values(AVIF_PIXEL_FORMAT_YUV444, AVIF_PIXEL_FORMAT_YUV422,
-                   AVIF_PIXEL_FORMAT_YUV420),
-            Values(AVIF_RANGE_LIMITED, AVIF_RANGE_FULL),
-            Values(kMatrixCoefficientsBT601),
+            /*yuv_depth=*/Values(12), Values(AVIF_RGB_FORMAT_RGBA),
+            Values(AVIF_PIXEL_FORMAT_YUV444, AVIF_PIXEL_FORMAT_YUV420),
+            Values(AVIF_RANGE_LIMITED), Values(kMatrixCoefficientsBT601),
             Values(AVIF_CHROMA_DOWNSAMPLING_AUTOMATIC),
             /*add_noise=*/Bool(),
             /*rgb_step=*/Values(809),  // High or it would be too slow.
@@ -705,10 +724,8 @@
     All16b, RGBToYUVTest,
     Combine(/*rgb_depth=*/Values(16),
             /*yuv_depth=*/Values(16), Values(AVIF_RGB_FORMAT_RGBA),
-            Values(AVIF_PIXEL_FORMAT_YUV444, AVIF_PIXEL_FORMAT_YUV422,
-                   AVIF_PIXEL_FORMAT_YUV420),
-            Values(AVIF_RANGE_LIMITED, AVIF_RANGE_FULL),
-            Values(kMatrixCoefficientsBT601),
+            Values(AVIF_PIXEL_FORMAT_YUV444, AVIF_PIXEL_FORMAT_YUV420),
+            Values(AVIF_RANGE_FULL), Values(kMatrixCoefficientsBT601),
             Values(AVIF_CHROMA_DOWNSAMPLING_AUTOMATIC),
             /*add_noise=*/Bool(),
             /*rgb_step=*/Values(16001),  // High or it would be too slow.
@@ -731,108 +748,5 @@
             /*max_abs_average_diff=*/Values(10.),
             /*min_psnr=*/Values(10.)));
 
-// Converts YUV pixels to RGB using one thread and multiple threads and checks
-// whether the results of both are identical.
-class YUVToRGBThreadingTest
-    : public testing::TestWithParam<std::tuple<
-          /*rgb_depth=*/int, /*yuv_depth=*/int,
-          /*width=*/int, /*height=*/int, avifRGBFormat, avifPixelFormat,
-          /*threads=*/int, /*avoidLibYUV=*/bool, avifChromaUpsampling,
-          /*has_alpha=*/bool>> {};
-
-TEST_P(YUVToRGBThreadingTest, TestIdentical) {
-  const int rgb_depth = std::get<0>(GetParam());
-  const int yuv_depth = std::get<1>(GetParam());
-  const int width = std::get<2>(GetParam());
-  const int height = std::get<3>(GetParam());
-  const avifRGBFormat rgb_format = std::get<4>(GetParam());
-  const avifPixelFormat yuv_format = std::get<5>(GetParam());
-  const int maxThreads = std::get<6>(GetParam());
-  const bool avoidLibYUV = std::get<7>(GetParam());
-  const avifChromaUpsampling chromaUpsampling = std::get<8>(GetParam());
-  const bool has_alpha = std::get<9>(GetParam());
-
-  if (rgb_depth > 8 && rgb_format == AVIF_RGB_FORMAT_RGB_565) {
-    return;
-  }
-
-  ImagePtr yuv(avifImageCreate(width, height, yuv_depth, yuv_format));
-  ASSERT_NE(yuv, nullptr);
-  yuv->matrixCoefficients = AVIF_MATRIX_COEFFICIENTS_BT601;
-  yuv->yuvRange = AVIF_RANGE_FULL;
-
-  // Fill YUVA planes with random values.
-  srand(0xAABBCCDD);
-  const int yuv_max = (1 << yuv_depth);
-  ASSERT_EQ(avifImageAllocatePlanes(
-                yuv.get(), has_alpha ? AVIF_PLANES_ALL : AVIF_PLANES_YUV),
-            AVIF_RESULT_OK);
-  for (int plane = AVIF_CHAN_Y; plane <= AVIF_CHAN_A; ++plane) {
-    const uint32_t plane_width = avifImagePlaneWidth(yuv.get(), plane);
-    if (plane_width == 0) continue;
-    const uint32_t plane_height = avifImagePlaneHeight(yuv.get(), plane);
-    const uint32_t rowBytes = avifImagePlaneRowBytes(yuv.get(), plane);
-    uint8_t* row = avifImagePlane(yuv.get(), plane);
-    for (uint32_t y = 0; y < plane_height; ++y, row += rowBytes) {
-      for (uint32_t x = 0; x < plane_width; ++x) {
-        if (yuv_depth == 8) {
-          row[x] = (uint8_t)(rand() % yuv_max);
-        } else {
-          ((uint16_t*)row)[x] = (uint16_t)(rand() % yuv_max);
-        }
-      }
-    }
-  }
-
-  // Convert to RGB with 1 thread.
-  testutil::AvifRgbImage rgb(yuv.get(), rgb_depth, rgb_format);
-  rgb.avoidLibYUV = avoidLibYUV;
-  rgb.chromaUpsampling = chromaUpsampling;
-  ASSERT_EQ(avifImageYUVToRGB(yuv.get(), &rgb), AVIF_RESULT_OK);
-
-  // Convert to RGB with multiple threads.
-  testutil::AvifRgbImage rgb_threaded(yuv.get(), rgb_depth, rgb_format);
-  rgb_threaded.avoidLibYUV = avoidLibYUV;
-  rgb_threaded.chromaUpsampling = chromaUpsampling;
-  rgb_threaded.maxThreads = maxThreads;
-  ASSERT_EQ(avifImageYUVToRGB(yuv.get(), &rgb_threaded), AVIF_RESULT_OK);
-
-  EXPECT_TRUE(testutil::AreImagesEqual(rgb, rgb_threaded));
-}
-
-INSTANTIATE_TEST_SUITE_P(
-    YUVToRGBThreadingTestInstance, YUVToRGBThreadingTest,
-    Combine(/*rgb_depth=*/Values(8, 16),
-            /*yuv_depth=*/Values(8, 10),
-            /*width=*/Values(1, 2, 127, 200),
-            /*height=*/Values(1, 2, 127, 200),
-            Values(AVIF_RGB_FORMAT_RGB, AVIF_RGB_FORMAT_RGBA),
-            Range(AVIF_PIXEL_FORMAT_YUV444, AVIF_PIXEL_FORMAT_COUNT),
-            // Test an odd and even number for threads. Not adding all possible
-            // thread values to keep the number of test instances low.
-            /*threads=*/Values(2, 7),
-            /*avoidLibYUV=*/Bool(),
-            Values(AVIF_CHROMA_UPSAMPLING_FASTEST,
-                   AVIF_CHROMA_UPSAMPLING_BILINEAR),
-            /*has_alpha=*/Bool()));
-
-// This will generate a large number of test instances and hence it is disabled
-// by default. It can be run manually if necessary.
-INSTANTIATE_TEST_SUITE_P(
-    DISABLED_ExhaustiveYUVToRGBThreadingTestInstance, YUVToRGBThreadingTest,
-    Combine(/*rgb_depth=*/Values(8, 10, 12, 16),
-            /*yuv_depth=*/Values(8, 10, 12),
-            /*width=*/Values(1, 2, 127, 200),
-            /*height=*/Values(1, 2, 127, 200),
-            Range(AVIF_RGB_FORMAT_RGB, AVIF_RGB_FORMAT_COUNT),
-            Range(AVIF_PIXEL_FORMAT_YUV444, AVIF_PIXEL_FORMAT_COUNT),
-            /*threads=*/Range(0, 9),
-            /*avoidLibYUV=*/Bool(),
-            Values(AVIF_CHROMA_UPSAMPLING_AUTOMATIC,
-                   AVIF_CHROMA_UPSAMPLING_FASTEST,
-                   AVIF_CHROMA_UPSAMPLING_NEAREST,
-                   AVIF_CHROMA_UPSAMPLING_BILINEAR),
-            /*has_alpha=*/Bool()));
-
 }  // namespace
 }  // namespace avif
diff --git a/tests/gtest/avifrgbtoyuvthreadingtest.cc b/tests/gtest/avifrgbtoyuvthreadingtest.cc
new file mode 100644
index 0000000..89588e3
--- /dev/null
+++ b/tests/gtest/avifrgbtoyuvthreadingtest.cc
@@ -0,0 +1,124 @@
+// Copyright 2022 Google LLC
+// SPDX-License-Identifier: BSD-2-Clause
+
+#include <algorithm>
+#include <cmath>
+#include <memory>
+#include <tuple>
+
+#include "aviftest_helpers.h"
+#include "gtest/gtest.h"
+
+using ::testing::Bool;
+using ::testing::Combine;
+using ::testing::Range;
+using ::testing::Values;
+
+namespace avif {
+namespace {
+
+// Converts YUV pixels to RGB using one thread and multiple threads and checks
+// whether the results of both are identical.
+class YUVToRGBThreadingTest
+    : public testing::TestWithParam<std::tuple<
+          /*rgb_depth=*/int, /*yuv_depth=*/int,
+          /*width=*/int, /*height=*/int, avifRGBFormat, avifPixelFormat,
+          /*threads=*/int, /*avoidLibYUV=*/bool, avifChromaUpsampling,
+          /*has_alpha=*/bool>> {};
+
+TEST_P(YUVToRGBThreadingTest, TestIdentical) {
+  const int rgb_depth = std::get<0>(GetParam());
+  const int yuv_depth = std::get<1>(GetParam());
+  const int width = std::get<2>(GetParam());
+  const int height = std::get<3>(GetParam());
+  const avifRGBFormat rgb_format = std::get<4>(GetParam());
+  const avifPixelFormat yuv_format = std::get<5>(GetParam());
+  const int maxThreads = std::get<6>(GetParam());
+  const bool avoidLibYUV = std::get<7>(GetParam());
+  const avifChromaUpsampling chromaUpsampling = std::get<8>(GetParam());
+  const bool has_alpha = std::get<9>(GetParam());
+
+  if (rgb_depth > 8 && rgb_format == AVIF_RGB_FORMAT_RGB_565) {
+    return;
+  }
+
+  ImagePtr yuv(avifImageCreate(width, height, yuv_depth, yuv_format));
+  ASSERT_NE(yuv, nullptr);
+  yuv->matrixCoefficients = AVIF_MATRIX_COEFFICIENTS_BT601;
+  yuv->yuvRange = AVIF_RANGE_FULL;
+
+  // Fill YUVA planes with random values.
+  srand(0xAABBCCDD);
+  const int yuv_max = (1 << yuv_depth);
+  ASSERT_EQ(avifImageAllocatePlanes(
+                yuv.get(), has_alpha ? AVIF_PLANES_ALL : AVIF_PLANES_YUV),
+            AVIF_RESULT_OK);
+  for (int plane = AVIF_CHAN_Y; plane <= AVIF_CHAN_A; ++plane) {
+    const uint32_t plane_width = avifImagePlaneWidth(yuv.get(), plane);
+    if (plane_width == 0) continue;
+    const uint32_t plane_height = avifImagePlaneHeight(yuv.get(), plane);
+    const uint32_t rowBytes = avifImagePlaneRowBytes(yuv.get(), plane);
+    uint8_t* row = avifImagePlane(yuv.get(), plane);
+    for (uint32_t y = 0; y < plane_height; ++y, row += rowBytes) {
+      for (uint32_t x = 0; x < plane_width; ++x) {
+        if (yuv_depth == 8) {
+          row[x] = (uint8_t)(rand() % yuv_max);
+        } else {
+          ((uint16_t*)row)[x] = (uint16_t)(rand() % yuv_max);
+        }
+      }
+    }
+  }
+
+  // Convert to RGB with 1 thread.
+  testutil::AvifRgbImage rgb(yuv.get(), rgb_depth, rgb_format);
+  rgb.avoidLibYUV = avoidLibYUV;
+  rgb.chromaUpsampling = chromaUpsampling;
+  ASSERT_EQ(avifImageYUVToRGB(yuv.get(), &rgb), AVIF_RESULT_OK);
+
+  // Convert to RGB with multiple threads.
+  testutil::AvifRgbImage rgb_threaded(yuv.get(), rgb_depth, rgb_format);
+  rgb_threaded.avoidLibYUV = avoidLibYUV;
+  rgb_threaded.chromaUpsampling = chromaUpsampling;
+  rgb_threaded.maxThreads = maxThreads;
+  ASSERT_EQ(avifImageYUVToRGB(yuv.get(), &rgb_threaded), AVIF_RESULT_OK);
+
+  EXPECT_TRUE(testutil::AreImagesEqual(rgb, rgb_threaded));
+}
+
+INSTANTIATE_TEST_SUITE_P(
+    YUVToRGBThreadingTestInstance, YUVToRGBThreadingTest,
+    Combine(/*rgb_depth=*/Values(8, 16),
+            /*yuv_depth=*/Values(8, 10),
+            /*width=*/Values(1, 2, 127, 200),
+            /*height=*/Values(1, 2, 127, 200),
+            Values(AVIF_RGB_FORMAT_RGB, AVIF_RGB_FORMAT_RGBA),
+            Range(AVIF_PIXEL_FORMAT_YUV444, AVIF_PIXEL_FORMAT_COUNT),
+            // Test an odd and even number for threads. Not adding all possible
+            // thread values to keep the number of test instances low.
+            /*threads=*/Values(2, 7),
+            /*avoidLibYUV=*/Bool(),
+            Values(AVIF_CHROMA_UPSAMPLING_FASTEST,
+                   AVIF_CHROMA_UPSAMPLING_BILINEAR),
+            /*has_alpha=*/Bool()));
+
+// This will generate a large number of test instances and hence it is disabled
+// by default. It can be run manually if necessary.
+INSTANTIATE_TEST_SUITE_P(
+    DISABLED_ExhaustiveYUVToRGBThreadingTestInstance, YUVToRGBThreadingTest,
+    Combine(/*rgb_depth=*/Values(8, 10, 12, 16),
+            /*yuv_depth=*/Values(8, 10, 12),
+            /*width=*/Values(1, 2, 127, 200),
+            /*height=*/Values(1, 2, 127, 200),
+            Range(AVIF_RGB_FORMAT_RGB, AVIF_RGB_FORMAT_COUNT),
+            Range(AVIF_PIXEL_FORMAT_YUV444, AVIF_PIXEL_FORMAT_COUNT),
+            /*threads=*/Range(0, 9),
+            /*avoidLibYUV=*/Bool(),
+            Values(AVIF_CHROMA_UPSAMPLING_AUTOMATIC,
+                   AVIF_CHROMA_UPSAMPLING_FASTEST,
+                   AVIF_CHROMA_UPSAMPLING_NEAREST,
+                   AVIF_CHROMA_UPSAMPLING_BILINEAR),
+            /*has_alpha=*/Bool()));
+
+}  // namespace
+}  // namespace avif