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
diff options
context:
space:
mode:
authorSebastian Dröge <sebastian@centricular.com>2022-12-22 21:44:25 +0300
committerGStreamer Marge Bot <gitlab-merge-bot@gstreamer-foundation.org>2022-12-23 01:56:48 +0300
commit0c8e69ed7c05faec47e44fe8060cff7fdf0e8cd3 (patch)
tree1164a3a07b79c264158024a8c1a783d940feb9c9
parent71c268da14045b50d1309de7533a9f295bf78e6d (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.rs8
-rw-r--r--video/gtk4/src/sink/paintable/imp.rs8
-rw-r--r--video/gtk4/src/sink/paintable/mod.rs4
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();
+ }
}