diff options
author | Mathieu Duponchelle <mathieu@centricular.com> | 2020-07-02 23:52:47 +0200 |
---|---|---|
committer | GStreamer Merge Bot <gitlab-merge-bot@gstreamer-foundation.org> | 2020-07-06 10:20:32 +0000 |
commit | 34590b342ec28c1621e4ba543e20188dd9b1fbaa (patch) | |
tree | a24a2479a379c1997e622ff19b096eb38fbfc65c /gst | |
parent | 60d8ed7d4f23eea9b41c9ed316b45c75aefec419 (diff) |
rtsp-stream: explicitly set caps on udpsrc elements
This causes them to send caps events before data flow, which is
usually a pretty correct thing to do!
Not doing so manifested in a bug where ssrcdemux wouldn't forward
the caps it had received with an extra ssrc field, as it hadn't
received any caps event.
Fixes #85
Part-of: <https://gitlab.freedesktop.org/gstreamer/gst-rtsp-server/-/merge_requests/141>
Diffstat (limited to 'gst')
-rw-r--r-- | gst/rtsp-server/rtsp-stream.c | 61 |
1 files changed, 53 insertions, 8 deletions
diff --git a/gst/rtsp-server/rtsp-stream.c b/gst/rtsp-server/rtsp-stream.c index c3b3586..7ef3511 100644 --- a/gst/rtsp-server/rtsp-stream.c +++ b/gst/rtsp-server/rtsp-stream.c @@ -3635,13 +3635,17 @@ static gboolean create_receiver_part (GstRTSPStream * stream, const GstRTSPTransport * transport) { + gboolean ret = FALSE; GstRTSPStreamPrivate *priv; GstPad *pad; GstBin *bin; gboolean tcp; gboolean udp; gboolean mcast; + gboolean secure; gint i; + GstCaps *rtp_caps; + GstCaps *rtcp_caps; GST_DEBUG_OBJECT (stream, "create receiver part"); priv = stream->priv; @@ -3650,6 +3654,20 @@ create_receiver_part (GstRTSPStream * stream, const GstRTSPTransport * tcp = transport->lower_transport == GST_RTSP_LOWER_TRANS_TCP; udp = transport->lower_transport == GST_RTSP_LOWER_TRANS_UDP; mcast = transport->lower_transport == GST_RTSP_LOWER_TRANS_UDP_MCAST; + secure = (priv->profiles & GST_RTSP_PROFILE_SAVP) + || (priv->profiles & GST_RTSP_PROFILE_SAVPF); + + if (secure) { + rtp_caps = gst_caps_new_empty_simple ("application/x-srtp"); + rtcp_caps = gst_caps_new_empty_simple ("application/x-srtcp"); + } else { + rtp_caps = gst_caps_new_empty_simple ("application/x-rtp"); + rtcp_caps = gst_caps_new_empty_simple ("application/x-rtcp"); + } + + GST_DEBUG_OBJECT (stream, + "RTP caps: %" GST_PTR_FORMAT " RTCP caps: %" GST_PTR_FORMAT, rtp_caps, + rtcp_caps); for (i = 0; i < 2; i++) { /* For the receiver we create this bit of pipeline for both @@ -3696,7 +3714,13 @@ create_receiver_part (GstRTSPStream * stream, const GstRTSPTransport * GST_DEBUG_OBJECT (stream, "udp IPv4, create and configure udpsources"); if (!create_and_configure_udpsource (&priv->udpsrc_v4[i], priv->socket_v4[i])) - goto udpsrc_error; + goto done; + + if (i == 0) { + g_object_set (priv->udpsrc_v4[i], "caps", rtp_caps, NULL); + } else { + g_object_set (priv->udpsrc_v4[i], "caps", rtcp_caps, NULL); + } plug_src (stream, bin, priv->udpsrc_v4[i], priv->funnel[i]); } @@ -3705,7 +3729,13 @@ create_receiver_part (GstRTSPStream * stream, const GstRTSPTransport * GST_DEBUG_OBJECT (stream, "udp IPv6, create and configure udpsources"); if (!create_and_configure_udpsource (&priv->udpsrc_v6[i], priv->socket_v6[i])) - goto udpsrc_error; + goto done; + + if (i == 0) { + g_object_set (priv->udpsrc_v6[i], "caps", rtp_caps, NULL); + } else { + g_object_set (priv->udpsrc_v6[i], "caps", rtcp_caps, NULL); + } plug_src (stream, bin, priv->udpsrc_v6[i], priv->funnel[i]); } @@ -3714,7 +3744,14 @@ create_receiver_part (GstRTSPStream * stream, const GstRTSPTransport * GST_DEBUG_OBJECT (stream, "mcast IPv4, create and configure udpsources"); if (!create_and_configure_udpsource (&priv->mcast_udpsrc_v4[i], priv->mcast_socket_v4[i])) - goto mcast_udpsrc_error; + goto done; + + if (i == 0) { + g_object_set (priv->mcast_udpsrc_v4[i], "caps", rtp_caps, NULL); + } else { + g_object_set (priv->mcast_udpsrc_v4[i], "caps", rtcp_caps, NULL); + } + plug_src (stream, bin, priv->mcast_udpsrc_v4[i], priv->funnel[i]); } @@ -3722,7 +3759,14 @@ create_receiver_part (GstRTSPStream * stream, const GstRTSPTransport * GST_DEBUG_OBJECT (stream, "mcast IPv6, create and configure udpsources"); if (!create_and_configure_udpsource (&priv->mcast_udpsrc_v6[i], priv->mcast_socket_v6[i])) - goto mcast_udpsrc_error; + goto done; + + if (i == 0) { + g_object_set (priv->mcast_udpsrc_v6[i], "caps", rtp_caps, NULL); + } else { + g_object_set (priv->mcast_udpsrc_v6[i], "caps", rtcp_caps, NULL); + } + plug_src (stream, bin, priv->mcast_udpsrc_v6[i], priv->funnel[i]); } @@ -3738,11 +3782,12 @@ create_receiver_part (GstRTSPStream * stream, const GstRTSPTransport * gst_element_sync_state_with_parent (priv->funnel[i]); } - return TRUE; + ret = TRUE; -mcast_udpsrc_error: -udpsrc_error: - return FALSE; +done: + gst_caps_unref (rtp_caps); + gst_caps_unref (rtcp_caps); + return ret; } static gboolean |