Git Inbox Mirror of the ffmpeg-devel mailing list - see https://ffmpeg.org/mailman/listinfo/ffmpeg-devel
 help / color / mirror / Atom feed
From: James Almer via ffmpeg-devel <ffmpeg-devel@ffmpeg.org>
To: ffmpeg-devel@ffmpeg.org
Cc: James Almer <code@ffmpeg.org>
Subject: [FFmpeg-devel] [PR] [release/7.0] Backport IAMF in mp4 fixes (PR #22314)
Date: Fri, 27 Feb 2026 15:25:56 -0000
Message-ID: <177220596425.25.1859633137034059117@29965ddac10e> (raw)

PR #22314 opened by James Almer (jamrial)
URL: https://code.ffmpeg.org/FFmpeg/FFmpeg/pulls/22314
Patch URL: https://code.ffmpeg.org/FFmpeg/FFmpeg/pulls/22314.patch


>From f1cbd81e9e97085d9d8c01e42c77e4183c21e9ce Mon Sep 17 00:00:00 2001
From: James Almer <jamrial@gmail.com>
Date: Wed, 31 Jul 2024 22:57:58 -0300
Subject: [PATCH 1/4] fate/mov: add an IAMF+video muxing test

Signed-off-by: James Almer <jamrial@gmail.com>
(cherry picked from commit eb3cc508d85e8113cbc66fbec09d29e94ec3fd44)
---
 tests/fate/mov.mak                            |  28 +-
 tests/ref/fate/mov-mp4-iamf-7_1_4-video-first | 646 ++++++++++++++++++
 ...mf-7_1_4 => mov-mp4-iamf-7_1_4-video-last} | 175 +++--
 tests/streamgroups/audio_element-7_1_4-2      |   6 +
 4 files changed, 793 insertions(+), 62 deletions(-)
 create mode 100644 tests/ref/fate/mov-mp4-iamf-7_1_4-video-first
 rename tests/ref/fate/{mov-mp4-iamf-7_1_4 => mov-mp4-iamf-7_1_4-video-last} (87%)
 create mode 100644 tests/streamgroups/audio_element-7_1_4-2

diff --git a/tests/fate/mov.mak b/tests/fate/mov.mak
index b54fe19620..ffa7afdd3e 100644
--- a/tests/fate/mov.mak
+++ b/tests/fate/mov.mak
@@ -237,15 +237,31 @@ fate-mov-mp4-iamf-5_1_4: CMD = transcode wav $(SRC) mp4 "-auto_conversion_filter
   -streamid 0:0 -streamid 1:1 -streamid 2:2 -streamid 3:3 -streamid 4:4 -streamid 5:5 -map [FRONT] -map [BACK] -map [CENTER] -map [LFE] -map [TOP_FRONT] -map [TOP_BACK] -c:a flac -t 1" "-c:a copy -map 0" \
   "-show_entries stream_group=index,id,nb_streams,type:stream_group_components:stream_group_disposition:stream_group_tags:stream_group_stream=index,id:stream_group_stream_disposition"
 
-FATE_MOV_FFMPEG_FFPROBE-$(call TRANSCODE, FLAC, MOV, WAV_DEMUXER PCM_S16LE_DECODER ARESAMPLE_FILTER) += fate-mov-mp4-iamf-7_1_4
-fate-mov-mp4-iamf-7_1_4: tests/data/asynth-44100-12.wav tests/data/filtergraphs/iamf_7_1_4 tests/data/streamgroups/audio_element-7_1_4 tests/data/streamgroups/mix_presentation-7_1_4
-fate-mov-mp4-iamf-7_1_4: SRC = $(TARGET_PATH)/tests/data/asynth-44100-12.wav
-fate-mov-mp4-iamf-7_1_4: CMD = transcode wav $(SRC) mp4 "-auto_conversion_filters \
+# Test muxing an IAMF track alongside a video one, with video as the first track.
+FATE_MOV_FFMPEG_FFPROBE-$(call TRANSCODE, MPEG4 FLAC, MOV, WAV_DEMUXER RAWVIDEO_DEMUXER PCM_S16LE_DECODER ARESAMPLE_FILTER) += fate-mov-mp4-iamf-7_1_4-video-first
+fate-mov-mp4-iamf-7_1_4-video-first: tests/data/asynth-44100-12.wav tests/data/vsynth1.yuv tests/data/filtergraphs/iamf_7_1_4 tests/data/streamgroups/audio_element-7_1_4-2 tests/data/streamgroups/mix_presentation-7_1_4
+fate-mov-mp4-iamf-7_1_4-video-first: SRC = $(TARGET_PATH)/tests/data/asynth-44100-12.wav
+fate-mov-mp4-iamf-7_1_4-video-first: SRC2 = $(TARGET_PATH)/tests/data/vsynth1.yuv
+fate-mov-mp4-iamf-7_1_4-video-first: CMD = transcode wav $(SRC) mp4 "-auto_conversion_filters \
+  -/filter_complex $(TARGET_PATH)/tests/data/filtergraphs/iamf_7_1_4 \
+  -/stream_group $(TARGET_PATH)/tests/data/streamgroups/audio_element-7_1_4-2 \
+  -/stream_group $(TARGET_PATH)/tests/data/streamgroups/mix_presentation-7_1_4 \
+  -streamid 0:1 -streamid 1:2 -streamid 2:3 -streamid 3:4 -streamid 4:5 -streamid 5:6 -streamid 6:7 -streamid 7:8 -map 1:v:0 -map [FRONT] -map [BACK] -map [CENTER] -map [LFE] -map [SIDE] -map [TOP_FRONT] -map [TOP_BACK] -c:a flac -c:v mpeg4 -t 1" "-c:a copy -c:v copy -map 0" \
+  "-show_entries stream_group=index,id,nb_streams,type:stream_group_components:stream_group_disposition:stream_group_tags:stream_group_stream=index,id:stream_group_stream_disposition:stream=index,id" \
+  "-f rawvideo -s 352x288 -pix_fmt yuv420p -i $(SRC2)"
+
+# Test muxing an IAMF track alongside a video one, with video as the last track. Also, use stream ids as track ids.
+FATE_MOV_FFMPEG_FFPROBE-$(call TRANSCODE, MPEG4 FLAC, MOV, WAV_DEMUXER RAWVIDEO_DEMUXER PCM_S16LE_DECODER ARESAMPLE_FILTER) += fate-mov-mp4-iamf-7_1_4-video-last
+fate-mov-mp4-iamf-7_1_4-video-last: tests/data/asynth-44100-12.wav tests/data/vsynth1.yuv tests/data/filtergraphs/iamf_7_1_4 tests/data/streamgroups/audio_element-7_1_4 tests/data/streamgroups/mix_presentation-7_1_4
+fate-mov-mp4-iamf-7_1_4-video-last: SRC = $(TARGET_PATH)/tests/data/asynth-44100-12.wav
+fate-mov-mp4-iamf-7_1_4-video-last: SRC2 = $(TARGET_PATH)/tests/data/vsynth1.yuv
+fate-mov-mp4-iamf-7_1_4-video-last: CMD = transcode wav $(SRC) mp4 "-auto_conversion_filters \
   -/filter_complex $(TARGET_PATH)/tests/data/filtergraphs/iamf_7_1_4 \
   -/stream_group $(TARGET_PATH)/tests/data/streamgroups/audio_element-7_1_4 \
   -/stream_group $(TARGET_PATH)/tests/data/streamgroups/mix_presentation-7_1_4 \
-  -streamid 0:0 -streamid 1:1 -streamid 2:2 -streamid 3:3 -streamid 4:4 -streamid 5:5 -streamid 6:6 -map [FRONT] -map [BACK] -map [CENTER] -map [LFE] -map [SIDE] -map [TOP_FRONT] -map [TOP_BACK] -c:a flac -t 1" "-c:a copy -map 0" \
-  "-show_entries stream_group=index,id,nb_streams,type:stream_group_components:stream_group_disposition:stream_group_tags:stream_group_stream=index,id:stream_group_stream_disposition"
+  -streamid 0:1 -streamid 1:2 -streamid 2:3 -streamid 3:4 -streamid 4:5 -streamid 5:6 -streamid 6:7 -streamid 7:8 -map [FRONT] -map [BACK] -map [CENTER] -map [LFE] -map [SIDE] -map [TOP_FRONT] -map [TOP_BACK] -map 1:v:0 -use_stream_ids_as_track_ids true -c:a flac -c:v mpeg4 -t 1" "-c:a copy -c:v copy -map 0" \
+  "-show_entries stream_group=index,id,nb_streams,type:stream_group_components:stream_group_disposition:stream_group_tags:stream_group_stream=index,id:stream_group_stream_disposition:stream=index,id" \
+  "-f rawvideo -s 352x288 -pix_fmt yuv420p -i $(SRC2)"
 
 FATE_MOV_FFMPEG_FFPROBE-$(call TRANSCODE, FLAC, MOV, WAV_DEMUXER PCM_S16LE_DECODER ARESAMPLE_FILTER) += fate-mov-mp4-iamf-ambisonic_1
 fate-mov-mp4-iamf-ambisonic_1: tests/data/asynth-44100-4.wav tests/data/filtergraphs/iamf_ambisonic_1 tests/data/streamgroups/audio_element-ambisonic_1 tests/data/streamgroups/mix_presentation-ambisonic_1
