id3v2: merge TYER/TDAT/TIME to date tag

This commit is contained in:
Anton Khirnov 2011-03-15 10:14:16 +01:00 committed by Justin Ruggles
parent aaff3b312e
commit 56e2ac6b45
1 changed files with 47 additions and 0 deletions

View File

@ -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[] = {