aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorJames Almer <jamrial@gmail.com>2025-07-27 16:14:12 -0300
committerJames Almer <jamrial@gmail.com>2025-07-30 16:48:14 -0300
commiteefa6de7d505ecd80e4674146067b99d1b74ddbe (patch)
treead3a9157144fea4521f47b6208b59fb314f123f9
parenta4a3b3bf544c9d9b7127e4488911bd1d71291a47 (diff)
downloadffmpeg-eefa6de7d505ecd80e4674146067b99d1b74ddbe.tar.gz
avformat/mov: export the correct initial extratada from samples with multiple stsd
The first sample in the stsc box may not refer to the first stsd entry. This is the case in h264/thezerotheorem-cut.mp4, and as such the fate-h264_redundant_pps-side_data test is updated accordingly. Signed-off-by: James Almer <jamrial@gmail.com>
-rw-r--r--libavformat/mov.c14
-rw-r--r--tests/ref/fate/h264_redundant_pps-side_data8
2 files changed, 18 insertions, 4 deletions
diff --git a/libavformat/mov.c b/libavformat/mov.c
index 8f1c5df3c9..55b0950b5e 100644
--- a/libavformat/mov.c
+++ b/libavformat/mov.c
@@ -10580,6 +10580,20 @@ static int mov_read_header(AVFormatContext *s)
MOVStreamContext *sc = st->priv_data;
uint32_t dvdsub_clut[FF_DVDCLUT_CLUT_LEN] = {0};
fix_timescale(mov, sc);
+
+ /* Set the primary extradata based on the first Sample. */
+ if (sc->stsc_count && sc->extradata_size && !sc->iamf) {
+ sc->last_stsd_index = sc->stsc_data[0].id - 1;
+ av_freep(&st->codecpar->extradata);
+ st->codecpar->extradata_size = sc->extradata_size[sc->last_stsd_index];
+ if (sc->extradata_size[sc->last_stsd_index]) {
+ st->codecpar->extradata = av_mallocz(sc->extradata_size[sc->last_stsd_index] + AV_INPUT_BUFFER_PADDING_SIZE);
+ if (!st->codecpar->extradata)
+ return AVERROR(ENOMEM);
+ memcpy(st->codecpar->extradata, sc->extradata[sc->last_stsd_index], sc->extradata_size[sc->last_stsd_index]);
+ }
+ }
+
if (st->codecpar->codec_type == AVMEDIA_TYPE_AUDIO &&
st->codecpar->codec_id == AV_CODEC_ID_AAC) {
sti->skip_samples = sc->start_pad;
diff --git a/tests/ref/fate/h264_redundant_pps-side_data b/tests/ref/fate/h264_redundant_pps-side_data
index 8633792d8f..1f4684bf5b 100644
--- a/tests/ref/fate/h264_redundant_pps-side_data
+++ b/tests/ref/fate/h264_redundant_pps-side_data
@@ -1,12 +1,12 @@
-a35cca13c3f91d1a279bf576b8264d05 *tests/data/fate/h264_redundant_pps-side_data.nut
-596153 tests/data/fate/h264_redundant_pps-side_data.nut
-#extradata 0: 34, 0x851f08e4
+92fe70291f72acf94ba56b426bbaccb0 *tests/data/fate/h264_redundant_pps-side_data.nut
+596100 tests/data/fate/h264_redundant_pps-side_data.nut
+#extradata 0: 34, 0x850408e3
#tb 0: 1/48000
#media_type 0: video
#codec_id 0: h264
#dimensions 0: 1920x1080
#sar 0: 0/1
-0, -2002, 0, 2002, 247959, 0xdb721881, S=1, New Extradata, 34, 0x850408e3
+0, -2002, 0, 2002, 247959, 0xdb721881
0, 0, 4004, 2002, 43356, 0xa366eb79, F=0x0
0, 2002, 2002, 2002, 11423, 0x9c0a86fa, F=0x0
0, 4004, 8008, 2002, 50801, 0xfbfe860d, F=0x0