[FFmpeg-devel] [PATCH] flac: ignore IDv3 tags if vorbis tags exist

James Almer jamrial at gmail.com
Mon Feb 2 02:10:47 CET 2015


On 01/02/15 10:00 PM, Ben Boeckel wrote:
> FLAC doesn't really support IDv3 tags, so warn if they are found at all.
> If vorbis tags are found, toss out the IDv3 tags. They are kept if
> vorbis tags aren't found to at least have something there.
> 
> Fixes #3799.
> 
> Signed-off-by: Ben Boeckel <mathstuf at gmail.com>
> ---
>  libavformat/flacdec.c | 17 +++++++++++++++++
>  1 file changed, 17 insertions(+)
> 
> diff --git a/libavformat/flacdec.c b/libavformat/flacdec.c
> index 1a8dc19..be637e3 100644
> --- a/libavformat/flacdec.c
> +++ b/libavformat/flacdec.c
> @@ -33,6 +33,7 @@ static int flac_read_header(AVFormatContext *s)
>      int ret, metadata_last=0, metadata_type, metadata_size, found_streaminfo=0;
>      uint8_t header[4];
>      uint8_t *buffer=NULL;
> +    int has_idv3 = 0;
>      AVStream *st = avformat_new_stream(s, NULL);
>      if (!st)
>          return AVERROR(ENOMEM);
> @@ -47,6 +48,16 @@ static int flac_read_header(AVFormatContext *s)
>          return 0;
>      }
>  
> +    if (av_dict_count(s->metadata)) {
> +        /* XXX: Is there a better way to parse this out? IDv3 parsing is done
> +         * all the way out in avformat_open_input. */
> +        has_idv3 = 1;
> +    }
> +
> +    if (has_idv3) {
> +        av_log(s, AV_LOG_WARNING, "FLAC does not support IDv3 tags.\n");
> +    }

You could check for s->error_recognition & AV_EF_COMPLIANT and abort if true instead of just warning.
And the message could be more verbose, mentioning the file does not follow the spec and such.

> +
>      /* process metadata blocks */
>      while (!avio_feof(s->pb) && !metadata_last) {
>          avio_read(s->pb, header, 4);
> @@ -141,6 +152,12 @@ static int flac_read_header(AVFormatContext *s)
>              if (metadata_type == FLAC_METADATA_TYPE_VORBIS_COMMENT) {
>                  AVDictionaryEntry *chmask;
>  
> +                if (has_idv3) {
> +                    av_log(s, AV_LOG_WARNING, "FLAC found with IDv3 and OGG tags; ignoring IDv3 tags.\n");

AV_LOG_VERBOSE is probably better here.

> +
> +                    av_dict_free(&s->metadata);
> +                }
> +
>                  ret = ff_vorbis_comment(s, &s->metadata, buffer, metadata_size, 1);
>                  if (ret < 0) {
>                      av_log(s, AV_LOG_WARNING, "error parsing VorbisComment metadata\n");
> 



More information about the ffmpeg-devel mailing list