summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorJames Almer <[email protected]>2024-04-21 12:18:51 -0300
committerJames Almer <[email protected]>2024-04-24 00:11:37 -0300
commit757367e068679e0f2884262ab7c1f53de490e6ad (patch)
treeef18ea49ffa66365509d6f205f71b695e1726625
parentc4e3d6cdb066425a5f5a2e05def9470a47a6082c (diff)
avformat/demux: extract extradata from packets when context update is requested
If the demuxer doesn't set extradata in the stream's codecpar, a need_context_update request will delete the previously extracted extradata in the stream's internal AVCodecContext. As we can't ensure the old extradata is valid for the stream in its post context update request state, try to get extradata from the new packet instead of attempting to preserve the old in some form. Signed-off-by: James Almer <[email protected]>
-rw-r--r--libavformat/demux.c13
1 files changed, 13 insertions, 0 deletions
diff --git a/libavformat/demux.c b/libavformat/demux.c
index abfd5fee7d..ecefe7e0a7 100644
--- a/libavformat/demux.c
+++ b/libavformat/demux.c
@@ -1319,6 +1319,8 @@ fail:
return ret;
}
+static int extract_extradata(FFFormatContext *si, AVStream *st, const AVPacket *pkt);
+
static int read_frame_internal(AVFormatContext *s, AVPacket *pkt)
{
FFFormatContext *const si = ffformatcontext(s);
@@ -1373,6 +1375,16 @@ static int read_frame_internal(AVFormatContext *s, AVPacket *pkt)
return ret;
}
+ if (!sti->avctx->extradata) {
+ sti->extract_extradata.inited = 0;
+
+ ret = extract_extradata(si, st, pkt);
+ if (ret < 0) {
+ av_packet_unref(pkt);
+ return ret;
+ }
+ }
+
sti->codec_desc = avcodec_descriptor_get(sti->avctx->codec_id);
sti->need_context_update = 0;
@@ -2427,6 +2439,7 @@ static int extract_extradata_init(AVStream *st)
if (!ret)
goto finish;
+ av_bsf_free(&sti->extract_extradata.bsf);
ret = av_bsf_alloc(f, &sti->extract_extradata.bsf);
if (ret < 0)
return ret;