diff options
author | David Phung <davidph@axis.com> | 2020-11-03 16:56:28 +0100 |
---|---|---|
committer | Tim-Philipp Müller <tim@centricular.com> | 2020-11-16 15:57:40 +0000 |
commit | 00dc54de66ba383511462b7111e7032ffe76fe2f (patch) | |
tree | 077fd02005fe2d40e7ecfc15c9785f308b02009a | |
parent | 0bf1c9a140f28f574716e22550089a2c513aed73 (diff) |
rtsp-media: Ignore GstRTSPStreamBlocking from incomplete streams
To prevent cases with prerolling when the inactive stream prerolls first
and the server proceeds without waiting for the active stream, we will
ignore GstRTSPStreamBlocking messages from incomplete streams. When
there are no complete streams (during DESCRIBE), we will listen to all
streams.
Part-of: <https://gitlab.freedesktop.org/gstreamer/gst-rtsp-server/-/merge_requests/173>
-rw-r--r-- | gst/rtsp-server/rtsp-media.c | 26 | ||||
-rw-r--r-- | gst/rtsp-server/rtsp-stream.c | 3 |
2 files changed, 24 insertions, 5 deletions
diff --git a/gst/rtsp-server/rtsp-media.c b/gst/rtsp-server/rtsp-media.c index 2df2a55..72b63f8 100644 --- a/gst/rtsp-server/rtsp-media.c +++ b/gst/rtsp-server/rtsp-media.c @@ -3270,12 +3270,30 @@ default_handle_message (GstRTSPMedia * media, GstMessage * message) s = gst_message_get_structure (message); if (gst_structure_has_name (s, "GstRTSPStreamBlocking")) { - GST_DEBUG ("media received blocking message"); - priv->blocking_msg_received++; + gboolean is_complete = FALSE; + guint n_active_streams; + guint expected_nbr_blocking_msg; + + /* to prevent problems when some streams are complete, some are not, + * we will ignore incomplete streams. When there are no complete + * streams (during DESCRIBE), we will listen to all streams. */ + + gst_structure_get_boolean (s, "is_complete", &is_complete); + n_active_streams = nbr_active_streams (media); + expected_nbr_blocking_msg = n_active_streams; + GST_DEBUG_OBJECT (media, "media received blocking message," + " n_active_streams = %d, is_complete = %d", + n_active_streams, is_complete); + + if (n_active_streams == 0 || is_complete) + priv->blocking_msg_received++; + + if (n_active_streams == 0) + expected_nbr_blocking_msg = priv->streams->len; + if (priv->blocked && media_streams_blocking (media) && priv->no_more_pads_pending == 0 && - (priv->blocking_msg_received == nbr_active_streams (media) || - priv->blocking_msg_received == priv->streams->len)) { + priv->blocking_msg_received == expected_nbr_blocking_msg) { GST_DEBUG_OBJECT (GST_MESSAGE_SRC (message), "media is blocking"); g_mutex_lock (&priv->lock); collect_media_stats (media); diff --git a/gst/rtsp-server/rtsp-stream.c b/gst/rtsp-server/rtsp-stream.c index 7585a0c..be486d2 100644 --- a/gst/rtsp-server/rtsp-stream.c +++ b/gst/rtsp-server/rtsp-stream.c @@ -5281,7 +5281,8 @@ pad_blocking (GstPad * pad, GstPadProbeInfo * info, gpointer user_data) gst_element_post_message (priv->payloader, gst_message_new_element (GST_OBJECT_CAST (priv->payloader), - gst_structure_new_empty ("GstRTSPStreamBlocking"))); + gst_structure_new ("GstRTSPStreamBlocking", "is_complete", + G_TYPE_BOOLEAN, priv->is_complete, NULL))); done: return ret; |