diff options
author | Anton Khirnov <wyskas@gmail.com> | 2009-09-23 18:22:00 +0000 |
---|---|---|
committer | Diego Biurrun <diego@biurrun.de> | 2009-09-23 18:22:00 +0000 |
commit | 20c68378807ff0b24897f999445415fae10c430b (patch) | |
tree | f9af069f27fba148297e18726a12dd23e3c97dd0 /libavformat/id3v2.c | |
parent | 9aa1bcce51f023e434046b02ea8bb93afa4ac29c (diff) | |
download | ffmpeg-20c68378807ff0b24897f999445415fae10c430b.tar.gz |
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.c | 28 |
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") |