summaryrefslogtreecommitdiff
path: root/ext
diff options
context:
space:
mode:
authorMatthew Waters <matthew@centricular.com>2018-12-18 13:50:43 +1100
committerMatthew Waters <matthew@centricular.com>2018-12-19 00:44:06 +0000
commitb4bdcf15b7237eb5c5943c4f746701a477333000 (patch)
tree2f241c9faa3e8c1cac7af2a2bbd8cbe911092a74 /ext
parent26a5cbddbb70b60a4a66bfd1eea6a87add0160a8 (diff)
downloadgstreamer-plugins-bad-b4bdcf15b7237eb5c5943c4f746701a477333000.tar.gz
webrtc/receive-bin: block pads before dtlssrtpdec:
Fixes SSL errors in fast-start scenarios and whenever media stream may be received before an answer is set.
Diffstat (limited to 'ext')
-rw-r--r--ext/webrtc/transportreceivebin.c108
-rw-r--r--ext/webrtc/transportreceivebin.h2
2 files changed, 67 insertions, 43 deletions
diff --git a/ext/webrtc/transportreceivebin.c b/ext/webrtc/transportreceivebin.c
index 4038cda0d..deeb9fb54 100644
--- a/ext/webrtc/transportreceivebin.c
+++ b/ext/webrtc/transportreceivebin.c
@@ -25,24 +25,24 @@
#include "utils.h"
/*
- * ,----------------------------transport_receive_%u----------------------------,
- * ; (rtp/data) ;
- * ; ,---nicesrc----, ,-capsfilter-, ,---dtlssrtpdec---, ,--funnel--, ;
- * ; ; src o--o sink src o--o sink rtp_src o-------o sink_0 ; ;
- * ; '--------------' '------------' ; ; ; src o--o rtp_src
- * ; ; rtcp_src o---, ,-o sink_1 ; ;
- * ; ; ; ; ; '----------' ;
- * ; ; data_src o-, ; ; ,--funnel--, ;
- * ; '-----------------' ; '-+-o sink_0 ; ;
- * ; ,---dtlssrtpdec---, ; ,-' ; src o--o rtcp_src
- * ; (rtcp) ; rtp_src o-+-' ,-o sink_1 ; ;
- * ; ,---nicesrc----, ,-capsfilter-, ; ; ; ; '----------' ;
- * ; ; src o--o sink src o--o sink rtcp_src o-+---' ,--funnel--, ;
- * ; '--------------' '------------' ; ; '-----o sink_0 ; ;
- * ; ; data_src o-, ; src o--o data_src
- * ; '-----------------' '-----o sink_1 ; ;
- * ; '----------' ;
- * '----------------------------------------------------------------------------'
+ * ,----------------------------transport_receive_%u---------------------------,
+ * ; (rtp/data) ;
+ * ; ,-nicesrc-, ,-capsfilter-, ,--queue--, ,-dtlssrtpdec-, ,-funnel-, ;
+ * ; ; src o-o sink src o-osink srco-osink rtp_srco-------o sink_0 ; ;
+ * ; '---------' '------------' '---------' ; ; ; src o--o rtp_src
+ * ; ; rtcp_srco---, ,-o sink_1 ; ;
+ * ; ; ; ; ; '--------' ;
+ * ; ; data_srco-, ; ; ,-funnel-, ;
+ * ; (rtcp) '-------------' ; '-+-o sink_0 ; ;
+ * ; ,-nicesrc-, ,-capsfilter-, ,--queue--, ,-dtlssrtpdec-, ; ,-' ; src o--o rtcp_src
+ * ; ; src o-o sink src o-osink srco-osink rtp_srco-+-' ,-o sink_1 ; ;
+ * ; '---------' '------------' '---------' ; ; ; ; '--------' ;
+ * ; ; rtcp_srco-+---' ,-funnel-, ;
+ * ; ; ; '-----o sink_0 ; ;
+ * ; ; data_srco-, ; src o--o data_src
+ * ; '-------------' '-----o sink_1 ; ;
+ * ; '--------' ;
+ * '---------------------------------------------------------------------------'
*
* Do we really wnat to be *that* permissive in what we accept?
*
@@ -56,8 +56,7 @@ GST_DEBUG_CATEGORY_STATIC (GST_CAT_DEFAULT);
G_DEFINE_TYPE_WITH_CODE (TransportReceiveBin, transport_receive_bin,
GST_TYPE_BIN,
GST_DEBUG_CATEGORY_INIT (gst_webrtc_transport_receive_bin_debug,
- "webrtctransportreceivebin", 0, "webrtctransportreceivebin");
- );
+ "webrtctransportreceivebin", 0, "webrtctransportreceivebin"););
static GstStaticPadTemplate rtp_sink_template =
GST_STATIC_PAD_TEMPLATE ("rtp_src",
@@ -195,14 +194,29 @@ transport_receive_bin_change_state (GstElement * element,
switch (transition) {
case GST_STATE_CHANGE_NULL_TO_READY:{
- GstElement *elem;
+ GstWebRTCDTLSTransport *transport;
+ GstElement *elem, *dtlssrtpdec;
+ GstPad *pad;
+ transport = receive->stream->transport;
+ dtlssrtpdec = transport->dtlssrtpdec;
+ pad = gst_element_get_static_pad (dtlssrtpdec, "sink");
receive->rtp_block =
- _create_pad_block (GST_ELEMENT (receive), receive->rtp_src, 0, NULL,
- NULL);
+ _create_pad_block (GST_ELEMENT (receive), pad, 0, NULL, NULL);
receive->rtp_block->block_id =
- gst_pad_add_probe (receive->rtp_src, GST_PAD_PROBE_TYPE_ALL_BOTH,
+ gst_pad_add_probe (pad, GST_PAD_PROBE_TYPE_ALL_BOTH,
+ (GstPadProbeCallback) pad_block, receive, NULL);
+ gst_object_unref (pad);
+
+ transport = receive->stream->rtcp_transport;
+ dtlssrtpdec = transport->dtlssrtpdec;
+ pad = gst_element_get_static_pad (dtlssrtpdec, "sink");
+ receive->rtcp_block =
+ _create_pad_block (GST_ELEMENT (receive), pad, 0, NULL, NULL);
+ receive->rtcp_block->block_id =
+ gst_pad_add_probe (pad, GST_PAD_PROBE_TYPE_ALL_BOTH,
(GstPadProbeCallback) pad_block, receive, NULL);
+ gst_object_unref (pad);
/* XXX: because nice needs the nicesrc internal main loop running in order
* correctly STUN... */
@@ -237,6 +251,9 @@ transport_receive_bin_change_state (GstElement * element,
if (receive->rtp_block)
_free_pad_block (receive->rtp_block);
receive->rtp_block = NULL;
+ if (receive->rtcp_block)
+ _free_pad_block (receive->rtcp_block);
+ receive->rtcp_block = NULL;
break;
}
default:
@@ -272,13 +289,21 @@ transport_receive_bin_constructed (GObject * object)
g_object_set (capsfilter, "caps", caps, NULL);
gst_caps_unref (caps);
+ queue = gst_element_factory_make ("queue", NULL);
+ /* FIXME: make this configurable? */
+ g_object_set (queue, "leaky", 2, "max-size-time", (guint64) 0,
+ "max-size-buffers", 0, "max-size-bytes", 5 * 1024 * 1024, NULL);
+ g_signal_connect (queue, "overrun", G_CALLBACK (rtp_queue_overrun), receive);
+
+ gst_bin_add (GST_BIN (receive), GST_ELEMENT (queue));
gst_bin_add (GST_BIN (receive), GST_ELEMENT (capsfilter));
- if (!gst_element_link_pads (capsfilter, "src", transport->dtlssrtpdec,
- "sink"))
+ if (!gst_element_link_pads (capsfilter, "src", queue, "sink"))
g_warn_if_reached ();
- gst_bin_add (GST_BIN (receive), GST_ELEMENT (transport->transport->src));
+ if (!gst_element_link_pads (queue, "src", transport->dtlssrtpdec, "sink"))
+ g_warn_if_reached ();
+ gst_bin_add (GST_BIN (receive), GST_ELEMENT (transport->transport->src));
if (!gst_element_link_pads (GST_ELEMENT (transport->transport->src), "src",
GST_ELEMENT (capsfilter), "sink"))
g_warn_if_reached ();
@@ -292,13 +317,21 @@ transport_receive_bin_constructed (GObject * object)
g_object_set (capsfilter, "caps", caps, NULL);
gst_caps_unref (caps);
+ queue = gst_element_factory_make ("queue", NULL);
+ /* FIXME: make this configurable? */
+ g_object_set (queue, "leaky", 2, "max-size-time", (guint64) 0,
+ "max-size-buffers", 0, "max-size-bytes", 5 * 1024 * 1024, NULL);
+ g_signal_connect (queue, "overrun", G_CALLBACK (rtp_queue_overrun), receive);
+
+ gst_bin_add (GST_BIN (receive), queue);
gst_bin_add (GST_BIN (receive), GST_ELEMENT (capsfilter));
- if (!gst_element_link_pads (capsfilter, "src", transport->dtlssrtpdec,
- "sink"))
+ if (!gst_element_link_pads (capsfilter, "src", queue, "sink"))
g_warn_if_reached ();
- gst_bin_add (GST_BIN (receive), GST_ELEMENT (transport->transport->src));
+ if (!gst_element_link_pads (queue, "src", transport->dtlssrtpdec, "sink"))
+ g_warn_if_reached ();
+ gst_bin_add (GST_BIN (receive), GST_ELEMENT (transport->transport->src));
if (!gst_element_link_pads (GST_ELEMENT (transport->transport->src), "src",
GST_ELEMENT (capsfilter), "sink"))
g_warn_if_reached ();
@@ -313,19 +346,10 @@ transport_receive_bin_constructed (GObject * object)
"rtp_src", funnel, "sink_1"))
g_warn_if_reached ();
- queue = gst_element_factory_make ("queue", NULL);
- /* FIXME: make this configurable? */
- g_object_set (queue, "leaky", 2, "max-size-time", (guint64) 0,
- "max-size-buffers", 0, "max-size-bytes", 5 * 1024 * 1024, NULL);
- g_signal_connect (queue, "overrun", G_CALLBACK (rtp_queue_overrun), receive);
- gst_bin_add (GST_BIN (receive), queue);
- if (!gst_element_link_pads (funnel, "src", queue, "sink"))
- g_warn_if_reached ();
-
- pad = gst_element_get_static_pad (queue, "src");
- receive->rtp_src = gst_ghost_pad_new ("rtp_src", pad);
+ pad = gst_element_get_static_pad (funnel, "src");
+ ghost = gst_ghost_pad_new ("rtp_src", pad);
- gst_element_add_pad (GST_ELEMENT (receive), receive->rtp_src);
+ gst_element_add_pad (GST_ELEMENT (receive), ghost);
gst_object_unref (pad);
/* create funnel for rtcp_src */
diff --git a/ext/webrtc/transportreceivebin.h b/ext/webrtc/transportreceivebin.h
index f26b4ad0f..1d2586d7a 100644
--- a/ext/webrtc/transportreceivebin.h
+++ b/ext/webrtc/transportreceivebin.h
@@ -45,8 +45,8 @@ struct _TransportReceiveBin
TransportStream *stream; /* parent transport stream */
gboolean rtcp_mux;
- GstPad *rtp_src;
struct pad_block *rtp_block;
+ struct pad_block *rtcp_block;
GMutex pad_block_lock;
GCond pad_block_cond;
ReceiveState receive_state;