[FFmpeg-devel] [PATCH] avformat: close parser if codec changed

Andreas Cadhalpun andreas.cadhalpun at googlemail.com
Thu Nov 3 02:04:21 EET 2016


On 03.11.2016 00:42, Michael Niedermayer wrote:
> On Wed, Nov 02, 2016 at 10:30:30PM +0100, Andreas Cadhalpun wrote:
>> On 02.11.2016 13:07, Michael Niedermayer wrote:
>>> On Sat, Oct 22, 2016 at 01:16:00AM +0200, Andreas Cadhalpun wrote:
>>>>  utils.c |   12 ++++++++++++
>>>>  1 file changed, 12 insertions(+)
>>>> ffefc22756b774cb7652587207ae66cfbf681be3  0001-avformat-close-parser-if-codec-changed.patch
>>>> From 9de87a4fb2c6c6311a11a2da5de8554a71adfa66 Mon Sep 17 00:00:00 2001
>>>> From: Andreas Cadhalpun <Andreas.Cadhalpun at googlemail.com>
>>>> Date: Mon, 17 Oct 2016 20:26:51 +0200
>>>> Subject: [PATCH] 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.
>>>>
>>>> Signed-off-by: Andreas Cadhalpun <Andreas.Cadhalpun at googlemail.com>
>>>> ---
>>>>  libavformat/utils.c | 12 ++++++++++++
>>>>  1 file changed, 12 insertions(+)
>>>>
>>>> diff --git a/libavformat/utils.c b/libavformat/utils.c
>>>> index 70dbfa1..a8a78ed 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;
>>>> +            }
>>>> +
>>>
>>> what if the codec id differs but both are supported by the parser ?
>>> AVCodecParser has a list of 5 codec ids ?
>>>
>>> I didnt find a testcase where this makes a difference, just wondering
>>
>> I think the parser should be re-initialized in that case, too.
> 
> doesnt this lead to data loss (parser internal buffers being lost at
> a transition between 2 types)?

Yes, but it's not clear that the parser internal state is still correct
after a change of the codec id.

> both types might be handled by the same decoder so nothing special
> might be needed "downstream"

It might work for some decoders and might not work for others.
It's hard to tell without samples.

Best regards,
Andreas



More information about the ffmpeg-devel mailing list