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

Måns Rullgård mans
Wed Jun 25 20:25:46 CEST 2008


Michael Niedermayer <michaelni at gmx.at> writes:

> On Wed, Jun 25, 2008 at 02:23:00PM +0100, M?ns Rullg?rd wrote:
>> 
>> Michael Niedermayer wrote:
>> > 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
>> 
>> The way I read it, both "specs" are saying the same thing: that the
>> timestamp on a page refers to the last packet ending on that page.
>> 
>> It is quite possible that the code is wrong, but I don't think we need
>> special cases for these two codecs.
>
> After various bugfixes, i now get timestamps which are consistant in
> relation to the number of samples output by the decoder with oggdec.c
> svn and vorbis. The theora timestamp code does break vorbis timestamps.
>
> So i think my patch is correct. And ill apply it in a few days unless
> you object or i stumble accross an issue with it.

I object as long as I don't understand it, and I can't see how the
specs are really saying anything differently.  If there is a
difference in behaviour, the bug must be elsewhere.

-- 
M?ns Rullg?rd
mans at mansr.com




More information about the ffmpeg-devel mailing list