diff --git a/tests/ref/fate/mov-mp4-iamf-7_1_4-video-first b/tests/ref/fate/mov-mp4-iamf-7_1_4-video-first
new file mode 100644
index 0000000000..707691ff29
--- /dev/null
+++ b/tests/ref/fate/mov-mp4-iamf-7_1_4-video-first
@@ -0,0 +1,646 @@
+f92a589b00c2ba98b78ae77e6edffa23 *tests/data/fate/mov-mp4-iamf-7_1_4-video-first.mp4
+416657 tests/data/fate/mov-mp4-iamf-7_1_4-video-first.mp4
+#extradata 0:       30, 0x47ab0576
+#extradata 1:       34, 0xafa70d5e
+#extradata 2:       34, 0xafa70d5e
+#extradata 3:       34, 0xaf7b0d5c
+#extradata 4:       34, 0xaf7b0d5c
+#extradata 5:       34, 0xafa70d5e
+#extradata 6:       34, 0xafa70d5e
+#extradata 7:       34, 0xafa70d5e
+#tb 0: 1/12800
+#media_type 0: video
+#codec_id 0: mpeg4
+#dimensions 0: 352x288
+#sar 0: 1/1
+#tb 1: 1/44100
+#media_type 1: audio
+#codec_id 1: flac
+#sample_rate 1: 44100
+#channel_layout_name 1: stereo
+#tb 2: 1/44100
+#media_type 2: audio
+#codec_id 2: flac
+#sample_rate 2: 44100
+#channel_layout_name 2: stereo
+#tb 3: 1/44100
+#media_type 3: audio
+#codec_id 3: flac
+#sample_rate 3: 44100
+#channel_layout_name 3: mono
+#tb 4: 1/44100
+#media_type 4: audio
+#codec_id 4: flac
+#sample_rate 4: 44100
+#channel_layout_name 4: mono
+#tb 5: 1/44100
+#media_type 5: audio
+#codec_id 5: flac
+#sample_rate 5: 44100
+#channel_layout_name 5: stereo
+#tb 6: 1/44100
+#media_type 6: audio
+#codec_id 6: flac
+#sample_rate 6: 44100
+#channel_layout_name 6: stereo
+#tb 7: 1/44100
+#media_type 7: audio
+#codec_id 7: flac
+#sample_rate 7: 44100
+#channel_layout_name 7: stereo
+0,          0,          0,      512,    42002, 0xef0e5124
+1,          0,          0,     4608,     1399, 0x6e89566e
+2,          0,          0,     4608,     1399, 0x6e89566e
+3,          0,          0,     4608,     1396, 0x0dcb5677
+4,          0,          0,     4608,     1396, 0x0dcb5677
+5,          0,          0,     4608,     1399, 0x6e89566e
+6,          0,          0,     4608,     1399, 0x6e89566e
+7,          0,          0,     4608,     1399, 0x6e89566e
+0,        512,        512,      512,    52619, 0xc794e830, F=0x0
+0,       1024,       1024,      512,    51242, 0xf2f6be7f, F=0x0
+1,       4608,       4608,     4608,     1442, 0x6c3c5b13
+2,       4608,       4608,     4608,     1442, 0x6c3c5b13
+3,       4608,       4608,     4608,     1439, 0xc46b5ac5
+4,       4608,       4608,     4608,     1439, 0xc46b5ac5
+5,       4608,       4608,     4608,     1442, 0x6c3c5b13
+6,       4608,       4608,     4608,     1442, 0x6c3c5b13
+7,       4608,       4608,     4608,     1442, 0x6c3c5b13
+0,       1536,       1536,      512,    49320, 0xe87a921f, F=0x0
+0,       2048,       2048,      512,    22461, 0xc858a20b, F=0x0
+0,       2560,       2560,      512,    16731, 0x04beb863, F=0x0
+1,       9216,       9216,     4608,     1380, 0xc497571b
+2,       9216,       9216,     4608,     1380, 0xc497571b
+3,       9216,       9216,     4608,     1377, 0x5b2a55fe
+4,       9216,       9216,     4608,     1377, 0x5b2a55fe
+5,       9216,       9216,     4608,     1380, 0xc497571b
+6,       9216,       9216,     4608,     1380, 0xc497571b
+7,       9216,       9216,     4608,     1380, 0xc497571b
+0,       3072,       3072,      512,     9983, 0x091aa8e8, F=0x0
+0,       3584,       3584,      512,     6991, 0xa0385313, F=0x0
+1,      13824,      13824,     4608,     1383, 0x48e9510f
+2,      13824,      13824,     4608,     1383, 0x48e9510f
+3,      13824,      13824,     4608,     1380, 0x045550d3
+4,      13824,      13824,     4608,     1380, 0x045550d3
+5,      13824,      13824,     4608,     1383, 0x48e9510f
+6,      13824,      13824,     4608,     1383, 0x48e9510f
+7,      13824,      13824,     4608,     1383, 0x48e9510f
+0,       4096,       4096,      512,     5825, 0x3c97cfbc, F=0x0
+0,       4608,       4608,      512,     4331, 0xbaf5f982, F=0x0
+0,       5120,       5120,      512,     2541, 0xe018c3cb, F=0x0
+1,      18432,      18432,     4608,     1572, 0x9a514719
+2,      18432,      18432,     4608,     1572, 0x9a514719
+3,      18432,      18432,     4608,     1568, 0xa2bc45f4
+4,      18432,      18432,     4608,     1568, 0xa2bc45f4
+5,      18432,      18432,     4608,     1572, 0x9a514719
+6,      18432,      18432,     4608,     1572, 0x9a514719
+7,      18432,      18432,     4608,     1572, 0x9a514719
+0,       5632,       5632,      512,     2655, 0xf98af7a1, F=0x0
+0,       6144,       6144,      512,    13464, 0x33e5196f
+0,       6656,       6656,      512,     2587, 0x90e198aa, F=0x0
+1,      23040,      23040,     4608,     1391, 0x74ac5014
+2,      23040,      23040,     4608,     1391, 0x74ac5014
+3,      23040,      23040,     4608,     1388, 0x96c85007
+4,      23040,      23040,     4608,     1388, 0x96c85007
+5,      23040,      23040,     4608,     1391, 0x74ac5014
+6,      23040,      23040,     4608,     1391, 0x74ac5014
+7,      23040,      23040,     4608,     1391, 0x74ac5014
+0,       7168,       7168,      512,     2313, 0x698c429b, F=0x0
+0,       7680,       7680,      512,     2123, 0x63a3f034, F=0x0
+1,      27648,      27648,     4608,     1422, 0x2f9d47c5
+2,      27648,      27648,     4608,     1422, 0x2f9d47c5
+3,      27648,      27648,     4608,     1419, 0x4d4d466a
+4,      27648,      27648,     4608,     1419, 0x4d4d466a
+5,      27648,      27648,     4608,     1422, 0x2f9d47c5
+6,      27648,      27648,     4608,     1422, 0x2f9d47c5
+7,      27648,      27648,     4608,     1422, 0x2f9d47c5
+0,       8192,       8192,      512,     2222, 0x442b233d, F=0x0
+0,       8704,       8704,      512,     2332, 0x24c75b04, F=0x0
+0,       9216,       9216,      512,     2302, 0xa0fa2ee7, F=0x0
+1,      32256,      32256,     4608,     1768, 0x2a044b99
+2,      32256,      32256,     4608,     1768, 0x2a044b99
+3,      32256,      32256,     4608,     1765, 0xacb84b24
+4,      32256,      32256,     4608,     1765, 0xacb84b24
+5,      32256,      32256,     4608,     1768, 0x2a044b99
+6,      32256,      32256,     4608,     1768, 0x2a044b99
+7,      32256,      32256,     4608,     1768, 0x2a044b99
+0,       9728,       9728,      512,     1740, 0xdf772eb3, F=0x0
+0,      10240,      10240,      512,     1994, 0x8830ad23, F=0x0
+1,      36864,      36864,     4608,     1534, 0xb0b35a3f
+2,      36864,      36864,     4608,     1534, 0xb0b35a3f
+3,      36864,      36864,     4608,     1531, 0x996458aa
+4,      36864,      36864,     4608,     1531, 0x996458aa
+5,      36864,      36864,     4608,     1534, 0xb0b35a3f
+6,      36864,      36864,     4608,     1534, 0xb0b35a3f
+7,      36864,      36864,     4608,     1534, 0xb0b35a3f
+0,      10752,      10752,      512,     1884, 0x2c567db6, F=0x0
+0,      11264,      11264,      512,     1880, 0x72237c52, F=0x0
+0,      11776,      11776,      512,     1970, 0x60708ff8, F=0x0
+1,      41472,      41472,     2628,      926, 0xc26a5eae
+2,      41472,      41472,     2628,      926, 0xc26a5eae
+3,      41472,      41472,     2628,      923, 0xa7225edf
+4,      41472,      41472,     2628,      923, 0xa7225edf
+5,      41472,      41472,     2628,      926, 0xc26a5eae
+6,      41472,      41472,     2628,      926, 0xc26a5eae
+7,      41472,      41472,     2628,      926, 0xc26a5eae
+0,      12288,      12288,      512,    11659, 0x6bcb830e
+[STREAM_GROUP]
+index=0
+id=0x1
+nb_streams=7
+type=IAMF Audio Element
+[COMPONENT]
+nb_layers=4
+audio_element_type=0
+default_w=10
+[SUBCOMPONENT]
+channel_layout=stereo
+output_gain_flags=0
+output_gain=0/1
+[/SUBCOMPONENT]
+[SUBCOMPONENT]
+channel_layout=3.1.2
+output_gain_flags=0
+output_gain=0/1
+[/SUBCOMPONENT]
+[SUBCOMPONENT]
+channel_layout=7.1.2
+output_gain_flags=0
+output_gain=0/1
+[/SUBCOMPONENT]
+[SUBCOMPONENT]
+channel_layout=7.1.4
+output_gain_flags=0
+output_gain=0/1
+[/SUBCOMPONENT]
+[SUBCOMPONENT]
+name=demixing_info
+nb_subblocks=1
+type=1
+parameter_id=998
+parameter_rate=44100
+duration=4608
+constant_subblock_duration=4608
+[PIECE]
+subblock_duration=4608
+dmixp_mode=1
+[/PIECE]
+[/SUBCOMPONENT]
+[/COMPONENT]
+DISPOSITION:default=0
+DISPOSITION:dub=0
+DISPOSITION:original=0
+DISPOSITION:comment=0
+DISPOSITION:lyrics=0
+DISPOSITION:karaoke=0
+DISPOSITION:forced=0
+DISPOSITION:hearing_impaired=0
+DISPOSITION:visual_impaired=0
+DISPOSITION:clean_effects=0
+DISPOSITION:attached_pic=0
+DISPOSITION:timed_thumbnails=0
+DISPOSITION:non_diegetic=0
+DISPOSITION:captions=0
+DISPOSITION:descriptions=0
+DISPOSITION:metadata=0
+DISPOSITION:dependent=0
+DISPOSITION:still_image=0
+TAG:language=und
+TAG:handler_name=SoundHandler
+TAG:vendor_id=[0][0][0][0]
+[STREAM]
+index=1
+id=0x2
+DISPOSITION:default=1
+DISPOSITION:dub=0
+DISPOSITION:original=0
+DISPOSITION:comment=0
+DISPOSITION:lyrics=0
+DISPOSITION:karaoke=0
+DISPOSITION:forced=0
+DISPOSITION:hearing_impaired=0
+DISPOSITION:visual_impaired=0
+DISPOSITION:clean_effects=0
+DISPOSITION:attached_pic=0
+DISPOSITION:timed_thumbnails=0
+DISPOSITION:non_diegetic=0
+DISPOSITION:captions=0
+DISPOSITION:descriptions=0
+DISPOSITION:metadata=0
+DISPOSITION:dependent=0
+DISPOSITION:still_image=0
+[/STREAM]
+[STREAM]
+index=2
+id=0x3
+DISPOSITION:default=0
+DISPOSITION:dub=0
+DISPOSITION:original=0
+DISPOSITION:comment=0
+DISPOSITION:lyrics=0
+DISPOSITION:karaoke=0
+DISPOSITION:forced=0
+DISPOSITION:hearing_impaired=0
+DISPOSITION:visual_impaired=0
+DISPOSITION:clean_effects=0
+DISPOSITION:attached_pic=0
+DISPOSITION:timed_thumbnails=0
+DISPOSITION:non_diegetic=0
+DISPOSITION:captions=0
+DISPOSITION:descriptions=0
+DISPOSITION:metadata=0
+DISPOSITION:dependent=1
+DISPOSITION:still_image=0
+[/STREAM]
+[STREAM]
+index=3
+id=0x4
+DISPOSITION:default=0
+DISPOSITION:dub=0
+DISPOSITION:original=0
+DISPOSITION:comment=0
+DISPOSITION:lyrics=0
+DISPOSITION:karaoke=0
+DISPOSITION:forced=0
+DISPOSITION:hearing_impaired=0
+DISPOSITION:visual_impaired=0
+DISPOSITION:clean_effects=0
+DISPOSITION:attached_pic=0
+DISPOSITION:timed_thumbnails=0
+DISPOSITION:non_diegetic=0
+DISPOSITION:captions=0
+DISPOSITION:descriptions=0
+DISPOSITION:metadata=0
+DISPOSITION:dependent=1
+DISPOSITION:still_image=0
+[/STREAM]
+[STREAM]
+index=4
+id=0x5
+DISPOSITION:default=0
+DISPOSITION:dub=0
+DISPOSITION:original=0
+DISPOSITION:comment=0
+DISPOSITION:lyrics=0
+DISPOSITION:karaoke=0
+DISPOSITION:forced=0
+DISPOSITION:hearing_impaired=0
+DISPOSITION:visual_impaired=0
+DISPOSITION:clean_effects=0
+DISPOSITION:attached_pic=0
+DISPOSITION:timed_thumbnails=0
+DISPOSITION:non_diegetic=0
+DISPOSITION:captions=0
+DISPOSITION:descriptions=0
+DISPOSITION:metadata=0
+DISPOSITION:dependent=1
+DISPOSITION:still_image=0
+[/STREAM]
+[STREAM]
+index=5
+id=0x6
+DISPOSITION:default=0
+DISPOSITION:dub=0
+DISPOSITION:original=0
+DISPOSITION:comment=0
+DISPOSITION:lyrics=0
+DISPOSITION:karaoke=0
+DISPOSITION:forced=0
+DISPOSITION:hearing_impaired=0
+DISPOSITION:visual_impaired=0
+DISPOSITION:clean_effects=0
+DISPOSITION:attached_pic=0
+DISPOSITION:timed_thumbnails=0
+DISPOSITION:non_diegetic=0
+DISPOSITION:captions=0
+DISPOSITION:descriptions=0
+DISPOSITION:metadata=0
+DISPOSITION:dependent=1
+DISPOSITION:still_image=0
+[/STREAM]
+[STREAM]
+index=6
+id=0x7
+DISPOSITION:default=0
+DISPOSITION:dub=0
+DISPOSITION:original=0
+DISPOSITION:comment=0
+DISPOSITION:lyrics=0
+DISPOSITION:karaoke=0
+DISPOSITION:forced=0
+DISPOSITION:hearing_impaired=0
+DISPOSITION:visual_impaired=0
+DISPOSITION:clean_effects=0
+DISPOSITION:attached_pic=0
+DISPOSITION:timed_thumbnails=0
+DISPOSITION:non_diegetic=0
+DISPOSITION:captions=0
+DISPOSITION:descriptions=0
+DISPOSITION:metadata=0
+DISPOSITION:dependent=1
+DISPOSITION:still_image=0
+[/STREAM]
+[STREAM]
+index=7
+id=0x8
+DISPOSITION:default=0
+DISPOSITION:dub=0
+DISPOSITION:original=0
+DISPOSITION:comment=0
+DISPOSITION:lyrics=0
+DISPOSITION:karaoke=0
+DISPOSITION:forced=0
+DISPOSITION:hearing_impaired=0
+DISPOSITION:visual_impaired=0
+DISPOSITION:clean_effects=0
+DISPOSITION:attached_pic=0
+DISPOSITION:timed_thumbnails=0
+DISPOSITION:non_diegetic=0
+DISPOSITION:captions=0
+DISPOSITION:descriptions=0
+DISPOSITION:metadata=0
+DISPOSITION:dependent=1
+DISPOSITION:still_image=0
+[/STREAM]
+[/STREAM_GROUP]
+[STREAM_GROUP]
+index=1
+id=0x2
+nb_streams=7
+type=IAMF Mix Presentation
+[COMPONENT]
+nb_submixes=1
+[SUBCOMPONENT]
+en-us=Mix_Presentation
+[/SUBCOMPONENT]
+[SUBCOMPONENT]
+nb_elements=1
+nb_layouts=4
+default_mix_gain=256/256
+[PIECE]
+stream_id=1
+default_mix_gain=0/256
+headphones_rendering_mode=0
+[SUBPIECE]
+en-us=Scalable_Submix
+[/SUBPIECE]
+[SUBPIECE]
+name=element_mix_config
+nb_subblocks=0
+type=0
+parameter_id=100
+parameter_rate=48000
+duration=0
+constant_subblock_duration=0
+[/SUBPIECE]
+[/PIECE]
+[PIECE]
+name=output_mix_config
+nb_subblocks=0
+type=0
+parameter_id=100
+parameter_rate=48000
+duration=0
+constant_subblock_duration=0
+[/PIECE]
+[PIECE]
+sound_system=stereo
+integrated_loudness=256/256
+digital_peak=0/256
+true_peak=0/1
+dialogue_anchored_loudness=0/1
+album_anchored_loudness=0/1
+[/PIECE]
+[PIECE]
+sound_system=3.1.2
+integrated_loudness=0/256
+digital_peak=0/256
+true_peak=0/1
+dialogue_anchored_loudness=0/1
+album_anchored_loudness=0/1
+[/PIECE]
+[PIECE]
+sound_system=7.1.2
+integrated_loudness=0/256
+digital_peak=0/256
+true_peak=0/1
+dialogue_anchored_loudness=0/1
+album_anchored_loudness=0/1
+[/PIECE]
+[PIECE]
+sound_system=7.1.4
+integrated_loudness=0/256
+digital_peak=0/256
+true_peak=0/1
+dialogue_anchored_loudness=0/1
+album_anchored_loudness=0/1
+[/PIECE]
+[/SUBCOMPONENT]
+[/COMPONENT]
+DISPOSITION:default=0
+DISPOSITION:dub=0
+DISPOSITION:original=0
+DISPOSITION:comment=0
+DISPOSITION:lyrics=0
+DISPOSITION:karaoke=0
+DISPOSITION:forced=0
+DISPOSITION:hearing_impaired=0
+DISPOSITION:visual_impaired=0
+DISPOSITION:clean_effects=0
+DISPOSITION:attached_pic=0
+DISPOSITION:timed_thumbnails=0
+DISPOSITION:non_diegetic=0
+DISPOSITION:captions=0
+DISPOSITION:descriptions=0
+DISPOSITION:metadata=0
+DISPOSITION:dependent=0
+DISPOSITION:still_image=0
+TAG:language=und
+TAG:handler_name=SoundHandler
+TAG:vendor_id=[0][0][0][0]
+[STREAM]
+index=1
+id=0x2
+DISPOSITION:default=1
+DISPOSITION:dub=0
+DISPOSITION:original=0
+DISPOSITION:comment=0
+DISPOSITION:lyrics=0
+DISPOSITION:karaoke=0
+DISPOSITION:forced=0
+DISPOSITION:hearing_impaired=0
+DISPOSITION:visual_impaired=0
+DISPOSITION:clean_effects=0
+DISPOSITION:attached_pic=0
+DISPOSITION:timed_thumbnails=0
+DISPOSITION:non_diegetic=0
+DISPOSITION:captions=0
+DISPOSITION:descriptions=0
+DISPOSITION:metadata=0
+DISPOSITION:dependent=0
+DISPOSITION:still_image=0
+[/STREAM]
+[STREAM]
+index=2
+id=0x3
+DISPOSITION:default=0
+DISPOSITION:dub=0
+DISPOSITION:original=0
+DISPOSITION:comment=0
+DISPOSITION:lyrics=0
+DISPOSITION:karaoke=0
+DISPOSITION:forced=0
+DISPOSITION:hearing_impaired=0
+DISPOSITION:visual_impaired=0
+DISPOSITION:clean_effects=0
+DISPOSITION:attached_pic=0
+DISPOSITION:timed_thumbnails=0
+DISPOSITION:non_diegetic=0
+DISPOSITION:captions=0
+DISPOSITION:descriptions=0
+DISPOSITION:metadata=0
+DISPOSITION:dependent=1
+DISPOSITION:still_image=0
+[/STREAM]
+[STREAM]
+index=3
+id=0x4
+DISPOSITION:default=0
+DISPOSITION:dub=0
+DISPOSITION:original=0
+DISPOSITION:comment=0
+DISPOSITION:lyrics=0
+DISPOSITION:karaoke=0
+DISPOSITION:forced=0
+DISPOSITION:hearing_impaired=0
+DISPOSITION:visual_impaired=0
+DISPOSITION:clean_effects=0
+DISPOSITION:attached_pic=0
+DISPOSITION:timed_thumbnails=0
+DISPOSITION:non_diegetic=0
+DISPOSITION:captions=0
+DISPOSITION:descriptions=0
+DISPOSITION:metadata=0
+DISPOSITION:dependent=1
+DISPOSITION:still_image=0
+[/STREAM]
+[STREAM]
+index=4
+id=0x5
+DISPOSITION:default=0
+DISPOSITION:dub=0
+DISPOSITION:original=0
+DISPOSITION:comment=0
+DISPOSITION:lyrics=0
+DISPOSITION:karaoke=0
+DISPOSITION:forced=0
+DISPOSITION:hearing_impaired=0
+DISPOSITION:visual_impaired=0
+DISPOSITION:clean_effects=0
+DISPOSITION:attached_pic=0
+DISPOSITION:timed_thumbnails=0
+DISPOSITION:non_diegetic=0
+DISPOSITION:captions=0
+DISPOSITION:descriptions=0
+DISPOSITION:metadata=0
+DISPOSITION:dependent=1
+DISPOSITION:still_image=0
+[/STREAM]
+[STREAM]
+index=5
+id=0x6
+DISPOSITION:default=0
+DISPOSITION:dub=0
+DISPOSITION:original=0
+DISPOSITION:comment=0
+DISPOSITION:lyrics=0
+DISPOSITION:karaoke=0
+DISPOSITION:forced=0
+DISPOSITION:hearing_impaired=0
+DISPOSITION:visual_impaired=0
+DISPOSITION:clean_effects=0
+DISPOSITION:attached_pic=0
+DISPOSITION:timed_thumbnails=0
+DISPOSITION:non_diegetic=0
+DISPOSITION:captions=0
+DISPOSITION:descriptions=0
+DISPOSITION:metadata=0
+DISPOSITION:dependent=1
+DISPOSITION:still_image=0
+[/STREAM]
+[STREAM]
+index=6
+id=0x7
+DISPOSITION:default=0
+DISPOSITION:dub=0
+DISPOSITION:original=0
+DISPOSITION:comment=0
+DISPOSITION:lyrics=0
+DISPOSITION:karaoke=0
+DISPOSITION:forced=0
+DISPOSITION:hearing_impaired=0
+DISPOSITION:visual_impaired=0
+DISPOSITION:clean_effects=0
+DISPOSITION:attached_pic=0
+DISPOSITION:timed_thumbnails=0
+DISPOSITION:non_diegetic=0
+DISPOSITION:captions=0
+DISPOSITION:descriptions=0
+DISPOSITION:metadata=0
+DISPOSITION:dependent=1
+DISPOSITION:still_image=0
+[/STREAM]
+[STREAM]
+index=7
+id=0x8
+DISPOSITION:default=0
+DISPOSITION:dub=0
+DISPOSITION:original=0
+DISPOSITION:comment=0
+DISPOSITION:lyrics=0
+DISPOSITION:karaoke=0
+DISPOSITION:forced=0
+DISPOSITION:hearing_impaired=0
+DISPOSITION:visual_impaired=0
+DISPOSITION:clean_effects=0
+DISPOSITION:attached_pic=0
+DISPOSITION:timed_thumbnails=0
+DISPOSITION:non_diegetic=0
+DISPOSITION:captions=0
+DISPOSITION:descriptions=0
+DISPOSITION:metadata=0
+DISPOSITION:dependent=1
+DISPOSITION:still_image=0
+[/STREAM]
+[/STREAM_GROUP]
+[STREAM]
+index=0
+id=0x1
+[/STREAM]
+[STREAM]
+index=1
+id=0x2
+[/STREAM]
+[STREAM]
+index=2
+id=0x3
+[/STREAM]
+[STREAM]
+index=3
+id=0x4
+[/STREAM]
+[STREAM]
+index=4
+id=0x5
+[/STREAM]
+[STREAM]
+index=5
+id=0x6
+[/STREAM]
+[STREAM]
+index=6
+id=0x7
+[/STREAM]
+[STREAM]
+index=7
+id=0x8
+[/STREAM]
diff --git a/tests/ref/fate/mov-mp4-iamf-7_1_4 b/tests/ref/fate/mov-mp4-iamf-7_1_4-video-last
similarity index 87%
rename from tests/ref/fate/mov-mp4-iamf-7_1_4
rename to tests/ref/fate/mov-mp4-iamf-7_1_4-video-last
index 0641cb0c3c..4f70fedf5b 100644
--- a/tests/ref/fate/mov-mp4-iamf-7_1_4
+++ b/tests/ref/fate/mov-mp4-iamf-7_1_4-video-last
@@ -1,5 +1,5 @@
-d9ef5d14bbd37c5a06c1494cacdb8f29 *tests/data/fate/mov-mp4-iamf-7_1_4.mp4
-100588 tests/data/fate/mov-mp4-iamf-7_1_4.mp4
+d398cd7938efbe3dc570b407fe543a31 *tests/data/fate/mov-mp4-iamf-7_1_4-video-last.mp4
+416629 tests/data/fate/mov-mp4-iamf-7_1_4-video-last.mp4
 #extradata 0:       34, 0xafa70d5e
 #extradata 1:       34, 0xafa70d5e
 #extradata 2:       34, 0xaf7b0d5c
