mirror of
https://gitlab.freedesktop.org/gstreamer/gstreamer.git
synced 2024-11-27 04:01:08 +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