changeset 970:2266681a4a52 libavformat

support correct ptses on other than version 3.2.0 aswell
author alex
date Wed, 22 Feb 2006 00:18:12 +0000
parents 282e0f799f61
children 43f85eba04c4
files oggparsetheora.c
diffstat 1 files changed, 22 insertions(+), 7 deletions(-) [+]
line wrap: on
line diff
--- a/oggparsetheora.c	Tue Feb 21 20:32:47 2006 +0000
+++ b/oggparsetheora.c	Wed Feb 22 00:18:12 2006 +0000
@@ -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 @@
 
     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 */
+
+        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;
-        if(get_bits(&gb, 8) != 2) /* minor 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;