@@ -7,6 +7,7 @@ d9ef5d14bbd37c5a06c1494cacdb8f29 *tests/data/fate/mov-mp4-iamf-7_1_4.mp4
 #extradata 4:       34, 0xafa70d5e
 #extradata 5:       34, 0xafa70d5e
 #extradata 6:       34, 0xafa70d5e
+#extradata 7:       30, 0x47ab0576
 #tb 0: 1/44100
 #media_type 0: audio
 #codec_id 0: flac
@@ -42,6 +43,11 @@ d9ef5d14bbd37c5a06c1494cacdb8f29 *tests/data/fate/mov-mp4-iamf-7_1_4.mp4
 #codec_id 6: flac
 #sample_rate 6: 44100
 #channel_layout_name 6: stereo
+#tb 7: 1/12800
+#media_type 7: video
+#codec_id 7: mpeg4
+#dimensions 7: 352x288
+#sar 7: 1/1
 0,          0,          0,     4608,     1399, 0x6e89566e
 1,          0,          0,     4608,     1399, 0x6e89566e
 2,          0,          0,     4608,     1396, 0x0dcb5677
@@ -49,6 +55,9 @@ d9ef5d14bbd37c5a06c1494cacdb8f29 *tests/data/fate/mov-mp4-iamf-7_1_4.mp4
 4,          0,          0,     4608,     1399, 0x6e89566e
 5,          0,          0,     4608,     1399, 0x6e89566e
 6,          0,          0,     4608,     1399, 0x6e89566e
