Add --ignore-exif and --ignore-xmp to avifdec (#3307)
diff --git a/CHANGELOG.md b/CHANGELOG.md
index 218207e..703cad4 100644
--- a/CHANGELOG.md
+++ b/CHANGELOG.md
@@ -11,10 +11,11 @@
 ### Added since 1.4.2
 
 * Add the ignoreICC option to avifDecoder
-* Support ignoring alpha in avifDecoder::imageContentToDecode.
+* Support ignoring alpha in avifDecoder::imageContentToDecode
 * avifenc: add --ignore-alpha flag to discard alpha channel on encode
 * avifgainmaputil: add --ignore-alpha flag to discard alpha channel
 * avifgainmaputil: add --ignore-exif and --ignore-xmp flags
+* avifdec: add --ignore-exif and --ignore-xmp flags
 
 ### Changed since 1.4.2
 
diff --git a/apps/avifdec.c b/apps/avifdec.c
index 9fb84d6..5f269cd 100644
--- a/apps/avifdec.c
+++ b/apps/avifdec.c
@@ -45,6 +45,8 @@
     printf("                        avifdec will use --index to choose which layer to decode (in progressive order).\n");
     printf("    --no-strict       : Disable strict decoding, which disables strict validation checks and errors\n");
     printf("    -i,--info         : Decode all frames and display all image information instead of saving to disk\n");
+    printf("    --ignore-exif     : If the input file contains embedded Exif metadata, ignore it (no-op if absent)\n");
+    printf("    --ignore-xmp      : If the input file contains embedded XMP metadata, ignore it (no-op if absent)\n");
     printf("    --icc FILENAME    : Provide an ICC profile payload (implies --ignore-icc)\n");
     printf("    --ignore-icc      : If the input file contains an embedded ICC profile, ignore it (no-op if absent)\n");
     printf("    --size-limit C    : Maximum image size (in total pixels) that should be tolerated.\n");
@@ -97,6 +99,8 @@
     avifBool infoOnly = AVIF_FALSE;
     avifChromaUpsampling chromaUpsampling = AVIF_CHROMA_UPSAMPLING_AUTOMATIC;
     const char * iccOverrideFilename = NULL;
+    avifBool ignoreExif = AVIF_FALSE;
+    avifBool ignoreXMP = AVIF_FALSE;
     avifBool ignoreICC = AVIF_FALSE;
     avifBool rawColor = AVIF_FALSE;
     avifBool allowProgressive = AVIF_FALSE;
@@ -220,6 +224,10 @@
             strictFlags = AVIF_STRICT_DISABLED;
         } else if (!strcmp(arg, "-i") || !strcmp(arg, "--info")) {
             infoOnly = AVIF_TRUE;
+        } else if (!strcmp(arg, "--ignore-exif")) {
+            ignoreExif = AVIF_TRUE;
+        } else if (!strcmp(arg, "--ignore-xmp")) {
+            ignoreXMP = AVIF_TRUE;
         } else if (!strcmp(arg, "--icc")) {
             NEXTARG();
             iccOverrideFilename = arg;
@@ -321,6 +329,8 @@
     } else if (enableSampleTransforms) {
         decoder->imageContentToDecode |= AVIF_IMAGE_CONTENT_SAMPLE_TRANSFORMS;
     }
+    decoder->ignoreExif = ignoreExif;
+    decoder->ignoreXMP = ignoreXMP;
     decoder->ignoreICC = ignoreICC;
 
     avifResult result = avifDecoderSetIOFile(decoder, inputFilename);
@@ -406,6 +416,8 @@
             }
         }
 
+        assert(!ignoreExif || decoder->image->exif.size == 0);
+        assert(!ignoreXMP || decoder->image->xmp.size == 0);
         assert(!ignoreICC || decoder->image->icc.size == 0);
         if (iccOverrideFilename) {
             imageView = avifImageCreateEmpty();
diff --git a/tests/test_cmd_metadata.sh b/tests/test_cmd_metadata.sh
index b532610..4ebaeba 100755
--- a/tests/test_cmd_metadata.sh
+++ b/tests/test_cmd_metadata.sh
@@ -28,14 +28,14 @@
 ENCODED_FILE_NO_METADATA="avif_test_cmd_metadata_encoded_no_metadata.avif"
 ENCODED_FILE_MORE_METADATA="avif_test_cmd_metadata_encoded_more_metadata.avif"
 DECODED_FILE="avif_test_cmd_metadata_decoded.png"
-DECODED_FILE_CHANGED_ICC="avif_test_cmd_metadata_decoded_changed_icc.png"
+DECODED_FILE_CHANGED_METADATA="avif_test_cmd_metadata_decoded_changed_metadata.png"
 
 # Cleanup
 cleanup() {
   pushd ${TMP_DIR}
     rm -f -- "${ENCODED_FILE}" "${ENCODED_FILE_NO_METADATA}" \
              "${ENCODED_FILE_MORE_METADATA}" \
-             "${DECODED_FILE}" "${DECODED_FILE_CHANGED_ICC}"
+             "${DECODED_FILE}" "${DECODED_FILE_CHANGED_METADATA}"
   popd
 }
 trap cleanup EXIT
@@ -56,10 +56,14 @@
     cmp "${ENCODED_FILE}" "${ENCODED_FILE_NO_METADATA}" && exit 1
 
     "${AVIFDEC}" "${ENCODED_FILE}" "${DECODED_FILE}"
-    "${AVIFDEC}" "${ENCODED_FILE}" --ignore-icc "${DECODED_FILE_CHANGED_ICC}"
-    cmp "${DECODED_FILE}" "${DECODED_FILE_CHANGED_ICC}" && exit 1
-    "${AVIFDEC}" "${ENCODED_FILE}" --icc "${INPUT_ICC}" "${DECODED_FILE_CHANGED_ICC}"
-    cmp "${DECODED_FILE}" "${DECODED_FILE_CHANGED_ICC}" && exit 1
+    "${AVIFDEC}" "${ENCODED_FILE}" --ignore-icc "${DECODED_FILE_CHANGED_METADATA}"
+    cmp "${DECODED_FILE}" "${DECODED_FILE_CHANGED_METADATA}" && exit 1
+    "${AVIFDEC}" "${ENCODED_FILE}" --icc "${INPUT_ICC}" "${DECODED_FILE_CHANGED_METADATA}"
+    cmp "${DECODED_FILE}" "${DECODED_FILE_CHANGED_METADATA}" && exit 1
+    "${AVIFDEC}" "${ENCODED_FILE}" --ignore-exif "${DECODED_FILE_CHANGED_METADATA}"
+    cmp "${DECODED_FILE}" "${DECODED_FILE_CHANGED_METADATA}" && exit 1
+    "${AVIFDEC}" "${ENCODED_FILE}" --ignore-xmp "${DECODED_FILE_CHANGED_METADATA}"
+    cmp "${DECODED_FILE}" "${DECODED_FILE_CHANGED_METADATA}" && exit 1
 
     # As should adding metadata.