diff options
author | Sebastian Dröge <sebastian@centricular.com> | 2023-01-19 14:53:21 +0300 |
---|---|---|
committer | Sebastian Dröge <sebastian@centricular.com> | 2023-01-19 14:53:21 +0300 |
commit | 03df4f253cc56bcb3c61df9202991fd6f2094f5b (patch) | |
tree | c53510e57791cdba03635161af9fda2fe316a81c /video | |
parent | b161f56a5c1b2215111cbdd368eb5d931e84b530 (diff) |
gtk4: Asynchronously flush frames from GDK
There is no need to wait until the frames are flushed as the textures
will be kept alive until GDK is finished with them, and doing so can
cause deadlocks.
Fixes https://gitlab.freedesktop.org/gstreamer/gst-plugins-rs/-/issues/287
Part-of: <https://gitlab.freedesktop.org/gstreamer/gst-plugins-rs/-/merge_requests/1052>
Diffstat (limited to 'video')
-rw-r--r-- | video/gtk4/src/sink/imp.rs | 4 |
1 files changed, 3 insertions, 1 deletions
diff --git a/video/gtk4/src/sink/imp.rs b/video/gtk4/src/sink/imp.rs index caa8361d..6c1d3f8e 100644 --- a/video/gtk4/src/sink/imp.rs +++ b/video/gtk4/src/sink/imp.rs @@ -236,8 +236,10 @@ impl ElementImpl for PaintableSink { let _ = self.info.lock().unwrap().take(); let _ = self.pending_frame.lock().unwrap().take(); + // Flush frames from the GDK paintable but don't wait + // for this to finish as this can other deadlock. let self_ = self.to_owned(); - utils::invoke_on_main_thread(move || { + glib::MainContext::default().invoke(move || { let paintable = self_.paintable.lock().unwrap(); if let Some(paintable) = &*paintable { paintable.get_ref().handle_flush_frames(); |