From f118ef7db0c11fa579b2464a46b47a569692cefa Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?St=C3=A9phane=20Cerveau?= Date: Fri, 4 Feb 2022 15:06:29 +0100 Subject: [PATCH] player: detect gtk4paintablesink with deep-element-added Connect to the deep-element-added signal from the pipeline to detect the gtk4paintablesink presence. --- Cargo.lock | 7 +++---- Cargo.toml | 7 +++---- TODO.md | 1 + src/gps/player.rs | 35 +++++++++++++++++++++++++++++++---- 4 files changed, 38 insertions(+), 12 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index 7b4f8d3..578bf10 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -478,9 +478,9 @@ dependencies = [ [[package]] name = "gst-plugin-gtk4" -version = "0.1.0" +version = "0.1.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f70501fa85dfdbeebecea35d747791351d04266f5c2c4aa23014d9fe74132290" +checksum = "e62e047edb1932887c20105c681203d138ebeb61b83b9e0b368cdec1d0fbc0cc" dependencies = [ "fragile", "gst-plugin-version-helper", @@ -502,10 +502,9 @@ dependencies = [ [[package]] name = "gst_pipeline_studio" -version = "0.1.0" +version = "0.2.0" dependencies = [ "anyhow", - "fragile", "futures-channel", "futures-executor", "gettext-rs", diff --git a/Cargo.toml b/Cargo.toml index ebeb8f5..04afe12 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -1,16 +1,16 @@ [package] name = "gst_pipeline_studio" -version = "0.1.0" +version = "0.2.0" edition = "2018" # See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html [dependencies] gtk = { version = "0.4.1", package = "gtk4" } +gst = { package = "gstreamer", version = "0.18.1" } +gst-plugin-gtk4 = { version = "0.1.1", optional=true } anyhow = "1" gettext-rs = {version = "0.7", features = ["gettext-system"]} -gst = { package = "gstreamer", version = "0.18.1" } -gst-plugin-gtk4 = { version = "0.1.0", optional=true } log = "0.4.11" once_cell = "1.7.2" xml-rs = "0.8.4" @@ -19,7 +19,6 @@ serde = "1.0" serde_any = "0.5" simplelog = "0.11.2" futures-channel = "0.3" -fragile = "1.0.0" [dev-dependencies] futures-executor = "0.3" diff --git a/TODO.md b/TODO.md index 1f85d84..99937cb 100644 --- a/TODO.md +++ b/TODO.md @@ -93,6 +93,7 @@ - [ ] Change TreeView to ListView - [ ] Implement zoom on the view (https://gitlab.gnome.org/World/obfuscate/-/blob/master/src/widgets/drawing_area.rs) - [ ] Settings: add a log level selection +- [ ] reopen the last log on prematured exit (crash) ### CI/Infra diff --git a/src/gps/player.rs b/src/gps/player.rs index 0b6b838..6e637ff 100644 --- a/src/gps/player.rs +++ b/src/gps/player.rs @@ -99,7 +99,7 @@ impl Player { pub fn create_pipeline(&self, description: &str) -> anyhow::Result { GPS_INFO!("Creating pipeline {}", description); - + self.n_video_sink.set(0); if settings::Settings::load_settings() .preferences .get("use_gtk4_sink") @@ -122,7 +122,36 @@ impl Player { "Unable to create a pipeline from the given parse launch {" )); } - + self.check_for_gtk4sink(pipeline.as_ref().unwrap()); + // GPSApp is not Send(trait) ready , so we use a channel to exchange the given data with the main thread and use + // GPSApp. + let (ready_tx, ready_rx) = glib::MainContext::channel(glib::PRIORITY_DEFAULT); + let player_weak = self.downgrade(); + let _ = ready_rx.attach(None, move |element: gst::Element| { + let player = upgrade_weak!(player_weak, glib::Continue(false)); + let paintable = element.property::("paintable"); + let n_sink = player.n_video_sink.get(); + player + .app + .borrow() + .as_ref() + .expect("App should be available") + .set_app_preview(&paintable, n_sink); + player.n_video_sink.set(n_sink + 1); + glib::Continue(true) + }); + let bin = pipeline.unwrap().dynamic_cast::(); + if let Ok(bin) = bin.as_ref() { + bin.connect_deep_element_added(move |_, _, element| { + if let Some(factory) = element.factory() { + GPS_INFO!("Received the signal deep element added {}", factory.name()); + if factory.name() == "gtk4paintablesink" { + let _ = ready_tx.send(element.clone()); + } + } + }); + } + let pipeline = bin.unwrap().dynamic_cast::(); Ok(pipeline.unwrap()) } @@ -160,8 +189,6 @@ impl Player { pipeline.on_pipeline_message(msg); glib::Continue(true) })?; - pipeline.set_state(gst::State::Ready)?; - self.check_for_gtk4sink(&pipeline); *self.pipeline.borrow_mut() = Some(pipeline); }