1 | // Take a look at the license at the top of the repository in the LICENSE file. |
2 | |
3 | pub const MAJOR_VERSION: i32 = 1; |
4 | |
5 | cfg_if::cfg_if! { |
6 | if #[cfg(feature = "v1_22" )] { |
7 | pub const MINOR_VERSION: i32 = 22; |
8 | } else if #[cfg(feature = "v1_20" )] { |
9 | pub const MINOR_VERSION: i32 = 20; |
10 | } else if #[cfg(feature = "v1_18" )] { |
11 | pub const MINOR_VERSION: i32 = 18; |
12 | } else if #[cfg(feature = "v1_16" )] { |
13 | pub const MINOR_VERSION: i32 = 16; |
14 | } else { |
15 | pub const MINOR_VERSION: i32 = 14; |
16 | } |
17 | } |
18 | |
19 | #[macro_export ] |
20 | macro_rules! plugin_define( |
21 | ($name:ident, $description:expr, $plugin_init:ident, |
22 | $version:expr, $license:expr, $source:expr, |
23 | $package:expr, $origin:expr $(, $release_datetime:expr)?) => { |
24 | pub mod plugin_desc { |
25 | #[repr(transparent)] |
26 | pub struct GstPluginDesc($crate::ffi::GstPluginDesc); |
27 | unsafe impl Send for GstPluginDesc {} |
28 | unsafe impl Sync for GstPluginDesc {} |
29 | |
30 | static GST_PLUGIN_DESC: GstPluginDesc = GstPluginDesc($crate::ffi::GstPluginDesc { |
31 | major_version: $crate::subclass::MAJOR_VERSION, |
32 | minor_version: $crate::subclass::MINOR_VERSION, |
33 | name: concat!(stringify!($name), " \0" ) as *const str as *const _, |
34 | description: concat!($description, " \0" ) as *const str as *const _, |
35 | plugin_init: Some(plugin_init_trampoline), |
36 | version: concat!($version, " \0" ) as *const str as *const _, |
37 | license: concat!($license, " \0" ) as *const str as *const _, |
38 | source: concat!($source, " \0" ) as *const str as *const _, |
39 | package: concat!($package, " \0" ) as *const str as *const _, |
40 | origin: concat!($origin, " \0" ) as *const str as *const _, |
41 | release_datetime: { |
42 | // NB: if this looks a lot like `Option`, it is not a coincidence. Alas, |
43 | // Option::or is not `const` and neither is `unwrap_or` so we have to roll our |
44 | // own oli-obk-ified enum instead. |
45 | enum OptionalPtr<T>{ |
46 | Null, |
47 | Some(*const T), |
48 | } |
49 | impl<T: Sized> OptionalPtr<T> { |
50 | const fn with(self, value: *const T) -> Self { |
51 | Self::Some(value) |
52 | } |
53 | const fn ptr(self) -> *const T { |
54 | match self { |
55 | Self::Null => std::ptr::null(), |
56 | Self::Some(ptr) => ptr |
57 | } |
58 | } |
59 | } |
60 | OptionalPtr::Null |
61 | $(.with(concat!($release_datetime, " \0" ).as_ptr() as _))? |
62 | .ptr() |
63 | }, |
64 | _gst_reserved: [0 as $crate::glib::ffi::gpointer; 4], |
65 | }); |
66 | |
67 | pub fn plugin_register_static() -> Result<(), $crate::glib::BoolError> { |
68 | unsafe { |
69 | $crate::glib::result_from_gboolean!( |
70 | $crate::ffi::gst_plugin_register_static( |
71 | $crate::subclass::MAJOR_VERSION, |
72 | $crate::subclass::MINOR_VERSION, |
73 | concat!(stringify!($name), " \0" ) as *const str as *const _, |
74 | concat!($description, " \0" ) as *const str as _, |
75 | Some(plugin_init_trampoline), |
76 | concat!($version, " \0" ) as *const str as *const _, |
77 | concat!($license, " \0" ) as *const str as *const _, |
78 | concat!($source, " \0" ) as *const str as *const _, |
79 | concat!($package, " \0" ) as *const str as *const _, |
80 | concat!($origin, " \0" ) as *const str as *const _, |
81 | ), |
82 | "Failed to register the plugin" |
83 | ) |
84 | } |
85 | } |
86 | |
87 | $crate::paste::item! { |
88 | #[no_mangle] |
89 | #[allow(clippy::missing_safety_doc)] |
90 | pub unsafe extern "C" fn [<gst_plugin_ $name _register>] () { |
91 | let _ = plugin_register_static(); |
92 | } |
93 | |
94 | #[no_mangle] |
95 | #[allow(clippy::missing_safety_doc)] |
96 | pub unsafe extern "C" fn [<gst_plugin_ $name _get_desc>] () -> *const $crate::ffi::GstPluginDesc { |
97 | &GST_PLUGIN_DESC.0 |
98 | } |
99 | } |
100 | |
101 | #[allow(clippy::missing_safety_doc)] |
102 | unsafe extern "C" fn plugin_init_trampoline(plugin: *mut $crate::ffi::GstPlugin) -> $crate::glib::ffi::gboolean { |
103 | let panic_result = std::panic::catch_unwind( |
104 | std::panic::AssertUnwindSafe(|| super::$plugin_init(&$crate::glib::translate::from_glib_borrow(plugin))) |
105 | ); |
106 | |
107 | match panic_result { |
108 | Ok(register_result) => match register_result { |
109 | Ok(_) => $crate::glib::ffi::GTRUE, |
110 | Err(err) => { |
111 | $crate::error!($crate::CAT_PLUGIN_LOADING, "Failed to register plugin: {}" , err); |
112 | $crate::glib::ffi::GFALSE |
113 | } |
114 | } |
115 | Err(err) => { |
116 | let cause = err.downcast_ref::<&str>().copied() |
117 | .or_else(|| err.downcast_ref::<String>().map(|s| s.as_str())); |
118 | if let Some(cause) = cause { |
119 | $crate::error!($crate::CAT_PLUGIN_LOADING, "Failed to initialize plugin due to panic: {}" , cause); |
120 | } else { |
121 | $crate::error!($crate::CAT_PLUGIN_LOADING, "Failed to initialize plugin due to panic" ); |
122 | } |
123 | |
124 | $crate::glib::ffi::GFALSE |
125 | } |
126 | } |
127 | } |
128 | } |
129 | pub use self::plugin_desc::plugin_register_static; |
130 | }; |
131 | ); |
132 | |