webrtc/dc: move some code from webrtcbin into the datachannel

This commit is contained in:
Matthew Waters 2019-03-08 00:32:53 +11:00
parent a51db86ac4
commit be011d2086
2 changed files with 55 additions and 52 deletions

View file

@ -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) {

View file

@ -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);
}
}
}