mirror of
https://gitlab.freedesktop.org/gstreamer/gstreamer.git
synced 2024-11-27 12:11:13 +00:00
multiparty/rust: Add Rust version of multiparty demo
Different to the C version this also mixes all participants into a grid with videomixer.
This commit is contained in:
parent
9a46977a4c
commit
5e18b460b3
4 changed files with 2522 additions and 0 deletions
1366
webrtc/multiparty-sendrecv/gst-rust/Cargo.lock
generated
Normal file
1366
webrtc/multiparty-sendrecv/gst-rust/Cargo.lock
generated
Normal file
File diff suppressed because it is too large
Load diff
20
webrtc/multiparty-sendrecv/gst-rust/Cargo.toml
Normal file
20
webrtc/multiparty-sendrecv/gst-rust/Cargo.toml
Normal file
|
@ -0,0 +1,20 @@
|
||||||
|
[package]
|
||||||
|
name = "webrtc-app"
|
||||||
|
version = "0.1.0"
|
||||||
|
authors = ["Sebastian Dröge <sebastian@centricular.com>"]
|
||||||
|
edition = "2018"
|
||||||
|
|
||||||
|
[dependencies]
|
||||||
|
futures = "0.3"
|
||||||
|
async-std = "1"
|
||||||
|
structopt = { version = "0.3", default-features = false }
|
||||||
|
anyhow = "1"
|
||||||
|
url = "2"
|
||||||
|
rand = "0.7"
|
||||||
|
async-tungstenite = "0.2"
|
||||||
|
gst = { package = "gstreamer", version = "0.14", features = ["v1_14"] }
|
||||||
|
gst-webrtc = { package = "gstreamer-webrtc", version = "0.14" }
|
||||||
|
gst-sdp = { package = "gstreamer-sdp", version = "0.14", features = ["v1_14"] }
|
||||||
|
serde = "1"
|
||||||
|
serde_derive = "1"
|
||||||
|
serde_json = "1"
|
67
webrtc/multiparty-sendrecv/gst-rust/src/macos_workaround.rs
Normal file
67
webrtc/multiparty-sendrecv/gst-rust/src/macos_workaround.rs
Normal file
|
@ -0,0 +1,67 @@
|
||||||
|
/// macOS has a specific requirement that there must be a run loop running
|
||||||
|
/// on the main thread in order to open windows and use OpenGL.
|
||||||
|
|
||||||
|
#[cfg(target_os = "macos")]
|
||||||
|
mod runloop {
|
||||||
|
use std::os::raw::c_void;
|
||||||
|
#[repr(C)]
|
||||||
|
pub struct CFRunLoop(*mut c_void);
|
||||||
|
|
||||||
|
#[link(name = "foundation", kind = "framework")]
|
||||||
|
extern "C" {
|
||||||
|
fn CFRunLoopRun();
|
||||||
|
fn CFRunLoopGetMain() -> *mut c_void;
|
||||||
|
fn CFRunLoopStop(l: *mut c_void);
|
||||||
|
}
|
||||||
|
|
||||||
|
impl CFRunLoop {
|
||||||
|
pub fn run() {
|
||||||
|
unsafe {
|
||||||
|
CFRunLoopRun();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
pub fn get_main() -> CFRunLoop {
|
||||||
|
unsafe {
|
||||||
|
let r = CFRunLoopGetMain();
|
||||||
|
assert!(!r.is_null());
|
||||||
|
CFRunLoop(r)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
pub fn stop(&self) {
|
||||||
|
unsafe { CFRunLoopStop(self.0) }
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
unsafe impl Send for CFRunLoop {}
|
||||||
|
}
|
||||||
|
|
||||||
|
/// On macOS this launches the callback function on a thread.
|
||||||
|
/// On other platforms it's just executed immediately.
|
||||||
|
#[cfg(not(target_os = "macos"))]
|
||||||
|
pub fn run<T, F: FnOnce() -> T + Send + 'static>(main: F) -> T
|
||||||
|
where
|
||||||
|
T: Send + 'static,
|
||||||
|
{
|
||||||
|
main()
|
||||||
|
}
|
||||||
|
|
||||||
|
#[cfg(target_os = "macos")]
|
||||||
|
pub fn run<T, F: FnOnce() -> T + Send + 'static>(main: F) -> T
|
||||||
|
where
|
||||||
|
T: Send + 'static,
|
||||||
|
{
|
||||||
|
use std::thread;
|
||||||
|
|
||||||
|
let l = runloop::CFRunLoop::get_main();
|
||||||
|
let t = thread::spawn(move || {
|
||||||
|
let res = main();
|
||||||
|
l.stop();
|
||||||
|
res
|
||||||
|
});
|
||||||
|
|
||||||
|
runloop::CFRunLoop::run();
|
||||||
|
|
||||||
|
t.join().unwrap()
|
||||||
|
}
|
1069
webrtc/multiparty-sendrecv/gst-rust/src/main.rs
Normal file
1069
webrtc/multiparty-sendrecv/gst-rust/src/main.rs
Normal file
File diff suppressed because it is too large
Load diff
Loading…
Reference in a new issue