[FFmpeg-devel] [PATCH] Missing Theora 3.2.1 granule support
Henrik Gulbrandsen
henrik
Sun Apr 20 07:51:25 CEST 2008
On Fri, 2008-04-18 at 09:27 +0100, M?ns Rullg?rd wrote:
> Henrik Gulbrandsen <henrik at gulbra.net> writes:
>
> > Given the modified granule semantics for Theora bitstreams, which was
> > mentioned in my previous email, the theora_gptopts function needs to
> > change if it should still map from granule positions to PTS when the
> > bitstream version is 3.2.1 or higher.
> >
> > I haven't actually tested this on a new bitstream, but with some good
> > code review and a little luck, this may actually work as intended :-)
> >
> > /Henrik
> >
> >
> > Index: libavformat/oggparsetheora.c
> > ===================================================================
> > --- libavformat/oggparsetheora.c (revision 12887)
> > +++ libavformat/oggparsetheora.c (working copy)
> > @@ -29,6 +29,7 @@
> > #include "oggdec.h"
> >
> > typedef struct theora_params {
> > + unsigned version;
> > int gpshift;
> > int gpmask;
> > } theora_params_t;
> > @@ -95,6 +96,7 @@ theora_header (AVFormatContext * s, int
> > if (version >= 0x304000)
> > skip_bits(&gb, 2);
> >
> > + thp->version = version;
> > thp->gpshift = get_bits(&gb, 5);
> > thp->gpmask = (1 << thp->gpshift) - 1;
> >
> > @@ -124,6 +126,11 @@ theora_gptopts(AVFormatContext *ctx, int
> > uint64_t iframe = gp >> thp->gpshift;
> > uint64_t pframe = gp & thp->gpmask;
> >
> > + // We want PTS (beginning of display interval)
> > + // rather than the count of frames seen so far.
> > + if (thp->version >= 0x030201 && iframe > 0)
> > + iframe--;
>
> What if iframe == 0?
For Theora bitstream versions >= 3.2.1, that means that the current
packet doesn't contain any frames. It would probably be some kind of
header packet. In any case, we don't want the PTS to go negative...
/Henrik
More information about the ffmpeg-devel
mailing list