@@ -18,23 +18,26 @@ namespace {
1818const char * data_path = nullptr ;
1919
2020class SampleTransformTest
21- : public testing::TestWithParam<std::tuple<
22- avifSampleTransformRecipe, avifPixelFormat, /* create_alpha=*/ bool ,
23- /* use_grid=*/ bool , /* quality=*/ int , /* add_xmp=*/ bool >> {};
21+ : public testing::TestWithParam<
22+ std::tuple<avifSampleTransformRecipe, avifPixelFormat, avifRange,
23+ /* create_alpha=*/ bool , /* use_grid=*/ bool , /* quality=*/ int ,
24+ /* add_xmp=*/ bool >> {};
2425
2526// ------------------------------------------------------------------------------
2627
2728TEST_P (SampleTransformTest, Avif16bit) {
2829 const avifSampleTransformRecipe recipe = std::get<0 >(GetParam ());
2930 const avifPixelFormat yuv_format = std::get<1 >(GetParam ());
30- const bool create_alpha = std::get<2 >(GetParam ());
31- const bool use_grid = std::get<3 >(GetParam ());
32- const int quality = std::get<4 >(GetParam ());
33- const bool add_xmp = std::get<5 >(GetParam ());
31+ const avifRange yuv_range = std::get<2 >(GetParam ());
32+ const bool create_alpha = std::get<3 >(GetParam ());
33+ const bool use_grid = std::get<4 >(GetParam ());
34+ const int quality = std::get<5 >(GetParam ());
35+ const bool add_xmp = std::get<6 >(GetParam ());
3436
3537 const ImagePtr image = testutil::ReadImage (
3638 data_path, " weld_16bit.png" , yuv_format, /* requested_depth=*/ 16 );
3739 ASSERT_NE (image, nullptr );
40+ image->yuvRange = yuv_range; // Some pixel values are out-of-range.
3841 if (create_alpha && !image->alphaPlane ) {
3942 // Simulate alpha plane with a view on luma.
4043 image->alphaPlane = image->yuvPlanes [AVIF_CHAN_Y ];
@@ -97,8 +100,11 @@ TEST_P(SampleTransformTest, Avif16bit) {
97100 ASSERT_EQ (image->width , decoded->width );
98101 ASSERT_EQ (image->height , decoded->height );
99102
100- EXPECT_GE (testutil::GetPsnr (*image, *decoded),
101- (quality == AVIF_QUALITY_LOSSLESS ) ? 99.0 : 15.0 );
103+ if (quality == AVIF_QUALITY_LOSSLESS ) {
104+ EXPECT_TRUE (testutil::AreImagesEqual (*image, *decoded));
105+ } else {
106+ EXPECT_GE (testutil::GetPsnr (*image, *decoded), 15.0 );
107+ }
102108
103109 // Replace all 'sato' box types by "zzzz" garbage. This simulates an old
104110 // decoder that does not recognize the Sample Transform feature.
@@ -116,11 +122,10 @@ TEST_P(SampleTransformTest, Avif16bit) {
116122 encoded.data , encoded.size ),
117123 AVIF_RESULT_OK );
118124 // Only the most significant bits of each sample can be retrieved.
119- // They should be encoded losslessly no matter the quantizer settings.
120125 ImagePtr image_no_sato = testutil::CreateImage (
121126 static_cast <int >(image->width ), static_cast <int >(image->height ),
122127 static_cast <int >(decoded_no_sato->depth ), image->yuvFormat ,
123- image->alphaPlane ? AVIF_PLANES_ALL : AVIF_PLANES_YUV , image-> yuvRange );
128+ image->alphaPlane ? AVIF_PLANES_ALL : AVIF_PLANES_YUV , AVIF_RANGE_FULL );
124129 ASSERT_NE (image_no_sato, nullptr );
125130
126131 if (recipe == AVIF_SAMPLE_TRANSFORM_BIT_DEPTH_EXTENSION_8B_8B ||
@@ -140,6 +145,7 @@ TEST_P(SampleTransformTest, Avif16bit) {
140145 /* numTokens=*/ 3 , tokens, /* numInputImageItems=*/ 1 ,
141146 &inputImage, AVIF_PLANES_ALL ),
142147 AVIF_RESULT_OK );
148+ image_no_sato->yuvRange = image->yuvRange ;
143149 ASSERT_EQ (avifImageSetMetadataXMP (image_no_sato.get (), image->xmp .data ,
144150 image->xmp .size ),
145151 AVIF_RESULT_OK );
@@ -155,17 +161,30 @@ INSTANTIATE_TEST_SUITE_P(
155161 testing::Values (AVIF_SAMPLE_TRANSFORM_BIT_DEPTH_EXTENSION_8B_8B ),
156162 testing::Values(AVIF_PIXEL_FORMAT_YUV444 , AVIF_PIXEL_FORMAT_YUV420 ,
157163 AVIF_PIXEL_FORMAT_YUV400 ),
164+ testing::Values(AVIF_RANGE_FULL ),
158165 /* create_alpha=*/ testing::Values(false ),
159166 /* use_grid=*/ testing::Values(false ),
160167 testing::Values(AVIF_QUALITY_DEFAULT ),
161168 /* add_xmp=*/ testing::Values(false )));
162169
170+ INSTANTIATE_TEST_SUITE_P (
171+ LimitedRange, SampleTransformTest,
172+ testing::Combine (
173+ testing::Values (AVIF_SAMPLE_TRANSFORM_BIT_DEPTH_EXTENSION_8B_8B ),
174+ testing::Values(AVIF_PIXEL_FORMAT_YUV444 ),
175+ testing::Values(AVIF_RANGE_LIMITED ),
176+ /* create_alpha=*/ testing::Values(false ),
177+ /* use_grid=*/ testing::Values(false ),
178+ testing::Values(AVIF_QUALITY_LOSSLESS ),
179+ /* add_xmp=*/ testing::Values(false )));
180+
163181INSTANTIATE_TEST_SUITE_P (
164182 BitDepthExtensions, SampleTransformTest,
165183 testing::Combine (
166184 testing::Values (AVIF_SAMPLE_TRANSFORM_BIT_DEPTH_EXTENSION_8B_8B ,
167185 AVIF_SAMPLE_TRANSFORM_BIT_DEPTH_EXTENSION_12B_4B ),
168186 testing::Values(AVIF_PIXEL_FORMAT_YUV444 ),
187+ testing::Values(AVIF_RANGE_FULL ),
169188 /* create_alpha=*/ testing::Values(false ),
170189 /* use_grid=*/ testing::Values(false ),
171190 testing::Values(AVIF_QUALITY_LOSSLESS ),
@@ -177,6 +196,7 @@ INSTANTIATE_TEST_SUITE_P(
177196 testing::Values (
178197 AVIF_SAMPLE_TRANSFORM_BIT_DEPTH_EXTENSION_12B_8B_OVERLAP_4B ),
179198 testing::Values(AVIF_PIXEL_FORMAT_YUV444 ),
199+ testing::Values(AVIF_RANGE_FULL ),
180200 /* create_alpha=*/ testing::Values(false ),
181201 /* use_grid=*/ testing::Values(false ),
182202 testing::Values(AVIF_QUALITY_DEFAULT ),
@@ -187,6 +207,7 @@ INSTANTIATE_TEST_SUITE_P(
187207 testing::Combine (
188208 testing::Values (AVIF_SAMPLE_TRANSFORM_BIT_DEPTH_EXTENSION_8B_8B ),
189209 testing::Values(AVIF_PIXEL_FORMAT_YUV444 ),
210+ testing::Values(AVIF_RANGE_FULL ),
190211 /* create_alpha=*/ testing::Values(true ),
191212 /* use_grid=*/ testing::Values(false ),
192213 testing::Values(AVIF_QUALITY_LOSSLESS ),
@@ -198,6 +219,7 @@ INSTANTIATE_TEST_SUITE_P(
198219 testing::Values (
199220 AVIF_SAMPLE_TRANSFORM_BIT_DEPTH_EXTENSION_12B_8B_OVERLAP_4B ),
200221 testing::Values(AVIF_PIXEL_FORMAT_YUV444 ),
222+ testing::Values(AVIF_RANGE_FULL ),
201223 /* create_alpha=*/ testing::Values(false ),
202224 /* use_grid=*/ testing::Values(false ),
203225 testing::Values(AVIF_QUALITY_LOSSLESS ),
@@ -208,6 +230,7 @@ INSTANTIATE_TEST_SUITE_P(
208230 testing::Combine (
209231 testing::Values (AVIF_SAMPLE_TRANSFORM_BIT_DEPTH_EXTENSION_8B_8B ),
210232 testing::Values(AVIF_PIXEL_FORMAT_YUV444 ),
233+ testing::Values(AVIF_RANGE_FULL ),
211234 /* create_alpha=*/ testing::Values(false ),
212235 /* use_grid=*/ testing::Values(false ),
213236 testing::Values(AVIF_QUALITY_DEFAULT ),
@@ -219,6 +242,7 @@ INSTANTIATE_TEST_SUITE_P(
219242 testing::Values (
220243 AVIF_SAMPLE_TRANSFORM_BIT_DEPTH_EXTENSION_12B_8B_OVERLAP_4B ),
221244 testing::Values(AVIF_PIXEL_FORMAT_YUV420 ),
245+ testing::Values(AVIF_RANGE_LIMITED ),
222246 /* create_alpha=*/ testing::Values(true ),
223247 /* use_grid=*/ testing::Values(true ),
224248 testing::Values(AVIF_QUALITY_LOSSLESS ),
0 commit comments