Patch by Anton Khirnov <wyskas gmail com>.
Originally committed as revision 21850 to svn://svn.ffmpeg.org/ffmpeg/trunk
| ... | ... |
@@ -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) |