From 1c7450dd6685496c0d60c6f43faedb233e284b5c Mon Sep 17 00:00:00 2001 From: Andreas Frisch Date: Tue, 10 Feb 2015 10:04:17 +0100 Subject: [PATCH] rtsp-stream+media: method to distinguish between in and out streams --- gst/rtsp-server/rtsp-media.c | 36 +++++++++++++++++++++++++++--------- gst/rtsp-server/rtsp-stream.c | 22 ++++++++++++++++++++++ gst/rtsp-server/rtsp-stream.h | 3 +++ 3 files changed, 52 insertions(+), 9 deletions(-) diff --git a/gst/rtsp-server/rtsp-media.c b/gst/rtsp-server/rtsp-media.c index 4ac89b1..29bd2ee 100644 --- a/gst/rtsp-server/rtsp-media.c +++ b/gst/rtsp-server/rtsp-media.c @@ -1383,9 +1383,11 @@ _find_payload_types (GstRTSPMedia * media) n = media->priv->streams->len; for (i = 0; i < n; i++) { GstRTSPStream *stream = g_ptr_array_index (media->priv->streams, i); - guint pt = gst_rtsp_stream_get_pt (stream); - - g_queue_push_tail (&queue, GUINT_TO_POINTER (pt)); + if (gst_rtsp_stream_get_transport_mode (stream) == + GST_RTSP_TRANSPORT_MODE_PLAY) { + guint pt = gst_rtsp_stream_get_pt (stream); + g_queue_push_tail (&queue, GUINT_TO_POINTER (pt)); + } } return queue.head; @@ -1547,7 +1549,6 @@ gst_rtsp_media_create_stream (GstRTSPMedia * media, GstElement * payloader, if (GST_PAD_IS_SRC (pad)) { gint i, n; - if (priv->payloads) g_list_free (priv->payloads); priv->payloads = _find_payload_types (media); @@ -1555,8 +1556,13 @@ gst_rtsp_media_create_stream (GstRTSPMedia * media, GstElement * payloader, n = priv->streams->len; for (i = 0; i < n; i++) { GstRTSPStream *stream = g_ptr_array_index (priv->streams, i); - guint rtx_pt = _next_available_pt (priv->payloads); + guint rtx_pt; + + if (gst_rtsp_stream_get_transport_mode (stream) == + GST_RTSP_TRANSPORT_MODE_RECORD) + continue; + rtx_pt = _next_available_pt (priv->payloads); if (rtx_pt == 0) { GST_WARNING ("Ran out of space of dynamic payload types"); break; @@ -3452,12 +3458,24 @@ static gboolean default_handle_sdp (GstRTSPMedia * media, GstSDPMessage * sdp) { GstRTSPMediaPrivate *priv = media->priv; - gint i, medias_len; + gint i, medias_len, play_streams_len = 0, record_streams_len = 0; medias_len = gst_sdp_message_medias_len (sdp); - if (medias_len != priv->streams->len) { - GST_ERROR ("%p: Media has more or less streams than SDP (%d /= %d)", media, - priv->streams->len, medias_len); + + for (i = 0; i < priv->streams->len; i++) { + GstRTSPStream *stream = g_ptr_array_index (priv->streams, i); + if (gst_rtsp_stream_get_transport_mode (stream) == + GST_RTSP_TRANSPORT_MODE_PLAY) + play_streams_len++; + if (gst_rtsp_stream_get_transport_mode (stream) == + GST_RTSP_TRANSPORT_MODE_RECORD) + record_streams_len++; + } + + if (GST_RTSP_TRANSPORT_MODE_RECORD && medias_len != record_streams_len) { + GST_ERROR + ("%p: Media has more or less streams (%d PLAY, %d RECORD) than SDP (%d)", + media, play_streams_len, record_streams_len, medias_len); return FALSE; } diff --git a/gst/rtsp-server/rtsp-stream.c b/gst/rtsp-server/rtsp-stream.c index 83cee2b..0c843de 100644 --- a/gst/rtsp-server/rtsp-stream.c +++ b/gst/rtsp-server/rtsp-stream.c @@ -1897,6 +1897,25 @@ request_pt_map (GstElement * rtpbin, guint session, guint pt, return caps; } +/** + * gst_rtsp_stream_get_transport_mode: + * @stream: a #GstRTSPStream + * + * Check whether this stream is in PLAY or RECORD mode + * + * Returns: The current transport mode. + */ +GstRTSPTransportMode +gst_rtsp_stream_get_transport_mode (GstRTSPStream * stream) +{ + GstRTSPTransportMode ret = 0; + if (stream->priv->srcpad) + ret = GST_RTSP_TRANSPORT_MODE_PLAY; + if (stream->priv->sinkpad) + ret = GST_RTSP_TRANSPORT_MODE_RECORD; + return ret; +} + static void pad_added (GstElement * rtpbin, GstPad * pad, GstRTSPStream * stream) { @@ -3139,6 +3158,9 @@ gst_rtsp_stream_set_blocked (GstRTSPStream * stream, gboolean blocked) priv = stream->priv; + if (priv->srcpad == NULL) + return TRUE; + g_mutex_lock (&priv->lock); if (blocked) { priv->blocking = FALSE; diff --git a/gst/rtsp-server/rtsp-stream.h b/gst/rtsp-server/rtsp-stream.h index b71c776..2dc172a 100644 --- a/gst/rtsp-server/rtsp-stream.h +++ b/gst/rtsp-server/rtsp-stream.h @@ -163,6 +163,9 @@ void gst_rtsp_stream_set_retransmission_pt (GstRTSPStream * s void gst_rtsp_stream_set_pt_map (GstRTSPStream * stream, guint pt, GstCaps * caps); +GstRTSPTransportMode + gst_rtsp_stream_get_transport_mode (GstRTSPStream * stream); + /** * GstRTSPStreamTransportFilterFunc: * @stream: a #GstRTSPStream object -- 2.2.0