diff --git a/ext/webrtc/gstwebrtcbin.c b/ext/webrtc/gstwebrtcbin.c index 772719c256..141440a534 100644 --- a/ext/webrtc/gstwebrtcbin.c +++ b/ext/webrtc/gstwebrtcbin.c @@ -1639,29 +1639,6 @@ _on_data_channel_ready_state (GstWebRTCDataChannel * channel, } } -static void -_link_data_channel_to_sctp (GstWebRTCBin * webrtc, - GstWebRTCDataChannel * channel) -{ - if (webrtc->priv->sctp_transport && !channel->sctp_transport) { - gint id; - - g_object_get (channel, "id", &id, NULL); - - if (webrtc->priv->sctp_transport->association_established && id != -1) { - gchar *pad_name; - - gst_webrtc_data_channel_set_sctp_transport (channel, - webrtc->priv->sctp_transport); - pad_name = g_strdup_printf ("sink_%u", id); - if (!gst_element_link_pads (channel->appsrc, "src", - channel->sctp_transport->sctpenc, pad_name)) - g_warn_if_reached (); - g_free (pad_name); - } - } -} - static void _on_sctpdec_pad_added (GstElement * sctpdec, GstPad * pad, GstWebRTCBin * webrtc) @@ -1686,7 +1663,8 @@ _on_sctpdec_pad_added (GstElement * sctpdec, GstPad * pad, gst_element_sync_state_with_parent (channel->appsrc); gst_element_sync_state_with_parent (channel->appsink); - _link_data_channel_to_sctp (webrtc, channel); + gst_webrtc_data_channel_link_to_sctp (channel, + webrtc->priv->sctp_transport); g_array_append_val (webrtc->priv->pending_data_channels, channel); } @@ -1723,7 +1701,8 @@ _on_sctp_state_notify (GstWebRTCSCTPTransport * sctp, GParamSpec * pspec, g_array_index (webrtc->priv->data_channels, GstWebRTCDataChannel *, i); - _link_data_channel_to_sctp (webrtc, channel); + gst_webrtc_data_channel_link_to_sctp (channel, + webrtc->priv->sctp_transport); if (!channel->negotiated && !channel->opened) gst_webrtc_data_channel_start_negotiation (channel); @@ -1783,7 +1762,8 @@ _get_or_create_data_channel_transports (GstWebRTCBin * webrtc, guint session_id) g_array_index (webrtc->priv->data_channels, GstWebRTCDataChannel *, i); - _link_data_channel_to_sctp (webrtc, channel); + gst_webrtc_data_channel_link_to_sctp (channel, + webrtc->priv->sctp_transport); } gst_element_sync_state_with_parent (GST_ELEMENT (stream->send_bin)); @@ -3741,7 +3721,8 @@ _update_data_channel_from_sdp_media (GstWebRTCBin * webrtc, if (webrtc->priv->sctp_transport->association_established && !channel->negotiated && !channel->opened) { - _link_data_channel_to_sctp (webrtc, channel); + gst_webrtc_data_channel_link_to_sctp (channel, + webrtc->priv->sctp_transport); gst_webrtc_data_channel_start_negotiation (channel); } } @@ -4607,7 +4588,7 @@ gst_webrtc_bin_create_data_channel (GstWebRTCBin * webrtc, const gchar * label, ret = gst_object_ref (ret); ret->webrtcbin = webrtc; g_array_append_val (webrtc->priv->data_channels, ret); - _link_data_channel_to_sctp (webrtc, ret); + gst_webrtc_data_channel_link_to_sctp (ret, webrtc->priv->sctp_transport); if (webrtc->priv->sctp_transport && webrtc->priv->sctp_transport->association_established && !ret->negotiated) { diff --git a/ext/webrtc/webrtcdatachannel.c b/ext/webrtc/webrtcdatachannel.c index 7aee403799..5655da9639 100644 --- a/ext/webrtc/webrtcdatachannel.c +++ b/ext/webrtc/webrtcdatachannel.c @@ -916,30 +916,6 @@ _on_sctp_notify_state (GObject * sctp_transport, GParamSpec * pspec, GST_OBJECT_UNLOCK (channel); } -void -gst_webrtc_data_channel_set_sctp_transport (GstWebRTCDataChannel * channel, - GstWebRTCSCTPTransport * sctp) -{ - g_return_if_fail (GST_IS_WEBRTC_DATA_CHANNEL (channel)); - g_return_if_fail (GST_IS_WEBRTC_SCTP_TRANSPORT (sctp)); - - GST_OBJECT_LOCK (channel); - if (channel->sctp_transport) - g_signal_handlers_disconnect_by_data (channel->sctp_transport, channel); - - gst_object_replace ((GstObject **) & channel->sctp_transport, - GST_OBJECT (sctp)); - - if (sctp) { - g_signal_connect (sctp, "stream-reset", G_CALLBACK (_on_sctp_reset_stream), - channel); - g_signal_connect (sctp, "notify::state", G_CALLBACK (_on_sctp_notify_state), - channel); - _on_sctp_notify_state_unlocked (G_OBJECT (sctp), channel); - } - GST_OBJECT_UNLOCK (channel); -} - static void gst_webrtc_data_channel_set_property (GObject * object, guint prop_id, const GValue * value, GParamSpec * pspec) @@ -1321,3 +1297,49 @@ static void gst_webrtc_data_channel_init (GstWebRTCDataChannel * channel) { } + +static void +_data_channel_set_sctp_transport (GstWebRTCDataChannel * channel, + GstWebRTCSCTPTransport * sctp) +{ + g_return_if_fail (GST_IS_WEBRTC_DATA_CHANNEL (channel)); + g_return_if_fail (GST_IS_WEBRTC_SCTP_TRANSPORT (sctp)); + + GST_OBJECT_LOCK (channel); + if (channel->sctp_transport) + g_signal_handlers_disconnect_by_data (channel->sctp_transport, channel); + + gst_object_replace ((GstObject **) & channel->sctp_transport, + GST_OBJECT (sctp)); + + if (sctp) { + g_signal_connect (sctp, "stream-reset", G_CALLBACK (_on_sctp_reset_stream), + channel); + g_signal_connect (sctp, "notify::state", G_CALLBACK (_on_sctp_notify_state), + channel); + _on_sctp_notify_state_unlocked (G_OBJECT (sctp), channel); + } + GST_OBJECT_UNLOCK (channel); +} + +void +gst_webrtc_data_channel_link_to_sctp (GstWebRTCDataChannel * channel, + GstWebRTCSCTPTransport * sctp_transport) +{ + if (sctp_transport && !channel->sctp_transport) { + gint id; + + g_object_get (channel, "id", &id, NULL); + + if (sctp_transport->association_established && id != -1) { + gchar *pad_name; + + _data_channel_set_sctp_transport (channel, sctp_transport); + pad_name = g_strdup_printf ("sink_%u", id); + if (!gst_element_link_pads (channel->appsrc, "src", + channel->sctp_transport->sctpenc, pad_name)) + g_warn_if_reached (); + g_free (pad_name); + } + } +}