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

Andreas Cadhalpun andreas.cadhalpun at googlemail.com
Wed Nov 23 00:18:56 EET 2016


On 04.11.2016 22:28, 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;
> +
> +    return ret;
>  }
>  
>  static int amf_get_string(AVIOContext *ioc, char *buffer, int buffsize)
> 

Ping. I intend to apply this in a few days.

Best regards,
Andreas


More information about the ffmpeg-devel mailing list