@@ -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