Add avifDiagnostics to avifEncoder and avifCodec (internal)
diff --git a/apps/avifenc.c b/apps/avifenc.c
index 60eb113..c15dae7 100644
--- a/apps/avifenc.c
+++ b/apps/avifenc.c
@@ -1244,6 +1244,9 @@
cleanup:
if (encoder) {
+ if (returnCode != 0) {
+ avifDumpDiagnostics(&encoder->diag);
+ }
avifEncoderDestroy(encoder);
}
if (gridCells) {
diff --git a/include/avif/avif.h b/include/avif/avif.h
index c33afac..4fe0622 100644
--- a/include/avif/avif.h
+++ b/include/avif/avif.h
@@ -936,6 +936,9 @@
// stats from the most recent write
avifIOStats ioStats;
+ // Additional diagnostics (such as detailed error state)
+ avifDiagnostics diag;
+
// Internals used by the encoder
struct avifEncoderData * data;
struct avifCodecSpecificOptions * csOptions;
diff --git a/include/avif/internal.h b/include/avif/internal.h
index 8b7310c..804f395 100644
--- a/include/avif/internal.h
+++ b/include/avif/internal.h
@@ -239,6 +239,8 @@
// If a codec uses a value, it must mark it as used.
// This array is NOT owned by avifCodec.
struct avifCodecInternal * internal; // up to each codec to use how it wants
+ //
+ avifDiagnostics * diag; // Shallow copy; owned by avifEncoder or avifDecoder
avifCodecOpenFunc open;
avifCodecGetNextImageFunc getNextImage;
diff --git a/src/read.c b/src/read.c
index 5d7fc3b..cf4b5f0 100644
--- a/src/read.c
+++ b/src/read.c
@@ -2525,7 +2525,6 @@
decoder->maxThreads = 1;
decoder->imageCountLimit = AVIF_DEFAULT_IMAGE_COUNT_LIMIT;
decoder->strictFlags = AVIF_STRICT_ENABLED;
- avifDiagnosticsClearError(&decoder->diag);
return decoder;
}
@@ -2746,6 +2745,7 @@
if (!tile->codec) {
return AVIF_RESULT_NO_CODEC_AVAILABLE;
}
+ tile->codec->diag = &decoder->diag;
if (!tile->codec->open(tile->codec, decoder)) {
return AVIF_RESULT_DECODE_COLOR_FAILED;
}
diff --git a/src/write.c b/src/write.c
index 294d186..e0c9eef 100644
--- a/src/write.c
+++ b/src/write.c
@@ -210,6 +210,7 @@
void avifEncoderSetCodecSpecificOption(avifEncoder * encoder, const char * key, const char * value)
{
+ avifDiagnosticsClearError(&encoder->diag);
avifCodecSpecificOptionsSet(encoder->csOptions, key, value);
}
@@ -492,6 +493,7 @@
return AVIF_RESULT_NO_CODEC_AVAILABLE;
}
item->codec->csOptions = encoder->csOptions;
+ item->codec->diag = &encoder->diag;
if (cellCount > 1) {
item->dimgFromID = gridColorID;
@@ -548,6 +550,7 @@
return AVIF_RESULT_NO_CODEC_AVAILABLE;
}
item->codec->csOptions = encoder->csOptions;
+ item->codec->diag = &encoder->diag;
item->alpha = AVIF_TRUE;
if (cellCount > 1) {
@@ -651,6 +654,7 @@
avifResult avifEncoderAddImage(avifEncoder * encoder, const avifImage * image, uint64_t durationInTimescales, avifAddImageFlags addImageFlags)
{
+ avifDiagnosticsClearError(&encoder->diag);
return avifEncoderAddImageInternal(encoder, 1, 1, &image, durationInTimescales, addImageFlags);
}
@@ -660,6 +664,7 @@
const avifImage * const * cellImages,
avifAddImageFlags addImageFlags)
{
+ avifDiagnosticsClearError(&encoder->diag);
if ((gridCols == 0) || (gridCols > 256) || (gridRows == 0) || (gridRows > 256)) {
return AVIF_RESULT_INVALID_IMAGE_GRID;
}
@@ -684,6 +689,7 @@
avifResult avifEncoderFinish(avifEncoder * encoder, avifRWData * output)
{
+ avifDiagnosticsClearError(&encoder->diag);
if (encoder->data->items.count == 0) {
return AVIF_RESULT_NO_CONTENT;
}