Skip to content

Commit f0c6d7f

Browse files
authored
Return 0 dec rows when contentToDecode is gainmap (AOMediaCodec#3000)
1 parent 2a4a06f commit f0c6d7f

3 files changed

Lines changed: 66 additions & 13 deletions

File tree

src/read.c

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -7125,6 +7125,14 @@ static uint32_t avifGetDecodedRowCount(const avifDecoder * decoder, const avifTi
71257125

71267126
uint32_t avifDecoderDecodedRowCount(const avifDecoder * decoder)
71277127
{
7128+
if (decoder->data->tileInfos[AVIF_ITEM_COLOR].tileCount == 0) {
7129+
// decoder->imageContentToDecode & AVIF_IMAGE_CONTENT_COLOR_AND_ALPHA
7130+
// was likely 0 when avifDecoderNextImage() was called.
7131+
// avifDecoderDecodedRowCount() only describes decoder->image->yuvPlanes[0].
7132+
// There is no available luma plane, so return 0 decoded rows.
7133+
return 0;
7134+
}
7135+
71287136
uint32_t minRowCount = decoder->image->height;
71297137
for (int c = 0; c < AVIF_ITEM_CATEGORY_COUNT; ++c) {
71307138
if (c == AVIF_ITEM_GAIN_MAP) {

tests/gtest/avifincrtest.cc

Lines changed: 28 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -126,6 +126,34 @@ INSTANTIATE_TEST_SUITE_P(SinglePixel, IncrementalTest,
126126

127127
//------------------------------------------------------------------------------
128128

129+
// Check that avifDecoderDecodedRowCount() returns 0 unless
130+
// decoder->imageContentToDecode is set to at least
131+
// AVIF_IMAGE_CONTENT_COLOR_AND_ALPHA.
132+
// Regression test for b/481550106.
133+
TEST(IncrementalTest, DecodeGainMapOnly) {
134+
const testutil::AvifRwData encoded_avif = testutil::ReadFile(
135+
std::string(data_path) + "seine_sdr_gainmap_srgb.avif");
136+
ASSERT_NE(encoded_avif.size, 0u);
137+
ImagePtr reference(avifImageCreateEmpty());
138+
ASSERT_NE(reference, nullptr);
139+
DecoderPtr decoder(avifDecoderCreate());
140+
ASSERT_NE(decoder, nullptr);
141+
ASSERT_EQ(avifDecoderReadMemory(decoder.get(), reference.get(),
142+
encoded_avif.data, encoded_avif.size),
143+
AVIF_RESULT_OK);
144+
ASSERT_NE(reference->gainMap, nullptr);
145+
146+
decoder->imageContentToDecode = AVIF_IMAGE_CONTENT_GAIN_MAP;
147+
ASSERT_EQ(
148+
testutil::DecodeIncrementally(
149+
encoded_avif, decoder.get(), /*is_persistent=*/true,
150+
/*give_size_hint=*/true, /*use_nth_image_api=*/false, *reference,
151+
/*cell_height=*/154, /*enable_fine_incremental_check=*/true),
152+
AVIF_RESULT_OK);
153+
}
154+
155+
//------------------------------------------------------------------------------
156+
129157
} // namespace
130158
} // namespace avif
131159

tests/gtest/avifincrtest_helpers.cc

Lines changed: 30 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -333,7 +333,8 @@ avifResult DecodeIncrementally(const avifRWData& encoded_avif,
333333
data.available.size = std::min(data.available.size + step, data.full_size);
334334
parse_result = avifDecoderParse(decoder);
335335
}
336-
if (data.available.size == data.full_size &&
336+
if ((decoder->imageContentToDecode & AVIF_IMAGE_CONTENT_COLOR_AND_ALPHA) &&
337+
data.available.size == data.full_size &&
337338
expect_parse_success_from_partial_file) {
338339
// Can happen if the data is in 'idat', or if some metadata is at the end of
339340
// the file. But ideally this should be avoided.
@@ -362,15 +363,23 @@ avifResult DecodeIncrementally(const avifRWData& encoded_avif,
362363
previously_decoded_row_count, decoded_row_count);
363364
AVIF_CHECKERR(false, AVIF_RESULT_INVALID_ARGUMENT);
364365
}
365-
const uint32_t min_decoded_row_count = GetMinDecodedRowCount(
366-
reference.height, cell_height, reference.alphaPlane != nullptr,
367-
reference.gainMap != nullptr, data.available.size, data.full_size,
368-
enable_fine_incremental_check);
369-
if (decoded_row_count < min_decoded_row_count) {
366+
if (decoder->imageContentToDecode & AVIF_IMAGE_CONTENT_COLOR_AND_ALPHA) {
367+
const uint32_t min_decoded_row_count = GetMinDecodedRowCount(
368+
reference.height, cell_height, reference.alphaPlane != nullptr,
369+
reference.gainMap != nullptr, data.available.size, data.full_size,
370+
enable_fine_incremental_check);
371+
if (decoded_row_count < min_decoded_row_count) {
372+
printf(
373+
"ERROR: expected to have decoded at least %d rows with %zu "
374+
"available bytes, but only %d were decoded\n",
375+
min_decoded_row_count, data.available.size, decoded_row_count);
376+
AVIF_CHECKERR(false, AVIF_RESULT_INVALID_ARGUMENT);
377+
}
378+
} else if (decoded_row_count != 0) {
379+
// avifDecoderDecodedRowCount() is only for decoder->image->yuvPlanes[0].
370380
printf(
371-
"ERROR: expected to have decoded at least %d rows with %zu available "
372-
"bytes, but only %d were decoded\n",
373-
min_decoded_row_count, data.available.size, decoded_row_count);
381+
"ERROR: decoded row count shall be 0 unless "
382+
"decoder->imageContentToDecode&AVIF_IMAGE_CONTENT_COLOR_AND_ALPHA\n");
374383
AVIF_CHECKERR(false, AVIF_RESULT_INVALID_ARGUMENT);
375384
}
376385
ComparePartialYuva(reference, *decoder->image, decoded_row_count);
@@ -385,10 +394,18 @@ avifResult DecodeIncrementally(const avifRWData& encoded_avif,
385394
AVIF_CHECKERR(data.available.size == data.full_size,
386395
AVIF_RESULT_INVALID_ARGUMENT);
387396
}
388-
AVIF_CHECKERR(avifDecoderDecodedRowCount(decoder) == decoder->image->height,
389-
AVIF_RESULT_INVALID_ARGUMENT);
390-
391-
ComparePartialYuva(reference, *decoder->image, reference.height);
397+
const uint32_t decoded_row_count = avifDecoderDecodedRowCount(decoder);
398+
if (decoder->imageContentToDecode & AVIF_IMAGE_CONTENT_COLOR_AND_ALPHA) {
399+
AVIF_CHECKERR(decoded_row_count == decoder->image->height,
400+
AVIF_RESULT_INVALID_ARGUMENT);
401+
ComparePartialYuva(reference, *decoder->image, reference.height);
402+
} else if (decoded_row_count != 0) {
403+
// avifDecoderDecodedRowCount() is only for decoder->image->yuvPlanes[0].
404+
printf(
405+
"ERROR: decoded row count shall be 0 unless "
406+
"decoder->imageContentToDecode&AVIF_IMAGE_CONTENT_COLOR_AND_ALPHA\n");
407+
AVIF_CHECKERR(false, AVIF_RESULT_INVALID_ARGUMENT);
408+
}
392409
return AVIF_RESULT_OK;
393410
}
394411

0 commit comments

Comments
 (0)