Skip to content

Commit ec2ee83

Browse files
authored
Remove yuvRange TODO in avifApplyExpression32b() (AOMediaCodec#3025)
Add tests.
1 parent 2d48c03 commit ec2ee83

3 files changed

Lines changed: 38 additions & 12 deletions

File tree

src/read.c

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -6851,6 +6851,7 @@ static avifResult avifDecoderApplySampleTransform(const avifDecoder * decoder, a
68516851
avifImage * dstImageWithCorrectDepth =
68526852
avifImageCreate(dstImage->width, dstImage->height, decoder->data->meta->sampleTransformDepth, dstImage->yuvFormat);
68536853
AVIF_CHECKERR(dstImageWithCorrectDepth != NULL, AVIF_RESULT_OUT_OF_MEMORY);
6854+
dstImageWithCorrectDepth->yuvRange = dstImage->yuvRange;
68546855
avifResult result =
68556856
avifImageAllocatePlanes(dstImageWithCorrectDepth, dstImage->alphaPlane != NULL ? AVIF_PLANES_ALL : AVIF_PLANES_YUV);
68566857
if (result == AVIF_RESULT_OK) {

src/sampletransform.c

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -332,7 +332,8 @@ static avifResult avifImageApplyExpression32b(avifImage * dstImage,
332332
}
333333
}
334334
AVIF_ASSERT_OR_RETURN(stackSize == 1);
335-
// Fit to 'pixi'-defined range. TODO(yguyon): Take avifRange into account.
335+
// Fit to the range defined by the PixelInformationProperty.
336+
// The limited/full range is ignored, like in other libavif encoding and decoding paths.
336337
stack[0] = AVIF_CLAMP(stack[0], minValue, maxValue);
337338

338339
uint8_t * row = avifImagePlane(dstImage, c);

tests/gtest/avif16bittest.cc

Lines changed: 35 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -18,23 +18,26 @@ namespace {
1818
const char* data_path = nullptr;
1919

2020
class 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

2728
TEST_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+
163181
INSTANTIATE_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

Comments
 (0)