diff options
author | James Almer <jamrial@gmail.com> | 2025-08-02 18:03:40 -0300 |
---|---|---|
committer | James Almer <jamrial@gmail.com> | 2025-08-03 16:06:43 +0000 |
commit | 5bd7003e81c30914e8adfe46b3ab85ba99e42d0f (patch) | |
tree | ec5c0fc80c02bb071b60dbd7e61b957bdec97638 | |
parent | 999e3e9bf80a8595f5ff65019001b3a3c0628c79 (diff) | |
download | ffmpeg-5bd7003e81c30914e8adfe46b3ab85ba99e42d0f.tar.gz |
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 <jamrial@gmail.com>
-rw-r--r-- | libavformat/mov.c | 33 |
1 files 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: |