mirror of
https://gitlab.freedesktop.org/gstreamer/gst-plugins-rs.git
synced 2025-02-10 10:02:31 +00:00
webrtcsrc: add turn-servers property
Part-of: <https://gitlab.freedesktop.org/gstreamer/gst-plugins-rs/-/merge_requests/1387>
This commit is contained in:
parent
8355f93f5f
commit
19597b3737
2 changed files with 50 additions and 7 deletions
|
@ -6227,17 +6227,28 @@
|
||||||
"writable": true
|
"writable": true
|
||||||
},
|
},
|
||||||
"stun-server": {
|
"stun-server": {
|
||||||
"blurb": "NULL",
|
"blurb": "The STUN server of the form stun://host:port",
|
||||||
"conditionally-available": false,
|
"conditionally-available": false,
|
||||||
"construct": false,
|
"construct": false,
|
||||||
"construct-only": false,
|
"construct-only": false,
|
||||||
"controllable": false,
|
"controllable": false,
|
||||||
"default": "stun://stun.l.google.com:19302",
|
"default": "stun://stun.l.google.com:19302",
|
||||||
"mutable": "null",
|
"mutable": "ready",
|
||||||
"readable": true,
|
"readable": true,
|
||||||
"type": "gchararray",
|
"type": "gchararray",
|
||||||
"writable": true
|
"writable": true
|
||||||
},
|
},
|
||||||
|
"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,
|
||||||
|
"mutable": "ready",
|
||||||
|
"readable": true,
|
||||||
|
"type": "GstValueArray",
|
||||||
|
"writable": true
|
||||||
|
},
|
||||||
"video-codecs": {
|
"video-codecs": {
|
||||||
"blurb": "Names of video codecs to be be used during the SDP negotiation. Valid values: [VP8, H264, VP9, H265]",
|
"blurb": "Names of video codecs to be be used during the SDP negotiation. Valid values: [VP8, H264, VP9, H265]",
|
||||||
"conditionally-available": false,
|
"conditionally-available": false,
|
||||||
|
|
|
@ -138,6 +138,7 @@ const RTP_TWCC_URI: &str =
|
||||||
|
|
||||||
struct Settings {
|
struct Settings {
|
||||||
stun_server: Option<String>,
|
stun_server: Option<String>,
|
||||||
|
turn_servers: gst::Array,
|
||||||
signaller: Signallable,
|
signaller: Signallable,
|
||||||
meta: Option<gst::Structure>,
|
meta: Option<gst::Structure>,
|
||||||
video_codecs: Vec<Codec>,
|
video_codecs: Vec<Codec>,
|
||||||
|
@ -165,8 +166,21 @@ impl ObjectImpl for WebRTCSrc {
|
||||||
static PROPS: Lazy<Vec<glib::ParamSpec>> = Lazy::new(|| {
|
static PROPS: Lazy<Vec<glib::ParamSpec>> = Lazy::new(|| {
|
||||||
vec![
|
vec![
|
||||||
glib::ParamSpecString::builder("stun-server")
|
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)
|
.flags(glib::ParamFlags::READWRITE)
|
||||||
.default_value(DEFAULT_STUN_SERVER)
|
.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(),
|
.build(),
|
||||||
glib::ParamSpecObject::builder::<Signallable>("signaller")
|
glib::ParamSpecObject::builder::<Signallable>("signaller")
|
||||||
.flags(glib::ParamFlags::READWRITE | gst::PARAM_FLAG_MUTABLE_READY)
|
.flags(glib::ParamFlags::READWRITE | gst::PARAM_FLAG_MUTABLE_READY)
|
||||||
|
@ -215,7 +229,7 @@ impl ObjectImpl for WebRTCSrc {
|
||||||
"video-codecs" => {
|
"video-codecs" => {
|
||||||
self.settings.lock().unwrap().video_codecs = value
|
self.settings.lock().unwrap().video_codecs = value
|
||||||
.get::<gst::ArrayRef>()
|
.get::<gst::ArrayRef>()
|
||||||
.expect("Type checked upstream")
|
.expect("type checked upstream")
|
||||||
.as_slice()
|
.as_slice()
|
||||||
.iter()
|
.iter()
|
||||||
.filter_map(|codec_name| {
|
.filter_map(|codec_name| {
|
||||||
|
@ -224,7 +238,7 @@ impl ObjectImpl for WebRTCSrc {
|
||||||
.find(|codec| {
|
.find(|codec| {
|
||||||
codec.stream_type == gst::StreamType::VIDEO
|
codec.stream_type == gst::StreamType::VIDEO
|
||||||
&& codec.name
|
&& codec.name
|
||||||
== codec_name.get::<&str>().expect("Type checked upstream")
|
== codec_name.get::<&str>().expect("type checked upstream")
|
||||||
})
|
})
|
||||||
.cloned()
|
.cloned()
|
||||||
})
|
})
|
||||||
|
@ -233,7 +247,7 @@ impl ObjectImpl for WebRTCSrc {
|
||||||
"audio-codecs" => {
|
"audio-codecs" => {
|
||||||
self.settings.lock().unwrap().audio_codecs = value
|
self.settings.lock().unwrap().audio_codecs = value
|
||||||
.get::<gst::ArrayRef>()
|
.get::<gst::ArrayRef>()
|
||||||
.expect("Type checked upstream")
|
.expect("type checked upstream")
|
||||||
.as_slice()
|
.as_slice()
|
||||||
.iter()
|
.iter()
|
||||||
.filter_map(|codec_name| {
|
.filter_map(|codec_name| {
|
||||||
|
@ -242,7 +256,7 @@ impl ObjectImpl for WebRTCSrc {
|
||||||
.find(|codec| {
|
.find(|codec| {
|
||||||
codec.stream_type == gst::StreamType::AUDIO
|
codec.stream_type == gst::StreamType::AUDIO
|
||||||
&& codec.name
|
&& codec.name
|
||||||
== codec_name.get::<&str>().expect("Type checked upstream")
|
== codec_name.get::<&str>().expect("type checked upstream")
|
||||||
})
|
})
|
||||||
.cloned()
|
.cloned()
|
||||||
})
|
})
|
||||||
|
@ -251,7 +265,11 @@ impl ObjectImpl for WebRTCSrc {
|
||||||
"stun-server" => {
|
"stun-server" => {
|
||||||
self.settings.lock().unwrap().stun_server = value
|
self.settings.lock().unwrap().stun_server = value
|
||||||
.get::<Option<String>>()
|
.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" => {
|
"meta" => {
|
||||||
self.settings.lock().unwrap().meta = value
|
self.settings.lock().unwrap().meta = value
|
||||||
|
@ -284,6 +302,7 @@ impl ObjectImpl for WebRTCSrc {
|
||||||
)
|
)
|
||||||
.to_value(),
|
.to_value(),
|
||||||
"stun-server" => self.settings.lock().unwrap().stun_server.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(),
|
"meta" => self.settings.lock().unwrap().meta.to_value(),
|
||||||
name => panic!("{} getter not implemented", name),
|
name => panic!("{} getter not implemented", name),
|
||||||
}
|
}
|
||||||
|
@ -308,6 +327,7 @@ impl Default for Settings {
|
||||||
|
|
||||||
Self {
|
Self {
|
||||||
stun_server: DEFAULT_STUN_SERVER.map(|v| v.to_string()),
|
stun_server: DEFAULT_STUN_SERVER.map(|v| v.to_string()),
|
||||||
|
turn_servers: gst::Array::from_values([]),
|
||||||
signaller: signaller.upcast(),
|
signaller: signaller.upcast(),
|
||||||
meta: Default::default(),
|
meta: Default::default(),
|
||||||
audio_codecs: CODECS
|
audio_codecs: CODECS
|
||||||
|
@ -469,6 +489,18 @@ impl WebRTCSrc {
|
||||||
.build()
|
.build()
|
||||||
.with_context(|| "Failed to make element webrtcbin".to_string())?;
|
.with_context(|| "Failed to make element webrtcbin".to_string())?;
|
||||||
|
|
||||||
|
{
|
||||||
|
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(None);
|
let bin = gst::Bin::new(None);
|
||||||
bin.connect_pad_removed(glib::clone!(@weak self as this => move |_, pad|
|
bin.connect_pad_removed(glib::clone!(@weak self as this => move |_, pad|
|
||||||
this.state.lock().unwrap().flow_combiner.remove_pad(pad);
|
this.state.lock().unwrap().flow_combiner.remove_pad(pad);
|
||||||
|
|
Loading…
Reference in a new issue