diff --git a/gstreamer-gl/Gir.toml b/gstreamer-gl/Gir.toml index fdec509b8..7ada5e7d3 100644 --- a/gstreamer-gl/Gir.toml +++ b/gstreamer-gl/Gir.toml @@ -300,8 +300,7 @@ manual_traits = ["GLContextExtManual"] [[object.function]] name = "thread_add" - # unimplemented GLContextThreadFunc - ignore = true + manual = true [[object.function]] name = "get_thread" diff --git a/gstreamer-gl/src/gl_context.rs b/gstreamer-gl/src/gl_context.rs index 046d8af78..da0508acf 100644 --- a/gstreamer-gl/src/gl_context.rs +++ b/gstreamer-gl/src/gl_context.rs @@ -67,6 +67,29 @@ pub trait GLContextExtManual: sealed::Sealed + IsA + 'static { ) as uintptr_t } } + + #[doc(alias = "gst_gl_context_thread_add")] + fn thread_add(&self, func: F) { + let mut func = std::mem::ManuallyDrop::new(func); + let user_data: *mut F = &mut *func; + + unsafe extern "C" fn trampoline, F: FnOnce(&O) + Send>( + context: *mut ffi::GstGLContext, + data: glib::ffi::gpointer, + ) { + let func = std::ptr::read(data as *mut F); + let context = GLContext::from_glib_borrow(context); + func(context.unsafe_cast_ref()) + } + + unsafe { + ffi::gst_gl_context_thread_add( + self.as_ref().to_glib_none().0, + Some(trampoline::), + user_data as glib::ffi::gpointer, + ); + } + } } impl> GLContextExtManual for O {}