gstreamer_gl/subclass/
gl_base_filter.rs1use 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}