support correct ptses on other than version 3.2.0 aswell
authorAlex Beregszaszi <alex@rtfs.hu>
Wed, 22 Feb 2006 00:18:12 +0000 (00:18 +0000)
committerAlex Beregszaszi <alex@rtfs.hu>
Wed, 22 Feb 2006 00:18:12 +0000 (00:18 +0000)
Originally committed as revision 5047 to svn://svn.ffmpeg.org/ffmpeg/trunk

libavformat/oggparsetheora.c

index f1820e8..2f35d1b 100644 (file)
@@ -1,5 +1,5 @@
 /**
-      Copyright (C) 2005  Matthieu CASTET
+      Copyright (C) 2005  Matthieu CASTET, Alex Beregszaszi
 
       Permission is hereby granted, free of charge, to any person
       obtaining a copy of this software and associated documentation
@@ -53,26 +53,41 @@ theora_header (AVFormatContext * s, int idx)
 
     if (os->buf[os->pstart] == 0x80) {
         GetBitContext gb;
+        int version;
+
         init_get_bits(&gb, os->buf + os->pstart, os->psize*8);
 
         skip_bits(&gb, 7*8); /* 0x80"theora" */
-        if(get_bits(&gb, 8) != 3) /* major version */
-            return -1;
-        if(get_bits(&gb, 8) != 2) /* minor version */
+
+        version = get_bits(&gb, 8) << 16;
+        version |= get_bits(&gb, 8) << 8;
+        version |= get_bits(&gb, 8);
+
+        if (version < 0x030100)
+        {
+            av_log(s, AV_LOG_ERROR,
+                "Too old or unsupported Theora (%x)\n", version);
             return -1;
-        skip_bits(&gb, 8);      /* revision */
+        }
 
         st->codec->width = get_bits(&gb, 16) << 4;
         st->codec->height = get_bits(&gb, 16) << 4;
 
-        skip_bits(&gb, 64);
+        if (version >= 0x030400)
+            skip_bits(&gb, 164);
+        else
+            skip_bits(&gb, 64);
         st->codec->time_base.den = get_bits(&gb, 32);
         st->codec->time_base.num = get_bits(&gb, 32);
 
         st->codec->sample_aspect_ratio.num = get_bits(&gb, 24);
         st->codec->sample_aspect_ratio.den = get_bits(&gb, 24);
 
-        skip_bits(&gb, 38);
+        if (version >= 0x030200)
+            skip_bits(&gb, 38);
+        if (version >= 0x304000)
+            skip_bits(&gb, 2);
+
         thp->gpshift = get_bits(&gb, 5);
         thp->gpmask = (1 << thp->gpshift) - 1;