Use libaom AOMD_SET_FRAME_SIZE_LIMIT if available
Bug: https://aomedia.g-issues.chromium.org/issues/485932002
diff --git a/CHANGELOG.md b/CHANGELOG.md
index 7b3b942..5b8b58d 100644
--- a/CHANGELOG.md
+++ b/CHANGELOG.md
@@ -24,6 +24,7 @@
* Fix decoding layered image with multiple scaled alpha layers
* Fix NaN bypass of AVIF_CLAMP in gain map tone mapping (use fminf/fmaxf)
* avifenc: reject mismatched --depth for Y4M input
+* Use libaom AOMD_SET_FRAME_SIZE_LIMIT if available
## [1.4.1] - 2026-03-20
diff --git a/src/codec_aom.c b/src/codec_aom.c
index 92a348c..883fca7 100644
--- a/src/codec_aom.c
+++ b/src/codec_aom.c
@@ -109,6 +109,11 @@
assert(sample);
aom_codec_iface_t * const decoderInterface = aom_codec_av1_dx();
+#if !defined(AOM_CTRL_AOMD_SET_FRAME_SIZE_LIMIT)
+ // The AOMD_SET_FRAME_SIZE_LIMIT codec control (added in libaom v3.14.0)
+ // can be used to impose a maximum on AV1 frame size. When
+ // AOMD_SET_FRAME_SIZE_LIMIT is not available, approximate it with
+ // aom_codec_peek_stream_info() and avifDimensionsTooLarge().
struct aom_codec_stream_info streamInfo = { 0 };
aom_codec_err_t err = aom_codec_peek_stream_info(decoderInterface, sample->data.data, sample->data.size, &streamInfo);
if (err != AOM_CODEC_OK) {
@@ -127,6 +132,7 @@
return AVIF_FALSE;
}
}
+#endif // !defined(AOM_CTRL_AOMD_SET_FRAME_SIZE_LIMIT)
if (!codec->internal->decoderInitialized) {
aom_codec_dec_cfg_t cfg;
@@ -140,6 +146,11 @@
}
codec->internal->decoderInitialized = AVIF_TRUE;
+#if defined(AOM_CTRL_AOMD_SET_FRAME_SIZE_LIMIT)
+ if (codec->imageSizeLimit != 0 && aom_codec_control(&codec->internal->decoder, AOMD_SET_FRAME_SIZE_LIMIT, codec->imageSizeLimit)) {
+ return AVIF_FALSE;
+ }
+#endif // defined(AOM_CTRL_AOMD_SET_FRAME_SIZE_LIMIT)
if (aom_codec_control(&codec->internal->decoder, AV1D_SET_OUTPUT_ALL_LAYERS, codec->allLayers)) {
aomDiagPrintf(codec->diag, "aom_codec_control(AV1D_SET_OUTPUT_ALL_LAYERS)", &codec->internal->decoder);
return AVIF_FALSE;