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.