decoder->image can't be NULL after decoder has run decoder->image is set to NULL only in avifDecoderCleanup(), which is only called in avifDecoderDestroy() and at the beginning of avifDecoderParse(). Therefore, after decoder->image is allocated in avifDecoderParse(), decoder->image cannot be NULL. In avif.h, instead of saying when decoder->image "can be NULL", say when decoder->image "is invalid".
diff --git a/include/avif/avif.h b/include/avif/avif.h index 368fa37..aafaa5f 100644 --- a/include/avif/avif.h +++ b/include/avif/avif.h
@@ -544,7 +544,7 @@ // Set this via avifDecoderSetSource(). avifDecoderSource requestedSource; - // The current decoded image, owned by the decoder. Can be NULL if the decoder hasn't run or has run + // The current decoded image, owned by the decoder. Is invalid if the decoder hasn't run or has run // out of images. The YUV and A contents of this image are likely owned by the decoder, so be // sure to copy any data inside of this image before advancing to the next image or reusing the // decoder. It is legal to call avifImageYUVToRGB() on this in between calls to avifDecoderNextImage(),
diff --git a/src/read.c b/src/read.c index 04b131a..e7d024d 100644 --- a/src/read.c +++ b/src/read.c
@@ -2388,9 +2388,6 @@ if (result != AVIF_RESULT_OK) { return result; } - if (!decoder->image) { - return AVIF_RESULT_NO_IMAGES_REMAINING; - } avifImageCopy(image, decoder->image); return AVIF_RESULT_OK; }