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;