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

Philip Langdale philipl at overt.org
Thu May 17 00:46:01 CEST 2012


On Wed, 16 May 2012 15:33:33 -0700
Michael Niedermayer <michaelni at gmx.at> wrote:

> Do you want to comment on this one?
>
> --phil

Well, that's impressive. I pasted into the From field...

--phil
 
> On Sun, 13 May 2012 17:33:41 -0700
> Philip Langdale <philipl at overt.org> wrote:
> 
> > 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)
> _______________________________________________
> ffmpeg-devel mailing list
> ffmpeg-devel at ffmpeg.org
> http://ffmpeg.org/mailman/listinfo/ffmpeg-devel
> 




--phil


More information about the ffmpeg-devel mailing list