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/1027>
This commit is contained in:
Sebastian Dröge 2022-12-22 20:44:25 +02:00
parent d9d5571641
commit 993619d654
3 changed files with 20 additions and 0 deletions

View file

@ -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();
}
});
}
_ => (),
}

View file

@ -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();
}
}

View file

@ -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();
}
}