summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorEdward Hervey <edward@centricular.com>2020-11-09 11:41:10 +0100
committerGStreamer Merge Bot <gitlab-merge-bot@gstreamer-foundation.org>2020-12-04 08:09:58 +0000
commit30518de51df3e3c31168196e88dc155bb1c4606f (patch)
tree1cd8a871a1527facd3c0205683375536e33d01a1
parent0940d1b5b1df164a06a53a0fe8e7135a6b71ad79 (diff)
downloadgstreamer-plugins-bad-30518de51df3e3c31168196e88dc155bb1c4606f.tar.gz
adaptivedemux: Store QoS values on the element
Storing it per-stream requires taking the manifest lock which can apparenly be hold for aeons. And since the QoS event comes from the video rendering thread we *really* do not want to do that. Storing it as-is in the element is fine, the important part is knowing the earliest time downstream. Part-of: <https://gitlab.freedesktop.org/gstreamer/gst-plugins-bad/-/merge_requests/1819>
-rw-r--r--ext/dash/gstdashdemux.c12
-rw-r--r--gst-libs/gst/adaptivedemux/gstadaptivedemux.c59
-rw-r--r--gst-libs/gst/adaptivedemux/gstadaptivedemux.h5
3 files changed, 48 insertions, 28 deletions
diff --git a/ext/dash/gstdashdemux.c b/ext/dash/gstdashdemux.c
index 8aecfafa4..93980b040 100644
--- a/ext/dash/gstdashdemux.c
+++ b/ext/dash/gstdashdemux.c
@@ -218,8 +218,7 @@
* GstDashDemuxStream->actual_position.
*
* The downstream position of the pipeline is obtained via QoS events and
- * is stored in GstAdaptiveDemuxStream->qos_earliest_time (note: it's a
- * running time value).
+ * is stored in GstAdaptiveDemux (note: it's a running time value).
*
* The estimated buffering level between dashdemux and downstream is
* therefore:
@@ -1764,6 +1763,7 @@ gst_dash_demux_stream_get_target_time (GstDashDemux * dashdemux,
GstClockTimeDiff diff;
GstClockTime ret = cur_position;
GstClockTime deadline;
+ GstClockTime upstream_earliest_time;
GstClockTime earliest_time = GST_CLOCK_TIME_NONE;
g_assert (min_skip > 0);
@@ -1785,7 +1785,9 @@ gst_dash_demux_stream_get_target_time (GstDashDemux * dashdemux,
* flush, as otherwise base_time and clock might not be correct because of a
* still pre-rolling sink
*/
- if (stream->qos_earliest_time != GST_CLOCK_TIME_NONE) {
+ upstream_earliest_time =
+ gst_adaptive_demux_get_qos_earliest_time ((GstAdaptiveDemux *) dashdemux);
+ if (upstream_earliest_time != GST_CLOCK_TIME_NONE) {
GstClock *clock;
clock = gst_element_get_clock (GST_ELEMENT_CAST (dashdemux));
@@ -1803,9 +1805,9 @@ gst_dash_demux_stream_get_target_time (GstDashDemux * dashdemux,
gst_object_unref (clock);
- earliest_time = MAX (now_time, stream->qos_earliest_time);
+ earliest_time = MAX (now_time, upstream_earliest_time);
} else {
- earliest_time = stream->qos_earliest_time;
+ earliest_time = upstream_earliest_time;
}
}
diff --git a/gst-libs/gst/adaptivedemux/gstadaptivedemux.c b/gst-libs/gst/adaptivedemux/gstadaptivedemux.c
index 74f9950e5..99fbcd548 100644
--- a/gst-libs/gst/adaptivedemux/gstadaptivedemux.c
+++ b/gst-libs/gst/adaptivedemux/gstadaptivedemux.c
@@ -205,6 +205,8 @@ struct _GstAdaptiveDemuxPrivate
* without needing to stop tasks when they just want to
* update the segment boundaries */
GMutex segment_lock;
+
+ GstClockTime qos_earliest_time;
};
typedef struct _GstAdaptiveDemuxTimer
@@ -1203,12 +1205,12 @@ gst_adaptive_demux_prepare_streams (GstAdaptiveDemux * demux,
stream->pending_segment = gst_event_new_segment (&stream->segment);
gst_event_set_seqnum (stream->pending_segment, demux->priv->segment_seqnum);
- stream->qos_earliest_time = GST_CLOCK_TIME_NONE;
GST_DEBUG_OBJECT (demux,
"Prepared segment %" GST_SEGMENT_FORMAT " for stream %p",
&stream->segment, stream);
}
+ demux->priv->qos_earliest_time = GST_CLOCK_TIME_NONE;
return TRUE;
}
@@ -1527,8 +1529,8 @@ gst_adaptive_demux_update_streams_segment (GstAdaptiveDemux * demux,
gst_event_unref (seg_evt);
/* Make sure the first buffer after a seek has the discont flag */
stream->discont = TRUE;
- stream->qos_earliest_time = GST_CLOCK_TIME_NONE;
}
+ demux->priv->qos_earliest_time = GST_CLOCK_TIME_NONE;
}
#define IS_SNAP_SEEK(f) (f & (GST_SEEK_FLAG_SNAP_BEFORE | \
@@ -1908,25 +1910,19 @@ gst_adaptive_demux_src_event (GstPad * pad, GstObject * parent,
return TRUE;
}
case GST_EVENT_QOS:{
- GstAdaptiveDemuxStream *stream;
-
- GST_MANIFEST_LOCK (demux);
- stream = gst_adaptive_demux_find_stream_for_pad (demux, pad);
-
- if (stream) {
- GstClockTimeDiff diff;
- GstClockTime timestamp;
-
- gst_event_parse_qos (event, NULL, NULL, &diff, &timestamp);
- /* Only take into account lateness if late */
- if (diff > 0)
- stream->qos_earliest_time = timestamp + 2 * diff;
- else
- stream->qos_earliest_time = timestamp;
- GST_DEBUG_OBJECT (stream->pad, "qos_earliest_time %" GST_TIME_FORMAT,
- GST_TIME_ARGS (stream->qos_earliest_time));
- }
- GST_MANIFEST_UNLOCK (demux);
+ GstClockTimeDiff diff;
+ GstClockTime timestamp;
+
+ gst_event_parse_qos (event, NULL, NULL, &diff, &timestamp);
+ /* Only take into account lateness if late */
+ GST_OBJECT_LOCK (demux);
+ if (diff > 0)
+ demux->priv->qos_earliest_time = timestamp + 2 * diff;
+ else
+ demux->priv->qos_earliest_time = timestamp;
+ GST_OBJECT_UNLOCK (demux);
+ GST_DEBUG_OBJECT (demux, "qos_earliest_time %" GST_TIME_FORMAT,
+ GST_TIME_ARGS (demux->priv->qos_earliest_time));
break;
}
default:
@@ -2198,10 +2194,10 @@ gst_adaptive_demux_stop_tasks (GstAdaptiveDemux * demux, gboolean stop_updates)
stream->download_error_count = 0;
stream->need_header = TRUE;
- stream->qos_earliest_time = GST_CLOCK_TIME_NONE;
}
list_to_process = demux->prepared_streams;
}
+ demux->priv->qos_earliest_time = GST_CLOCK_TIME_NONE;
}
/* must be called with manifest_lock taken */
@@ -4661,3 +4657,22 @@ gst_adaptive_demux_clock_callback (GstClock * clock,
g_mutex_unlock (timer->mutex);
return TRUE;
}
+
+/**
+ * gst_adaptive_demux_get_qos_earliest_time:
+ *
+ * Returns: The QOS earliest time
+ *
+ * Since: 1.18
+ */
+GstClockTime
+gst_adaptive_demux_get_qos_earliest_time (GstAdaptiveDemux * demux)
+{
+ GstClockTime earliest;
+
+ GST_OBJECT_LOCK (demux);
+ earliest = demux->priv->qos_earliest_time;
+ GST_OBJECT_UNLOCK (demux);
+
+ return earliest;
+}
diff --git a/gst-libs/gst/adaptivedemux/gstadaptivedemux.h b/gst-libs/gst/adaptivedemux/gstadaptivedemux.h
index 9de70dafe..61e0f0c60 100644
--- a/gst-libs/gst/adaptivedemux/gstadaptivedemux.h
+++ b/gst-libs/gst/adaptivedemux/gstadaptivedemux.h
@@ -184,7 +184,7 @@ struct _GstAdaptiveDemuxStream
guint moving_index;
guint64 *fragment_bitrates;
- /* QoS data */
+ /* QoS data : UNUSED !!! */
GstClockTime qos_earliest_time;
GstAdaptiveDemuxStreamFragment fragment;
@@ -532,6 +532,9 @@ GDateTime *gst_adaptive_demux_get_client_now_utc (GstAdaptiveDemux * demux);
GST_ADAPTIVE_DEMUX_API
gboolean gst_adaptive_demux_is_running (GstAdaptiveDemux * demux);
+GST_ADAPTIVE_DEMUX_API
+GstClockTime gst_adaptive_demux_get_qos_earliest_time (GstAdaptiveDemux *demux);
+
G_END_DECLS
#endif