oggdemux: Fix granulepos->key granule calculation for Dirac
authorSebastian Dröge <sebastian.droege@collabora.co.uk>
Fri, 14 May 2010 11:31:42 +0000 (13:31 +0200)
committerSebastian Dröge <sebastian.droege@collabora.co.uk>
Wed, 19 May 2010 17:23:07 +0000 (19:23 +0200)
ext/ogg/gstoggstream.c

index 1e766c1..cbcb6d9 100644 (file)
@@ -465,6 +465,29 @@ granule_to_granulepos_dirac (GstOggStream * pad, gint64 granule,
   return -1;
 }
 
+static gint64
+granulepos_to_key_granule_dirac (GstOggStream * pad, gint64 gp)
+{
+  gint64 pt;
+  int dist_h;
+  int dist_l;
+  int dist;
+  int delay;
+  gint64 dt;
+
+  if (gp == -1 || gp == 0)
+    return gp;
+
+  pt = ((gp >> 22) + (gp & OGG_DIRAC_GRANULE_LOW_MASK)) >> 9;
+  dist_h = (gp >> 22) & 0xff;
+  dist_l = gp & 0xff;
+  dist = (dist_h << 8) | dist_l;
+  delay = (gp >> 9) & 0x1fff;
+  dt = pt - delay;
+
+  return dt - 2 * dist + 4;
+}
+
 /* VP8 */
 
 static gboolean
@@ -1600,7 +1623,7 @@ static const GstOggMap mappers[] = {
     is_keyframe_dirac,
     is_header_count,
     packet_duration_constant,
-    NULL
+    granulepos_to_key_granule_dirac
   },
   {
     "VP80\1", 5, 4,