gstreamer/
device_provider.rs1use std::ffi::CStr;
4
5use glib::{prelude::*, translate::*};
6
7use crate::{ffi, DeviceProvider, Plugin, Rank};
8
9impl DeviceProvider {
10 #[doc(alias = "gst_device_provider_register")]
11 pub fn register(
12 plugin: Option<&Plugin>,
13 name: &str,
14 rank: Rank,
15 type_: glib::types::Type,
16 ) -> Result<(), glib::error::BoolError> {
17 skip_assert_initialized!();
18 unsafe {
19 glib::result_from_gboolean!(
20 ffi::gst_device_provider_register(
21 plugin.to_glib_none().0,
22 name.to_glib_none().0,
23 rank.into_glib() as u32,
24 type_.into_glib()
25 ),
26 "Failed to register device provider factory"
27 )
28 }
29 }
30}
31
32pub trait DeviceProviderExtManual: IsA<DeviceProvider> + 'static {
33 #[doc(alias = "get_metadata")]
34 #[doc(alias = "gst_device_provider_class_get_metadata")]
35 fn metadata<'a>(&self, key: &str) -> Option<&'a str> {
36 unsafe {
37 self.unsafe_cast_ref::<DeviceProvider>()
38 .class()
39 .metadata(key)
40 }
41 }
42
43 #[doc(alias = "gst_device_provider_get_devices")]
44 #[doc(alias = "get_devices")]
45 fn devices(&self) -> glib::List<crate::Device> {
46 unsafe {
47 FromGlibPtrContainer::from_glib_full(ffi::gst_device_provider_get_devices(
48 self.as_ref().to_glib_none().0,
49 ))
50 }
51 }
52}
53
54impl<O: IsA<DeviceProvider>> DeviceProviderExtManual for O {}
55
56pub unsafe trait DeviceProviderClassExt {
57 #[doc(alias = "get_metadata")]
58 #[doc(alias = "gst_device_provider_class_get_metadata")]
59 fn metadata<'a>(&self, key: &str) -> Option<&'a str> {
60 unsafe {
61 let klass = self as *const _ as *const ffi::GstDeviceProviderClass;
62
63 let ptr = ffi::gst_device_provider_class_get_metadata(
64 mut_override(klass),
65 key.to_glib_none().0,
66 );
67
68 if ptr.is_null() {
69 None
70 } else {
71 Some(CStr::from_ptr(ptr).to_str().unwrap())
72 }
73 }
74 }
75}
76
77unsafe impl<T: IsA<DeviceProvider> + glib::object::IsClass> DeviceProviderClassExt
78 for glib::object::Class<T>
79{
80}