ogg: implement packet duration query for kate streams
authorVincent Penquerc'h <vincent.penquerch@collabora.co.uk>
Fri, 17 Dec 2010 14:16:18 +0000 (14:16 +0000)
committerSebastian Dröge <sebastian.droege@collabora.co.uk>
Sat, 18 Dec 2010 19:33:09 +0000 (20:33 +0100)
https://bugzilla.gnome.org/show_bug.cgi?id=637519

ext/ogg/gstoggdemux.c
ext/ogg/gstoggstream.c

index df470f9..8da7288 100644 (file)
@@ -540,7 +540,12 @@ gst_ogg_demux_chain_peer (GstOggPad * pad, ogg_packet * packet,
       } else if (pad->map.is_sparse) {
         out_timestamp = gst_ogg_stream_granule_to_time (&pad->map,
             pad->current_granule);
-        out_duration = GST_CLOCK_TIME_NONE;
+        if (duration == GST_CLOCK_TIME_NONE) {
+          out_duration = GST_CLOCK_TIME_NONE;
+        } else {
+          out_duration = gst_util_uint64_scale (duration,
+              GST_SECOND * pad->map.granulerate_d, pad->map.granulerate_n);
+        }
       } else {
         out_timestamp = gst_ogg_stream_granule_to_time (&pad->map,
             pad->current_granule - duration);
index eeaf4b9..f8ba6c0 100644 (file)
@@ -1732,6 +1732,32 @@ setup_kate_mapper (GstOggStream * pad, ogg_packet * packet)
   return TRUE;
 }
 
+static gint64
+packet_duration_kate (GstOggStream * pad, ogg_packet * packet)
+{
+  gint64 duration;
+
+  if (packet->bytes < 1)
+    return 0;
+
+  switch (packet->packet[0]) {
+    case 0x00:                 /* text data */
+      if (packet->bytes < 1 + 8 * 2) {
+        duration = 0;
+      } else {
+        duration = GST_READ_UINT64_LE (packet->packet + 1 + 8);
+        if (duration < 0)
+          duration = 0;
+      }
+      break;
+    default:
+      duration = GST_CLOCK_TIME_NONE;
+      break;
+  }
+
+  return duration;
+}
+
 
 /* *INDENT-OFF* */
 /* indent hates our freedoms */
@@ -1875,7 +1901,7 @@ const GstOggMap mappers[] = {
     granule_to_granulepos_default,
     NULL,
     is_header_count,
-    NULL,
+    packet_duration_kate,
     NULL,
     NULL
   },