gstreamer_gl/subclass/
gl_base_filter.rs

1use ffi::GstGLBaseFilter;
2use glib::translate::*;
3use gst::{ffi::GstCaps, result_from_gboolean, Caps, LoggableError, CAT_RUST};
4use gst_base::subclass::prelude::*;
5
6use crate::{ffi, prelude::*, GLBaseFilter};
7
8pub trait GLBaseFilterImpl: BaseTransformImpl + ObjectSubclass<Type: IsA<GLBaseFilter>> {
9    fn gl_set_caps(&self, incaps: &Caps, outcaps: &Caps) -> Result<(), LoggableError> {
10        self.parent_gl_set_caps(incaps, outcaps)
11    }
12
13    fn gl_start(&self) -> Result<(), LoggableError> {
14        self.parent_gl_start()
15    }
16
17    fn gl_stop(&self) {
18        self.parent_gl_stop()
19    }
20}
21
22pub trait GLBaseFilterImplExt: GLBaseFilterImpl {
23    fn parent_gl_set_caps(&self, incaps: &Caps, outcaps: &Caps) -> Result<(), LoggableError> {
24        unsafe {
25            let data = Self::type_data();
26            let parent_class = data.as_ref().parent_class() as *mut ffi::GstGLBaseFilterClass;
27
28            (*parent_class)
29                .gl_set_caps
30                .map(|f| {
31                    result_from_gboolean!(
32                        f(
33                            self.obj()
34                                .unsafe_cast_ref::<GLBaseFilter>()
35                                .to_glib_none()
36                                .0,
37                            incaps.to_glib_none().0,
38                            outcaps.to_glib_none().0,
39                        ),
40                        CAT_RUST,
41                        "Parent function `gl_set_caps` failed",
42                    )
43                })
44                .unwrap_or(Ok(()))
45        }
46    }
47
48    fn parent_gl_start(&self) -> Result<(), LoggableError> {
49        unsafe {
50            let data = Self::type_data();
51            let parent_class = data.as_ref().parent_class() as *mut ffi::GstGLBaseFilterClass;
52
53            (*parent_class)
54                .gl_start
55                .map(|f| {
56                    result_from_gboolean!(
57                        f(self
58                            .obj()
59                            .unsafe_cast_ref::<GLBaseFilter>()
60                            .to_glib_none()
61                            .0),
62                        CAT_RUST,
63                        "Parent function `gl_start` failed",
64                    )
65                })
66                .unwrap_or(Ok(()))
67        }
68    }
69
70    fn parent_gl_stop(&self) {
71        unsafe {
72            let data = Self::type_data();
73            let parent_class = data.as_ref().parent_class() as *mut ffi::GstGLBaseFilterClass;
74
75            if let Some(f) = (*parent_class).gl_stop {
76                f(self
77                    .obj()
78                    .unsafe_cast_ref::<GLBaseFilter>()
79                    .to_glib_none()
80                    .0)
81            }
82        }
83    }
84}
85
86impl<T: GLBaseFilterImpl> GLBaseFilterImplExt for T {}
87
88unsafe impl<T: GLBaseFilterImpl> IsSubclassable<T> for GLBaseFilter {
89    fn class_init(klass: &mut glib::Class<Self>) {
90        Self::parent_class_init::<T>(klass);
91        let klass = klass.as_mut();
92        klass.gl_set_caps = Some(gl_set_caps::<T>);
93        klass.gl_start = Some(gl_start::<T>);
94        klass.gl_stop = Some(gl_stop::<T>);
95    }
96}
97
98unsafe extern "C" fn gl_set_caps<T: GLBaseFilterImpl>(
99    ptr: *mut GstGLBaseFilter,
100    incaps: *mut GstCaps,
101    outcaps: *mut GstCaps,
102) -> glib::ffi::gboolean {
103    let instance = &*(ptr as *mut T::Instance);
104    let imp = instance.imp();
105
106    gst::panic_to_error!(imp, false, {
107        match imp.gl_set_caps(&from_glib_borrow(incaps), &from_glib_borrow(outcaps)) {
108            Ok(()) => true,
109            Err(err) => {
110                err.log_with_imp(imp);
111                false
112            }
113        }
114    })
115    .into_glib()
116}
117
118unsafe extern "C" fn gl_start<T: GLBaseFilterImpl>(
119    ptr: *mut GstGLBaseFilter,
120) -> glib::ffi::gboolean {
121    let instance = &*(ptr as *mut T::Instance);
122    let imp = instance.imp();
123
124    gst::panic_to_error!(imp, false, {
125        match imp.gl_start() {
126            Ok(()) => true,
127            Err(err) => {
128                err.log_with_imp(imp);
129                false
130            }
131        }
132    })
133    .into_glib()
134}
135
136unsafe extern "C" fn gl_stop<T: GLBaseFilterImpl>(ptr: *mut GstGLBaseFilter) {
137    let instance = &*(ptr as *mut T::Instance);
138    let imp = instance.imp();
139
140    gst::panic_to_error!(imp, (), { imp.gl_stop() })
141}