+7,          0,          0,      512,    42002, 0xef0e5124
+7,        512,        512,      512,    52619, 0xc794e830, F=0x0
+7,       1024,       1024,      512,    51242, 0xf2f6be7f, F=0x0
 0,       4608,       4608,     4608,     1442, 0x6c3c5b13
 1,       4608,       4608,     4608,     1442, 0x6c3c5b13
 2,       4608,       4608,     4608,     1439, 0xc46b5ac5
@@ -56,6 +65,9 @@ d9ef5d14bbd37c5a06c1494cacdb8f29 *tests/data/fate/mov-mp4-iamf-7_1_4.mp4
 4,       4608,       4608,     4608,     1442, 0x6c3c5b13
 5,       4608,       4608,     4608,     1442, 0x6c3c5b13
 6,       4608,       4608,     4608,     1442, 0x6c3c5b13
+7,       1536,       1536,      512,    49320, 0xe87a921f, F=0x0
+7,       2048,       2048,      512,    22461, 0xc858a20b, F=0x0
+7,       2560,       2560,      512,    16731, 0x04beb863, F=0x0
 0,       9216,       9216,     4608,     1380, 0xc497571b
 1,       9216,       9216,     4608,     1380, 0xc497571b
 2,       9216,       9216,     4608,     1377, 0x5b2a55fe
