oggdemux: handle theora streams with 0 keyoffset
authorDavid Schleef <ds@schleef.org>
Thu, 26 Nov 2009 01:04:41 +0000 (17:04 -0800)
committerDavid Schleef <ds@schleef.org>
Thu, 26 Nov 2009 22:16:28 +0000 (14:16 -0800)
ext/ogg/gstoggstream.c
ext/ogg/gstoggstream.h

index 02c5abad1f3f368e286ac25560def3506392f50f..5ec4abbd221ddb0deaa7b7bef53ce14ce7e0a3f5 100644 (file)
@@ -299,6 +299,26 @@ setup_theora_mapper (GstOggStream * pad, ogg_packet * packet)
   return TRUE;
 }
 
+static gint64
+granulepos_to_granule_theora (GstOggStream * pad, gint64 granulepos)
+{
+  gint64 keyindex, keyoffset;
+
+  if (pad->granuleshift != 0) {
+    keyindex = granulepos >> pad->granuleshift;
+    keyoffset = granulepos - (keyindex << pad->granuleshift);
+    if (keyoffset == 0) {
+      pad->theora_has_zero_keyoffset = TRUE;
+    }
+    if (pad->theora_has_zero_keyoffset) {
+      keyoffset++;
+    }
+    return keyindex + keyoffset;
+  } else {
+    return granulepos;
+  }
+}
+
 static gboolean
 is_keyframe_theora (GstOggStream * pad, gint64 granulepos)
 {
@@ -944,7 +964,7 @@ static const GstOggMap mappers[] = {
     "\200theora", 7, 42,
     "video/x-theora",
     setup_theora_mapper,
-    granulepos_to_granule_default,
+    granulepos_to_granule_theora,
     granule_to_granulepos_default,
     is_keyframe_theora,
     is_header_theora,
index f359e90d84fff53bc7878deb58df125bb53f397f..752a3fcad3899837c60b365da37fae936120c353 100644 (file)
@@ -63,6 +63,8 @@ struct _GstOggStream
   int vorbis_log2_num_modes;
   int vorbis_mode_sizes[256];
   int last_size;
+  /* theora stuff */
+  gboolean theora_has_zero_keyoffset;
 };