From 4810008afa1fbb89d0e84bc0aaa0a3f97506b1bb Mon Sep 17 00:00:00 2001 From: Alba Mendez Date: Tue, 18 Oct 2022 11:16:20 +0200 Subject: [PATCH] webrtcbin: support adding TURN servers after pipeline start Fixes https://gitlab.freedesktop.org/gstreamer/gst-plugins-bad/-/issues/1680 When a TURN server is added for the first time, propagate the change to all nice streams that already exist. This lets us add servers after the pipeline has been started (and streams have been added). Part-of: --- .../gst-libs/gst/webrtc/nice/nice.c | 28 ++++++++++++++++++- 1 file changed, 27 insertions(+), 1 deletion(-) diff --git a/subprojects/gst-plugins-bad/gst-libs/gst/webrtc/nice/nice.c b/subprojects/gst-plugins-bad/gst-libs/gst/webrtc/nice/nice.c index 836646f6b8..ce1e430536 100644 --- a/subprojects/gst-plugins-bad/gst-libs/gst/webrtc/nice/nice.c +++ b/subprojects/gst-plugins-bad/gst-libs/gst/webrtc/nice/nice.c @@ -932,17 +932,43 @@ gst_webrtc_nice_set_remote_credentials (GstWebRTCICE * ice, return TRUE; } +typedef struct +{ + GstWebRTCNice *ice; + GstUri *turn_server; +} AddTurnServerToStreamData; + +static gboolean +_add_turn_server_foreach_stream_func (struct NiceStreamItem *item, + gpointer data) +{ + AddTurnServerToStreamData *add_data = (AddTurnServerToStreamData *) data; + _add_turn_server (add_data->ice, item, add_data->turn_server); + return TRUE; +} + static gboolean gst_webrtc_nice_add_turn_server (GstWebRTCICE * ice, const gchar * uri) { gboolean ret = FALSE; GstUri *valid_uri; GstWebRTCNice *nice = GST_WEBRTC_NICE (ice); + gboolean inserted; + AddTurnServerToStreamData add_data; if (!(valid_uri = _validate_turn_server (nice, uri))) goto done; - g_hash_table_insert (nice->priv->turn_servers, g_strdup (uri), valid_uri); + inserted = + g_hash_table_insert (nice->priv->turn_servers, g_strdup (uri), valid_uri); + + /* add the turn server to any streams that were already created */ + if (inserted) { + add_data.ice = nice; + add_data.turn_server = valid_uri; + _nice_stream_item_foreach (nice, _add_turn_server_foreach_stream_func, + &add_data); + } ret = TRUE;