@@ -63,6 +75,8 @@ d9ef5d14bbd37c5a06c1494cacdb8f29 *tests/data/fate/mov-mp4-iamf-7_1_4.mp4
 4,       9216,       9216,     4608,     1380, 0xc497571b
 5,       9216,       9216,     4608,     1380, 0xc497571b
 6,       9216,       9216,     4608,     1380, 0xc497571b
+7,       3072,       3072,      512,     9983, 0x091aa8e8, F=0x0
+7,       3584,       3584,      512,     6991, 0xa0385313, F=0x0
 0,      13824,      13824,     4608,     1383, 0x48e9510f
 1,      13824,      13824,     4608,     1383, 0x48e9510f
 2,      13824,      13824,     4608,     1380, 0x045550d3
@@ -70,6 +84,9 @@ d9ef5d14bbd37c5a06c1494cacdb8f29 *tests/data/fate/mov-mp4-iamf-7_1_4.mp4
 4,      13824,      13824,     4608,     1383, 0x48e9510f
 5,      13824,      13824,     4608,     1383, 0x48e9510f
 6,      13824,      13824,     4608,     1383, 0x48e9510f
+7,       4096,       4096,      512,     5825, 0x3c97cfbc, F=0x0
+7,       4608,       4608,      512,     4331, 0xbaf5f982, F=0x0
+7,       5120,       5120,      512,     2541, 0xe018c3cb, F=0x0
 0,      18432,      18432,     4608,     1572, 0x9a514719
 1,      18432,      18432,     4608,     1572, 0x9a514719
 2,      18432,      18432,     4608,     1568, 0xa2bc45f4
@@ -77,6 +94,9 @@ d9ef5d14bbd37c5a06c1494cacdb8f29 *tests/data/fate/mov-mp4-iamf-7_1_4.mp4
 4,      18432,      18432,     4608,     1572, 0x9a514719
 5,      18432,      18432,     4608,     1572, 0x9a514719
 6,      18432,      18432,     4608,     1572, 0x9a514719
+7,       5632,       5632,      512,     2655, 0xf98af7a1, F=0x0
+7,       6144,       6144,      512,    13464, 0x33e5196f
+7,       6656,       6656,      512,     2587, 0x90e198aa, F=0x0
 0,      23040,      23040,     4608,     1391, 0x74ac5014
 1,      23040,      23040,     4608,     1391, 0x74ac5014
 2,      23040,      23040,     4608,     1388, 0x96c85007
@@ -84,6 +104,8 @@ d9ef5d14bbd37c5a06c1494cacdb8f29 *tests/data/fate/mov-mp4-iamf-7_1_4.mp4
 4,      23040,      23040,     4608,     1391, 0x74ac5014
 5,      23040,      23040,     4608,     1391, 0x74ac5014
 6,      23040,      23040,     4608,     1391, 0x74ac5014
+7,       7168,       7168,      512,     2313, 0x698c429b, F=0x0
+7,       7680,       7680,      512,     2123, 0x63a3f034, F=0x0
 0,      27648,      27648,     4608,     1422, 0x2f9d47c5
 1,      27648,      27648,     4608,     1422, 0x2f9d47c5
 2,      27648,      27648,     4608,     1419, 0x4d4d466a
@@ -91,6 +113,9 @@ d9ef5d14bbd37c5a06c1494cacdb8f29 *tests/data/fate/mov-mp4-iamf-7_1_4.mp4
 4,      27648,      27648,     4608,     1422, 0x2f9d47c5
 5,      27648,      27648,     4608,     1422, 0x2f9d47c5
 6,      27648,      27648,     4608,     1422, 0x2f9d47c5
+7,       8192,       8192,      512,     2222, 0x442b233d, F=0x0
+7,       8704,       8704,      512,     2332, 0x24c75b04, F=0x0
+7,       9216,       9216,      512,     2302, 0xa0fa2ee7, F=0x0
 0,      32256,      32256,     4608,     1768, 0x2a044b99
 1,      32256,      32256,     4608,     1768, 0x2a044b99
 2,      32256,      32256,     4608,     1765, 0xacb84b24
@@ -98,6 +123,8 @@ d9ef5d14bbd37c5a06c1494cacdb8f29 *tests/data/fate/mov-mp4-iamf-7_1_4.mp4
 4,      32256,      32256,     4608,     1768, 0x2a044b99
 5,      32256,      32256,     4608,     1768, 0x2a044b99
 6,      32256,      32256,     4608,     1768, 0x2a044b99
+7,       9728,       9728,      512,     1740, 0xdf772eb3, F=0x0
+7,      10240,      10240,      512,     1994, 0x8830ad23, F=0x0
 0,      36864,      36864,     4608,     1534, 0xb0b35a3f
 1,      36864,      36864,     4608,     1534, 0xb0b35a3f
 2,      36864,      36864,     4608,     1531, 0x996458aa
@@ -105,6 +132,9 @@ d9ef5d14bbd37c5a06c1494cacdb8f29 *tests/data/fate/mov-mp4-iamf-7_1_4.mp4
 4,      36864,      36864,     4608,     1534, 0xb0b35a3f
 5,      36864,      36864,     4608,     1534, 0xb0b35a3f
 6,      36864,      36864,     4608,     1534, 0xb0b35a3f
+7,      10752,      10752,      512,     1884, 0x2c567db6, F=0x0
+7,      11264,      11264,      512,     1880, 0x72237c52, F=0x0
+7,      11776,      11776,      512,     1970, 0x60708ff8, F=0x0
 0,      41472,      41472,     2628,      926, 0xc26a5eae
 1,      41472,      41472,     2628,      926, 0xc26a5eae
 2,      41472,      41472,     2628,      923, 0xa7225edf
@@ -112,6 +142,7 @@ d9ef5d14bbd37c5a06c1494cacdb8f29 *tests/data/fate/mov-mp4-iamf-7_1_4.mp4
 4,      41472,      41472,     2628,      926, 0xc26a5eae
 5,      41472,      41472,     2628,      926, 0xc26a5eae
 6,      41472,      41472,     2628,      926, 0xc26a5eae
+7,      12288,      12288,      512,    11659, 0x6bcb830e
 [STREAM_GROUP]
 index=0
 id=0x1
@@ -178,7 +209,7 @@ TAG:handler_name=SoundHandler
 TAG:vendor_id=[0][0][0][0]
 [STREAM]
 index=0
-id=0x0
+id=0x1
 DISPOSITION:default=1
 DISPOSITION:dub=0
 DISPOSITION:original=0
@@ -200,28 +231,6 @@ DISPOSITION:still_image=0
 [/STREAM]
 [STREAM]
 index=1
