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

Ben Boeckel mathstuf at gmail.com
Tue Feb 3 02:36:43 CET 2015


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 | 20 ++++++++++++++++++++
 1 file changed, 20 insertions(+)

diff --git a/libavformat/flacdec.c b/libavformat/flacdec.c
index 1a8dc19..076332b 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,19 @@ 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) {
+        int level = AV_LOG_WARNING;
+        if (s->error_recognition & AV_EF_COMPLIANT)
+            level = AV_LOG_ERROR;
+        av_log(s, level, "Spec-compliant FLAC do not support IDv3 tags.\n");
+    }
+
     /* process metadata blocks */
     while (!avio_feof(s->pb) && !metadata_last) {
         avio_read(s->pb, header, 4);
@@ -141,6 +155,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_VERBOSE, "FLAC found with IDv3 and vorbis tags; ignoring IDv3 tags.\n");
+
+                    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");
-- 
2.2.2



More information about the ffmpeg-devel mailing list