mp3enc: write ISO8859-1 instead of UTF-16 when possible
authorAnton Khirnov <anton@khirnov.net>
Sat, 5 Feb 2011 21:20:13 +0000 (22:20 +0100)
committerRonald S. Bultje <rsbultje@gmail.com>
Sun, 6 Feb 2011 01:13:48 +0000 (20:13 -0500)
Signed-off-by: Ronald S. Bultje <rsbultje@gmail.com>
libavformat/mp3enc.c

index b2c0a7e..5921ded 100644 (file)
@@ -77,6 +77,12 @@ static void id3v2_put_size(AVFormatContext *s, int size)
     put_byte(s->pb, size       & 0x7f);
 }
 
+static int string_is_ascii(const uint8_t *str)
+{
+    while (*str && *str < 128) str++;
+    return !*str;
+}
+
 /**
  * Write a text frame with one (normal frames) or two (TXXX frames) strings
  * according to encoding (only UTF-8 or UTF-16+BOM supported).
@@ -92,6 +98,12 @@ static int id3v2_put_ttag(AVFormatContext *s, const char *str1, const char *str2
     if (url_open_dyn_buf(&dyn_buf) < 0)
         return AVERROR(ENOMEM);
 
+    /* check if the strings are ASCII-only and use UTF16 only if
+     * they're not */
+    if (enc == ID3v2_ENCODING_UTF16BOM && string_is_ascii(str1) &&
+        (!str2 || string_is_ascii(str2)))
+        enc = ID3v2_ENCODING_ISO8859;
+
     put_byte(dyn_buf, enc);
     if (enc == ID3v2_ENCODING_UTF16BOM) {
         put_le16(dyn_buf, 0xFEFF);      /* BOM */