diff options
author | Sebastian Dröge <sebastian@centricular.com> | 2022-12-22 21:44:25 +0300 |
---|---|---|
committer | GStreamer Marge Bot <gitlab-merge-bot@gstreamer-foundation.org> | 2022-12-23 01:56:48 +0300 |
commit | 0c8e69ed7c05faec47e44fe8060cff7fdf0e8cd3 (patch) | |
tree | 1164a3a07b79c264158024a8c1a783d940feb9c9 | |
parent | 71c268da14045b50d1309de7533a9f295bf78e6d (diff) |
gtk4: Flush frames from the paintable when shutting down the sink
Otherwise it will continue showing the last frames forever and keep
around the frames forever instead of rendering black.
Fixes https://gitlab.freedesktop.org/gstreamer/gst-plugins-rs/-/issues/281
Part-of: <https://gitlab.freedesktop.org/gstreamer/gst-plugins-rs/-/merge_requests/1024>
-rw-r--r-- | video/gtk4/src/sink/imp.rs | 8 | ||||
-rw-r--r-- | video/gtk4/src/sink/paintable/imp.rs | 8 | ||||
-rw-r--r-- | video/gtk4/src/sink/paintable/mod.rs | 4 |
3 files changed, 20 insertions, 0 deletions
diff --git a/video/gtk4/src/sink/imp.rs b/video/gtk4/src/sink/imp.rs index 92a7dbaa..0901828e 100644 --- a/video/gtk4/src/sink/imp.rs +++ b/video/gtk4/src/sink/imp.rs @@ -221,6 +221,14 @@ impl ElementImpl for PaintableSink { gst::StateChange::PausedToReady => { let _ = self.info.lock().unwrap().take(); let _ = self.pending_frame.lock().unwrap().take(); + + let self_ = self.to_owned(); + utils::invoke_on_main_thread(move || { + let paintable = self_.paintable.lock().unwrap(); + if let Some(paintable) = &*paintable { + paintable.get().handle_flush_frames(); + } + }); } _ => (), } diff --git a/video/gtk4/src/sink/paintable/imp.rs b/video/gtk4/src/sink/paintable/imp.rs index f270709f..7134ad25 100644 --- a/video/gtk4/src/sink/paintable/imp.rs +++ b/video/gtk4/src/sink/paintable/imp.rs @@ -196,4 +196,12 @@ impl Paintable { self.obj().invalidate_contents(); } } + + pub(super) fn handle_flush_frames(&self) { + gst::debug!(CAT, imp: self, "Flushing frames"); + self.paintables.borrow_mut().clear(); + self.cached_textures.borrow_mut().clear(); + self.obj().invalidate_size(); + self.obj().invalidate_contents(); + } } diff --git a/video/gtk4/src/sink/paintable/mod.rs b/video/gtk4/src/sink/paintable/mod.rs index 56489a37..835c43de 100644 --- a/video/gtk4/src/sink/paintable/mod.rs +++ b/video/gtk4/src/sink/paintable/mod.rs @@ -33,4 +33,8 @@ impl Paintable { pub(crate) fn handle_frame_changed(&self, frame: Option<Frame>) { self.imp().handle_frame_changed(frame); } + + pub(crate) fn handle_flush_frames(&self) { + self.imp().handle_flush_frames(); + } } |