Welcome to mirror list, hosted at ThFree Co, Russian Federation.

gitlab.freedesktop.org/gstreamer/gst-plugins-rs.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
path: root/video
diff options
context:
space:
mode:
authorSebastian Dröge <sebastian@centricular.com>2023-02-24 12:52:28 +0300
committerSebastian Dröge <sebastian@centricular.com>2023-02-25 13:52:46 +0300
commitef7f0d12bfe0bede947bf73c889b25c2b34e5f5f (patch)
tree6b217f421569fed2ca2d37a1183bd89293d3716d /video
parent2723fc47132b154e1722b86e7608156f4801b365 (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/1106>
Diffstat (limited to 'video')
-rw-r--r--video/gtk4/src/sink/frame.rs14
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![],