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

Yusuke Nakamura muken.the.vfrmaniac at gmail.com
Mon May 14 02:48:06 CEST 2012


2012/5/14 Philip Langdale <philipl at overt.org>

> 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.
>
> Signed-off-by: Philip Langdale <philipl at overt.org>
> ---
>  libavformat/movenc.c |   57
> ++++++++++++++++++++++++++++++++++++++++++++++++-
>  1 files changed, 55 insertions(+), 2 deletions(-)
>
> diff --git a/libavformat/movenc.c b/libavformat/movenc.c
> index 8dc6ada..40d227c 100644
> --- a/libavformat/movenc.c
> +++ b/libavformat/movenc.c
> @@ -1002,6 +1002,39 @@ 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) */
> +        // TextSampleEntry
> +        avio_wb32(pb, 0x01); // displayFlags
> +        avio_w8(pb, 0x00);   // horizontal justification
> +        avio_w8(pb, 0x00);   // vertical justification
> +        avio_w8(pb, 0x00);   // bgColourRed
> +        avio_w8(pb, 0x00);   // bgColourGreen
> +        avio_w8(pb, 0x00);   // bgColourBlue
> +        avio_w8(pb, 0x00);   // bgColourAlpha
> +        // BoxRecord
> +        avio_wb16(pb, 0x00); // defTextBoxTop
> +        avio_wb16(pb, 0x00); // defTextBoxLeft
> +        avio_wb16(pb, 0x00); // defTextBoxBottom
> +        avio_wb16(pb, 0x00); // defTextBoxRight
> +        // StyleRecord
> +        avio_wb16(pb, 0x00); // startChar
> +        avio_wb16(pb, 0x00); // endChar
> +        avio_wb16(pb, 0x01); // fontID
> +        avio_w8(pb, 0x00);   // fontStyleFlags
> +        avio_w8(pb, 0x00);   // fontSize
> +        avio_w8(pb, 0x00);   // fgColourRed
> +        avio_w8(pb, 0x00);   // fgColourGreen
> +        avio_w8(pb, 0x00);   // fgColourBlue
> +        avio_w8(pb, 0x00);   // fgColourAlpha
> +        // FontTableBox
> +        avio_wb32(pb, 0x0D); // box size
> +        ffio_wfourcc(pb, "ftab"); // box atom name
> +        avio_wb16(pb, 0x01); // entry count
> +        // FontRecord
> +        avio_wb16(pb, 0x01); // font ID
> +        avio_w8(pb, 0x00);   // font name length
> +    }
>
>     return update_size(pb, pos);
>  }
> @@ -1260,7 +1293,7 @@ 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 */
> @@ -1271,7 +1304,27 @@ 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
>
> _______________________________________________
> ffmpeg-devel mailing list
> ffmpeg-devel at ffmpeg.org
> http://ffmpeg.org/mailman/listinfo/ffmpeg-devel
>

For 3GPP timed text, atom type tag of the sample description is 'tx3g', not
'text'.


More information about the ffmpeg-devel mailing list