[FFmpeg-devel] [PATCH] Ignore duplicate ID3 tags if vorbis tags exist

wm4 nfxjfg at googlemail.com
Thu Jan 26 14:10:47 EET 2017


On Thu, 26 Jan 2017 12:55:15 +0100
Paul Arzelier <paul.arzelier at free.fr> wrote:

> From a3dc6068fb06722aacea56365f948afdb8df841f Mon Sep 17 00:00:00 2001
> From: Paul Arzelier <paul.arzelier at free.fr>
> Date: Thu, 26 Jan 2017 12:51:33 +0100
> Subject: [PATCH] Ignore ID3 tags if other tags are present (e.g. vorbis
>  comments)
> Originally-by: Ben Boeckel <mathstuf at gmail.com>
> ---
>  libavformat/utils.c | 16 +++++++++++++++-
>  1 file changed, 15 insertions(+), 1 deletion(-)
> 
> diff --git a/libavformat/utils.c b/libavformat/utils.c
> index d5dfca7dec..bbe5c1ff1c 100644
> --- a/libavformat/utils.c
> +++ b/libavformat/utils.c
> @@ -513,6 +513,7 @@ int avformat_open_input(AVFormatContext **ps, const char *filename,
>      AVFormatContext *s = *ps;
>      int i, ret = 0;
>      AVDictionary *tmp = NULL;
> +    AVDictionary *id3_meta = NULL;

Looks like this would leak on "goto fail;".

>      ID3v2ExtraMeta *id3v2_extra_meta = NULL;
>  
>      if (!s && !(s = avformat_alloc_context()))
> @@ -588,12 +589,25 @@ int avformat_open_input(AVFormatContext **ps, const char *filename,
>  
>      /* e.g. AVFMT_NOFILE formats will not have a AVIOContext */
>      if (s->pb)
> -        ff_id3v2_read(s, ID3v2_DEFAULT_MAGIC, &id3v2_extra_meta, 0);
> +        ff_id3v2_read_dict(s->pb, &id3_meta, ID3v2_DEFAULT_MAGIC, &id3v2_extra_meta);
>  
>      if (!(s->flags&AVFMT_FLAG_PRIV_OPT) && s->iformat->read_header)
>          if ((ret = s->iformat->read_header(s)) < 0)
>              goto fail;
>  
> +    if (!s->metadata) {
> +        av_dict_copy(&s->metadata, id3_meta, AV_DICT_DONT_OVERWRITE);
> +        av_dict_free(&id3_meta);
> +    }
> +    else if (id3_meta) {
> +        int level = AV_LOG_WARNING;
> +        if (s->error_recognition & AV_EF_COMPLIANT)
> +            level = AV_LOG_ERROR;
> +        av_log(s, level, "Spec-compliant flac files do not support ID3 tags.\n");

Seems ok, but this message will be printed for non-flac formats too,
which is weird at best. Maybe something along the id3 tag being
discarded or so?

> +        if (s->error_recognition & AV_EF_EXPLODE)
> +            return AVERROR_INVALIDDATA;

Not sure about this one, but I'd be fine with it personally.

> +    }
> +
>      if (id3v2_extra_meta) {
>          if (!strcmp(s->iformat->name, "mp3") || !strcmp(s->iformat->name, "aac") ||
>              !strcmp(s->iformat->name, "tta")) {



More information about the ffmpeg-devel mailing list