From 4ccafaca1cf60227527c7df12668fb3c8eecb23f Mon Sep 17 00:00:00 2001 From: Mark Harris Date: Sat, 10 Aug 2013 17:03:11 -0700 Subject: avformat/id3v2enc: use UTF-16 in id3v2.3 APIC frame only if non-ASCII 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. Example: 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.) Signed-off-by: Michael Niedermayer --- libavformat/id3v2enc.c | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/libavformat/id3v2enc.c b/libavformat/id3v2enc.c index f7c37ebbdb..60522444fc 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); -- cgit v1.2.3