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

Mark Harris git at videolan.org
Sun Aug 11 13:16:48 CEST 2013


ffmpeg | branch: master | Mark Harris <mark.hsj at gmail.com> | Sat Aug 10 17:03:11 2013 -0700| [4ccafaca1cf60227527c7df12668fb3c8eecb23f] | committer: Michael Niedermayer

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 <michaelni at gmx.at>

> http://git.videolan.org/gitweb.cgi/ffmpeg.git/?a=commit;h=4ccafaca1cf60227527c7df12668fb3c8eecb23f
---

 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-cvslog mailing list