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) { self.imp().handle_frame_changed(frame); } + + pub(crate) fn handle_flush_frames(&self) { + self.imp().handle_flush_frames(); + } }