[FFmpeg-devel] [PATCH] avformat/id3v2enc: use UTF-16 in id3v2.3 APIC frame only if non-ASCII

Mark Harris mark.hsj at gmail.com
Sun Aug 11 02:03:11 CEST 2013

This makes the encoding of picture descriptions consistent with the
encoding of other text id3 tags and works better with iTunes, which
does not display pictures with some UTF-16 picture descriptions
(including a UTF-16 empty string, i.e. BOM + terminator).  It also
saves a few bytes.

 ffmpeg -f lavfi -i sine=b=4 -f lavfi -i smptebars -map 0:a -map 1:v \
   -codec:a libmp3lame -codec:v mjpeg -id3v2_version 3 \
   -metadata:s:v comment="Cover (front)" -t 3 -y out.mp3

This example does not set a picture description (-metadata:s:v title=)
so an empty string is written in the id3v2.3 APIC frame.  Without this
patch, UTF-16 is used and the cover art does not display in iTunes.
With the patch the cover art is displayed.  (Note that iTunes does not
display or have a way to set picture descriptions, only the picture
itself, but nevertheless has trouble skipping some UTF-16 descriptions.)
 libavformat/id3v2enc.c | 4 ++++
 1 file changed, 4 insertions(+)

diff --git a/libavformat/id3v2enc.c b/libavformat/id3v2enc.c
index f7c37eb..6052244 100644
--- a/libavformat/id3v2enc.c
+++ b/libavformat/id3v2enc.c
@@ -295,6 +295,10 @@ int ff_id3v2_write_apic(AVFormatContext *s, ID3v2EncContext *id3, AVPacket *pkt)
     if ((e = av_dict_get(st->metadata, "title", NULL, 0)))
         desc = e->value;
+    /* use UTF16 only for non-ASCII strings */
+    if (enc == ID3v2_ENCODING_UTF16BOM && string_is_ascii(desc))
+        enc = ID3v2_ENCODING_ISO8859;
     /* start writing */
     if (avio_open_dyn_buf(&dyn_buf) < 0)
         return AVERROR(ENOMEM);

More information about the ffmpeg-devel mailing list