Skip to main content

gstreamer_gl/subclass/
gl_base_filter.rs

1use ffi::GstGLBaseFilter;
2use glib::translate::*;
3use gst::{CAT_RUST, Caps, LoggableError, ffi::GstCaps, result_from_gboolean};
4use gst_base::subclass::prelude::*;
5
6use crate::{GLBaseFilter, ffi, prelude::*};
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    unsafe {
104        let instance = &*(ptr as *mut T::Instance);
105        let imp = instance.imp();
106
107        gst::panic_to_error!(imp, false, {
108            match imp.gl_set_caps(&from_glib_borrow(incaps), &from_glib_borrow(outcaps)) {
109                Ok(()) => true,
110                Err(err) => {
111                    err.log_with_imp(imp);
112                    false
113                }
114            }
115        })
116        .into_glib()
117    }
118}
119
120unsafe extern "C" fn gl_start<T: GLBaseFilterImpl>(
121    ptr: *mut GstGLBaseFilter,
122) -> glib::ffi::gboolean {
123    unsafe {
124        let instance = &*(ptr as *mut T::Instance);
125        let imp = instance.imp();
126
127        gst::panic_to_error!(imp, false, {
128            match imp.gl_start() {
129                Ok(()) => true,
130                Err(err) => {
131                    err.log_with_imp(imp);
132                    false
133                }
134            }
135        })
136        .into_glib()
137    }
138}
139
140unsafe extern "C" fn gl_stop<T: GLBaseFilterImpl>(ptr: *mut GstGLBaseFilter) {
141    unsafe {
142        let instance = &*(ptr as *mut T::Instance);
143        let imp = instance.imp();
144
145        gst::panic_to_error!(imp, (), { imp.gl_stop() })
146    }
147}