Skip to main content

gstreamer_gl/
gl_framebuffer.rs

1use glib::{prelude::*, translate::*};
2
3use crate::{GLFramebuffer, GLMemoryRef, ffi};
4
5pub trait GLFramebufferExtManual: IsA<GLFramebuffer> + 'static {
6    #[doc(alias = "gst_gl_framebuffer_draw_to_texture")]
7    fn draw_to_texture<F: FnOnce()>(&self, mem: &mut GLMemoryRef, func: F) {
8        let mut func = std::mem::ManuallyDrop::new(func);
9        let user_data: *mut F = &mut *func;
10
11        unsafe extern "C" fn trampoline<F: FnOnce()>(
12            data: glib::ffi::gpointer,
13        ) -> glib::ffi::gboolean {
14            unsafe {
15                let func = std::ptr::read(data as *mut F);
16                func();
17                glib::ffi::GTRUE
18            }
19        }
20
21        unsafe {
22            ffi::gst_gl_framebuffer_draw_to_texture(
23                self.as_ref().to_glib_none().0,
24                mem.as_mut_ptr(),
25                Some(trampoline::<F>),
26                user_data as glib::ffi::gpointer,
27            );
28        }
29    }
30}
31
32impl<O: IsA<GLFramebuffer>> GLFramebufferExtManual for O {}