gstreamer: Add DeviceProviderClassExt extension trait for class methods

Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer-rs/-/merge_requests/1337>
This commit is contained in:
Sebastian Dröge 2023-10-11 15:47:37 +03:00
parent 7975383e96
commit 3b30546461
3 changed files with 31 additions and 11 deletions

View file

@ -56,6 +56,7 @@ manual = [
"Gst.CapsFeatures", "Gst.CapsFeatures",
"Gst.DebugCategory", "Gst.DebugCategory",
"Gst.DebugMessage", "Gst.DebugMessage",
"Gst.DeviceProviderClass", # for docs only
"Gst.ElementClass", # for docs only "Gst.ElementClass", # for docs only
"Gst.Segment", "Gst.Segment",
"Gst.StaticCaps", "Gst.StaticCaps",

View file

@ -39,16 +39,9 @@ pub trait DeviceProviderExtManual: sealed::Sealed + IsA<DeviceProvider> + 'stati
#[doc(alias = "gst_device_provider_class_get_metadata")] #[doc(alias = "gst_device_provider_class_get_metadata")]
fn metadata<'a>(&self, key: &str) -> Option<&'a str> { fn metadata<'a>(&self, key: &str) -> Option<&'a str> {
unsafe { unsafe {
let klass = (*(self.as_ptr() as *mut glib::gobject_ffi::GTypeInstance)).g_class self.unsafe_cast_ref::<DeviceProvider>()
as *mut ffi::GstDeviceProviderClass; .class()
.metadata(key)
let ptr = ffi::gst_device_provider_class_get_metadata(klass, key.to_glib_none().0);
if ptr.is_null() {
None
} else {
Some(CStr::from_ptr(ptr).to_str().unwrap())
}
} }
} }
@ -64,3 +57,29 @@ pub trait DeviceProviderExtManual: sealed::Sealed + IsA<DeviceProvider> + 'stati
} }
impl<O: IsA<DeviceProvider>> DeviceProviderExtManual for O {} impl<O: IsA<DeviceProvider>> DeviceProviderExtManual for O {}
pub unsafe trait DeviceProviderClassExt {
#[doc(alias = "get_metadata")]
#[doc(alias = "gst_device_provider_class_get_metadata")]
fn metadata<'a>(&self, key: &str) -> Option<&'a str> {
unsafe {
let klass = self as *const _ as *const ffi::GstDeviceProviderClass;
let ptr = ffi::gst_device_provider_class_get_metadata(
mut_override(klass),
key.to_glib_none().0,
);
if ptr.is_null() {
None
} else {
Some(CStr::from_ptr(ptr).to_str().unwrap())
}
}
}
}
unsafe impl<T: IsA<DeviceProvider> + glib::object::IsClass> DeviceProviderClassExt
for glib::object::Class<T>
{
}

View file

@ -317,7 +317,7 @@ pub mod prelude {
child_proxy::ChildProxyExtManual, child_proxy::ChildProxyExtManual,
clock::ClockExtManual, clock::ClockExtManual,
device_monitor::DeviceMonitorExtManual, device_monitor::DeviceMonitorExtManual,
device_provider::DeviceProviderExtManual, device_provider::{DeviceProviderClassExt, DeviceProviderExtManual},
element::{ElementClassExt, ElementExtManual}, element::{ElementClassExt, ElementExtManual},
format::prelude::*, format::prelude::*,
gobject::GObjectExtManualGst, gobject::GObjectExtManualGst,