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

Michael Niedermayer michael at niedermayer.cc
Wed Nov 23 04:26:56 EET 2016


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

but maybe iam missing something

[...]
-- 
Michael     GnuPG fingerprint: 9FF2128B147EF6730BADF133611EC787040B0FAB

I am the wisest man alive, for I know one thing, and that is that I know
nothing. -- Socrates
-------------- next part --------------
A non-text attachment was scrubbed...
Name: signature.asc
Type: application/pgp-signature
Size: 181 bytes
Desc: Digital signature
URL: <http://ffmpeg.org/pipermail/ffmpeg-devel/attachments/20161123/69490f7f/attachment.sig>


More information about the ffmpeg-devel mailing list