changeset 4017:b2a3ed76122e libavformat

OGG: correct PTS with old theora streams
author mru
date Thu, 06 Nov 2008 01:57:17 +0000
parents 6cd006bc2de9
children 0c2f650d31bb
files oggparsetheora.c
diffstat 1 files changed, 11 insertions(+), 8 deletions(-) [+]
line wrap: on
line diff
--- a/oggparsetheora.c	Thu Nov 06 01:50:56 2008 +0000
+++ b/oggparsetheora.c	Thu Nov 06 01:57:17 2008 +0000
@@ -31,6 +31,7 @@
 struct theora_params {
     int gpshift;
     int gpmask;
+    unsigned version;
 };
 
 static int
@@ -54,17 +55,16 @@
     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" */
 
-        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,
-                "Too old or unsupported Theora (%x)\n", version);
+                "Too old or unsupported Theora (%x)\n", thp->version);
             return -1;
         }
 
@@ -72,10 +72,10 @@
         height = get_bits(&gb, 16) << 4;
         avcodec_set_dimensions(st->codec, width, height);
 
-        if (version >= 0x030400)
+        if (thp->version >= 0x030400)
             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
@@ -91,9 +91,9 @@
         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);
-        if (version >= 0x304000)
+        if (thp->version >= 0x304000)
             skip_bits(&gb, 2);
 
         thp->gpshift = get_bits(&gb, 5);
@@ -125,6 +125,9 @@
     uint64_t iframe = gp >> thp->gpshift;
     uint64_t pframe = gp & thp->gpmask;
 
+    if (thp->version < 0x030201)
+        iframe++;
+
     if(!pframe)
         os->pflags |= PKT_FLAG_KEY;