|
|
|
@ -399,6 +399,45 @@ error: |
|
|
|
|
av_free(key); |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
* Parse a comment tag. |
|
|
|
|
*/ |
|
|
|
|
static void read_comment(AVFormatContext *s, AVIOContext *pb, int taglen, |
|
|
|
|
AVDictionary **metadata) |
|
|
|
|
{ |
|
|
|
|
const char *key = "comment"; |
|
|
|
|
uint8_t *dst; |
|
|
|
|
int encoding, dict_flags = AV_DICT_DONT_OVERWRITE | AV_DICT_DONT_STRDUP_VAL; |
|
|
|
|
int language; |
|
|
|
|
|
|
|
|
|
if (taglen < 4) |
|
|
|
|
return; |
|
|
|
|
|
|
|
|
|
encoding = avio_r8(pb); |
|
|
|
|
language = avio_rl24(pb); |
|
|
|
|
taglen -= 4; |
|
|
|
|
|
|
|
|
|
if (decode_str(s, pb, encoding, &dst, &taglen) < 0) { |
|
|
|
|
av_log(s, AV_LOG_ERROR, "Error reading comment frame, skipped\n"); |
|
|
|
|
return; |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
if (dst && dst[0]) { |
|
|
|
|
key = (const char *) dst; |
|
|
|
|
dict_flags |= AV_DICT_DONT_STRDUP_KEY; |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
if (decode_str(s, pb, encoding, &dst, &taglen) < 0) { |
|
|
|
|
av_log(s, AV_LOG_ERROR, "Error reading comment frame, skipped\n"); |
|
|
|
|
if (dict_flags & AV_DICT_DONT_STRDUP_KEY) |
|
|
|
|
av_freep((void*)&key); |
|
|
|
|
return; |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
if (dst) |
|
|
|
|
av_dict_set(metadata, key, (const char *) dst, dict_flags); |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
* Parse GEOB tag into a ID3v2ExtraMetaGEOB struct. |
|
|
|
|
*/ |
|
|
|
@ -908,6 +947,7 @@ static void id3v2_parse(AVIOContext *pb, AVDictionary **metadata, |
|
|
|
|
/* check for text tag or supported special meta tag */ |
|
|
|
|
} else if (tag[0] == 'T' || |
|
|
|
|
!memcmp(tag, "USLT", 4) || |
|
|
|
|
!memcmp(tag, "COMM", 4) || |
|
|
|
|
(extra_meta && |
|
|
|
|
(extra_func = get_extra_meta_func(tag, isv34)))) { |
|
|
|
|
pbx = pb; |
|
|
|
@ -975,6 +1015,8 @@ static void id3v2_parse(AVIOContext *pb, AVDictionary **metadata, |
|
|
|
|
read_ttag(s, pbx, tlen, metadata, tag); |
|
|
|
|
else if (!memcmp(tag, "USLT", 4)) |
|
|
|
|
read_uslt(s, pbx, tlen, metadata); |
|
|
|
|
else if (!memcmp(tag, "COMM", 4)) |
|
|
|
|
read_comment(s, pbx, tlen, metadata); |
|
|
|
|
else |
|
|
|
|
/* parse special meta tag */ |
|
|
|
|
extra_func->read(s, pbx, tlen, tag, extra_meta, isv34); |
|
|
|
|