diff options
author | Anton Khirnov <anton@khirnov.net> | 2011-03-15 10:14:16 +0100 |
---|---|---|
committer | Justin Ruggles <justin.ruggles@gmail.com> | 2011-03-15 13:57:52 -0400 |
commit | 56e2ac6b45ada4f9c107fe7b25f0706ec2e4dc11 (patch) | |
tree | f1ea718dac884b5727fc2019df41a323f698c2a2 | |
parent | aaff3b312ed0a67750aa0a3a3300a3b69bb87150 (diff) | |
download | ffmpeg-56e2ac6b45ada4f9c107fe7b25f0706ec2e4dc11.tar.gz |
id3v2: merge TYER/TDAT/TIME to date tag
-rw-r--r-- | libavformat/id3v2.c | 47 |
1 files changed, 47 insertions, 0 deletions
diff --git a/libavformat/id3v2.c b/libavformat/id3v2.c index 76c7124525..be88d10caa 100644 --- a/libavformat/id3v2.c +++ b/libavformat/id3v2.c @@ -136,6 +136,52 @@ static void read_ttag(AVFormatContext *s, AVIOContext *pb, int taglen, const cha av_metadata_set2(&s->metadata, key, val, AV_METADATA_DONT_OVERWRITE); } +static int is_number(const char *str) +{ + while (*str >= '0' && *str <= '9') str++; + return !*str; +} + +static AVMetadataTag* get_date_tag(AVMetadata *m, const char *tag) +{ + AVMetadataTag *t; + if ((t = av_metadata_get(m, tag, NULL, AV_METADATA_MATCH_CASE)) && + strlen(t->value) == 4 && is_number(t->value)) + return t; + return NULL; +} + +static void merge_date(AVMetadata **m) +{ + AVMetadataTag *t; + char date[17] = {0}; // YYYY-MM-DD hh:mm + + if (!(t = get_date_tag(*m, "TYER")) && + !(t = get_date_tag(*m, "TYE"))) + return; + av_strlcpy(date, t->value, 5); + av_metadata_set2(m, "TYER", NULL, 0); + av_metadata_set2(m, "TYE", NULL, 0); + + if (!(t = get_date_tag(*m, "TDAT")) && + !(t = get_date_tag(*m, "TDA"))) + goto finish; + snprintf(date + 4, sizeof(date) - 4, "-%.2s-%.2s", t->value + 2, t->value); + av_metadata_set2(m, "TDAT", NULL, 0); + av_metadata_set2(m, "TDA", NULL, 0); + + if (!(t = get_date_tag(*m, "TIME")) && + !(t = get_date_tag(*m, "TIM"))) + goto finish; + snprintf(date + 10, sizeof(date) - 10, " %.2s:%.2s", t->value, t->value + 2); + av_metadata_set2(m, "TIME", NULL, 0); + av_metadata_set2(m, "TIM", NULL, 0); + +finish: + if (date[0]) + av_metadata_set2(m, "date", date, 0); +} + static void ff_id3v2_parse(AVFormatContext *s, int len, uint8_t version, uint8_t flags) { int isv34, tlen, unsync; @@ -277,6 +323,7 @@ void ff_id3v2_read(AVFormatContext *s, const char *magic) ff_metadata_conv(&s->metadata, NULL, ff_id3v2_34_metadata_conv); ff_metadata_conv(&s->metadata, NULL, ff_id3v2_2_metadata_conv); ff_metadata_conv(&s->metadata, NULL, ff_id3v2_4_metadata_conv); + merge_date(&s->metadata); } const AVMetadataConv ff_id3v2_34_metadata_conv[] = { |