diff options
author | Sebastian Dröge <sebastian@centricular.com> | 2023-02-24 12:52:28 +0300 |
---|---|---|
committer | Sebastian Dröge <sebastian@centricular.com> | 2023-02-24 12:52:28 +0300 |
commit | bca4af0c795edd2469fcb5f48511f3df839da2c7 (patch) | |
tree | 47c6b618c930056a294bea2a500e6075a44b45a7 /video | |
parent | 6bc72e513c11d014b2a9d9538a2b1e2acb4a8147 (diff) |
gtk4: Set sync point on the video frame after mapping it
Otherwise it is not always ready for use yet in GTK even after waiting
on the sync point, and a fully transparent texture is rendered instead.
Fixes https://gitlab.freedesktop.org/gstreamer/gst-plugins-rs/-/issues/320
Part-of: <https://gitlab.freedesktop.org/gstreamer/gst-plugins-rs/-/merge_requests/1103>
Diffstat (limited to 'video')
-rw-r--r-- | video/gtk4/src/sink/frame.rs | 14 |
1 files changed, 10 insertions, 4 deletions
diff --git a/video/gtk4/src/sink/frame.rs b/video/gtk4/src/sink/frame.rs index 3e4bcbd04..6074792b5 100644 --- a/video/gtk4/src/sink/frame.rs +++ b/video/gtk4/src/sink/frame.rs @@ -251,21 +251,27 @@ impl Frame { }); if let Some(memory_ctx) = memory_ctx { - let mapped_frame = if let Some(meta) = buffer.meta::<gst_gl::GLSyncMeta>() { - meta.set_sync_point(memory_ctx); + // If there is no GLSyncMeta yet then we need to add one here now, which requires + // obtaining a writable buffer. + let mapped_frame = if buffer.meta::<gst_gl::GLSyncMeta>().is_some() { gst_video::VideoFrame::from_buffer_readable_gl(buffer.clone(), info) .map_err(|_| gst::FlowError::Error)? } else { let mut buffer = buffer.clone(); { let buffer = buffer.make_mut(); - let meta = gst_gl::GLSyncMeta::add(buffer, memory_ctx); - meta.set_sync_point(memory_ctx); + gst_gl::GLSyncMeta::add(buffer, memory_ctx); } gst_video::VideoFrame::from_buffer_readable_gl(buffer, info) .map_err(|_| gst::FlowError::Error)? }; + // Now that it's guaranteed that there is a sync meta and the frame is mapped, set + // a sync point so we can ensure that the texture is ready later when making use of + // it as gdk::GLTexture. + let meta = mapped_frame.buffer().meta::<gst_gl::GLSyncMeta>().unwrap(); + meta.set_sync_point(memory_ctx); + frame = Self { frame: mapped_frame, overlays: vec![], |