[FFmpeg-devel] [PATCH] flvdec: set need_context_update when changing codec id

Andreas Cadhalpun andreas.cadhalpun at googlemail.com
Thu Nov 24 02:37:17 EET 2016


On 23.11.2016 03:26, Michael Niedermayer wrote:
> On Fri, Nov 04, 2016 at 10:28:20PM +0100, Andreas Cadhalpun wrote:
>> Otherwise the codec context and codecpar might disagree on the codec id,
>> triggering asserts in av_parser_parse2.
>>
>> Signed-off-by: Andreas Cadhalpun <Andreas.Cadhalpun at googlemail.com>
>> ---
>>  libavformat/flvdec.c | 16 ++++++++++++----
>>  1 file changed, 12 insertions(+), 4 deletions(-)
>>
>> diff --git a/libavformat/flvdec.c b/libavformat/flvdec.c
>> index e53c345..4ba7fc8 100644
>> --- a/libavformat/flvdec.c
>> +++ b/libavformat/flvdec.c
>> @@ -289,7 +289,9 @@ static int flv_same_video_codec(AVCodecParameters *vpar, int flags)
>>  static int flv_set_video_codec(AVFormatContext *s, AVStream *vstream,
>>                                 int flv_codecid, int read)
>>  {
>> +    int ret = 0;
>>      AVCodecParameters *par = vstream->codecpar;
>> +    enum AVCodecID old_codec_id = vstream->codecpar->codec_id;
>>      switch (flv_codecid) {
>>      case FLV_CODECID_H263:
>>          par->codec_id = AV_CODEC_ID_FLV1;
>> @@ -317,20 +319,26 @@ static int flv_set_video_codec(AVFormatContext *s, AVStream *vstream,
>>              else
>>                  avio_skip(s->pb, 1);
>>          }
>> -        return 1;     // 1 byte body size adjustment for flv_read_packet()
>> +        ret = 1;     // 1 byte body size adjustment for flv_read_packet()
>> +        break;
>>      case FLV_CODECID_H264:
>>          par->codec_id = AV_CODEC_ID_H264;
>>          vstream->need_parsing = AVSTREAM_PARSE_HEADERS;
>> -        return 3;     // not 4, reading packet type will consume one byte
>> +        ret = 3;     // not 4, reading packet type will consume one byte
>> +        break;
>>      case FLV_CODECID_MPEG4:
>>          par->codec_id = AV_CODEC_ID_MPEG4;
>> -        return 3;
>> +        ret = 3;
>> +        break;
>>      default:
>>          avpriv_request_sample(s, "Video codec (%x)", flv_codecid);
>>          par->codec_tag = flv_codecid;
>>      }
>>  
>> -    return 0;
>> +    if (par->codec_id != old_codec_id)
>> +        vstream->internal->need_context_update = 1;
> 
> If this occurs only for fuzzed samples then rejecting the change
> with a request for a sample seems better
>
> changing teh codec_id midstream like this could, seems problematic
> changing at at header time might be ok if that works better than not
> changing it for some real sample

This happens for almost every file, because at the beginning the codec_id
is AV_CODEC_ID_NONE. However, usually need_context_update is already
set from avformat_new_stream, so a change can be rejected, if this
is not the case. Patch doing that attached.

Best regards,
Andreas

-------------- next part --------------
A non-text attachment was scrubbed...
Name: 0001-flvdec-require-need_context_update-when-changing-cod.patch
Type: text/x-diff
Size: 3537 bytes
Desc: not available
URL: <http://ffmpeg.org/pipermail/ffmpeg-devel/attachments/20161124/43979d0f/attachment.patch>


More information about the ffmpeg-devel mailing list