diff --git a/Cargo.lock b/Cargo.lock index 4f94564..663d95a 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -184,6 +184,17 @@ dependencies = [ "objc", ] +[[package]] +name = "colibri" +version = "0.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e90829b3ef30aafd6f707b32665623656cae1c3fd5dfdf090f41bb8855f336d5" +dependencies = [ + "serde", + "serde_json", + "serde_with", +] + [[package]] name = "core-foundation" version = "0.9.1" @@ -512,6 +523,7 @@ version = "0.2.2" dependencies = [ "anyhow", "cocoa", + "colibri", "futures", "glib", "gstreamer", @@ -694,6 +706,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "19e0935b518d535e6de070bdcfc9ab8970cefc57b94ef13b26baf6967cf65a73" dependencies = [ "minidom-gst-meet", + "serde", ] [[package]] @@ -719,12 +732,13 @@ checksum = "e2abad23fbc42b3700f2f279844dc832adb2b2eb069b2df918f455c4e18cc646" [[package]] name = "lib-gst-meet" -version = "0.3.1" +version = "0.4.0" dependencies = [ "anyhow", "async-stream", "async-trait", "bytes", + "colibri", "futures", "glib", "gstreamer", @@ -885,9 +899,9 @@ dependencies = [ [[package]] name = "nix" -version = "0.22.1" +version = "0.22.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e7555d6c7164cc913be1ce7f95cbecdabda61eb2ccd89008524af306fb7f5031" +checksum = "d3bb9a13fa32bc5aeb64150cd3f32d6cf4c748f8f8a417cce5d2eb976a8370ba" dependencies = [ "bitflags", "cc", @@ -1118,9 +1132,9 @@ dependencies = [ [[package]] name = "quote" -version = "1.0.9" +version = "1.0.10" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c3d0b9745dc2debf507c8422de05d7226cc1f0644216dfdfead988f9b1ab32a7" +checksum = "38bc8cc6a5f2e3655e0899c1b848643b2562f853f114bfec7be120678e3ace05" dependencies = [ "proc-macro2", ] @@ -1389,9 +1403,9 @@ checksum = "c307a32c1c5c437f38c7fd45d753050587732ba8628319fbdf12a7e289ccc590" [[package]] name = "smallvec" -version = "1.6.1" +version = "1.7.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fe0f37c9e8f3c5a4a66ad655a93c74daac4ad00c441533bf5c6e7990bb42604e" +checksum = "1ecab6c735a6bb4139c0caafd0cc3635748bbb3acf4550e8138122099251f309" [[package]] name = "spin" @@ -1455,9 +1469,9 @@ checksum = "6bdef32e8150c2a081110b42772ffe7d7c9032b606bc226c8260fd97e0976601" [[package]] name = "syn" -version = "1.0.77" +version = "1.0.80" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5239bc68e0fef57495900cfea4e8dc75596d9a319d7e16b1e0a440d24e6fe0a0" +checksum = "d010a1623fbd906d51d650a9916aaefc05ffa0e4053ff7fe601167f3e715d194" dependencies = [ "proc-macro2", "quote", @@ -1570,9 +1584,9 @@ dependencies = [ [[package]] name = "tokio-macros" -version = "1.3.0" +version = "1.4.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "54473be61f4ebe4efd09cec9bd5d16fa51d70ea0192213d754d2d500457db110" +checksum = "154794c8f499c2619acd19e839294703e9e32e7630ef5f46ea80d4ef0fbee5eb" dependencies = [ "proc-macro2", "quote", @@ -1629,9 +1643,9 @@ dependencies = [ [[package]] name = "tracing" -version = "0.1.28" +version = "0.1.29" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "84f96e095c0c82419687c20ddf5cb3eadb61f4e1405923c9dc8e53a1adacbda8" +checksum = "375a639232caf30edfc78e8d89b2d4c375515393e7af7e16f01cd96917fb2105" dependencies = [ "cfg-if", "pin-project-lite", @@ -1641,9 +1655,9 @@ dependencies = [ [[package]] name = "tracing-attributes" -version = "0.1.16" +version = "0.1.18" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "98863d0dd09fa59a1b79c6750ad80dbda6b75f4e71c437a6a1a8cb91a8bcbd77" +checksum = "f4f480b8f81512e825f337ad51e94c1eb5d3bbdf2b363dcd01e2b19a9ffe3f8e" dependencies = [ "proc-macro2", "quote", @@ -1652,9 +1666,9 @@ dependencies = [ [[package]] name = "tracing-core" -version = "0.1.20" +version = "0.1.21" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "46125608c26121c81b0c6d693eab5a420e416da7e43c426d2e8f7df8da8a3acf" +checksum = "1f4ed65637b8390770814083d20756f87bfa2c21bf2f110babdc5438351746e4" dependencies = [ "lazy_static", ] @@ -1672,9 +1686,9 @@ dependencies = [ [[package]] name = "tracing-subscriber" -version = "0.2.24" +version = "0.2.25" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fdd0568dbfe3baf7048b7908d2b32bca0d81cd56bec6d2a8f894b01d74f86be3" +checksum = "0e0d2eaa99c3c2e41547cfa109e910a68ea03823cccad4a0525dcbc9b01e8c71" dependencies = [ "chrono", "parking_lot", diff --git a/gst-meet/Cargo.toml b/gst-meet/Cargo.toml index ba8e1ed..88da317 100644 --- a/gst-meet/Cargo.toml +++ b/gst-meet/Cargo.toml @@ -8,10 +8,11 @@ authors = ["Jasper Hugo "] [dependencies] anyhow = { version = "1", default-features = false, features = ["std"] } +colibri = { version = "0.1", default-features = false } futures = { version = "0.3", default-features = false } glib = { version = "0.14", default-features = false, features = ["log"] } gstreamer = { version = "0.17", default-features = false, features = ["v1_16"] } -lib-gst-meet = { version = "0.3", path = "../lib-gst-meet", default-features = false, features = ["tracing-subscriber"] } +lib-gst-meet = { version = "0.4", path = "../lib-gst-meet", default-features = false, features = ["tracing-subscriber"] } structopt = { version = "0.3", default-features = false } tokio = { version = "1", default-features = false, features = ["macros", "rt-multi-thread", "signal", "sync", "time"] } tokio-stream = { version = "0.1", default-features = false } diff --git a/gst-meet/src/main.rs b/gst-meet/src/main.rs index d7afabe..5f2d040 100644 --- a/gst-meet/src/main.rs +++ b/gst-meet/src/main.rs @@ -3,13 +3,13 @@ use std::time::Duration; use anyhow::{bail, Context, Result}; #[cfg(target_os = "macos")] use cocoa::appkit::NSApplication; +use colibri::{ColibriMessage, Constraints, VideoType}; use glib::ObjectExt; use gstreamer::{ prelude::{ElementExt, GstBinExt}, GhostPad, }; use lib_gst_meet::{ - colibri::{ColibriMessage, Constraints, VideoType}, Authentication, init_tracing, JitsiConference, JitsiConferenceConfig, Connection, }; use structopt::StructOpt; diff --git a/lib-gst-meet-c/Cargo.toml b/lib-gst-meet-c/Cargo.toml index 5f5ab02..3ed29e5 100644 --- a/lib-gst-meet-c/Cargo.toml +++ b/lib-gst-meet-c/Cargo.toml @@ -10,7 +10,7 @@ authors = ["Jasper Hugo "] anyhow = { version = "1", default-features = false } glib = { version = "0.14", default-features = false } gstreamer = { version = "0.17", default-features = false } -lib-gst-meet = { version = "0.3", path = "../lib-gst-meet", default-features = false, features = ["tracing-subscriber"] } +lib-gst-meet = { version = "0.4", path = "../lib-gst-meet", default-features = false, features = ["tracing-subscriber"] } tokio = { version = "1", default-features = false, features = ["rt-multi-thread"] } tracing = { version = "0.1", default-features = false } diff --git a/lib-gst-meet-c/src/lib.rs b/lib-gst-meet-c/src/lib.rs index 6f86162..b62e382 100644 --- a/lib-gst-meet-c/src/lib.rs +++ b/lib-gst-meet-c/src/lib.rs @@ -14,7 +14,7 @@ use glib::{ translate::{from_glib, from_glib_full, ToGlibPtr}, }; use lib_gst_meet::JitsiConferenceConfig; -pub use lib_gst_meet::{init_tracing, JitsiConference, JitsiConnection, MediaType}; +pub use lib_gst_meet::{init_tracing, Authentication, Connection, JitsiConference, MediaType}; use tokio::runtime::Runtime; pub struct Context { @@ -80,14 +80,15 @@ pub unsafe extern "C" fn gstmeet_connection_new( context: *mut Context, websocket_url: *const c_char, xmpp_domain: *const c_char, -) -> *mut JitsiConnection { +) -> *mut Connection { let websocket_url = CStr::from_ptr(websocket_url); let xmpp_domain = CStr::from_ptr(xmpp_domain); (*context) .runtime - .block_on(JitsiConnection::new( + .block_on(Connection::new( &websocket_url.to_string_lossy(), &xmpp_domain.to_string_lossy(), + Authentication::Anonymous, )) .map(|(connection, background)| { (*context).runtime.spawn(background); @@ -97,14 +98,14 @@ pub unsafe extern "C" fn gstmeet_connection_new( } #[no_mangle] -pub unsafe extern "C" fn gstmeet_connection_free(connection: *mut JitsiConnection) { +pub unsafe extern "C" fn gstmeet_connection_free(connection: *mut Connection) { Box::from_raw(connection); } #[no_mangle] pub unsafe extern "C" fn gstmeet_connection_connect( context: *mut Context, - connection: *mut JitsiConnection, + connection: *mut Connection, ) -> bool { (*context) .runtime @@ -116,7 +117,7 @@ pub unsafe extern "C" fn gstmeet_connection_connect( #[no_mangle] pub unsafe extern "C" fn gstmeet_connection_join_conference( context: *mut Context, - connection: *mut JitsiConnection, + connection: *mut Connection, glib_main_context: *mut GMainContext, config: *const ConferenceConfig, ) -> *mut JitsiConference { @@ -144,10 +145,11 @@ pub unsafe extern "C" fn gstmeet_connection_join_conference( video_codec: CStr::from_ptr((*config).video_codec) .to_string_lossy() .to_string(), + extra_muc_features: vec![], }; (*context) .runtime - .block_on((*connection).join_conference(from_glib_full(glib_main_context), config)) + .block_on(JitsiConference::join((*connection).clone(), from_glib_full(glib_main_context), config)) .ok_raw_or_log() } @@ -233,7 +235,11 @@ pub unsafe extern "C" fn gstmeet_conference_on_participant( let ctx = ctx.clone(); Box::pin(async move { let participant = Participant { - jid: CString::new(participant.jid.to_string())?.into_raw() as *const _, + jid: participant + .jid + .map(|jid| Ok::<_, anyhow::Error>(CString::new(jid.to_string())?.into_raw() as *const _)) + .transpose()? + .unwrap_or_else(ptr::null), muc_jid: CString::new(participant.muc_jid.to_string())?.into_raw() as *const _, nick: participant .nick diff --git a/lib-gst-meet/Cargo.toml b/lib-gst-meet/Cargo.toml index ca7d623..b348011 100644 --- a/lib-gst-meet/Cargo.toml +++ b/lib-gst-meet/Cargo.toml @@ -1,7 +1,7 @@ [package] name = "lib-gst-meet" description = "Connect GStreamer pipelines to Jitsi Meet conferences" -version = "0.3.1" +version = "0.4.0" edition = "2018" license = "MIT/Apache-2.0" authors = ["Jasper Hugo "] @@ -11,6 +11,7 @@ anyhow = { version = "1", default-features = false, features = ["std"] } async-stream = { version = "0.3", default-features = false } async-trait = { version = "0.1", default-features = false } bytes = { version = "1", default-features = false, features = ["std"] } +colibri = { version = "0.1", default-features = false } futures = { version = "0.3", default-features = false } glib = { version = "0.14", default-features = false } gstreamer = { version = "0.17", default-features = false, features = ["v1_20"] } @@ -40,7 +41,7 @@ tracing-subscriber = { version = "0.2", optional = true, default-features = fals "tracing-log", ] } uuid = { version = "0.8", default-features = false, features = ["v4"] } -xmpp-parsers = { path = "../../xmpp-rs/xmpp-parsers", package = "xmpp-parsers-gst-meet", version = "0.18", default-features = false } +xmpp-parsers = { path = "../xmpp-parsers", package = "xmpp-parsers-gst-meet", version = "0.18", default-features = false } [features] default = [] diff --git a/lib-gst-meet/src/colibri.rs b/lib-gst-meet/src/colibri.rs index 388267a..bdced02 100644 --- a/lib-gst-meet/src/colibri.rs +++ b/lib-gst-meet/src/colibri.rs @@ -1,6 +1,7 @@ use std::{collections::HashMap, sync::Arc}; use anyhow::Result; +use colibri::ColibriMessage; use futures::{ sink::SinkExt, stream::{StreamExt, TryStreamExt}, @@ -12,100 +13,6 @@ use tokio_stream::wrappers::ReceiverStream; use tokio_tungstenite::tungstenite::{http::Request, Message}; use tracing::{debug, error, info, warn}; -#[serde_as] -#[derive(Clone, Debug, Deserialize, Serialize)] -#[serde(tag = "colibriClass")] -pub enum ColibriMessage { - #[serde(rename_all = "camelCase")] - DominantSpeakerEndpointChangeEvent { - dominant_speaker_endpoint: String, - previous_speakers: Vec, - }, - #[serde(rename_all = "camelCase")] - EndpointConnectivityStatusChangeEvent { - endpoint: String, - #[serde_as(as = "DisplayFromStr")] - active: bool, - }, - #[serde(rename_all = "camelCase")] - EndpointMessage { - from: String, - to: Option, - msg_payload: serde_json::Value, - }, - #[serde(rename_all = "camelCase")] - EndpointStats { - from: String, - bitrate: Bitrates, - packet_loss: PacketLoss, - connection_quality: f32, - #[serde(rename = "jvbRTT")] - jvb_rtt: Option, - server_region: String, - max_enabled_resolution: u16, - }, - #[serde(rename_all = "camelCase")] - LastNChangedEvent { last_n: u16 }, - #[serde(rename_all = "camelCase")] - LastNEndpointsChangeEvent { last_n_endpoints: Vec }, - #[serde(rename_all = "camelCase")] - ReceiverVideoConstraint { max_frame_height: u16 }, - #[serde(rename_all = "camelCase")] - ReceiverVideoConstraints { - last_n: Option, - selected_endpoints: Option>, - on_stage_endpoints: Option>, - default_constraints: Option, - constraints: Option>, - }, - #[serde(rename_all = "camelCase")] - SelectedEndpointsChangedEvent { selected_endpoints: Vec }, - #[serde(rename_all = "camelCase")] - SenderVideoConstraints { video_constraints: Constraints }, - #[serde(rename_all = "camelCase")] - ServerHello { version: Option }, - #[serde(rename_all = "camelCase")] - VideoTypeMessage { video_type: VideoType }, -} - -#[derive(Clone, Copy, Debug, Deserialize, Serialize)] -#[serde(rename_all = "camelCase")] -pub enum VideoType { - Camera, - Desktop, -} - -#[derive(Clone, Debug, Deserialize, Serialize)] -#[serde(rename_all = "camelCase")] -pub struct Constraints { - pub ideal_height: Option, - pub max_height: Option, -} - -#[derive(Clone, Debug, Deserialize, Serialize)] -#[serde(rename_all = "camelCase")] -pub struct Bitrates { - pub audio: Bitrate, - pub video: Bitrate, - #[serde(flatten)] - pub total: Bitrate, -} - -#[derive(Clone, Debug, Deserialize, Serialize)] -#[serde(rename_all = "camelCase")] -pub struct Bitrate { - pub upload: u32, - pub download: u32, -} - -#[derive(Clone, Debug, Deserialize, Serialize)] -#[serde(rename_all = "camelCase")] -pub struct PacketLoss { - pub total: u32, - pub download: u32, - pub upload: u32, -} - pub(crate) struct ColibriChannel { send_tx: mpsc::Sender, recv_tx: Arc>>>, diff --git a/lib-gst-meet/src/conference.rs b/lib-gst-meet/src/conference.rs index 931ca62..afca2ef 100644 --- a/lib-gst-meet/src/conference.rs +++ b/lib-gst-meet/src/conference.rs @@ -2,6 +2,7 @@ use std::{collections::HashMap, convert::TryFrom, fmt, future::Future, pin::Pin, use anyhow::{anyhow, bail, Context, Result}; use async_trait::async_trait; +use colibri::ColibriMessage; use futures::stream::StreamExt; use gstreamer::prelude::{ElementExt, ElementExtManual, GstBinExt}; use maplit::hashmap; @@ -27,7 +28,7 @@ use xmpp_parsers::{ }; use crate::{ - colibri::{ColibriChannel, ColibriMessage}, + colibri::ColibriChannel, jingle::JingleSession, source::MediaType, stanza_filter::StanzaFilter, diff --git a/lib-gst-meet/src/lib.rs b/lib-gst-meet/src/lib.rs index f067d73..c122b9e 100644 --- a/lib-gst-meet/src/lib.rs +++ b/lib-gst-meet/src/lib.rs @@ -8,7 +8,6 @@ mod util; mod xmpp; pub use crate::{ - colibri::ColibriMessage, conference::{Feature, JitsiConference, JitsiConferenceConfig, Participant}, source::MediaType, stanza_filter::StanzaFilter,