From 6b11284e8a83bf2c5f91f2d5d63651e0c0e1cf14 Mon Sep 17 00:00:00 2001 From: Thibault Saunier Date: Wed, 9 Nov 2022 15:44:02 -0300 Subject: [PATCH] webrtcsink: Make the turn-server prop a `turn-servers` list So that we can simply specify several turn servers at once Part-of: --- docs/plugins/gst_plugins_cache.json | 9 ++++---- net/webrtc/src/webrtcsink/imp.rs | 36 ++++++++++++++++------------- 2 files changed, 24 insertions(+), 21 deletions(-) diff --git a/docs/plugins/gst_plugins_cache.json b/docs/plugins/gst_plugins_cache.json index c606db33..7d67b603 100644 --- a/docs/plugins/gst_plugins_cache.json +++ b/docs/plugins/gst_plugins_cache.json @@ -5840,16 +5840,15 @@ "type": "gchararray", "writable": true }, - "turn-server": { - "blurb": "The TURN server of the form turn(s)://username:password@host:port.", + "turn-servers": { + "blurb": "The TURN servers of the form <\"turn(s)://username:password@host:port\", \"turn(s)://username1:password1@host1:port1\">", "conditionally-available": false, "construct": false, "construct-only": false, "controllable": false, - "default": "NULL", - "mutable": "null", + "mutable": "ready", "readable": true, - "type": "gchararray", + "type": "GstValueArray", "writable": true }, "video-caps": { diff --git a/net/webrtc/src/webrtcsink/imp.rs b/net/webrtc/src/webrtcsink/imp.rs index 4b8074fb..3b4c2809 100644 --- a/net/webrtc/src/webrtcsink/imp.rs +++ b/net/webrtc/src/webrtcsink/imp.rs @@ -67,7 +67,7 @@ struct CCInfo { struct Settings { video_caps: gst::Caps, audio_caps: gst::Caps, - turn_server: Option, + turn_servers: gst::Array, stun_server: Option, cc_info: CCInfo, do_fec: bool, @@ -271,7 +271,7 @@ impl Default for Settings { .map(|s| gst::Structure::new_empty(s)) .collect::(), stun_server: DEFAULT_STUN_SERVER.map(String::from), - turn_server: None, + turn_servers: gst::Array::new(Vec::new() as Vec), cc_info: CCInfo { heuristic: WebRTCSinkCongestionControl::GoogleCongestionControl, min_bitrate: DEFAULT_MIN_BITRATE, @@ -1420,8 +1420,8 @@ impl WebRTCSink { webrtcbin.set_property("stun-server", stun_server); } - if let Some(turn_server) = settings.turn_server.as_ref() { - webrtcbin.set_property("turn-server", turn_server); + for turn_server in settings.turn_servers.iter() { + webrtcbin.emit_by_name::("add-turn-server", &[&turn_server]); } let rtpgccbwe = match settings.cc_info.heuristic { @@ -2372,12 +2372,18 @@ impl ObjectImpl for WebRTCSink { DEFAULT_STUN_SERVER, glib::ParamFlags::READWRITE, ), - glib::ParamSpecString::new( - "turn-server", - "TURN Server", - "The TURN server of the form turn(s)://username:password@host:port.", - None, - glib::ParamFlags::READWRITE, + gst::ParamSpecArray::new( + "turn-servers", + "List of TURN Servers to user", + "The TURN servers of the form <\"turn(s)://username:password@host:port\", \"turn(s)://username1:password1@host1:port1\">", + Some(&glib::ParamSpecString::new( + "turn-server", + "TURN Server", + "The TURN server of the form turn(s)://username:password@host:port.", + None, + glib::ParamFlags::READWRITE, + )), + glib::ParamFlags::READWRITE | gst::PARAM_FLAG_MUTABLE_READY, ), glib::ParamSpecEnum::new( "congestion-control", @@ -2477,11 +2483,9 @@ impl ObjectImpl for WebRTCSink { .get::>() .expect("type checked upstream") } - "turn-server" => { + "turn-servers" => { let mut settings = self.settings.lock().unwrap(); - settings.turn_server = value - .get::>() - .expect("type checked upstream") + settings.turn_servers = value.get::().expect("type checked upstream") } "congestion-control" => { let mut settings = self.settings.lock().unwrap(); @@ -2542,9 +2546,9 @@ impl ObjectImpl for WebRTCSink { let settings = self.settings.lock().unwrap(); settings.stun_server.to_value() } - "turn-server" => { + "turn-servers" => { let settings = self.settings.lock().unwrap(); - settings.turn_server.to_value() + settings.turn_servers.to_value() } "min-bitrate" => { let settings = self.settings.lock().unwrap();