[FFmpeg-devel] [PATCH] issue251, xvid within .ogm will not remux to .avi try2

Michael Niedermayer michaelni
Wed Jun 25 14:17:35 CEST 2008


On Wed, Jun 25, 2008 at 12:44:59PM +0100, M?ns Rullg?rd wrote:
> 
> Michael Niedermayer wrote:
> > Hi
> >
> > This patch fixes "according to spec" timestamp association for theora
> > it also as a sideeffect fixes the file from issue 251
> >
> > quote of the theora spec: (A.2.2)
> >    Frame data pages MUST be marked with a granule index corresponding to
> > the display time of the last frame/packet that finishes in that page.
> >
> > Note ive not tested this extensively, i thought our users can do this better
> >
> > Ill apply this in a few days if i hear no objections
> >
> >
> > Index: libavformat/oggdec.c
> > ===================================================================
> > --- libavformat/oggdec.c	(revision 13799)
> > +++ libavformat/oggdec.c	(working copy)
> > @@ -523,11 +523,25 @@
> >          return AVERROR(EIO);
> >      pkt->stream_index = idx;
> >      memcpy (pkt->data, os->buf + pstart, psize);
> > +    if (s->streams[idx]->codec->codec_id == CODEC_ID_VORBIS){
> >      if (os->lastgp != -1LL){
> >          pkt->pts = ogg_gptopts (s, idx, os->lastgp);
> >          os->lastgp = -1;
> >      }
> > +    }else{
> > +        int segp= os->segp;
> > +        int nsegs=os->nsegs;
> > +        while (segp < nsegs){
> > +            if (os->segments[segp] < 255)
> > +                break;
> > +            segp++;
> > +        }
> >
> > +        if (segp == nsegs && os->granule != -1LL){
> > +            pkt->pts = ogg_gptopts (s, idx, os->granule);
> > +        }
> > +    }
> > +
> >      pkt->flags = os->pflags;
> 
> Can you please explain a little more why this change is needed, and
> why it doesn't apply to Vorbis?

As already quoted theora says:
> > (A.2.2)
> >    Frame data pages MUST be marked with a granule index corresponding to
> > the display time of the last frame/packet that finishes in that page.

vorbis (http://www.xiph.org/vorbis/doc/framing.html) says:
--------
absolute granule position

(This is packed in the same way the rest of Ogg data is packed; LSb of LSB
first. Note that the 'position' data specifies a 'sample' number (eg, in a
CD quality sample is four octets, 16 bits for left and 16 bits for right;
in video it would likely be the frame number. It is up to the specific codec
in use to define the semantic meaning of the granule position value). The
position specified is the total samples encoded after including all packets
finished on this page (packets begun on this page but continuing on to the
next page do not count). The rationale here is that the position specified
in the frame header of the last page tells how long the data coded by the
bitstream is. A truncated stream will still return the proper number of
samples that can be decoded fully.

A special value of '-1' (in two's complement) indicates that no packets
finish on this page.
--------

Thus with theora

page0       page1
AAABB       BBCCC

with theora the last frame finishing on page0 is A thus the granule pos from
page0 applies to A and for page1 its B

Iam not 100% certain what is correct for vorbis (iam still working on getting
timestamps consistant with the number of samples returned by the decoder)

But the vorbis spec sounds like one should associate B with page0 and 
C or D (when C is completed on page1) with page1

[...]
-- 
Michael     GnuPG fingerprint: 9FF2128B147EF6730BADF133611EC787040B0FAB

I have never wished to cater to the crowd; for what I know they do not
approve, and what they approve I do not know. -- Epicurus
-------------- next part --------------
A non-text attachment was scrubbed...
Name: not available
Type: application/pgp-signature
Size: 189 bytes
Desc: Digital signature
URL: <http://lists.mplayerhq.hu/pipermail/ffmpeg-devel/attachments/20080625/2785c572/attachment.pgp>



More information about the ffmpeg-devel mailing list