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