]> rtime.felk.cvut.cz Git - frescor/ffmpeg.git/blobdiff - libavformat/oggparsetheora.c
Use skip_bits_long() for large skips
[frescor/ffmpeg.git] / libavformat / oggparsetheora.c
index c835fadf6ba40eea9da71f711f1a208ae03ef06f..96c432f9930bc37c3fe25f2c3756923141ec5cb8 100644 (file)
 
 #include <stdlib.h>
 #include "libavutil/bswap.h"
-#include "libavcodec/bitstream.h"
+#include "libavcodec/get_bits.h"
 #include "avformat.h"
 #include "oggdec.h"
 
 struct theora_params {
     int gpshift;
     int gpmask;
+    unsigned version;
 };
 
 static int
@@ -54,17 +55,16 @@ theora_header (AVFormatContext * s, int idx)
     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" */
+        skip_bits_long(&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 idx)
         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 idx)
         st->sample_aspect_ratio.num = get_bits_long(&gb, 24);
         st->sample_aspect_ratio.den = get_bits_long(&gb, 24);
 
-        if (version >= 0x030200)
-            skip_bits(&gb, 38);
-        if (version >= 0x304000)
+        if (thp->version >= 0x030200)
+            skip_bits_long(&gb, 38);
+        if (thp->version >= 0x304000)
             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;
 
+    if (thp->version < 0x030201)
+        iframe++;
+
     if(!pframe)
         os->pflags |= PKT_FLAG_KEY;