[FFmpeg-devel] [PATCH 3/4] lavf/movenc: Fail when codec tag is invalid for format

James Almer jamrial at gmail.com
Mon Aug 27 23:29:43 EEST 2018


On 8/27/2018 4:57 PM, John Stebbins wrote:
> Fixes ticket #6897
> ---
>  libavformat/movenc.c | 40 +++++++++++++++++++++++++++++-----------
>  1 file changed, 29 insertions(+), 11 deletions(-)
> 
> diff --git a/libavformat/movenc.c b/libavformat/movenc.c
> index 8a3b651514..dd6281d210 100644
> --- a/libavformat/movenc.c
> +++ b/libavformat/movenc.c
> @@ -1589,6 +1589,26 @@ static const AVCodecTag codec_cover_image_tags[] = {
>      { AV_CODEC_ID_NONE, 0 },
>  };
>  
> +static int validate_codec_tag(const AVCodecTag *const *tags,
> +                              unsigned int tag, int codec_id)
> +{
> +    int i;
> +
> +    /**
> +     * Check that tag + id is in the table
> +     */
> +    for (i = 0; tags && tags[i]; i++) {
> +        const AVCodecTag *codec_tags = tags[i];
> +        while (codec_tags->id != AV_CODEC_ID_NONE) {
> +            if (codec_tags->tag == tag && codec_tags->id == codec_id) {

Make both tag checks case insensitive using avpriv_toupper4(), then
return codec_tags->tag instead of 1 if the check succeeds.

> +                return 1;
> +            }
> +            codec_tags++;
> +        }
> +    }
> +    return 0;
> +}
> +
>  static int mov_find_codec_tag(AVFormatContext *s, MOVTrack *track)
>  {
>      int tag;

Take the opportunity to change this, the ones in mov_get_codec_tag() and
in validate_codec_tag() to unsigned int, including the return types.
Codec tags in AVCodecTag are unsigned after all.

> @@ -1596,23 +1616,21 @@ static int mov_find_codec_tag(AVFormatContext *s, MOVTrack *track)
>      if (is_cover_image(track->st))
>          return ff_codec_get_tag(codec_cover_image_tags, track->par->codec_id);
>  
> -    if (track->mode == MODE_MP4 || track->mode == MODE_PSP)
> -        tag = track->par->codec_tag;
> -    else if (track->mode == MODE_ISM)
> -        tag = track->par->codec_tag;
> -    else if (track->mode == MODE_IPOD) {
> +    if (track->mode == MODE_IPOD)
>          if (!av_match_ext(s->url, "m4a") &&
>              !av_match_ext(s->url, "m4v") &&
>              !av_match_ext(s->url, "m4b"))
>              av_log(s, AV_LOG_WARNING, "Warning, extension is not .m4a nor .m4v "
>                     "Quicktime/Ipod might not play the file\n");
> -        tag = track->par->codec_tag;
> -    } else if (track->mode & MODE_3GP)
> -        tag = track->par->codec_tag;
> -    else if (track->mode == MODE_F4V)
> -        tag = track->par->codec_tag;
> -    else
> +
> +    if (track->mode == MODE_MOV)
>          tag = mov_get_codec_tag(s, track);
> +    else
> +        if (!validate_codec_tag(s->oformat->codec_tag, track->par->codec_tag,
> +                                track->par->codec_id))
> +            tag = 0;
> +        else
> +            tag = track->par->codec_tag;

And of course make this simply

tag = validate_codec_tag(...);

Thanks.

>  
>      return tag;
>  }
> 



More information about the ffmpeg-devel mailing list