On Thu, 5 Feb 2015 22:57:07 -0500 Ben Boeckel <maths...@gmail.com> wrote:
> FLAC doesn't really support ID3 tags, so warn if they are found at all. > If vorbis tags are found, toss out duplicate ID3 tags. > > Fixes #3799. > > Signed-off-by: Ben Boeckel <maths...@gmail.com> > --- > libavformat/flacdec.c | 27 +++++++++++++++++++++++++++ > 1 file changed, 27 insertions(+) > > diff --git a/libavformat/flacdec.c b/libavformat/flacdec.c > index 1a8dc19..fdb8e46 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? ID3 parsing is done > + * all the way out in avformat_open_input. */ > + has_idv3 = 1; Not that I know of... the way libavformat does this is a travesty though. > + } > + > + 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 ID3 tags.\n"); > + } > + > /* process metadata blocks */ > while (!avio_feof(s->pb) && !metadata_last) { > avio_read(s->pb, header, 4); > @@ -139,8 +153,16 @@ static int flac_read_header(AVFormatContext *s) > } > /* process supported blocks other than STREAMINFO */ > if (metadata_type == FLAC_METADATA_TYPE_VORBIS_COMMENT) { > + AVDictionary *other_meta = NULL; > AVDictionaryEntry *chmask; > > + if (has_idv3) { > + av_log(s, AV_LOG_VERBOSE, "FLAC found with ID3 and > vorbis tags; ignoring ID3 tags also provided by vorbis.\n"); > + > + av_dict_copy(&other_meta, s->metadata, 0); > + av_dict_free(&s->metadata); Just swap these pointers? > + } > + > 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"); > @@ -148,6 +170,11 @@ static int flac_read_header(AVFormatContext *s) > s->event_flags |= AVFMT_EVENT_FLAG_METADATA_UPDATED; > } > > + if (other_meta) { > + av_dict_copy(&s->metadata, other_meta, > AV_DICT_DONT_OVERWRITE); > + av_dict_free(&other_meta); > + } > + > /* parse the channels mask if present */ > chmask = av_dict_get(s->metadata, > "WAVEFORMATEXTENSIBLE_CHANNEL_MASK", NULL, 0); > if (chmask) { _______________________________________________ ffmpeg-devel mailing list ffmpeg-devel@ffmpeg.org http://ffmpeg.org/mailman/listinfo/ffmpeg-devel