OGG: correct PTS with old theora streams
authorMåns Rullgård <mans@mansr.com>
Thu, 6 Nov 2008 01:57:17 +0000 (01:57 +0000)
committerMåns Rullgård <mans@mansr.com>
Thu, 6 Nov 2008 01:57:17 +0000 (01:57 +0000)
Originally committed as revision 15785 to svn://svn.ffmpeg.org/ffmpeg/trunk

libavformat/oggparsetheora.c

index c835fad..2d362e6 100644 (file)
@@ -31,6 +31,7 @@
 struct theora_params {
     int gpshift;
     int gpmask;
 struct theora_params {
     int gpshift;
     int gpmask;
+    unsigned version;
 };
 
 static int
 };
 
 static int
@@ -54,17 +55,16 @@ theora_header (AVFormatContext * s, int idx)
     if (os->buf[os->pstart] == 0x80) {
         GetBitContext gb;
         int width, height;
     if (os->buf[os->pstart] == 0x80) {
         GetBitContext gb;
         int width, height;
-        int version;
 
         init_get_bits(&gb, os->buf + os->pstart, os->psize*8);
 
         skip_bits(&gb, 7*8); /* 0x80"theora" */
 
 
         init_get_bits(&gb, os->buf + os->pstart, os->psize*8);
 
         skip_bits(&gb, 7*8); /* 0x80"theora" */
 
-        version = get_bits_long(&gb, 24);
-        if (version < 0x030100)
+        thp->version = get_bits_long(&gb, 24);
+        if (thp->version < 0x030100)
         {
             av_log(s, AV_LOG_ERROR,
         {
             av_log(s, AV_LOG_ERROR,
-                "Too old or unsupported Theora (%x)\n", version);
+                "Too old or unsupported Theora (%x)\n", thp->version);
             return -1;
         }
 
             return -1;
         }
 
@@ -72,10 +72,10 @@ theora_header (AVFormatContext * s, int idx)
         height = get_bits(&gb, 16) << 4;
         avcodec_set_dimensions(st->codec, width, height);
 
         height = get_bits(&gb, 16) << 4;
         avcodec_set_dimensions(st->codec, width, height);
 
-        if (version >= 0x030400)
+        if (thp->version >= 0x030400)
             skip_bits(&gb, 100);
 
             skip_bits(&gb, 100);
 
-        if (version >= 0x030200) {
+        if (thp->version >= 0x030200) {
             width  = get_bits_long(&gb, 24);
             height = get_bits_long(&gb, 24);
             if (   width  <= st->codec->width  && width  > st->codec->width-16
             width  = get_bits_long(&gb, 24);
             height = get_bits_long(&gb, 24);
             if (   width  <= st->codec->width  && width  > st->codec->width-16
@@ -91,9 +91,9 @@ theora_header (AVFormatContext * s, int idx)
         st->sample_aspect_ratio.num = get_bits_long(&gb, 24);
         st->sample_aspect_ratio.den = get_bits_long(&gb, 24);
 
         st->sample_aspect_ratio.num = get_bits_long(&gb, 24);
         st->sample_aspect_ratio.den = get_bits_long(&gb, 24);
 
-        if (version >= 0x030200)
+        if (thp->version >= 0x030200)
             skip_bits(&gb, 38);
             skip_bits(&gb, 38);
-        if (version >= 0x304000)
+        if (thp->version >= 0x304000)
             skip_bits(&gb, 2);
 
         thp->gpshift = get_bits(&gb, 5);
             skip_bits(&gb, 2);
 
         thp->gpshift = get_bits(&gb, 5);
@@ -125,6 +125,9 @@ theora_gptopts(AVFormatContext *ctx, int idx, uint64_t gp)
     uint64_t iframe = gp >> thp->gpshift;
     uint64_t pframe = gp & thp->gpmask;
 
     uint64_t iframe = gp >> thp->gpshift;
     uint64_t pframe = gp & thp->gpmask;
 
+    if (thp->version < 0x030201)
+        iframe++;
+
     if(!pframe)
         os->pflags |= PKT_FLAG_KEY;
 
     if(!pframe)
         os->pflags |= PKT_FLAG_KEY;