mirror of
https://gitlab.freedesktop.org/gstreamer/gstreamer.git
synced 2025-01-12 02:15:31 +00:00
stream: add API to block streams
Add an API to block on the streams and make it post a message. Based on patch by Ognyan Tonchev <ognyan@axis.com> See https://bugzilla.gnome.org/show_bug.cgi?id=711257
This commit is contained in:
parent
1b0bf529d5
commit
bdef631218
2 changed files with 94 additions and 1 deletions
|
@ -120,6 +120,10 @@ struct _GstRTSPStreamPrivate
|
||||||
GList *transports;
|
GList *transports;
|
||||||
|
|
||||||
gint dscp_qos;
|
gint dscp_qos;
|
||||||
|
|
||||||
|
/* stream blocking */
|
||||||
|
gulong blocked_id;
|
||||||
|
gboolean blocking;
|
||||||
};
|
};
|
||||||
|
|
||||||
#define DEFAULT_CONTROL NULL
|
#define DEFAULT_CONTROL NULL
|
||||||
|
@ -2154,3 +2158,89 @@ gst_rtsp_stream_transport_filter (GstRTSPStream * stream,
|
||||||
|
|
||||||
return result;
|
return result;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static GstPadProbeReturn
|
||||||
|
pad_blocking (GstPad * pad, GstPadProbeInfo * info, gpointer user_data)
|
||||||
|
{
|
||||||
|
GstRTSPStreamPrivate *priv;
|
||||||
|
GstRTSPStream *stream;
|
||||||
|
|
||||||
|
stream = user_data;
|
||||||
|
priv = stream->priv;
|
||||||
|
|
||||||
|
GST_DEBUG_OBJECT (pad, "now blocking");
|
||||||
|
|
||||||
|
g_mutex_lock (&priv->lock);
|
||||||
|
priv->blocking = TRUE;
|
||||||
|
g_mutex_unlock (&priv->lock);
|
||||||
|
|
||||||
|
gst_element_post_message (priv->payloader,
|
||||||
|
gst_message_new_element (GST_OBJECT_CAST (priv->payloader),
|
||||||
|
gst_structure_new_empty ("GstRTSPStreamBlocking")));
|
||||||
|
|
||||||
|
return GST_PAD_PROBE_OK;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* gst_rtsp_stream_set_blocked:
|
||||||
|
* @stream: a #GstRTSPStream
|
||||||
|
* @blocked: boolean indicating we should block or unblock
|
||||||
|
*
|
||||||
|
* Blocks or unblocks the dataflow on @stream.
|
||||||
|
*
|
||||||
|
* Returns: %TRUE on success
|
||||||
|
*/
|
||||||
|
gboolean
|
||||||
|
gst_rtsp_stream_set_blocked (GstRTSPStream * stream, gboolean blocked)
|
||||||
|
{
|
||||||
|
GstRTSPStreamPrivate *priv;
|
||||||
|
|
||||||
|
g_return_val_if_fail (GST_IS_RTSP_STREAM (stream), FALSE);
|
||||||
|
|
||||||
|
priv = stream->priv;
|
||||||
|
|
||||||
|
g_mutex_lock (&priv->lock);
|
||||||
|
if (blocked) {
|
||||||
|
priv->blocking = FALSE;
|
||||||
|
if (priv->blocked_id == 0) {
|
||||||
|
priv->blocked_id = gst_pad_add_probe (priv->srcpad,
|
||||||
|
GST_PAD_PROBE_TYPE_BLOCK | GST_PAD_PROBE_TYPE_BUFFER |
|
||||||
|
GST_PAD_PROBE_TYPE_BUFFER_LIST, pad_blocking,
|
||||||
|
g_object_ref (stream), g_object_unref);
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
if (priv->blocked_id != 0) {
|
||||||
|
gst_pad_remove_probe (priv->srcpad, priv->blocked_id);
|
||||||
|
priv->blocked_id = 0;
|
||||||
|
priv->blocking = FALSE;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
g_mutex_unlock (&priv->lock);
|
||||||
|
|
||||||
|
return TRUE;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* gst_rtsp_stream_is_blocking:
|
||||||
|
* @stream: a #GstRTSPStream
|
||||||
|
*
|
||||||
|
* Check if @stream is blocking on a #GstBuffer.
|
||||||
|
*
|
||||||
|
* Returns: %TRUE if @stream is blocking
|
||||||
|
*/
|
||||||
|
gboolean
|
||||||
|
gst_rtsp_stream_is_blocking (GstRTSPStream * stream)
|
||||||
|
{
|
||||||
|
GstRTSPStreamPrivate *priv;
|
||||||
|
gboolean result;
|
||||||
|
|
||||||
|
g_return_val_if_fail (GST_IS_RTSP_STREAM (stream), FALSE);
|
||||||
|
|
||||||
|
priv = stream->priv;
|
||||||
|
|
||||||
|
g_mutex_lock (&priv->lock);
|
||||||
|
result = priv->blocking;
|
||||||
|
g_mutex_unlock (&priv->lock);
|
||||||
|
|
||||||
|
return result;
|
||||||
|
}
|
||||||
|
|
|
@ -98,6 +98,10 @@ gboolean gst_rtsp_stream_join_bin (GstRTSPStream *stream,
|
||||||
gboolean gst_rtsp_stream_leave_bin (GstRTSPStream *stream,
|
gboolean gst_rtsp_stream_leave_bin (GstRTSPStream *stream,
|
||||||
GstBin *bin, GstElement *rtpbin);
|
GstBin *bin, GstElement *rtpbin);
|
||||||
|
|
||||||
|
gboolean gst_rtsp_stream_set_blocked (GstRTSPStream * stream,
|
||||||
|
gboolean blocked);
|
||||||
|
gboolean gst_rtsp_stream_is_blocking (GstRTSPStream * stream);
|
||||||
|
|
||||||
void gst_rtsp_stream_get_server_port (GstRTSPStream *stream,
|
void gst_rtsp_stream_get_server_port (GstRTSPStream *stream,
|
||||||
GstRTSPRange *server_port,
|
GstRTSPRange *server_port,
|
||||||
GSocketFamily family);
|
GSocketFamily family);
|
||||||
|
@ -157,7 +161,6 @@ GList * gst_rtsp_stream_transport_filter (GstRTSPStream *stream,
|
||||||
GstRTSPStreamTransportFilterFunc func,
|
GstRTSPStreamTransportFilterFunc func,
|
||||||
gpointer user_data);
|
gpointer user_data);
|
||||||
|
|
||||||
|
|
||||||
G_END_DECLS
|
G_END_DECLS
|
||||||
|
|
||||||
#endif /* __GST_RTSP_STREAM_H__ */
|
#endif /* __GST_RTSP_STREAM_H__ */
|
||||||
|
|
Loading…
Reference in a new issue