diff options
author | Maksym Khomenko <maksym.khomenko@skelia.partners> | 2023-09-28 17:58:45 +0300 |
---|---|---|
committer | Maksym Khomenko <maksym.khomenko@skelia.partners> | 2023-10-06 12:58:03 +0300 |
commit | a9719cada25170461bfd20fec079a4aa61dc8804 (patch) | |
tree | 766fdb0fc414a31c25a741ac50ea2b2c45079e01 /net | |
parent | 1c4833bc5dd25dcbfe7a850f711791a2d768be96 (diff) |
webrtcsink: add custom signaller example
Part-of: <https://gitlab.freedesktop.org/gstreamer/gst-plugins-rs/-/merge_requests/1340>
Diffstat (limited to 'net')
4 files changed, 115 insertions, 0 deletions
diff --git a/net/webrtc/Cargo.toml b/net/webrtc/Cargo.toml index 134311833..c57eaa962 100644 --- a/net/webrtc/Cargo.toml +++ b/net/webrtc/Cargo.toml @@ -93,3 +93,6 @@ name = "webrtcsink-stats-server" [[example]] name = "webrtcsink-high-quality-tune" + +[[example]] +name = "webrtcsink-custom-signaller" diff --git a/net/webrtc/examples/webrtcsink-custom-signaller/main.rs b/net/webrtc/examples/webrtcsink-custom-signaller/main.rs new file mode 100644 index 000000000..30d688db7 --- /dev/null +++ b/net/webrtc/examples/webrtcsink-custom-signaller/main.rs @@ -0,0 +1,41 @@ +mod signaller; + +// from outside the plugin repository, one would need to add plugin package as follows: +// [dependencies] +// gstrswebrtc = { package = "gst-plugin-webrtc", git = "https://gitlab.freedesktop.org/gstreamer/gst-plugins-rs/" } +extern crate gstrswebrtc; + +use anyhow::Error; +use gst::prelude::*; +use gstrswebrtc::signaller as signaller_interface; +use gstrswebrtc::webrtcsink; + +fn main() -> Result<(), Error> { + gst::init()?; + + let custom_signaller = signaller::MyCustomSignaller::new(); + let webrtcsink = webrtcsink::BaseWebRTCSink::with_signaller( + signaller_interface::Signallable::from(custom_signaller), + ); + + let pipeline = gst::Pipeline::new(); + + let video_src = gst::ElementFactory::make("videotestsrc").build().unwrap(); + + pipeline + .add_many([&video_src, webrtcsink.upcast_ref()]) + .unwrap(); + video_src + .link(webrtcsink.upcast_ref::<gst::Element>()) + .unwrap(); + + let bus = pipeline.bus().unwrap(); + + pipeline.set_state(gst::State::Playing).unwrap(); + + let _msg = bus.timed_pop_filtered(gst::ClockTime::NONE, &[gst::MessageType::Eos]); + + pipeline.set_state(gst::State::Null).unwrap(); + + Ok(()) +} diff --git a/net/webrtc/examples/webrtcsink-custom-signaller/signaller/imp.rs b/net/webrtc/examples/webrtcsink-custom-signaller/signaller/imp.rs new file mode 100644 index 000000000..6d6f2d41e --- /dev/null +++ b/net/webrtc/examples/webrtcsink-custom-signaller/signaller/imp.rs @@ -0,0 +1,48 @@ +use gst::glib; +use gst::subclass::prelude::*; +use gst_webrtc::WebRTCSessionDescription; + +use gstrswebrtc::signaller::{Signallable, SignallableImpl}; + +#[derive(Default)] +pub struct Signaller {} + +impl Signaller {} + +impl SignallableImpl for Signaller { + fn start(&self) { + unimplemented!() + } + + fn stop(&self) { + unimplemented!() + } + + fn send_sdp(&self, _session_id: &str, _sdp: &WebRTCSessionDescription) { + unimplemented!() + } + + fn add_ice( + &self, + _session_id: &str, + _candidate: &str, + _sdp_m_line_index: u32, + _sdp_mid: Option<String>, + ) { + unimplemented!() + } + + fn end_session(&self, _session_id: &str) { + unimplemented!() + } +} + +#[glib::object_subclass] +impl ObjectSubclass for Signaller { + const NAME: &'static str = "MyCustomWebRTCSinkSignaller"; + type Type = super::MyCustomSignaller; + type ParentType = glib::Object; + type Interfaces = (Signallable,); +} + +impl ObjectImpl for Signaller {} diff --git a/net/webrtc/examples/webrtcsink-custom-signaller/signaller/mod.rs b/net/webrtc/examples/webrtcsink-custom-signaller/signaller/mod.rs new file mode 100644 index 000000000..64f50f8f4 --- /dev/null +++ b/net/webrtc/examples/webrtcsink-custom-signaller/signaller/mod.rs @@ -0,0 +1,23 @@ +use gst::glib; +use gstrswebrtc::signaller::Signallable; + +mod imp; + +glib::wrapper! { + pub struct MyCustomSignaller(ObjectSubclass<imp::Signaller>) @implements Signallable; +} + +unsafe impl Send for MyCustomSignaller {} +unsafe impl Sync for MyCustomSignaller {} + +impl MyCustomSignaller { + pub fn new() -> Self { + glib::Object::new() + } +} + +impl Default for MyCustomSignaller { + fn default() -> Self { + MyCustomSignaller::new() + } +} |