[FFmpeg-cvslog] r15785 - trunk/libavformat/oggparsetheora.c

mru subversion
Thu Nov 6 02:57:17 CET 2008


Author: mru
Date: Thu Nov  6 02:57:17 2008
New Revision: 15785

Log:
OGG: correct PTS with old theora streams

Modified:
   trunk/libavformat/oggparsetheora.c

Modified: trunk/libavformat/oggparsetheora.c
==============================================================================
--- trunk/libavformat/oggparsetheora.c	(original)
+++ trunk/libavformat/oggparsetheora.c	Thu Nov  6 02:57:17 2008
@@ -31,6 +31,7 @@
 struct theora_params {
     int gpshift;
     int gpmask;
+    unsigned version;
 };
 
 static int
@@ -54,17 +55,16 @@ theora_header (AVFormatContext * s, int 
     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 @@ theora_header (AVFormatContext * s, int 
         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 @@ theora_header (AVFormatContext * s, int 
         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 @@ theora_gptopts(AVFormatContext *ctx, int
     uint64_t iframe = gp >> thp->gpshift;
     uint64_t pframe = gp & thp->gpmask;
 
+    if (thp->version < 0x030201)
+        iframe++;
+
     if(!pframe)
         os->pflags |= PKT_FLAG_KEY;
 




More information about the ffmpeg-cvslog mailing list