matroska-demux: Cache upstream length

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...)
This commit is contained in:
Edward Hervey 2014-12-19 10:57:29 +01:00
parent b7413279d9
commit cbe56d2331
2 changed files with 13 additions and 5 deletions

View 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;

View 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 {