Commit 9b910242 authored by Sebastian Dröge's avatar Sebastian Dröge 🍵

Implement all message parsing API

parent cb26c0aa
......@@ -2,7 +2,7 @@
girs_dir = "gir-files"
library = "Gst"
version = "1.0"
min_cfg_version = "1.0"
min_cfg_version = "1.8"
target_path = "gstreamer"
work_mode = "normal"
concurrency = "send+sync"
......@@ -35,6 +35,16 @@ generate = [
"Gst.PluginError",
"Gst.ParseError",
"Gst.URIError",
"Gst.StructureChangeType",
"Gst.StreamStatusType",
"Gst.Device",
"Gst.DeviceMonitor",
"Gst.DeviceProvider",
"Gst.DeviceProviderFactory",
"Gst.Stream",
"Gst.StreamCollection",
"Gst.StreamType",
"Gst.StreamFlags",
]
manual = [
......@@ -220,3 +230,9 @@ status = "generate"
[[object.function]]
name = "util_dump_mem"
ignore = true
[[object.function]]
name = "protection_select_system"
# unsupported array type
ignore = true
......@@ -8,5 +8,5 @@ bitflags = "0.9"
libc = "0.2"
glib-sys = { version = "0.3.4", git = "https://github.com/gtk-rs/sys" }
gobject-sys = { version = "0.3.4", git = "https://github.com/gtk-rs/sys" }
gstreamer-sys = { version = "0.1.1", git = "https://github.com/sdroege/gstreamer-sys" }
gstreamer-sys = { version = "0.1.1", git = "https://github.com/sdroege/gstreamer-sys", features = ["v1_12"] }
glib = { version = "0.1.3", git = "https://github.com/gtk-rs/glib" }
......@@ -75,7 +75,6 @@ pub trait BinExt {
//#[cfg(feature = "v1_10")]
//fn set_suppressed_flags(&self, flags: /*Ignored*/ElementFlags);
#[cfg(feature = "v1_6")]
fn sync_children_states(&self) -> Result<(), glib::error::BoolError>;
fn get_property_async_handling(&self) -> bool;
......@@ -184,7 +183,6 @@ impl<O: IsA<Bin> + IsA<glib::object::Object>> BinExt for O {
// unsafe { TODO: call ffi::gst_bin_set_suppressed_flags() }
//}
#[cfg(feature = "v1_6")]
fn sync_children_states(&self) -> Result<(), glib::error::BoolError> {
unsafe {
glib::error::BoolError::from_glib(ffi::gst_bin_sync_children_states(self.to_glib_none().0), "Failed to sync children states")
......
......@@ -6,19 +6,14 @@ use Object;
use ffi;
use glib;
use glib::Value;
#[cfg(feature = "v1_6")]
use glib::object::Downcast;
use glib::object::IsA;
#[cfg(feature = "v1_6")]
use glib::signal::connect;
use glib::translate::*;
#[cfg(feature = "v1_6")]
use glib_ffi;
use gobject_ffi;
#[cfg(feature = "v1_6")]
use std::boxed::Box as Box_;
use std::mem;
#[cfg(feature = "v1_6")]
use std::mem::transmute;
use std::ptr;
......@@ -66,12 +61,10 @@ unsafe impl Sync for Clock {}
pub trait ClockExt {
fn add_observation(&self, slave: ClockTime, master: ClockTime) -> Option<f64>;
#[cfg(feature = "v1_6")]
fn add_observation_unapplied(&self, slave: ClockTime, master: ClockTime) -> Option<(f64, ClockTime, ClockTime, ClockTime, ClockTime)>;
fn adjust_unlocked(&self, internal: ClockTime) -> ClockTime;
#[cfg(feature = "v1_6")]
fn adjust_with_calibration(&self, internal_target: ClockTime, cinternal: ClockTime, cexternal: ClockTime, cnum: ClockTime, cdenom: ClockTime) -> ClockTime;
fn get_calibration(&self) -> (ClockTime, ClockTime, ClockTime, ClockTime);
......@@ -86,7 +79,6 @@ pub trait ClockExt {
fn get_timeout(&self) -> ClockTime;
#[cfg(feature = "v1_6")]
fn is_synced(&self) -> bool;
//fn new_periodic_id(&self, start_time: ClockTime, interval: ClockTime) -> /*Unimplemented*/Option<ClockID>;
......@@ -101,7 +93,6 @@ pub trait ClockExt {
fn set_resolution(&self, resolution: ClockTime) -> ClockTime;
#[cfg(feature = "v1_6")]
fn set_synced(&self, synced: bool);
fn set_timeout(&self, timeout: ClockTime);
......@@ -110,10 +101,8 @@ pub trait ClockExt {
fn unadjust_unlocked(&self, external: ClockTime) -> ClockTime;
#[cfg(feature = "v1_8")]
fn unadjust_with_calibration(&self, external_target: ClockTime, cinternal: ClockTime, cexternal: ClockTime, cnum: ClockTime, cdenom: ClockTime) -> ClockTime;
#[cfg(feature = "v1_6")]
fn wait_for_sync(&self, timeout: ClockTime) -> Result<(), glib::error::BoolError>;
fn get_property_window_size(&self) -> i32;
......@@ -124,7 +113,6 @@ pub trait ClockExt {
fn set_property_window_threshold(&self, window_threshold: i32);
#[cfg(feature = "v1_6")]
fn connect_synced<F: Fn(&Self, bool) + Send + Sync + 'static>(&self, f: F) -> u64;
}
......@@ -137,7 +125,6 @@ impl<O: IsA<Clock> + IsA<glib::object::Object>> ClockExt for O {
}
}
#[cfg(feature = "v1_6")]
fn add_observation_unapplied(&self, slave: ClockTime, master: ClockTime) -> Option<(f64, ClockTime, ClockTime, ClockTime, ClockTime)> {
unsafe {
let mut r_squared = mem::uninitialized();
......@@ -156,7 +143,6 @@ impl<O: IsA<Clock> + IsA<glib::object::Object>> ClockExt for O {
}
}
#[cfg(feature = "v1_6")]
fn adjust_with_calibration(&self, internal_target: ClockTime, cinternal: ClockTime, cexternal: ClockTime, cnum: ClockTime, cdenom: ClockTime) -> ClockTime {
unsafe {
ffi::gst_clock_adjust_with_calibration(self.to_glib_none().0, internal_target, cinternal, cexternal, cnum, cdenom)
......@@ -204,7 +190,6 @@ impl<O: IsA<Clock> + IsA<glib::object::Object>> ClockExt for O {
}
}
#[cfg(feature = "v1_6")]
fn is_synced(&self) -> bool {
unsafe {
from_glib(ffi::gst_clock_is_synced(self.to_glib_none().0))
......@@ -243,7 +228,6 @@ impl<O: IsA<Clock> + IsA<glib::object::Object>> ClockExt for O {
}
}
#[cfg(feature = "v1_6")]
fn set_synced(&self, synced: bool) {
unsafe {
ffi::gst_clock_set_synced(self.to_glib_none().0, synced.to_glib());
......@@ -266,14 +250,12 @@ impl<O: IsA<Clock> + IsA<glib::object::Object>> ClockExt for O {
}
}
#[cfg(feature = "v1_8")]
fn unadjust_with_calibration(&self, external_target: ClockTime, cinternal: ClockTime, cexternal: ClockTime, cnum: ClockTime, cdenom: ClockTime) -> ClockTime {
unsafe {
ffi::gst_clock_unadjust_with_calibration(self.to_glib_none().0, external_target, cinternal, cexternal, cnum, cdenom)
}
}
#[cfg(feature = "v1_6")]
fn wait_for_sync(&self, timeout: ClockTime) -> Result<(), glib::error::BoolError> {
unsafe {
glib::error::BoolError::from_glib(ffi::gst_clock_wait_for_sync(self.to_glib_none().0, timeout), "Timed out waiting for sync")
......@@ -308,7 +290,6 @@ impl<O: IsA<Clock> + IsA<glib::object::Object>> ClockExt for O {
}
}
#[cfg(feature = "v1_6")]
fn connect_synced<F: Fn(&Self, bool) + Send + Sync + 'static>(&self, f: F) -> u64 {
unsafe {
let f: Box_<Box_<Fn(&Self, bool) + Send + Sync + 'static>> = Box_::new(Box_::new(f));
......@@ -318,7 +299,6 @@ impl<O: IsA<Clock> + IsA<glib::object::Object>> ClockExt for O {
}
}
#[cfg(feature = "v1_6")]
unsafe extern "C" fn synced_trampoline<P>(this: *mut ffi::GstClock, synced: glib_ffi::gboolean, f: glib_ffi::gpointer)
where P: IsA<Clock> {
callback_guard!();
......
// This file was generated by gir (33e9567) from gir-files (???)
// DO NOT EDIT
use Element;
use Object;
use ffi;
use glib;
use glib::Value;
use glib::object::Downcast;
use glib::object::IsA;
use glib::signal::connect;
use glib::translate::*;
use glib_ffi;
use gobject_ffi;
use std::boxed::Box as Box_;
use std::mem::transmute;
glib_wrapper! {
pub struct Device(Object<ffi::GstDevice>): Object;
match fn {
get_type => || ffi::gst_device_get_type(),
}
}
unsafe impl Send for Device {}
unsafe impl Sync for Device {}
pub trait DeviceExt {
fn create_element<'a, P: Into<Option<&'a str>>>(&self, name: P) -> Option<Element>;
//fn get_caps(&self) -> /*Ignored*/Option<Caps>;
fn get_device_class(&self) -> Option<String>;
fn get_display_name(&self) -> Option<String>;
//fn get_properties(&self) -> /*Ignored*/Option<Structure>;
fn has_classes(&self, classes: &str) -> bool;
fn has_classesv(&self, classes: &[&str]) -> bool;
fn reconfigure_element<P: IsA<Element>>(&self, element: &P) -> bool;
//fn get_property_caps(&self) -> /*Ignored*/Option<Caps>;
fn get_property_device_class(&self) -> Option<String>;
fn get_property_display_name(&self) -> Option<String>;
//fn get_property_properties(&self) -> /*Ignored*/Option<Structure>;
fn connect_removed<F: Fn(&Self) + Send + Sync + 'static>(&self, f: F) -> u64;
}
impl<O: IsA<Device> + IsA<glib::object::Object>> DeviceExt for O {
fn create_element<'a, P: Into<Option<&'a str>>>(&self, name: P) -> Option<Element> {
let name = name.into();
let name = name.to_glib_none();
unsafe {
from_glib_full(ffi::gst_device_create_element(self.to_glib_none().0, name.0))
}
}
//fn get_caps(&self) -> /*Ignored*/Option<Caps> {
// unsafe { TODO: call ffi::gst_device_get_caps() }
//}
fn get_device_class(&self) -> Option<String> {
unsafe {
from_glib_full(ffi::gst_device_get_device_class(self.to_glib_none().0))
}
}
fn get_display_name(&self) -> Option<String> {
unsafe {
from_glib_full(ffi::gst_device_get_display_name(self.to_glib_none().0))
}
}
//fn get_properties(&self) -> /*Ignored*/Option<Structure> {
// unsafe { TODO: call ffi::gst_device_get_properties() }
//}
fn has_classes(&self, classes: &str) -> bool {
unsafe {
from_glib(ffi::gst_device_has_classes(self.to_glib_none().0, classes.to_glib_none().0))
}
}
fn has_classesv(&self, classes: &[&str]) -> bool {
unsafe {
from_glib(ffi::gst_device_has_classesv(self.to_glib_none().0, classes.to_glib_none().0))
}
}
fn reconfigure_element<P: IsA<Element>>(&self, element: &P) -> bool {
unsafe {
from_glib(ffi::gst_device_reconfigure_element(self.to_glib_none().0, element.to_glib_none().0))
}
}
//fn get_property_caps(&self) -> /*Ignored*/Option<Caps> {
// let mut value = Value::from(None::<&/*Ignored*/Caps>);
// unsafe {
// gobject_ffi::g_object_get_property(self.to_glib_none().0, "caps".to_glib_none().0, value.to_glib_none_mut().0);
// }
// value.get()
//}
fn get_property_device_class(&self) -> Option<String> {
let mut value = Value::from(None::<&str>);
unsafe {
gobject_ffi::g_object_get_property(self.to_glib_none().0, "device-class".to_glib_none().0, value.to_glib_none_mut().0);
}
value.get()
}
fn get_property_display_name(&self) -> Option<String> {
let mut value = Value::from(None::<&str>);
unsafe {
gobject_ffi::g_object_get_property(self.to_glib_none().0, "display-name".to_glib_none().0, value.to_glib_none_mut().0);
}
value.get()
}
//fn get_property_properties(&self) -> /*Ignored*/Option<Structure> {
// let mut value = Value::from(None::<&/*Ignored*/Structure>);
// unsafe {
// gobject_ffi::g_object_get_property(self.to_glib_none().0, "properties".to_glib_none().0, value.to_glib_none_mut().0);
// }
// value.get()
//}
fn connect_removed<F: Fn(&Self) + Send + Sync + 'static>(&self, f: F) -> u64 {
unsafe {
let f: Box_<Box_<Fn(&Self) + Send + Sync + 'static>> = Box_::new(Box_::new(f));
connect(self.to_glib_none().0, "removed",
transmute(removed_trampoline::<Self> as usize), Box_::into_raw(f) as *mut _)
}
}
}
unsafe extern "C" fn removed_trampoline<P>(this: *mut ffi::GstDevice, f: glib_ffi::gpointer)
where P: IsA<Device> {
callback_guard!();
let f: &Box_<Fn(&P) + Send + Sync + 'static> = transmute(f);
f(&Device::from_glib_none(this).downcast_unchecked())
}
// This file was generated by gir (33e9567) from gir-files (???)
// DO NOT EDIT
use Bus;
use Device;
use Object;
use ffi;
use glib;
use glib::Value;
use glib::object::IsA;
use glib::translate::*;
use gobject_ffi;
glib_wrapper! {
pub struct DeviceMonitor(Object<ffi::GstDeviceMonitor>): Object;
match fn {
get_type => || ffi::gst_device_monitor_get_type(),
}
}
impl DeviceMonitor {
pub fn new() -> DeviceMonitor {
unsafe {
from_glib_full(ffi::gst_device_monitor_new())
}
}
}
unsafe impl Send for DeviceMonitor {}
unsafe impl Sync for DeviceMonitor {}
pub trait DeviceMonitorExt {
//fn add_filter<'a, 'b, P: Into<Option<&'a str>>, Q: Into<Option<&'b /*Ignored*/Caps>>>(&self, classes: P, caps: Q) -> u32;
fn get_bus(&self) -> Option<Bus>;
fn get_devices(&self) -> Vec<Device>;
fn get_providers(&self) -> Vec<String>;
fn get_show_all_devices(&self) -> bool;
fn remove_filter(&self, filter_id: u32) -> bool;
fn set_show_all_devices(&self, show_all: bool);
fn start(&self) -> bool;
fn stop(&self);
fn get_property_show_all(&self) -> bool;
fn set_property_show_all(&self, show_all: bool);
}
impl<O: IsA<DeviceMonitor> + IsA<glib::object::Object>> DeviceMonitorExt for O {
//fn add_filter<'a, 'b, P: Into<Option<&'a str>>, Q: Into<Option<&'b /*Ignored*/Caps>>>(&self, classes: P, caps: Q) -> u32 {
// unsafe { TODO: call ffi::gst_device_monitor_add_filter() }
//}
fn get_bus(&self) -> Option<Bus> {
unsafe {
from_glib_full(ffi::gst_device_monitor_get_bus(self.to_glib_none().0))
}
}
fn get_devices(&self) -> Vec<Device> {
unsafe {
FromGlibPtrContainer::from_glib_full(ffi::gst_device_monitor_get_devices(self.to_glib_none().0))
}
}
fn get_providers(&self) -> Vec<String> {
unsafe {
FromGlibPtrContainer::from_glib_full(ffi::gst_device_monitor_get_providers(self.to_glib_none().0))
}
}
fn get_show_all_devices(&self) -> bool {
unsafe {
from_glib(ffi::gst_device_monitor_get_show_all_devices(self.to_glib_none().0))
}
}
fn remove_filter(&self, filter_id: u32) -> bool {
unsafe {
from_glib(ffi::gst_device_monitor_remove_filter(self.to_glib_none().0, filter_id))
}
}
fn set_show_all_devices(&self, show_all: bool) {
unsafe {
ffi::gst_device_monitor_set_show_all_devices(self.to_glib_none().0, show_all.to_glib());
}
}
fn start(&self) -> bool {
unsafe {
from_glib(ffi::gst_device_monitor_start(self.to_glib_none().0))
}
}
fn stop(&self) {
unsafe {
ffi::gst_device_monitor_stop(self.to_glib_none().0);
}
}
fn get_property_show_all(&self) -> bool {
let mut value = Value::from(&false);
unsafe {
gobject_ffi::g_object_get_property(self.to_glib_none().0, "show-all".to_glib_none().0, value.to_glib_none_mut().0);
}
value.get().unwrap()
}
fn set_property_show_all(&self, show_all: bool) {
unsafe {
gobject_ffi::g_object_set_property(self.to_glib_none().0, "show-all".to_glib_none().0, Value::from(&show_all).to_glib_none().0);
}
}
}
// This file was generated by gir (33e9567) from gir-files (???)
// DO NOT EDIT
use Bus;
use Device;
use DeviceProviderFactory;
use Object;
use Plugin;
use ffi;
use glib;
use glib::object::Downcast;
use glib::object::IsA;
use glib::signal::connect;
use glib::translate::*;
use glib_ffi;
use libc;
use std::boxed::Box as Box_;
use std::mem::transmute;
glib_wrapper! {
pub struct DeviceProvider(Object<ffi::GstDeviceProvider>): Object;
match fn {
get_type => || ffi::gst_device_provider_get_type(),
}
}
impl DeviceProvider {
pub fn register<'a, P: Into<Option<&'a Plugin>>>(plugin: P, name: &str, rank: u32, type_: glib::types::Type) -> bool {
let plugin = plugin.into();
let plugin = plugin.to_glib_none();
unsafe {
from_glib(ffi::gst_device_provider_register(plugin.0, name.to_glib_none().0, rank, type_.to_glib()))
}
}
}
unsafe impl Send for DeviceProvider {}
unsafe impl Sync for DeviceProvider {}
pub trait DeviceProviderExt {
fn can_monitor(&self) -> bool;
fn device_add(&self, device: &Device);
fn device_remove(&self, device: &Device);
fn get_bus(&self) -> Option<Bus>;
fn get_devices(&self) -> Vec<Device>;
fn get_factory(&self) -> Option<DeviceProviderFactory>;
fn get_hidden_providers(&self) -> Vec<String>;
fn hide_provider(&self, name: &str);
fn start(&self) -> bool;
fn stop(&self);
fn unhide_provider(&self, name: &str);
fn connect_provider_hidden<F: Fn(&Self, &str) + Send + Sync + 'static>(&self, f: F) -> u64;
fn connect_provider_unhidden<F: Fn(&Self, &str) + Send + Sync + 'static>(&self, f: F) -> u64;
}
impl<O: IsA<DeviceProvider> + IsA<glib::object::Object>> DeviceProviderExt for O {
fn can_monitor(&self) -> bool {
unsafe {
from_glib(ffi::gst_device_provider_can_monitor(self.to_glib_none().0))
}
}
fn device_add(&self, device: &Device) {
unsafe {
ffi::gst_device_provider_device_add(self.to_glib_none().0, device.to_glib_none().0);
}
}
fn device_remove(&self, device: &Device) {
unsafe {
ffi::gst_device_provider_device_remove(self.to_glib_none().0, device.to_glib_none().0);
}
}
fn get_bus(&self) -> Option<Bus> {
unsafe {
from_glib_full(ffi::gst_device_provider_get_bus(self.to_glib_none().0))
}
}
fn get_devices(&self) -> Vec<Device> {
unsafe {
FromGlibPtrContainer::from_glib_full(ffi::gst_device_provider_get_devices(self.to_glib_none().0))
}
}
fn get_factory(&self) -> Option<DeviceProviderFactory> {
unsafe {
from_glib_none(ffi::gst_device_provider_get_factory(self.to_glib_none().0))
}
}
fn get_hidden_providers(&self) -> Vec<String> {
unsafe {
FromGlibPtrContainer::from_glib_full(ffi::gst_device_provider_get_hidden_providers(self.to_glib_none().0))
}
}
fn hide_provider(&self, name: &str) {
unsafe {
ffi::gst_device_provider_hide_provider(self.to_glib_none().0, name.to_glib_none().0);
}
}
fn start(&self) -> bool {
unsafe {
from_glib(ffi::gst_device_provider_start(self.to_glib_none().0))
}
}
fn stop(&self) {
unsafe {
ffi::gst_device_provider_stop(self.to_glib_none().0);
}
}
fn unhide_provider(&self, name: &str) {
unsafe {
ffi::gst_device_provider_unhide_provider(self.to_glib_none().0, name.to_glib_none().0);
}
}
fn connect_provider_hidden<F: Fn(&Self, &str) + Send + Sync + 'static>(&self, f: F) -> u64 {
unsafe {
let f: Box_<Box_<Fn(&Self, &str) + Send + Sync + 'static>> = Box_::new(Box_::new(f));
connect(self.to_glib_none().0, "provider-hidden",
transmute(provider_hidden_trampoline::<Self> as usize), Box_::into_raw(f) as *mut _)
}
}
fn connect_provider_unhidden<F: Fn(&Self, &str) + Send + Sync + 'static>(&self, f: F) -> u64 {
unsafe {
let f: Box_<Box_<Fn(&Self, &str) + Send + Sync + 'static>> = Box_::new(Box_::new(f));
connect(self.to_glib_none().0, "provider-unhidden",
transmute(provider_unhidden_trampoline::<Self> as usize), Box_::into_raw(f) as *mut _)
}
}
}
unsafe extern "C" fn provider_hidden_trampoline<P>(this: *mut ffi::GstDeviceProvider, object: *mut libc::c_char, f: glib_ffi::gpointer)
where P: IsA<DeviceProvider> {
callback_guard!();
let f: &Box_<Fn(&P, &str) + Send + Sync + 'static> = transmute(f);
f(&DeviceProvider::from_glib_none(this).downcast_unchecked(), &String::from_glib_none(object))
}
unsafe extern "C" fn provider_unhidden_trampoline<P>(this: *mut ffi::GstDeviceProvider, object: *mut libc::c_char, f: glib_ffi::gpointer)
where P: IsA<DeviceProvider> {
callback_guard!();
let f: &Box_<Fn(&P, &str) + Send + Sync + 'static> = transmute(f);
f(&DeviceProvider::from_glib_none(this).downcast_unchecked(), &String::from_glib_none(object))
}
// This file was generated by gir (33e9567) from gir-files (???)
// DO NOT EDIT
use DeviceProvider;
use Object;
use ffi;
use glib;
use glib::object::IsA;
use glib::translate::*;
glib_wrapper! {
pub struct DeviceProviderFactory(Object<ffi::GstDeviceProviderFactory>): Object;
match fn {
get_type => || ffi::gst_device_provider_factory_get_type(),
}
}
impl DeviceProviderFactory {
pub fn find(name: &str) -> Option<DeviceProviderFactory> {
unsafe {
from_glib_full(ffi::gst_device_provider_factory_find(name.to_glib_none().0))
}
}
pub fn get_by_name(factoryname: &str) -> Option<DeviceProvider> {
unsafe {
from_glib_full(ffi::gst_device_provider_factory_get_by_name(factoryname.to_glib_none().0))
}
}
//pub fn list_get_device_providers(minrank: /*Ignored*/Rank) -> Vec<DeviceProviderFactory> {
// unsafe { TODO: call ffi::gst_device_provider_factory_list_get_device_providers() }
//}
}
unsafe impl Send for DeviceProviderFactory {}
unsafe impl Sync for DeviceProviderFactory {}
pub trait DeviceProviderFactoryExt {
fn get(&self) -> Option<DeviceProvider>;
fn get_device_provider_type(&self) -> glib::types::Type;
fn get_metadata(&self, key: &str) -> Option<String>;
fn get_metadata_keys(&self) -> Vec<String>;
fn has_classes<'a, P: Into<Option<&'a str>>>(&self, classes: P) -> bool;
fn has_classesv(&self, classes: &[&str]) -> bool;
}
impl<O: IsA<DeviceProviderFactory>> DeviceProviderFactoryExt for O {
fn get(&self) -> Option<DeviceProvider> {
unsafe {
from_glib_full(ffi::gst_device_provider_factory_get(self.to_glib_none().0))
}
}
fn get_device_provider_type(&self) -> glib::types::Type {
unsafe {
from_glib(ffi::gst_device_provider_factory_get_device_provider_type(self.to_glib_none().0))
}
}
fn get_metadata(&self, key: &str) -> Option<String> {
unsafe {
from_glib_none(ffi::gst_device_provider_factory_get_metadata(self.to_glib_none().0, key.to_glib_none().0))
}
}
fn get_metadata_keys(&self) -> Vec<String> {
unsafe {
FromGlibPtrContainer::from_glib_full(ffi::gst_device_provider_factory_get_metadata_keys(self.to_glib_none().0))
}
}
fn has_classes<'a, P: Into<Option<&'a str>>>(&self, classes: P) -> bool {
let classes = classes.into();
let classes = classes.to_glib_none();
unsafe {