diff options
author | Maksym Khomenko <maksym.khomenko@skelia.partners> | 2023-11-04 00:24:54 +0300 |
---|---|---|
committer | GStreamer Marge Bot <gitlab-merge-bot@gstreamer-foundation.org> | 2023-11-04 13:19:45 +0300 |
commit | e5fd2c3568e1e66e344153b2f9c200155f20395d (patch) | |
tree | a5f5c4bee59d5375e05074a192c9f07849baf46a /net | |
parent | 5371eb52adea01b2bcd697fefe3e7487d72eaa85 (diff) |
webrtcsrc: add turn-servers property
Part-of: <https://gitlab.freedesktop.org/gstreamer/gst-plugins-rs/-/merge_requests/1380>
Diffstat (limited to 'net')
-rw-r--r-- | net/webrtc/src/webrtcsrc/imp.rs | 42 |
1 files changed, 35 insertions, 7 deletions
diff --git a/net/webrtc/src/webrtcsrc/imp.rs b/net/webrtc/src/webrtcsrc/imp.rs index 465ca34c4..8b27cecf6 100644 --- a/net/webrtc/src/webrtcsrc/imp.rs +++ b/net/webrtc/src/webrtcsrc/imp.rs @@ -34,6 +34,7 @@ const RTP_TWCC_URI: &str = struct Settings { stun_server: Option<String>, + turn_servers: gst::Array, signaller: Signallable, meta: Option<gst::Structure>, video_codecs: Vec<Codec>, @@ -62,8 +63,21 @@ impl ObjectImpl for WebRTCSrc { static PROPS: Lazy<Vec<glib::ParamSpec>> = Lazy::new(|| { vec![ glib::ParamSpecString::builder("stun-server") + .nick("The STUN server to use") + .blurb("The STUN server of the form stun://host:port") .flags(glib::ParamFlags::READWRITE) .default_value(DEFAULT_STUN_SERVER) + .mutable_ready() + .build(), + gst::ParamSpecArray::builder("turn-servers") + .nick("List of TURN servers to use") + .blurb("The TURN servers of the form <\"turn(s)://username:password@host:port\", \"turn(s)://username1:password1@host1:port1\">") + .element_spec(&glib::ParamSpecString::builder("turn-server") + .nick("TURN Server") + .blurb("The TURN server of the form turn(s)://username:password@host:port.") + .build() + ) + .mutable_ready() .build(), glib::ParamSpecObject::builder::<Signallable>("signaller") .flags(glib::ParamFlags::READWRITE | glib::ParamFlags::CONSTRUCT_ONLY) @@ -114,29 +128,33 @@ impl ObjectImpl for WebRTCSrc { "video-codecs" => { self.settings.lock().unwrap().video_codecs = value .get::<gst::ArrayRef>() - .expect("Type checked upstream") + .expect("type checked upstream") .as_slice() .iter() .filter_map(|codec_name| { - Codecs::find(codec_name.get::<&str>().expect("Type checked upstream")) + Codecs::find(codec_name.get::<&str>().expect("type checked upstream")) }) .collect::<Vec<Codec>>() } "audio-codecs" => { self.settings.lock().unwrap().audio_codecs = value .get::<gst::ArrayRef>() - .expect("Type checked upstream") + .expect("type checked upstream") .as_slice() .iter() .filter_map(|codec_name| { - Codecs::find(codec_name.get::<&str>().expect("Type checked upstream")) + Codecs::find(codec_name.get::<&str>().expect("type checked upstream")) }) .collect::<Vec<Codec>>() } "stun-server" => { self.settings.lock().unwrap().stun_server = value .get::<Option<String>>() - .expect("type checked upstream") + .expect("type checked upstream"); + } + "turn-servers" => { + let mut settings = self.settings.lock().unwrap(); + settings.turn_servers = value.get::<gst::Array>().expect("type checked upstream"); } "meta" => { self.settings.lock().unwrap().meta = value @@ -173,6 +191,7 @@ impl ObjectImpl for WebRTCSrc { ) .to_value(), "stun-server" => self.settings.lock().unwrap().stun_server.to_value(), + "turn-servers" => self.settings.lock().unwrap().turn_servers.to_value(), "meta" => self.settings.lock().unwrap().meta.to_value(), "enable-data-channel-navigation" => { let settings = self.settings.lock().unwrap(); @@ -233,6 +252,7 @@ impl Default for Settings { Self { stun_server: DEFAULT_STUN_SERVER.map(|v| v.to_string()), + turn_servers: Default::default(), signaller: signaller.upcast(), meta: Default::default(), audio_codecs: Codecs::audio_codecs() @@ -475,8 +495,16 @@ impl WebRTCSrc { .build() .with_context(|| "Failed to make element webrtcbin".to_string())?; - if let Some(stun_server) = self.settings.lock().unwrap().stun_server.as_ref() { - webrtcbin.set_property("stun-server", stun_server); + { + let settings = self.settings.lock().unwrap(); + + if let Some(stun_server) = settings.stun_server.as_ref() { + webrtcbin.set_property("stun-server", stun_server); + } + + for turn_server in settings.turn_servers.iter() { + webrtcbin.emit_by_name::<bool>("add-turn-server", &[&turn_server]); + } } let bin = gst::Bin::new(); |