gstreamer/
device_provider.rs

1// Take a look at the license at the top of the repository in the LICENSE file.
2
3use 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}