Welcome to mirror list, hosted at ThFree Co, Russian Federation.

github.com/sdroege/gst-plugin-rs.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
path: root/video
diff options
context:
space:
mode:
authorSebastian Dröge <sebastian@centricular.com>2022-12-22 22:34:08 +0300
committerGStreamer Marge Bot <gitlab-merge-bot@gstreamer-foundation.org>2022-12-23 01:56:48 +0300
commit1026949b2b8ee967384abc28d5c0b9762c0008e5 (patch)
tree542ee959274771681cf2c2984b4bfef1a8c7ae30 /video
parent52764e140e89729f88d27b7965f9b9b6658e1cc0 (diff)
gtk4: Use `glib::ThreadGuard` instead of the fragile crate
Fixes https://gitlab.freedesktop.org/gstreamer/gst-plugins-rs/-/issues/272 Part-of: <https://gitlab.freedesktop.org/gstreamer/gst-plugins-rs/-/merge_requests/1024>
Diffstat (limited to 'video')
-rw-r--r--video/gtk4/Cargo.toml1
-rw-r--r--video/gtk4/src/sink/imp.rs62
2 files changed, 31 insertions, 32 deletions
diff --git a/video/gtk4/Cargo.toml b/video/gtk4/Cargo.toml
index 479e6c31..e420f32c 100644
--- a/video/gtk4/Cargo.toml
+++ b/video/gtk4/Cargo.toml
@@ -23,7 +23,6 @@ gst_gl_x11 = { package = "gstreamer-gl-x11", git = "https://gitlab.freedesktop.o
gst_gl_egl = { package = "gstreamer-gl-egl", git = "https://gitlab.freedesktop.org/gstreamer/gstreamer-rs", features = ["v1_16"], optional = true }
once_cell = "1.0"
-fragile = "2"
[lib]
name = "gstgtk4"
diff --git a/video/gtk4/src/sink/imp.rs b/video/gtk4/src/sink/imp.rs
index 48c9e2e0..53a421f5 100644
--- a/video/gtk4/src/sink/imp.rs
+++ b/video/gtk4/src/sink/imp.rs
@@ -13,7 +13,7 @@ use super::SinkEvent;
use crate::sink::frame::Frame;
use crate::sink::paintable::Paintable;
-use glib::Sender;
+use glib::{thread_guard::ThreadGuard, Sender};
use gtk::prelude::*;
use gtk::{gdk, glib};
@@ -25,7 +25,6 @@ use once_cell::sync::Lazy;
use std::sync::{Mutex, MutexGuard};
use crate::utils;
-use fragile::Fragile;
#[cfg(feature = "gst_gl")]
use glib::translate::*;
@@ -44,9 +43,9 @@ static CAT: Lazy<gst::DebugCategory> = Lazy::new(|| {
)
});
-#[derive(Default, Debug)]
+#[derive(Default)]
pub struct PaintableSink {
- paintable: Mutex<Option<Fragile<Paintable>>>,
+ paintable: Mutex<Option<ThreadGuard<Paintable>>>,
info: Mutex<Option<gst_video::VideoInfo>>,
sender: Mutex<Option<Sender<SinkEvent>>>,
pending_frame: Mutex<Option<Frame>>,
@@ -109,16 +108,15 @@ impl ObjectImpl for PaintableSink {
};
// Getter must be called from the main thread
- match paintable.try_get() {
- Ok(paintable) => paintable.to_value(),
- Err(_) => {
- gst::error!(
- CAT,
- imp: self,
- "Can't retrieve Paintable from non-main thread"
- );
- None::<&gdk::Paintable>.to_value()
- }
+ if paintable.is_owner() {
+ paintable.get_ref().to_value()
+ } else {
+ gst::error!(
+ CAT,
+ imp: self,
+ "Can't retrieve Paintable from non-main thread"
+ );
+ None::<&gdk::Paintable>.to_value()
}
}
_ => unimplemented!(),
@@ -226,7 +224,7 @@ impl ElementImpl for PaintableSink {
utils::invoke_on_main_thread(move || {
let paintable = self_.paintable.lock().unwrap();
if let Some(paintable) = &*paintable {
- paintable.get().handle_flush_frames();
+ paintable.get_ref().handle_flush_frames();
}
});
}
@@ -458,16 +456,18 @@ impl PaintableSink {
}
fn do_action(&self, action: SinkEvent) -> glib::Continue {
- let paintable = self.paintable.lock().unwrap().clone();
- let paintable = match paintable {
- Some(paintable) => paintable,
+ let paintable = self.paintable.lock().unwrap();
+ let paintable = match &*paintable {
+ Some(paintable) => paintable.clone(),
None => return glib::Continue(false),
};
match action {
SinkEvent::FrameChanged => {
gst::trace!(CAT, imp: self, "Frame changed");
- paintable.get().handle_frame_changed(self.pending_frame())
+ paintable
+ .get_ref()
+ .handle_frame_changed(self.pending_frame())
}
}
@@ -496,7 +496,7 @@ impl PaintableSink {
.replace(tmp_caps);
}
- fn create_paintable(&self, paintable_storage: &mut MutexGuard<Option<Fragile<Paintable>>>) {
+ fn create_paintable(&self, paintable_storage: &mut MutexGuard<Option<ThreadGuard<Paintable>>>) {
#[allow(unused_mut)]
let mut ctx = None;
@@ -516,15 +516,15 @@ impl PaintableSink {
fn initialize_paintable(
&self,
- gl_context: Option<Fragile<gdk::GLContext>>,
- paintable_storage: &mut MutexGuard<Option<Fragile<Paintable>>>,
+ gl_context: Option<ThreadGuard<gdk::GLContext>>,
+ paintable_storage: &mut MutexGuard<Option<ThreadGuard<Paintable>>>,
) {
gst::debug!(CAT, imp: self, "Initializing paintable");
let paintable = utils::invoke_on_main_thread(|| {
// grab the context out of the fragile
let ctx = gl_context.map(|f| f.into_inner());
- Fragile::new(Paintable::new(ctx))
+ ThreadGuard::new(Paintable::new(ctx))
});
// The channel for the SinkEvents
@@ -544,11 +544,11 @@ impl PaintableSink {
}
#[cfg(feature = "gst_gl")]
- fn realize_context(&self) -> Option<Fragile<gdk::GLContext>> {
+ fn realize_context(&self) -> Option<ThreadGuard<gdk::GLContext>> {
gst::debug!(CAT, imp: self, "Realizing GDK GL Context");
let weak = self.instance().downgrade();
- let cb = move || -> Option<Fragile<gdk::GLContext>> {
+ let cb = move || -> Option<ThreadGuard<gdk::GLContext>> {
let obj = weak
.upgrade()
.expect("Failed to upgrade Weak ref during gl initialization.");
@@ -576,7 +576,7 @@ impl PaintableSink {
if ctx.realize().is_ok() {
gst::info!(CAT, obj: &obj, "Successfully realized GDK GL Context",);
- return Some(Fragile::new(ctx));
+ return Some(ThreadGuard::new(ctx));
} else {
gst::warning!(CAT, obj: &obj, "Failed to realize GDK GL Context",);
}
@@ -593,8 +593,8 @@ impl PaintableSink {
#[cfg(feature = "gst_gl")]
fn initialize_gl_wrapper(
&self,
- context: Fragile<gdk::GLContext>,
- ) -> Result<Fragile<gdk::GLContext>, glib::Error> {
+ context: ThreadGuard<gdk::GLContext>,
+ ) -> Result<ThreadGuard<gdk::GLContext>, glib::Error> {
gst::info!(CAT, imp: self, "Initializing GDK GL Context");
let self_ = self.instance().clone();
utils::invoke_on_main_thread(move || self_.imp().initialize_gl(context))
@@ -603,9 +603,9 @@ impl PaintableSink {
#[cfg(feature = "gst_gl")]
fn initialize_gl(
&self,
- context: Fragile<gdk::GLContext>,
- ) -> Result<Fragile<gdk::GLContext>, glib::Error> {
- let ctx = context.get();
+ context: ThreadGuard<gdk::GLContext>,
+ ) -> Result<ThreadGuard<gdk::GLContext>, glib::Error> {
+ let ctx = context.get_ref();
let display = gtk::prelude::GLContextExt::display(ctx)
.expect("Failed to get GDK Display from GDK Context.");
ctx.make_current();