Message ID | f0ecf286-e2e6-d56e-ed22-09295563a64d@free.fr |
---|---|
State | Superseded |
Headers | show |
On Thu, 26 Jan 2017 13:32:08 +0100 Paul Arzelier <paul.arzelier@free.fr> wrote: > From d84648e1990ad3a12462dfb76990dc7036f5f082 Mon Sep 17 00:00:00 2001 > From: Polochon-street <polochonstreet@gmx.fr> > Date: Thu, 26 Jan 2017 13:25:22 +0100 > Subject: [PATCH] Ignore ID3 tags if other tags are present (e.g. vorbis > comments) > Originally-by: Ben Boeckel <mathstuf@gmail.com> > --- > libavformat/utils.c | 17 ++++++++++++++++- > 1 file changed, 16 insertions(+), 1 deletion(-) > Patch looks generally great to me now. > diff --git a/libavformat/utils.c b/libavformat/utils.c > index d5dfca7dec..ce24244135 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; > 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); Strictly speaking, this line is redundant, but it doesn't harm either. If you feel like it you could remove it, but it's not necessary. > + } > + else if (id3_meta) { If you make another patch, you could merge the } with the next line too (I'm not sure, but I think that's preferred coding-style wise). > + int level = AV_LOG_WARNING; > + if (s->error_recognition & AV_EF_COMPLIANT) > + level = AV_LOG_ERROR; > + av_log(s, level, "Discarding ID3 tag because more suitable tags were found.\n"); > + if (s->error_recognition & AV_EF_EXPLODE) > + return AVERROR_INVALIDDATA; > + } > + > if (id3v2_extra_meta) { > if (!strcmp(s->iformat->name, "mp3") || !strcmp(s->iformat->name, "aac") || > !strcmp(s->iformat->name, "tta")) { > @@ -627,6 +641,7 @@ int avformat_open_input(AVFormatContext **ps, const char *filename, > fail: > ff_id3v2_free_extra_meta(&id3v2_extra_meta); > av_dict_free(&tmp); > + av_dict_free(&id3_meta); > if (s->pb && !(s->flags & AVFMT_FLAG_CUSTOM_IO)) > avio_closep(&s->pb); > avformat_free_context(s);
From d84648e1990ad3a12462dfb76990dc7036f5f082 Mon Sep 17 00:00:00 2001 From: Polochon-street <polochonstreet@gmx.fr> Date: Thu, 26 Jan 2017 13:25:22 +0100 Subject: [PATCH] Ignore ID3 tags if other tags are present (e.g. vorbis comments) Originally-by: Ben Boeckel <mathstuf@gmail.com> --- libavformat/utils.c | 17 ++++++++++++++++- 1 file changed, 16 insertions(+), 1 deletion(-) diff --git a/libavformat/utils.c b/libavformat/utils.c index d5dfca7dec..ce24244135 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; 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, "Discarding ID3 tag because more suitable tags were found.\n"); + if (s->error_recognition & AV_EF_EXPLODE) + return AVERROR_INVALIDDATA; + } + if (id3v2_extra_meta) { if (!strcmp(s->iformat->name, "mp3") || !strcmp(s->iformat->name, "aac") || !strcmp(s->iformat->name, "tta")) { @@ -627,6 +641,7 @@ int avformat_open_input(AVFormatContext **ps, const char *filename, fail: ff_id3v2_free_extra_meta(&id3v2_extra_meta); av_dict_free(&tmp); + av_dict_free(&id3_meta); if (s->pb && !(s->flags & AVFMT_FLAG_CUSTOM_IO)) avio_closep(&s->pb); avformat_free_context(s); -- 2.11.0