diff options
author | James Almer <jamrial@gmail.com> | 2025-07-27 16:14:12 -0300 |
---|---|---|
committer | James Almer <jamrial@gmail.com> | 2025-07-30 16:48:14 -0300 |
commit | eefa6de7d505ecd80e4674146067b99d1b74ddbe (patch) | |
tree | ad3a9157144fea4521f47b6208b59fb314f123f9 | |
parent | a4a3b3bf544c9d9b7127e4488911bd1d71291a47 (diff) | |
download | ffmpeg-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.c | 14 | ||||
-rw-r--r-- | tests/ref/fate/h264_redundant_pps-side_data | 8 |
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 |