matroska-demux: Cache upstream length
authorEdward Hervey <bilboed@bilboed.com>
Fri, 19 Dec 2014 09:57:29 +0000 (10:57 +0100)
committerEdward Hervey <bilboed@bilboed.com>
Fri, 19 Dec 2014 09:59:18 +0000 (10:59 +0100)
Instead of constantly querying upstream, just cache the last duration,
and in the unlikelyness we might have gone over query again before
deciding we are EOS.

Cut 15% cpu off matroskademux streaming thread (srsly...)

gst/matroska/matroska-demux.c
gst/matroska/matroska-demux.h

index ddca9cd..cdecceb 100644 (file)
@@ -329,6 +329,8 @@ gst_matroska_demux_reset (GstElement * element)
 
   demux->invalid_duration = FALSE;
 
+  demux->cached_length = G_MAXUINT64;
+
   gst_flow_combiner_clear (demux->flowcombiner);
 }
 
@@ -4436,11 +4438,14 @@ gst_matroska_demux_loop (GstPad * pad)
   }
 
 next:
-  if (G_UNLIKELY (demux->common.offset ==
-          gst_matroska_read_common_get_length (&demux->common))) {
-    GST_LOG_OBJECT (demux, "Reached end of stream");
-    ret = GST_FLOW_EOS;
-    goto eos;
+  if (G_UNLIKELY (demux->cached_length == G_MAXUINT64 ||
+          demux->common.offset >= demux->cached_length)) {
+    demux->cached_length = gst_matroska_read_common_get_length (&demux->common);
+    if (demux->common.offset == demux->cached_length) {
+      GST_LOG_OBJECT (demux, "Reached end of stream");
+      ret = GST_FLOW_EOS;
+      goto eos;
+    }
   }
 
   return;
index 36a686d..624d177 100644 (file)
@@ -107,6 +107,9 @@ typedef struct _GstMatroskaDemux {
 
   /* for non-finalized files, with invalid segment duration */
   gboolean                 invalid_duration;
+
+  /* Cached upstream length (default G_MAXUINT64) */
+  guint64                 cached_length;
 } GstMatroskaDemux;
 
 typedef struct _GstMatroskaDemuxClass {