|
|
|
@ -81,6 +81,7 @@ static void read_ttag(AVFormatContext *s, int taglen, const char *key) |
|
|
|
|
char *q, dst[512]; |
|
|
|
|
int len, dstlen = sizeof(dst) - 1; |
|
|
|
|
unsigned genre; |
|
|
|
|
unsigned int (*get)(ByteIOContext*) = get_be16; |
|
|
|
|
|
|
|
|
|
dst[0] = 0; |
|
|
|
|
if (taglen < 1) |
|
|
|
@ -99,11 +100,38 @@ static void read_ttag(AVFormatContext *s, int taglen, const char *key) |
|
|
|
|
*q = 0; |
|
|
|
|
break; |
|
|
|
|
|
|
|
|
|
case 1: /* UTF-16 with BOM */ |
|
|
|
|
taglen -= 2; |
|
|
|
|
switch (get_be16(s->pb)) { |
|
|
|
|
case 0xfffe: |
|
|
|
|
get = get_le16; |
|
|
|
|
case 0xfeff: |
|
|
|
|
break; |
|
|
|
|
default: |
|
|
|
|
av_log(s, AV_LOG_ERROR, "Incorrect BOM value in tag %s.\n", key); |
|
|
|
|
return; |
|
|
|
|
} |
|
|
|
|
// fall-through
|
|
|
|
|
|
|
|
|
|
case 2: /* UTF-16BE without BOM */ |
|
|
|
|
q = dst; |
|
|
|
|
while (taglen > 1 && q - dst < dstlen - 7) { |
|
|
|
|
uint32_t ch; |
|
|
|
|
uint8_t tmp; |
|
|
|
|
|
|
|
|
|
GET_UTF16(ch, ((taglen -= 2) >= 0 ? get(s->pb) : 0), break;) |
|
|
|
|
PUT_UTF8(ch, tmp, *q++ = tmp;) |
|
|
|
|
} |
|
|
|
|
*q = 0; |
|
|
|
|
break; |
|
|
|
|
|
|
|
|
|
case 3: /* UTF-8 */ |
|
|
|
|
len = FFMIN(taglen, dstlen - 1); |
|
|
|
|
get_buffer(s->pb, dst, len); |
|
|
|
|
dst[len] = 0; |
|
|
|
|
break; |
|
|
|
|
default: |
|
|
|
|
av_log(s, AV_LOG_WARNING, "Unknown encoding in tag %s\n.", key); |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
if (!strcmp(key, "genre") |
|
|
|
|