summaryrefslogtreecommitdiff
path: root/libavformat/id3v2.c
diff options
context:
space:
mode:
authorAnton Khirnov <wyskas@gmail.com>2009-09-23 18:22:00 +0000
committerDiego Biurrun <diego@biurrun.de>2009-09-23 18:22:00 +0000
commit20c68378807ff0b24897f999445415fae10c430b (patch)
treef9af069f27fba148297e18726a12dd23e3c97dd0 /libavformat/id3v2.c
parent9aa1bcce51f023e434046b02ea8bb93afa4ac29c (diff)
id3v2: Add support for UTF-16 encoding.
patch by Anton Khirnov, wyskas gmail com Originally committed as revision 20006 to svn://svn.ffmpeg.org/ffmpeg/trunk
Diffstat (limited to 'libavformat/id3v2.c')
-rw-r--r--libavformat/id3v2.c28
1 files changed, 28 insertions, 0 deletions
diff --git a/libavformat/id3v2.c b/libavformat/id3v2.c
index 6b1c4606e9..dedc0450b3 100644
--- a/libavformat/id3v2.c
+++ b/libavformat/id3v2.c
@@ -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")