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;
     }