Philip Langdale | 13 May 2012 18:22
Gravatar

[PATCH] movenc: Fix muxing of Apple Quicktime chapters.

There is basic support for muxing chapter information into the
Apple Quicktime format already, but there are two errors which
prevent correct detection on the player side.

1) A special apple 'text' atom needs to be included inside the
gmhd atom.

2) The *different* 'text' atom inside the 'stsd' atom needs a
proper header.

With these changes, the chapters are now picked up by Apple
players and reported correctly by tools like mediainfo and mp4chaps.
---
 libavformat/movenc.c |   45 +++++++++++++++++++++++++++++++++++++++++++--
 1 files changed, 43 insertions(+), 2 deletions(-)

diff --git a/libavformat/movenc.c b/libavformat/movenc.c
index 8dc6ada..e35cf46 100644
--- a/libavformat/movenc.c
+++ b/libavformat/movenc.c
 <at>  <at>  -1002,6 +1002,27  <at>  <at>  static int mov_write_subtitle_tag(AVIOContext *pb, MOVTrack *track)

     if (track->enc->extradata_size)
         avio_write(pb, track->enc->extradata, track->enc->extradata_size);
+    else {
+        // Stub header (usually for Quicktime chapter track)
+        avio_wb32(pb, 0x01); // displayFlags
+        avio_wb32(pb, 0x01); // text justification
+        avio_wb16(pb, 0x00); // bgColourRed
+        avio_wb16(pb, 0x00); // bgColourGreen
+        avio_wb16(pb, 0x00); // bgColourBlue
+        avio_wb16(pb, 0x00); // defTextBoxTop
+        avio_wb16(pb, 0x00); // defTextBoxLeft
+        avio_wb16(pb, 0x00); // defTextBoxBottom
+        avio_wb16(pb, 0x00); // defTextBoxRight
+        avio_wb32(pb, 0x00); // Reserved
+        avio_wb32(pb, 0x00); // Reserved
+        avio_wb16(pb, 0x00); // fontNumber
+        avio_wb16(pb, 0x00); // fontFace
+        avio_w8(pb, 0x00);   // Reserved
+        avio_wb16(pb, 0x00); // Reserved
+        avio_wb16(pb, 0x00); // foreColourRed
+        avio_wb16(pb, 0x00); // foreColourGreen
+        avio_wb16(pb, 0x00); // foreColourBlue
+    }

     return update_size(pb, pos);
 }
 <at>  <at>  -1260,7 +1281,7  <at>  <at>  static int mov_write_nmhd_tag(AVIOContext *pb)

 static int mov_write_gmhd_tag(AVIOContext *pb)
 {
-    avio_wb32(pb, 0x20);   /* size */
+    avio_wb32(pb, 0x4C);   /* size */
     ffio_wfourcc(pb, "gmhd");
     avio_wb32(pb, 0x18);   /* gmin size */
     ffio_wfourcc(pb, "gmin");/* generic media info */
 <at>  <at>  -1271,7 +1292,27  <at>  <at>  static int mov_write_gmhd_tag(AVIOContext *pb)
     avio_wb16(pb, 0x8000); /* opColor (b?) */
     avio_wb16(pb, 0);      /* balance */
     avio_wb16(pb, 0);      /* reserved */
-    return 0x20;
+
+    /*
+     * This special text atom is required for
+     * Apple Quicktime chapters. The contents
+     * don't appear to be documented, so the
+     * bytes are copied verbatim.
+     */
+    avio_wb32(pb, 0x2C);   /* size */
+    ffio_wfourcc(pb, "text");
+    avio_wb16(pb, 0x01);
+    avio_wb32(pb, 0x00);
+    avio_wb32(pb, 0x00);
+    avio_wb32(pb, 0x00);
+    avio_wb32(pb, 0x01);
+    avio_wb32(pb, 0x00);
+    avio_wb32(pb, 0x00);
+    avio_wb32(pb, 0x00);
+    avio_wb32(pb, 0x00004000);
+    avio_wb16(pb, 0x0000);
+
+    return 0x4C;
 }

 static int mov_write_smhd_tag(AVIOContext *pb)
--

-- 
1.7.5.4

Gmane