From 5bd7003e81c30914e8adfe46b3ab85ba99e42d0f Mon Sep 17 00:00:00 2001 From: James Almer Date: Sat, 2 Aug 2025 18:03:40 -0300 Subject: [PATCH] avformat/mov: move AVC-Intra extradata generation to earlier in the stsd parsing process This will ensure it will be stored in the stream's private context, so it can be fetched and replaced as required. Fixes a regression since eefa6de7d505ecd80e4674146067b99d1b74ddbe. Fixes avc-intra-panasonic-AG-HPX301E.mov Signed-off-by: James Almer --- libavformat/mov.c | 33 +++++++++++++++++++++++++-------- 1 file changed, 25 insertions(+), 8 deletions(-) diff --git a/libavformat/mov.c b/libavformat/mov.c index 37f24a6beb..40105a408d 100644 --- a/libavformat/mov.c +++ b/libavformat/mov.c @@ -3028,6 +3028,27 @@ static int mov_skip_multiple_stsd(MOVContext *c, AVIOContext *pb, return 0; } +static int mov_finalize_stsd_entry(MOVContext *c, AVStream *st) +{ + int ret; + + /* special codec parameters handling */ + switch (st->codecpar->codec_id) { + case AV_CODEC_ID_H264: + // done for ai5q, ai52, ai55, ai1q, ai12 and ai15. + if (!st->codecpar->extradata_size && TAG_IS_AVCI(st->codecpar->codec_tag)) { + ret = ff_generate_avci_extradata(st); + if (ret < 0) + return ret; + } + break; + default: + break; + } + + return 0; +} + int ff_mov_read_stsd_entries(MOVContext *c, AVIOContext *pb, int entries) { AVStream *st; @@ -3105,6 +3126,10 @@ int ff_mov_read_stsd_entries(MOVContext *c, AVIOContext *pb, int entries) } else if (a.size > 0) avio_skip(pb, a.size); + ret = mov_finalize_stsd_entry(c, st); + if (ret < 0) + return ret; + if (sc->extradata && st->codecpar->extradata) { int extra_size = st->codecpar->extradata_size; @@ -5216,14 +5241,6 @@ static int mov_read_trak(MOVContext *c, AVIOContext *pb, MOVAtom atom) #endif } - // done for ai5q, ai52, ai55, ai1q, ai12 and ai15. - if (!st->codecpar->extradata_size && st->codecpar->codec_id == AV_CODEC_ID_H264 && - TAG_IS_AVCI(st->codecpar->codec_tag)) { - ret = ff_generate_avci_extradata(st); - if (ret < 0) - return ret; - } - switch (st->codecpar->codec_id) { case AV_CODEC_ID_H261: case AV_CODEC_ID_H263: