mirror of
https://gitlab.freedesktop.org/gstreamer/gstreamer.git
synced 2024-12-24 17:20:36 +00:00
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:
parent
b7413279d9
commit
cbe56d2331
2 changed files with 13 additions and 5 deletions
|
@ -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;
|
||||
|
|
|
@ -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 {
|
||||
|
|
Loading…
Reference in a new issue