-id=0x1
-DISPOSITION:default=0
-DISPOSITION:dub=0
-DISPOSITION:original=0
-DISPOSITION:comment=0
-DISPOSITION:lyrics=0
-DISPOSITION:karaoke=0
-DISPOSITION:forced=0
-DISPOSITION:hearing_impaired=0
-DISPOSITION:visual_impaired=0
-DISPOSITION:clean_effects=0
-DISPOSITION:attached_pic=0
-DISPOSITION:timed_thumbnails=0
-DISPOSITION:non_diegetic=0
-DISPOSITION:captions=0
-DISPOSITION:descriptions=0
-DISPOSITION:metadata=0
-DISPOSITION:dependent=1
-DISPOSITION:still_image=0
-[/STREAM]
-[STREAM]
-index=2
 id=0x2
 DISPOSITION:default=0
 DISPOSITION:dub=0
@@ -243,7 +252,7 @@ DISPOSITION:dependent=1
 DISPOSITION:still_image=0
 [/STREAM]
 [STREAM]
-index=3
+index=2
 id=0x3
 DISPOSITION:default=0
 DISPOSITION:dub=0
@@ -265,7 +274,7 @@ DISPOSITION:dependent=1
 DISPOSITION:still_image=0
 [/STREAM]
 [STREAM]
-index=4
+index=3
 id=0x4
 DISPOSITION:default=0
 DISPOSITION:dub=0
@@ -287,7 +296,7 @@ DISPOSITION:dependent=1
 DISPOSITION:still_image=0
 [/STREAM]
 [STREAM]
-index=5
+index=4
 id=0x5
 DISPOSITION:default=0
 DISPOSITION:dub=0
@@ -309,7 +318,7 @@ DISPOSITION:dependent=1
 DISPOSITION:still_image=0
 [/STREAM]
 [STREAM]
-index=6
+index=5
 id=0x6
 DISPOSITION:default=0
 DISPOSITION:dub=0
@@ -330,6 +339,28 @@ DISPOSITION:metadata=0
 DISPOSITION:dependent=1
 DISPOSITION:still_image=0
 [/STREAM]
+[STREAM]
+index=6
+id=0x7
+DISPOSITION:default=0
+DISPOSITION:dub=0
+DISPOSITION:original=0
+DISPOSITION:comment=0
+DISPOSITION:lyrics=0
+DISPOSITION:karaoke=0
+DISPOSITION:forced=0
+DISPOSITION:hearing_impaired=0
+DISPOSITION:visual_impaired=0
+DISPOSITION:clean_effects=0
+DISPOSITION:attached_pic=0
+DISPOSITION:timed_thumbnails=0
+DISPOSITION:non_diegetic=0
+DISPOSITION:captions=0
+DISPOSITION:descriptions=0
+DISPOSITION:metadata=0
+DISPOSITION:dependent=1
+DISPOSITION:still_image=0
+[/STREAM]
 [/STREAM_GROUP]
 [STREAM_GROUP]
 index=1
@@ -428,7 +459,7 @@ TAG:handler_name=SoundHandler
 TAG:vendor_id=[0][0][0][0]
 [STREAM]
 index=0
-id=0x0
+id=0x1
 DISPOSITION:default=1
 DISPOSITION:dub=0
 DISPOSITION:original=0
@@ -450,28 +481,6 @@ DISPOSITION:still_image=0
 [/STREAM]
 [STREAM]
 index=1
-id=0x1
-DISPOSITION:default=0
-DISPOSITION:dub=0
-DISPOSITION:original=0
-DISPOSITION:comment=0
-DISPOSITION:lyrics=0
-DISPOSITION:karaoke=0
-DISPOSITION:forced=0
-DISPOSITION:hearing_impaired=0
-DISPOSITION:visual_impaired=0
-DISPOSITION:clean_effects=0
-DISPOSITION:attached_pic=0
-DISPOSITION:timed_thumbnails=0
-DISPOSITION:non_diegetic=0
-DISPOSITION:captions=0
-DISPOSITION:descriptions=0
-DISPOSITION:metadata=0
-DISPOSITION:dependent=1
-DISPOSITION:still_image=0
-[/STREAM]
-[STREAM]
-index=2
 id=0x2
 DISPOSITION:default=0
 DISPOSITION:dub=0
@@ -493,7 +502,7 @@ DISPOSITION:dependent=1
 DISPOSITION:still_image=0
 [/STREAM]
 [STREAM]
-index=3
+index=2
 id=0x3
 DISPOSITION:default=0
 DISPOSITION:dub=0
@@ -515,7 +524,7 @@ DISPOSITION:dependent=1
 DISPOSITION:still_image=0
 [/STREAM]
 [STREAM]
-index=4
+index=3
 id=0x4
 DISPOSITION:default=0
 DISPOSITION:dub=0
@@ -537,7 +546,7 @@ DISPOSITION:dependent=1
 DISPOSITION:still_image=0
 [/STREAM]
 [STREAM]
-index=5
+index=4
 id=0x5
 DISPOSITION:default=0
 DISPOSITION:dub=0
@@ -559,7 +568,7 @@ DISPOSITION:dependent=1
 DISPOSITION:still_image=0
 [/STREAM]
 [STREAM]
-index=6
+index=5
 id=0x6
 DISPOSITION:default=0
 DISPOSITION:dub=0
@@ -580,4 +589,58 @@ DISPOSITION:metadata=0
 DISPOSITION:dependent=1
 DISPOSITION:still_image=0
 [/STREAM]
+[STREAM]
+index=6
+id=0x7
+DISPOSITION:default=0
+DISPOSITION:dub=0
+DISPOSITION:original=0
+DISPOSITION:comment=0
+DISPOSITION:lyrics=0
+DISPOSITION:karaoke=0
+DISPOSITION:forced=0
+DISPOSITION:hearing_impaired=0
+DISPOSITION:visual_impaired=0
+DISPOSITION:clean_effects=0
+DISPOSITION:attached_pic=0
+DISPOSITION:timed_thumbnails=0
+DISPOSITION:non_diegetic=0
+DISPOSITION:captions=0
+DISPOSITION:descriptions=0
+DISPOSITION:metadata=0
+DISPOSITION:dependent=1
+DISPOSITION:still_image=0
+[/STREAM]
 [/STREAM_GROUP]
+[STREAM]
+index=0
+id=0x1
+[/STREAM]
+[STREAM]
+index=1
+id=0x2
+[/STREAM]
+[STREAM]
+index=2
+id=0x3
+[/STREAM]
+[STREAM]
+index=3
+id=0x4
+[/STREAM]
+[STREAM]
+index=4
+id=0x5
+[/STREAM]
+[STREAM]
+index=5
+id=0x6
+[/STREAM]
+[STREAM]
+index=6
+id=0x7
+[/STREAM]
+[STREAM]
+index=7
+id=0x8
+[/STREAM]
diff --git a/tests/streamgroups/audio_element-7_1_4-2 b/tests/streamgroups/audio_element-7_1_4-2
new file mode 100644
index 0000000000..324ab5562d
--- /dev/null
+++ b/tests/streamgroups/audio_element-7_1_4-2
@@ -0,0 +1,6 @@
+type=iamf_audio_element:id=1:st=1:st=2:st=3:st=4:st=5:st=6:st=7:default_w=10,
+demixing=dmixp_mode=1:parameter_id=998,recon_gain=parameter_id=101,
+layer=ch_layout=stereo,
+layer=ch_layout=3.1.2,
+layer=ch_layout=7.1.2,
+layer=ch_layout=7.1.4,
-- 
2.52.0


>From 3157e62866c2c20bcefa30236a73eff50a05ab92 Mon Sep 17 00:00:00 2001
From: James Almer <jamrial@gmail.com>
Date: Fri, 20 Dec 2024 12:57:48 -0300
Subject: [PATCH 2/4] avformat/mov: add an offset to IAMF streams

Using audio_substream_id for AVStream ids is not ideal give that in containers
like mp4, the IAMF structure is opaque to the outside and other streams may
share such id values.

Signed-off-by: James Almer <jamrial@gmail.com>
(cherry picked from commit a8f23745074acd8a1934e3653caebd5a0ba05c6f)
---
 libavformat/iamf_reader.c                    | 12 +++---
 libavformat/iamf_reader.h                    |  2 +-
 libavformat/iamfdec.c                        |  2 +-
 libavformat/isom.h                           |  1 +
 libavformat/mov.c                            | 29 +++++++++++++-
 libavformat/version.h                        |  2 +-
 tests/ref/fate/mov-mp4-iamf-7_1_4-video-last | 42 ++++++++++----------
 7 files changed, 59 insertions(+), 31 deletions(-)

diff --git a/libavformat/iamf_reader.c b/libavformat/iamf_reader.c
index 02e8b694d7..6b6360d314 100644
--- a/libavformat/iamf_reader.c
+++ b/libavformat/iamf_reader.c
@@ -30,10 +30,10 @@
 #include "iamf_parse.h"
 #include "iamf_reader.h"
 
