diff --git a/gstreamer-gl/Gir.toml b/gstreamer-gl/Gir.toml index 7ada5e7d3..1c2cae641 100644 --- a/gstreamer-gl/Gir.toml +++ b/gstreamer-gl/Gir.toml @@ -415,6 +415,7 @@ status = "generate" [[object]] name = "GstGL.GLFramebuffer" status = "generate" +manual_traits = ["GLFramebufferExtManual"] [[object.function]] name = "attach" @@ -423,8 +424,7 @@ status = "generate" [[object.function]] name = "draw_to_texture" - # needs to be manually implemented for correct types/mutability - ignore = true + manual = true [[object]] name = "GstGL.GLOverlayCompositor" diff --git a/gstreamer-gl/src/gl_framebuffer.rs b/gstreamer-gl/src/gl_framebuffer.rs new file mode 100644 index 000000000..10dce1d7f --- /dev/null +++ b/gstreamer-gl/src/gl_framebuffer.rs @@ -0,0 +1,35 @@ +use glib::{prelude::*, translate::*}; + +use crate::{GLFramebuffer, GLMemoryRef}; + +mod sealed { + pub trait Sealed {} + impl> Sealed for T {} +} + +pub trait GLFramebufferExtManual: sealed::Sealed + IsA + 'static { + #[doc(alias = "gst_gl_framebuffer_draw_to_texture")] + fn draw_to_texture(&self, mem: &mut GLMemoryRef, func: F) { + let mut func = std::mem::ManuallyDrop::new(func); + let user_data: *mut F = &mut *func; + + unsafe extern "C" fn trampoline( + data: glib::ffi::gpointer, + ) -> glib::ffi::gboolean { + let func = std::ptr::read(data as *mut F); + func(); + glib::ffi::GTRUE + } + + unsafe { + ffi::gst_gl_framebuffer_draw_to_texture( + self.as_ref().to_glib_none().0, + mem.as_mut_ptr(), + Some(trampoline::), + user_data as glib::ffi::gpointer, + ); + } + } +} + +impl> GLFramebufferExtManual for O {} diff --git a/gstreamer-gl/src/lib.rs b/gstreamer-gl/src/lib.rs index ccc9e3513..5d1ad6f63 100644 --- a/gstreamer-gl/src/lib.rs +++ b/gstreamer-gl/src/lib.rs @@ -42,6 +42,7 @@ mod gl_base_memory; pub use self::gl_base_memory::*; mod gl_memory; pub use crate::gl_memory::*; +mod gl_framebuffer; mod gl_memory_pbo; pub use crate::gl_memory_pbo::*; @@ -53,7 +54,8 @@ pub mod prelude { pub use crate::{ auto::traits::*, context::ContextGLExt, gl_context::GLContextExtManual, - gl_display::GLDisplayExtManual, gl_video_frame::VideoFrameGLExt, + gl_display::GLDisplayExtManual, gl_framebuffer::GLFramebufferExtManual, + gl_video_frame::VideoFrameGLExt, }; }