summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorAndreas Cadhalpun <Andreas.Cadhalpun@googlemail.com>2016-10-17 20:26:51 +0200
committerAndreas Cadhalpun <Andreas.Cadhalpun@googlemail.com>2016-11-17 23:12:43 +0100
commitdc2942bbc889c18dd23acd2202ffb2520fac697a (patch)
tree0169504f6a24e06d2041862df37c2ca43653ce62
parent35db873534a8a573a360a5f12e878f827bc67cc8 (diff)
downloadffmpeg-dc2942bbc889c18dd23acd2202ffb2520fac697a.tar.gz
avformat: close parser if codec changed
The parser depends on the codec and thus must not be used with a different one. If it is, the 'avctx->codec_id == s->parser->codec_ids[0] ...' assert in av_parser_parse2 gets triggered. Reviewed-by: Michael Niedermayer <michael@niedermayer.cc> Signed-off-by: Andreas Cadhalpun <Andreas.Cadhalpun@googlemail.com> (cherry picked from commit f84ae3f04aa074afeaeafe6b478d603ce46df55e) Signed-off-by: Andreas Cadhalpun <Andreas.Cadhalpun@googlemail.com>
-rw-r--r--libavformat/utils.c12
1 files changed, 12 insertions, 0 deletions
diff --git a/libavformat/utils.c b/libavformat/utils.c
index 31572f3807..56646464b6 100644
--- a/libavformat/utils.c
+++ b/libavformat/utils.c
@@ -480,6 +480,12 @@ static int update_stream_avctx(AVFormatContext *s)
if (!st->internal->need_context_update)
continue;
+ /* close parser, because it depends on the codec */
+ if (st->parser && st->internal->avctx->codec_id != st->codecpar->codec_id) {
+ av_parser_close(st->parser);
+ st->parser = NULL;
+ }
+
/* update internal codec context, for the parser */
ret = avcodec_parameters_to_context(st->internal->avctx, st->codecpar);
if (ret < 0)
@@ -1515,6 +1521,12 @@ static int read_frame_internal(AVFormatContext *s, AVPacket *pkt)
st->info->found_decoder = 0;
}
+ /* close parser, because it depends on the codec */
+ if (st->parser && st->internal->avctx->codec_id != st->codecpar->codec_id) {
+ av_parser_close(st->parser);
+ st->parser = NULL;
+ }
+
ret = avcodec_parameters_to_context(st->internal->avctx, st->codecpar);
if (ret < 0)
return ret;