-static AVStream *find_stream_by_id(AVFormatContext *s, int id)
+static AVStream *find_stream_by_id(AVFormatContext *s, int id, int stream_id_offset)
 {
     for (int i = 0; i < s->nb_streams; i++)
-        if (s->streams[i]->id == id)
+        if (s->streams[i]->id == id + stream_id_offset)
             return s->streams[i];
 
     av_log(s, AV_LOG_ERROR, "Invalid stream id %d\n", id);
@@ -44,7 +44,7 @@ static int audio_frame_obu(AVFormatContext *s, const IAMFDemuxContext *c,
                            AVIOContext *pb, AVPacket *pkt,
                            int len, enum IAMF_OBU_Type type,
                            unsigned skip_samples, unsigned discard_padding,
-                           int id_in_bitstream)
+                           int stream_id_offset, int id_in_bitstream)
 {
     AVStream *st;
     int ret, audio_substream_id;
@@ -58,7 +58,7 @@ static int audio_frame_obu(AVFormatContext *s, const IAMFDemuxContext *c,
     } else
         audio_substream_id = type - IAMF_OBU_IA_AUDIO_FRAME_ID0;
 
-    st = find_stream_by_id(s, audio_substream_id);
+    st = find_stream_by_id(s, audio_substream_id, stream_id_offset);
     if (!st)
         return AVERROR_INVALIDDATA;
 
@@ -276,7 +276,7 @@ fail:
 }
 
 int ff_iamf_read_packet(AVFormatContext *s, IAMFDemuxContext *c,
-                        AVIOContext *pb, int max_size, AVPacket *pkt)
+                        AVIOContext *pb, int max_size, int stream_id_offset, AVPacket *pkt)
 {
     int read = 0;
 
@@ -306,7 +306,7 @@ int ff_iamf_read_packet(AVFormatContext *s, IAMFDemuxContext *c,
         read += len;
         if (type >= IAMF_OBU_IA_AUDIO_FRAME && type <= IAMF_OBU_IA_AUDIO_FRAME_ID17) {
             ret = audio_frame_obu(s, c, pb, pkt, obu_size, type,
-                                   skip_samples, discard_padding,
+                                   skip_samples, discard_padding, stream_id_offset,
                                    type == IAMF_OBU_IA_AUDIO_FRAME);
             if (ret < 0)
                 return ret;
diff --git a/libavformat/iamf_reader.h b/libavformat/iamf_reader.h
index ecb92d485a..279739cde9 100644
--- a/libavformat/iamf_reader.h
+++ b/libavformat/iamf_reader.h
@@ -42,7 +42,7 @@ typedef struct IAMFDemuxContext {
 } IAMFDemuxContext;
 
 int ff_iamf_read_packet(AVFormatContext *s, IAMFDemuxContext *c,
-                        AVIOContext *pb, int max_size, AVPacket *pkt);
+                        AVIOContext *pb, int max_size, int stream_id_offset, AVPacket *pkt);
 
 void ff_iamf_read_deinit(IAMFDemuxContext *c);
 
diff --git a/libavformat/iamfdec.c b/libavformat/iamfdec.c
index ad47c5e5f7..08d12f59d3 100644
--- a/libavformat/iamfdec.c
+++ b/libavformat/iamfdec.c
@@ -165,7 +165,7 @@ static int iamf_read_packet(AVFormatContext *s, AVPacket *pkt)
     IAMFDemuxContext *const c = s->priv_data;
     int ret;
 
-    ret = ff_iamf_read_packet(s, c, s->pb, INT_MAX, pkt);
+    ret = ff_iamf_read_packet(s, c, s->pb, INT_MAX, 0, pkt);
     if (ret < 0)
         return ret;
 
diff --git a/libavformat/isom.h b/libavformat/isom.h
index b7ccc9994b..bdb7555d9c 100644
--- a/libavformat/isom.h
+++ b/libavformat/isom.h
@@ -267,6 +267,7 @@ typedef struct MOVStreamContext {
     } cenc;
 
     struct IAMFDemuxContext *iamf;
+    int iamf_stream_offset;
 } MOVStreamContext;
 
 typedef struct HEIFItem {
diff --git a/libavformat/mov.c b/libavformat/mov.c
index 68b46184e4..f2f1bb96e6 100644
--- a/libavformat/mov.c
+++ b/libavformat/mov.c
@@ -9551,6 +9551,30 @@ static int mov_parse_tiles(AVFormatContext *s)
     return 0;
 }
 
+static void fix_stream_ids(AVFormatContext *s)
+{
+    int highest_id = 0;
+
+    for (int i = 0; i < s->nb_streams; i++) {
+        const AVStream *st = s->streams[i];
+        const MOVStreamContext *sc = st->priv_data;
+        if (!sc->iamf)
+            highest_id = FFMAX(highest_id, st->id);
+    }
+    highest_id += !highest_id;
+    for (int i = 0; highest_id > 1 && i < s->nb_stream_groups; i++) {
+        AVStreamGroup *stg = s->stream_groups[i];
+        if (stg->type != AV_STREAM_GROUP_PARAMS_IAMF_AUDIO_ELEMENT)
+            continue;
+        for (int j = 0; j < stg->nb_streams; j++) {
+            AVStream *st = stg->streams[j];
+            MOVStreamContext *sc = st->priv_data;
+            st->id += highest_id;
+            sc->iamf_stream_offset = highest_id;
+        }
+    }
+}
+
 static int mov_read_header(AVFormatContext *s)
 {
     MOVContext *mov = s->priv_data;
@@ -9812,6 +9836,9 @@ static int mov_read_header(AVFormatContext *s)
             break;
         }
     }
+
+    fix_stream_ids(s);
+
     ff_configure_buffers_for_index(s, AV_TIME_BASE);
 
     for (i = 0; i < mov->frag_index.nb_items; i++)
