gtk4: Keep GstGLMemory alive as long as it is used inside GDK

Otherwise the texture might be released in the meantime and GDK would
use an invalid GL texture ID.

Fixes https://gitlab.freedesktop.org/gstreamer/gst-plugins-rs/-/issues/287

Part-of: <https://gitlab.freedesktop.org/gstreamer/gst-plugins-rs/-/merge_requests/1052>
This commit is contained in:
Sebastian Dröge 2023-01-19 13:49:22 +02:00
parent 570eb7463a
commit b161f56a5c

View file

@ -96,7 +96,7 @@ fn video_frame_to_memory_texture(
#[cfg(any(target_os = "macos", feature = "gst_gl"))]
fn video_frame_to_gl_texture(
frame: &gst_video::VideoFrame<gst_video::video_frame::Readable>,
frame: gst_video::VideoFrame<gst_video::video_frame::Readable>,
cached_textures: &mut HashMap<usize, gdk::Texture>,
used_textures: &mut HashSet<usize>,
gdk_context: &gdk::GLContext,
@ -119,7 +119,16 @@ fn video_frame_to_gl_texture(
sync_meta.wait(gst_context);
let texture = unsafe {
gdk::GLTexture::new(gdk_context, texture_id as u32, width as i32, height as i32)
gdk::GLTexture::with_release_func(
gdk_context,
texture_id as u32,
width as i32,
height as i32,
move || {
// Unmap and drop the GStreamer GL texture once GTK is done with it and not earlier
drop(frame);
},
)
.upcast::<gdk::Texture>()
};
@ -149,7 +158,7 @@ impl Frame {
{
if let (Some(gdk_ctx), Some(gst_ctx)) = (gdk_context, self.gst_context.as_ref()) {
video_frame_to_gl_texture(
&self.frame,
self.frame,
cached_textures,
&mut used_textures,
gdk_ctx,