Browse code

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 <wyskas gmail com>.

Originally committed as revision 21850 to svn://svn.ffmpeg.org/ffmpeg/trunk

Anton Khirnov authored on 2010/02/17 01:32:25
Showing 6 changed files
... ...
@@ -40,6 +40,6 @@ const AVMetadataConv ff_avi_metadata_conv[] = {
40 40
 const char ff_avi_tags[][5] = {
41 41
     "IARL", "IART", "ICMS", "ICMT", "ICOP", "ICRD", "ICRP", "IDIM", "IDPI",
42 42
     "IENG", "IGNR", "IKEY", "ILGT", "ILNG", "IMED", "INAM", "IPLT", "IPRD",
43
-    "IPRT", "ISBJ",/*"ISFT"*/"ISHP", "ISRC", "ISRF", "ITCH",
43
+    "IPRT", "ISBJ", "ISFT", "ISHP", "ISRC", "ISRF", "ITCH",
44 44
     {0}
45 45
 };
... ...
@@ -376,8 +376,6 @@ static int avi_write_header(AVFormatContext *s)
376 376
         if ((t = av_metadata_get(s->metadata, ff_avi_tags[i], NULL, AV_METADATA_MATCH_CASE)))
377 377
             avi_write_info_tag(s->pb, t->key, t->value);
378 378
     }
379
-    if(!(s->streams[0]->codec->flags & CODEC_FLAG_BITEXACT))
380
-        avi_write_info_tag(pb, "ISFT", LIBAVFORMAT_IDENT);
381 379
     ff_end_tag(pb, list2);
382 380
 
383 381
     /* some padding for easier tag editing */
... ...
@@ -105,7 +105,7 @@ void av_metadata_free(AVMetadata **pm)
105 105
     av_freep(pm);
106 106
 }
107 107
 
108
-static void metadata_conv(AVMetadata **pm, const AVMetadataConv *d_conv,
108
+void metadata_conv(AVMetadata **pm, const AVMetadataConv *d_conv,
109 109
                                            const AVMetadataConv *s_conv)
110 110
 {
111 111
     /* TODO: use binary search to look up the two conversion tables
... ...
@@ -45,4 +45,7 @@ void ff_metadata_demux_compat(AVFormatContext *s);
45 45
 void ff_metadata_mux_compat(AVFormatContext *s);
46 46
 #endif
47 47
 
48
+void metadata_conv(AVMetadata **pm, const AVMetadataConv *d_conv,
49
+                                    const AVMetadataConv *s_conv);
50
+
48 51
 #endif /* AVFORMAT_METADATA_H */
... ...
@@ -313,7 +313,7 @@ static int mp3_write_header(struct AVFormatContext *s)
313 313
     while ((t = av_metadata_get(s->metadata, "", t, AV_METADATA_IGNORE_SUFFIX))) {
314 314
         uint32_t tag = 0;
315 315
 
316
-        if (t->key[0] == 'T' && strcmp(t->key, "TSSE")) {
316
+        if (t->key[0] == 'T' && strlen(t->key) == 4) {
317 317
             int i;
318 318
             for (i = 0; *ff_id3v2_tags[i]; i++)
319 319
                 if (AV_RB32(t->key) == AV_RB32(ff_id3v2_tags[i])) {
... ...
@@ -338,11 +338,6 @@ static int mp3_write_header(struct AVFormatContext *s)
338 338
             av_free(buf);
339 339
         }
340 340
     }
341
-    if(!(s->streams[0]->codec->flags & CODEC_FLAG_BITEXACT)) {
342
-        totlen += strlen(LIBAVFORMAT_IDENT) + ID3v2_HEADER_SIZE + 2;
343
-        id3v2_put_ttag(s, LIBAVFORMAT_IDENT, strlen(LIBAVFORMAT_IDENT) + 1,
344
-                       MKBETAG('T', 'S', 'S', 'E'));
345
-    }
346 341
 
347 342
     cur_pos = url_ftell(s->pb);
348 343
     url_fseek(s->pb, size_pos, SEEK_SET);
... ...
@@ -2583,6 +2583,20 @@ int av_write_header(AVFormatContext *s)
2583 2583
     ff_metadata_mux_compat(s);
2584 2584
 #endif
2585 2585
 
2586
+    /* set muxer identification string */
2587
+    if (!(s->streams[0]->codec->flags & CODEC_FLAG_BITEXACT)) {
2588
+        AVMetadata *m;
2589
+        AVMetadataTag *t;
2590
+
2591
+        if (!(m = av_mallocz(sizeof(AVMetadata))))
2592
+            return AVERROR(ENOMEM);
2593
+        av_metadata_set2(&m, "encoder", LIBAVFORMAT_IDENT, 0);
2594
+        metadata_conv(&m, s->oformat->metadata_conv, NULL);
2595
+        if ((t = av_metadata_get(m, "", NULL, AV_METADATA_IGNORE_SUFFIX)))
2596
+            av_metadata_set2(&s->metadata, t->key, t->value, 0);
2597
+        av_metadata_free(&m);
2598
+    }
2599
+
2586 2600
     if(s->oformat->write_header){
2587 2601
         ret = s->oformat->write_header(s);
2588 2602
         if (ret < 0)