@@ -10101,7 +10128,7 @@ static int mov_read_packet(AVFormatContext *s, AVPacket *pkt)
             pos = pkt->pos; flags = pkt->flags;
             duration = pkt->duration;
             while (!ret && size > 0) {
-                ret = ff_iamf_read_packet(s, sc->iamf, sc->pb, size, pkt);
+                ret = ff_iamf_read_packet(s, sc->iamf, sc->pb, size, sc->iamf_stream_offset, pkt);
                 if (ret < 0) {
                     if (should_retry(sc->pb, ret))
                         mov_current_sample_dec(sc);
diff --git a/libavformat/version.h b/libavformat/version.h
index a7c80dc564..b32ddb3617 100644
--- a/libavformat/version.h
+++ b/libavformat/version.h
@@ -32,7 +32,7 @@
 #include "version_major.h"
 
 #define LIBAVFORMAT_VERSION_MINOR   1
-#define LIBAVFORMAT_VERSION_MICRO 100
+#define LIBAVFORMAT_VERSION_MICRO 101
 
 #define LIBAVFORMAT_VERSION_INT AV_VERSION_INT(LIBAVFORMAT_VERSION_MAJOR, \
                                                LIBAVFORMAT_VERSION_MINOR, \
diff --git a/tests/ref/fate/mov-mp4-iamf-7_1_4-video-last b/tests/ref/fate/mov-mp4-iamf-7_1_4-video-last
index 4f70fedf5b..e4b690e9a3 100644
--- a/tests/ref/fate/mov-mp4-iamf-7_1_4-video-last
+++ b/tests/ref/fate/mov-mp4-iamf-7_1_4-video-last
@@ -209,7 +209,7 @@ TAG:handler_name=SoundHandler
 TAG:vendor_id=[0][0][0][0]
 [STREAM]
 index=0
-id=0x1
+id=0x9
 DISPOSITION:default=1
 DISPOSITION:dub=0
 DISPOSITION:original=0
@@ -231,7 +231,7 @@ DISPOSITION:still_image=0
 [/STREAM]
 [STREAM]
 index=1
-id=0x2
+id=0xa
 DISPOSITION:default=0
 DISPOSITION:dub=0
 DISPOSITION:original=0
@@ -253,7 +253,7 @@ DISPOSITION:still_image=0
 [/STREAM]
 [STREAM]
 index=2
-id=0x3
+id=0xb
 DISPOSITION:default=0
 DISPOSITION:dub=0
 DISPOSITION:original=0
@@ -275,7 +275,7 @@ DISPOSITION:still_image=0
 [/STREAM]
 [STREAM]
 index=3
-id=0x4
+id=0xc
 DISPOSITION:default=0
 DISPOSITION:dub=0
 DISPOSITION:original=0
@@ -297,7 +297,7 @@ DISPOSITION:still_image=0
 [/STREAM]
 [STREAM]
 index=4
-id=0x5
+id=0xd
 DISPOSITION:default=0
 DISPOSITION:dub=0
 DISPOSITION:original=0
@@ -319,7 +319,7 @@ DISPOSITION:still_image=0
 [/STREAM]
 [STREAM]
 index=5
-id=0x6
+id=0xe
 DISPOSITION:default=0
 DISPOSITION:dub=0
 DISPOSITION:original=0
@@ -341,7 +341,7 @@ DISPOSITION:still_image=0
 [/STREAM]
 [STREAM]
 index=6
-id=0x7
+id=0xf
 DISPOSITION:default=0
 DISPOSITION:dub=0
 DISPOSITION:original=0
@@ -459,7 +459,7 @@ TAG:handler_name=SoundHandler
 TAG:vendor_id=[0][0][0][0]
 [STREAM]
 index=0
-id=0x1
+id=0x9
 DISPOSITION:default=1
 DISPOSITION:dub=0
 DISPOSITION:original=0
@@ -481,7 +481,7 @@ DISPOSITION:still_image=0
 [/STREAM]
 [STREAM]
 index=1
-id=0x2
+id=0xa
 DISPOSITION:default=0
 DISPOSITION:dub=0
 DISPOSITION:original=0
@@ -503,7 +503,7 @@ DISPOSITION:still_image=0
 [/STREAM]
 [STREAM]
 index=2
-id=0x3
+id=0xb
 DISPOSITION:default=0
 DISPOSITION:dub=0
 DISPOSITION:original=0
@@ -525,7 +525,7 @@ DISPOSITION:still_image=0
 [/STREAM]
 [STREAM]
 index=3
-id=0x4
+id=0xc
 DISPOSITION:default=0
 DISPOSITION:dub=0
 DISPOSITION:original=0
@@ -547,7 +547,7 @@ DISPOSITION:still_image=0
 [/STREAM]
 [STREAM]
 index=4
-id=0x5
+id=0xd
 DISPOSITION:default=0
 DISPOSITION:dub=0
 DISPOSITION:original=0
@@ -569,7 +569,7 @@ DISPOSITION:still_image=0
 [/STREAM]
 [STREAM]
 index=5
-id=0x6
+id=0xe
 DISPOSITION:default=0
 DISPOSITION:dub=0
 DISPOSITION:original=0
@@ -591,7 +591,7 @@ DISPOSITION:still_image=0
 [/STREAM]
 [STREAM]
 index=6
-id=0x7
+id=0xf
 DISPOSITION:default=0
 DISPOSITION:dub=0
 DISPOSITION:original=0
@@ -614,31 +614,31 @@ DISPOSITION:still_image=0
 [/STREAM_GROUP]
 [STREAM]
 index=0
-id=0x1
+id=0x9
 [/STREAM]
 [STREAM]
 index=1
-id=0x2
+id=0xa
 [/STREAM]
 [STREAM]
 index=2
-id=0x3
+id=0xb
 [/STREAM]
 [STREAM]
 index=3
-id=0x4
+id=0xc
 [/STREAM]
 [STREAM]
 index=4
-id=0x5
+id=0xd
 [/STREAM]
 [STREAM]
 index=5
-id=0x6
+id=0xe
 [/STREAM]
 [STREAM]
 index=6
-id=0x7
+id=0xf
 [/STREAM]
 [STREAM]
 index=7
-- 
2.52.0


>From 9434a8349de3ffd34236ca80df0ca2cf8273681c Mon Sep 17 00:00:00 2001
From: James Almer <jamrial@gmail.com>
Date: Fri, 27 Feb 2026 10:38:14 -0300
Subject: [PATCH 3/4] avformat/mov: fix setting iamf stream id offsets

If we were to add the highest id of a non iamf stream as offset to iamf stream
ids, and one of the latter was 0, then an id overlap would ocurr.

Signed-off-by: James Almer <jamrial@gmail.com>
(cherry picked from commit 51aef95ba156b7848eca5445f0f59b091c3b1004)
---
 libavformat/mov.c | 18 ++++++++++++++++--
 1 file changed, 16 insertions(+), 2 deletions(-)

diff --git a/libavformat/mov.c b/libavformat/mov.c
index f2f1bb96e6..b638ca0654 100644
--- a/libavformat/mov.c
+++ b/libavformat/mov.c
@@ -9553,7 +9553,7 @@ static int mov_parse_tiles(AVFormatContext *s)
 
 static void fix_stream_ids(AVFormatContext *s)
 {
-    int highest_id = 0;
+    int highest_id = 0, lowest_iamf_id = INT_MAX;
 
     for (int i = 0; i < s->nb_streams; i++) {
         const AVStream *st = s->streams[i];
@@ -9561,7 +9561,21 @@ static void fix_stream_ids(AVFormatContext *s)
         if (!sc->iamf)
             highest_id = FFMAX(highest_id, st->id);
     }
-    highest_id += !highest_id;
+
+    for (int i = 0; i < s->nb_stream_groups; i++) {
+        AVStreamGroup *stg = s->stream_groups[i];
+        if (stg->type != AV_STREAM_GROUP_PARAMS_IAMF_AUDIO_ELEMENT)
+            continue;
+        for (int j = 0; j < stg->nb_streams; j++) {
+            AVStream *st = stg->streams[j];
+            lowest_iamf_id = FFMIN(lowest_iamf_id, st->id);
+        }
+    }
+
+    if (highest_id < lowest_iamf_id)
+        return;
+
+    highest_id += !lowest_iamf_id;
     for (int i = 0; highest_id > 1 && i < s->nb_stream_groups; i++) {
         AVStreamGroup *stg = s->stream_groups[i];
         if (stg->type != AV_STREAM_GROUP_PARAMS_IAMF_AUDIO_ELEMENT)
-- 
2.52.0


>From 85166b3d5e861f2cd4fa270c57234d848346efb9 Mon Sep 17 00:00:00 2001
From: James Almer <jamrial@gmail.com>
Date: Fri, 27 Feb 2026 10:41:31 -0300
Subject: [PATCH 4/4] avformat/mov: fix cases where we discard iamf packets
 from enabled streams

Given the entire iamf struct is inside a single Track, if the first iamf stream
(which is the one sharing the index and id from the Track) was to be disabled,
then packets from every iamf stream would be discarded.
Fix this by actually going through the entire iamf Sample and discarding those
from the disabled streams only.

Signed-off-by: James Almer <jamrial@gmail.com>
(cherry picked from commit 16ee3d8d99a2f2e83a2559e958e19ede813b29f8)
---
 libavformat/iamf_reader.c | 3 +++
 libavformat/mov.c         | 8 +++++++-
 2 files changed, 10 insertions(+), 1 deletion(-)

diff --git a/libavformat/iamf_reader.c b/libavformat/iamf_reader.c
index 6b6360d314..d83bd1a006 100644
--- a/libavformat/iamf_reader.c
+++ b/libavformat/iamf_reader.c
@@ -94,6 +94,9 @@ static int audio_frame_obu(AVFormatContext *s, const IAMFDemuxContext *c,
         memcpy(side_data, c->recon, c->recon_size);
     }
 
+    if (st->discard == AVDISCARD_ALL)
+        pkt->flags |= AV_PKT_FLAG_DISCARD;
+
     pkt->stream_index = st->index;
     return 0;
 }
diff --git a/libavformat/mov.c b/libavformat/mov.c
index b638ca0654..1dd8bef4e4 100644
--- a/libavformat/mov.c
+++ b/libavformat/mov.c
@@ -10114,7 +10114,7 @@ static int mov_read_packet(AVFormatContext *s, AVPacket *pkt)
         sample->size = FFMIN(sample->size, (mov->next_root_atom - sample->pos));
     }
 
-    if (st->discard != AVDISCARD_ALL) {
+    if (st->discard != AVDISCARD_ALL || sc->iamf) {
         int64_t ret64 = avio_seek(sc->pb, sample->pos, SEEK_SET);
         if (ret64 != sample->pos) {
             av_log(mov->fc, AV_LOG_ERROR, "stream %d, offset 0x%"PRIx64": partial file\n",
@@ -10149,6 +10149,12 @@ static int mov_read_packet(AVFormatContext *s, AVPacket *pkt)
                     return ret;
                 }
                 size -= ret;
+
+                if (pkt->flags & AV_PKT_FLAG_DISCARD) {
+                    av_packet_unref(pkt);
+                    ret = 0;
+                    continue;
+                }
                 pkt->pts = pts; pkt->dts = dts;
                 pkt->pos = pos; pkt->flags |= flags;
                 pkt->duration = duration;
-- 
2.52.0

_______________________________________________
ffmpeg-devel mailing list -- ffmpeg-devel@ffmpeg.org
To unsubscribe send an email to ffmpeg-devel-leave@ffmpeg.org

                 reply	other threads:[~2026-02-27 15:27 UTC|newest]

Thread overview: [no followups] expand[flat|nested]  mbox.gz  Atom feed

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=177220596425.25.1859633137034059117@29965ddac10e \
    --to=ffmpeg-devel@ffmpeg.org \
    --cc=code@ffmpeg.org \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link

Git Inbox Mirror of the ffmpeg-devel mailing list - see https://ffmpeg.org/mailman/listinfo/ffmpeg-devel

This inbox may be cloned and mirrored by anyone:

	git clone --mirror https://master.gitmailbox.com/ffmpegdev/0 ffmpegdev/git/0.git

	# If you have public-inbox 1.1+ installed, you may
	# initialize and index your mirror using the following commands:
	public-inbox-init -V2 ffmpegdev ffmpegdev/ https://master.gitmailbox.com/ffmpegdev \
		ffmpegdev@gitmailbox.com
	public-inbox-index ffmpegdev

Example config snippet for mirrors.


AGPL code for this site: git clone https://public-inbox.org/public-inbox.git