From ed7694d8cf4633da444237f4df7efc48936419d2 Mon Sep 17 00:00:00 2001 From: Anton Khirnov Date: Tue, 16 Feb 2010 16:32:25 +0000 Subject: [PATCH] Set lavf identification string globally in av_write_header(), rather than inside the muxers. Remove special handling of "encoder" tags from AVI and MP3 muxers. Patch by Anton Khirnov . Originally committed as revision 21850 to svn://svn.ffmpeg.org/ffmpeg/trunk --- libavformat/avi.c | 2 +- libavformat/avienc.c | 2 -- libavformat/metadata.c | 2 +- libavformat/metadata.h | 3 +++ libavformat/mp3.c | 7 +------ libavformat/utils.c | 14 ++++++++++++++ 6 files changed, 20 insertions(+), 10 deletions(-) diff --git a/libavformat/avi.c b/libavformat/avi.c index a8980eb09c..705ad03ab0 100644 --- a/libavformat/avi.c +++ b/libavformat/avi.c @@ -40,6 +40,6 @@ const AVMetadataConv ff_avi_metadata_conv[] = { const char ff_avi_tags[][5] = { "IARL", "IART", "ICMS", "ICMT", "ICOP", "ICRD", "ICRP", "IDIM", "IDPI", "IENG", "IGNR", "IKEY", "ILGT", "ILNG", "IMED", "INAM", "IPLT", "IPRD", - "IPRT", "ISBJ",/*"ISFT"*/"ISHP", "ISRC", "ISRF", "ITCH", + "IPRT", "ISBJ", "ISFT", "ISHP", "ISRC", "ISRF", "ITCH", {0} }; diff --git a/libavformat/avienc.c b/libavformat/avienc.c index 3809b4d64b..50419960a3 100644 --- a/libavformat/avienc.c +++ b/libavformat/avienc.c @@ -376,8 +376,6 @@ static int avi_write_header(AVFormatContext *s) if ((t = av_metadata_get(s->metadata, ff_avi_tags[i], NULL, AV_METADATA_MATCH_CASE))) avi_write_info_tag(s->pb, t->key, t->value); } - if(!(s->streams[0]->codec->flags & CODEC_FLAG_BITEXACT)) - avi_write_info_tag(pb, "ISFT", LIBAVFORMAT_IDENT); ff_end_tag(pb, list2); /* some padding for easier tag editing */ diff --git a/libavformat/metadata.c b/libavformat/metadata.c index 080ebcde88..9ff7c48a8a 100644 --- a/libavformat/metadata.c +++ b/libavformat/metadata.c @@ -105,7 +105,7 @@ void av_metadata_free(AVMetadata **pm) av_freep(pm); } -static void metadata_conv(AVMetadata **pm, const AVMetadataConv *d_conv, +void metadata_conv(AVMetadata **pm, const AVMetadataConv *d_conv, const AVMetadataConv *s_conv) { /* TODO: use binary search to look up the two conversion tables diff --git a/libavformat/metadata.h b/libavformat/metadata.h index 9ec2265a41..21724e9774 100644 --- a/libavformat/metadata.h +++ b/libavformat/metadata.h @@ -45,4 +45,7 @@ void ff_metadata_demux_compat(AVFormatContext *s); void ff_metadata_mux_compat(AVFormatContext *s); #endif +void metadata_conv(AVMetadata **pm, const AVMetadataConv *d_conv, + const AVMetadataConv *s_conv); + #endif /* AVFORMAT_METADATA_H */ diff --git a/libavformat/mp3.c b/libavformat/mp3.c index e2f230acad..4579773369 100644 --- a/libavformat/mp3.c +++ b/libavformat/mp3.c @@ -313,7 +313,7 @@ static int mp3_write_header(struct AVFormatContext *s) while ((t = av_metadata_get(s->metadata, "", t, AV_METADATA_IGNORE_SUFFIX))) { uint32_t tag = 0; - if (t->key[0] == 'T' && strcmp(t->key, "TSSE")) { + if (t->key[0] == 'T' && strlen(t->key) == 4) { int i; for (i = 0; *ff_id3v2_tags[i]; i++) if (AV_RB32(t->key) == AV_RB32(ff_id3v2_tags[i])) { @@ -338,11 +338,6 @@ static int mp3_write_header(struct AVFormatContext *s) av_free(buf); } } - if(!(s->streams[0]->codec->flags & CODEC_FLAG_BITEXACT)) { - totlen += strlen(LIBAVFORMAT_IDENT) + ID3v2_HEADER_SIZE + 2; - id3v2_put_ttag(s, LIBAVFORMAT_IDENT, strlen(LIBAVFORMAT_IDENT) + 1, - MKBETAG('T', 'S', 'S', 'E')); - } cur_pos = url_ftell(s->pb); url_fseek(s->pb, size_pos, SEEK_SET); diff --git a/libavformat/utils.c b/libavformat/utils.c index 4829446312..e01c26712d 100644 --- a/libavformat/utils.c +++ b/libavformat/utils.c @@ -2583,6 +2583,20 @@ int av_write_header(AVFormatContext *s) ff_metadata_mux_compat(s); #endif + /* set muxer identification string */ + if (!(s->streams[0]->codec->flags & CODEC_FLAG_BITEXACT)) { + AVMetadata *m; + AVMetadataTag *t; + + if (!(m = av_mallocz(sizeof(AVMetadata)))) + return AVERROR(ENOMEM); + av_metadata_set2(&m, "encoder", LIBAVFORMAT_IDENT, 0); + metadata_conv(&m, s->oformat->metadata_conv, NULL); + if ((t = av_metadata_get(m, "", NULL, AV_METADATA_IGNORE_SUFFIX))) + av_metadata_set2(&s->metadata, t->key, t->value, 0); + av_metadata_free(&m); + } + if(s->oformat->write_header){ ret = s->oformat->write_header(s); if (ret < 0)