gstreamer: Use glib::List in various places for reducing allocations when working with factory lists

Fixes https://gitlab.freedesktop.org/gstreamer/gstreamer-rs/-/issues/359
This commit is contained in:
Sebastian Dröge 2021-11-15 11:45:30 +02:00
parent 9263c9f42e
commit 668b2b3fdf
20 changed files with 316 additions and 210 deletions

View file

@ -1091,6 +1091,28 @@ final_type = true
# separate name/value arrays need to be merged # separate name/value arrays need to be merged
manual = true manual = true
[[object.function]]
name = "get_static_pad_templates"
# Use glib::List as return type
manual = true
[[object.function]]
name = "list_is_type"
rename = "has_type"
# Renamed flags type
manual = true
[[object.function]]
name = "list_filter"
# can_{sink,src}_{all,any}_caps() around an iterator is the same
ignore = true
[[object.function]]
name = "list_get_elements"
rename = "factories_with_type"
# Use glib::List as return type
manual = true
[[object]] [[object]]
name = "Gst.TypeFindFactory" name = "Gst.TypeFindFactory"
status = "generate" status = "generate"
@ -1101,10 +1123,21 @@ final_type = true
# Set up native functions in `TypeFind`, calling into trait argument # Set up native functions in `TypeFind`, calling into trait argument
manual = true manual = true
[[object.function]]
name = "get_list"
rename = "factories"
# Use glib::List as return type
manual = true
[[object]] [[object]]
name = "Gst.DeviceProviderFactory" name = "Gst.DeviceProviderFactory"
status = "generate" status = "generate"
final_type = true final_type = true
[[object.function]]
name = "list_get_device_providers"
rename = "factories"
# Use glib::List as return type
manual = true
[[object]] [[object]]
name = "Gst.DeviceProvider" name = "Gst.DeviceProvider"
@ -1124,6 +1157,11 @@ manual_traits = ["DeviceProviderExtManual"]
# better manual function # better manual function
manual = true manual = true
[[object.function]]
name = "get_devices"
# Use glib::List as return type
manual = true
[[object]] [[object]]
name = "Gst.DeviceMonitor" name = "Gst.DeviceMonitor"
status = "generate" status = "generate"
@ -1148,6 +1186,11 @@ manual_traits = ["DeviceMonitorExtManual"]
# Use DeviceMonitorFilterId and return Result<(), glib::BoolError> # Use DeviceMonitorFilterId and return Result<(), glib::BoolError>
manual = true manual = true
[[object.function]]
name = "get_devices"
# Use glib::List as return type
manual = true
[[object]] [[object]]
name = "Gst.Device" name = "Gst.Device"
status = "generate" status = "generate"
@ -1655,6 +1698,36 @@ final_type = true
[object.function.return] [object.function.return]
bool_return_is_error = "Failed to add plugin" bool_return_is_error = "Failed to add plugin"
[[object.function]]
name = "feature_filter"
rename = "features_filtered"
# Use glib::List as return type
manual = true
[[object.function]]
name = "get_feature_list"
rename = "features"
# Use glib::List as return type
manual = true
[[object.function]]
name = "get_feature_list_by_plugin"
rename = "features_by_plugin"
# Use glib::List as return type
manual = true
[[object.function]]
name = "get_plugin_list"
rename = "plugins"
# Use glib::List as return type
manual = true
[[object.function]]
name = "plugin_filter"
rename = "plugins_filtered"
# Use glib::List as return type
manual = true
[[object]] [[object]]
name = "Gst.BufferPool" name = "Gst.BufferPool"
status = "generate" status = "generate"
@ -2041,6 +2114,12 @@ status = "generate"
# implemented as part of Tracer subclassing # implemented as part of Tracer subclassing
manual = true manual = true
[[object.function]]
name = "tracing_get_active_tracers"
rename = "active_tracers"
# Use glib::List as return type
manual = true
[[object]] [[object]]
name = "Gst.State" name = "Gst.State"
status = "generate" status = "generate"
@ -2262,6 +2341,12 @@ status = "generate"
name = "Gst.TracerFactory" name = "Gst.TracerFactory"
status = "generate" status = "generate"
[[object.function]]
name = "get_list"
rename = "factories"
# Use glib::List as return type
manual = true
[[object]] [[object]]
name = "Gst.URIType" name = "Gst.URIType"
status = "generate" status = "generate"

View file

@ -4,7 +4,6 @@
// DO NOT EDIT // DO NOT EDIT
use crate::Bus; use crate::Bus;
use crate::Device;
use crate::Object; use crate::Object;
use glib::object::Cast; use glib::object::Cast;
use glib::object::IsA; use glib::object::IsA;
@ -37,10 +36,6 @@ pub trait DeviceMonitorExt: 'static {
#[doc(alias = "get_bus")] #[doc(alias = "get_bus")]
fn bus(&self) -> Bus; fn bus(&self) -> Bus;
#[doc(alias = "gst_device_monitor_get_devices")]
#[doc(alias = "get_devices")]
fn devices(&self) -> Vec<Device>;
#[doc(alias = "gst_device_monitor_get_providers")] #[doc(alias = "gst_device_monitor_get_providers")]
#[doc(alias = "get_providers")] #[doc(alias = "get_providers")]
fn providers(&self) -> Vec<glib::GString>; fn providers(&self) -> Vec<glib::GString>;
@ -80,14 +75,6 @@ impl<O: IsA<DeviceMonitor>> DeviceMonitorExt for O {
} }
} }
fn devices(&self) -> Vec<Device> {
unsafe {
FromGlibPtrContainer::from_glib_full(ffi::gst_device_monitor_get_devices(
self.as_ref().to_glib_none().0,
))
}
}
fn providers(&self) -> Vec<glib::GString> { fn providers(&self) -> Vec<glib::GString> {
unsafe { unsafe {
FromGlibPtrContainer::from_glib_full(ffi::gst_device_monitor_get_providers( FromGlibPtrContainer::from_glib_full(ffi::gst_device_monitor_get_providers(

View file

@ -50,10 +50,6 @@ pub trait DeviceProviderExt: 'static {
#[doc(alias = "get_bus")] #[doc(alias = "get_bus")]
fn bus(&self) -> Bus; fn bus(&self) -> Bus;
#[doc(alias = "gst_device_provider_get_devices")]
#[doc(alias = "get_devices")]
fn devices(&self) -> Vec<Device>;
#[doc(alias = "gst_device_provider_get_factory")] #[doc(alias = "gst_device_provider_get_factory")]
#[doc(alias = "get_factory")] #[doc(alias = "get_factory")]
fn factory(&self) -> Option<DeviceProviderFactory>; fn factory(&self) -> Option<DeviceProviderFactory>;
@ -139,14 +135,6 @@ impl<O: IsA<DeviceProvider>> DeviceProviderExt for O {
} }
} }
fn devices(&self) -> Vec<Device> {
unsafe {
FromGlibPtrContainer::from_glib_full(ffi::gst_device_provider_get_devices(
self.as_ref().to_glib_none().0,
))
}
}
fn factory(&self) -> Option<DeviceProviderFactory> { fn factory(&self) -> Option<DeviceProviderFactory> {
unsafe { unsafe {
from_glib_none(ffi::gst_device_provider_get_factory( from_glib_none(ffi::gst_device_provider_get_factory(

View file

@ -6,7 +6,6 @@
use crate::DeviceProvider; use crate::DeviceProvider;
use crate::Object; use crate::Object;
use crate::PluginFeature; use crate::PluginFeature;
use crate::Rank;
use glib::translate::*; use glib::translate::*;
glib::wrapper! { glib::wrapper! {
@ -91,16 +90,6 @@ impl DeviceProviderFactory {
)) ))
} }
} }
#[doc(alias = "gst_device_provider_factory_list_get_device_providers")]
pub fn list_get_device_providers(minrank: Rank) -> Vec<DeviceProviderFactory> {
assert_initialized_main_thread!();
unsafe {
FromGlibPtrContainer::from_glib_full(
ffi::gst_device_provider_factory_list_get_device_providers(minrank.into_glib()),
)
}
}
} }
unsafe impl Send for DeviceProviderFactory {} unsafe impl Send for DeviceProviderFactory {}

View file

@ -5,12 +5,8 @@
use crate::Caps; use crate::Caps;
use crate::Element; use crate::Element;
use crate::ElementFactoryListType;
use crate::Object; use crate::Object;
use crate::PadDirection;
use crate::PluginFeature; use crate::PluginFeature;
use crate::Rank;
use crate::StaticPadTemplate;
use crate::URIType; use crate::URIType;
use glib::translate::*; use glib::translate::*;
@ -112,16 +108,6 @@ impl ElementFactory {
unsafe { ffi::gst_element_factory_get_num_pad_templates(self.to_glib_none().0) } unsafe { ffi::gst_element_factory_get_num_pad_templates(self.to_glib_none().0) }
} }
#[doc(alias = "gst_element_factory_get_static_pad_templates")]
#[doc(alias = "get_static_pad_templates")]
pub fn static_pad_templates(&self) -> Vec<StaticPadTemplate> {
unsafe {
FromGlibPtrContainer::from_glib_none(ffi::gst_element_factory_get_static_pad_templates(
self.to_glib_none().0,
))
}
}
#[doc(alias = "gst_element_factory_get_uri_protocols")] #[doc(alias = "gst_element_factory_get_uri_protocols")]
#[doc(alias = "get_uri_protocols")] #[doc(alias = "get_uri_protocols")]
pub fn uri_protocols(&self) -> Vec<glib::GString> { pub fn uri_protocols(&self) -> Vec<glib::GString> {
@ -148,51 +134,12 @@ impl ElementFactory {
} }
} }
#[doc(alias = "gst_element_factory_list_is_type")]
pub fn list_is_type(&self, type_: ElementFactoryListType) -> bool {
unsafe {
from_glib(ffi::gst_element_factory_list_is_type(
self.to_glib_none().0,
type_.into_glib(),
))
}
}
#[doc(alias = "gst_element_factory_find")] #[doc(alias = "gst_element_factory_find")]
pub fn find(name: &str) -> Option<ElementFactory> { pub fn find(name: &str) -> Option<ElementFactory> {
assert_initialized_main_thread!(); assert_initialized_main_thread!();
unsafe { from_glib_full(ffi::gst_element_factory_find(name.to_glib_none().0)) } unsafe { from_glib_full(ffi::gst_element_factory_find(name.to_glib_none().0)) }
} }
#[doc(alias = "gst_element_factory_list_filter")]
pub fn list_filter(
list: &[ElementFactory],
caps: &Caps,
direction: PadDirection,
subsetonly: bool,
) -> Vec<ElementFactory> {
assert_initialized_main_thread!();
unsafe {
FromGlibPtrContainer::from_glib_full(ffi::gst_element_factory_list_filter(
list.to_glib_none().0,
caps.to_glib_none().0,
direction.into_glib(),
subsetonly.into_glib(),
))
}
}
#[doc(alias = "gst_element_factory_list_get_elements")]
pub fn list_get_elements(type_: ElementFactoryListType, minrank: Rank) -> Vec<ElementFactory> {
assert_initialized_main_thread!();
unsafe {
FromGlibPtrContainer::from_glib_full(ffi::gst_element_factory_list_get_elements(
type_.into_glib(),
minrank.into_glib(),
))
}
}
#[doc(alias = "gst_element_factory_make")] #[doc(alias = "gst_element_factory_make")]
pub fn make(factoryname: &str, name: Option<&str>) -> Result<Element, glib::BoolError> { pub fn make(factoryname: &str, name: Option<&str>) -> Result<Element, glib::BoolError> {
assert_initialized_main_thread!(); assert_initialized_main_thread!();

View file

@ -14,9 +14,6 @@ use crate::PluginAPIFlags;
#[cfg(any(feature = "v1_12", feature = "dox"))] #[cfg(any(feature = "v1_12", feature = "dox"))]
#[cfg_attr(feature = "dox", doc(cfg(feature = "v1_12")))] #[cfg_attr(feature = "dox", doc(cfg(feature = "v1_12")))]
use crate::StackTraceFlags; use crate::StackTraceFlags;
#[cfg(any(feature = "v1_18", feature = "dox"))]
#[cfg_attr(feature = "dox", doc(cfg(feature = "v1_18")))]
use crate::Tracer;
use glib::object::IsA; use glib::object::IsA;
use glib::translate::*; use glib::translate::*;
use std::mem; use std::mem;
@ -239,14 +236,6 @@ pub fn parse_launchv(argv: &[&str]) -> Result<Element, glib::Error> {
} }
} }
#[cfg(any(feature = "v1_18", feature = "dox"))]
#[cfg_attr(feature = "dox", doc(cfg(feature = "v1_18")))]
#[doc(alias = "gst_tracing_get_active_tracers")]
pub fn tracing_get_active_tracers() -> Vec<Tracer> {
assert_initialized_main_thread!();
unsafe { FromGlibPtrContainer::from_glib_full(ffi::gst_tracing_get_active_tracers()) }
}
#[cfg(any(feature = "v1_18", feature = "dox"))] #[cfg(any(feature = "v1_18", feature = "dox"))]
#[cfg_attr(feature = "dox", doc(cfg(feature = "v1_18")))] #[cfg_attr(feature = "dox", doc(cfg(feature = "v1_18")))]
#[doc(alias = "gst_type_mark_as_plugin_api")] #[doc(alias = "gst_type_mark_as_plugin_api")]

View file

@ -69,34 +69,6 @@ impl Registry {
} }
} }
#[doc(alias = "gst_registry_feature_filter")]
pub fn feature_filter<P: FnMut(&PluginFeature) -> bool>(
&self,
filter: P,
first: bool,
) -> Vec<PluginFeature> {
let filter_data: P = filter;
unsafe extern "C" fn filter_func<P: FnMut(&PluginFeature) -> bool>(
feature: *mut ffi::GstPluginFeature,
user_data: glib::ffi::gpointer,
) -> glib::ffi::gboolean {
let feature = from_glib_borrow(feature);
let callback: *mut P = user_data as *const _ as usize as *mut P;
let res = (*callback)(&feature);
res.into_glib()
}
let filter = Some(filter_func::<P> as _);
let super_callback0: &P = &filter_data;
unsafe {
FromGlibPtrContainer::from_glib_full(ffi::gst_registry_feature_filter(
self.to_glib_none().0,
filter,
first.into_glib(),
super_callback0 as *const _ as usize as *mut _,
))
}
}
#[doc(alias = "gst_registry_find_feature")] #[doc(alias = "gst_registry_find_feature")]
pub fn find_feature(&self, name: &str, type_: glib::types::Type) -> Option<PluginFeature> { pub fn find_feature(&self, name: &str, type_: glib::types::Type) -> Option<PluginFeature> {
unsafe { unsafe {
@ -118,44 +90,12 @@ impl Registry {
} }
} }
#[doc(alias = "gst_registry_get_feature_list")]
#[doc(alias = "get_feature_list")]
pub fn feature_list(&self, type_: glib::types::Type) -> Vec<PluginFeature> {
unsafe {
FromGlibPtrContainer::from_glib_full(ffi::gst_registry_get_feature_list(
self.to_glib_none().0,
type_.into_glib(),
))
}
}
#[doc(alias = "gst_registry_get_feature_list_by_plugin")]
#[doc(alias = "get_feature_list_by_plugin")]
pub fn feature_list_by_plugin(&self, name: &str) -> Vec<PluginFeature> {
unsafe {
FromGlibPtrContainer::from_glib_full(ffi::gst_registry_get_feature_list_by_plugin(
self.to_glib_none().0,
name.to_glib_none().0,
))
}
}
#[doc(alias = "gst_registry_get_feature_list_cookie")] #[doc(alias = "gst_registry_get_feature_list_cookie")]
#[doc(alias = "get_feature_list_cookie")] #[doc(alias = "get_feature_list_cookie")]
pub fn feature_list_cookie(&self) -> u32 { pub fn feature_list_cookie(&self) -> u32 {
unsafe { ffi::gst_registry_get_feature_list_cookie(self.to_glib_none().0) } unsafe { ffi::gst_registry_get_feature_list_cookie(self.to_glib_none().0) }
} }
#[doc(alias = "gst_registry_get_plugin_list")]
#[doc(alias = "get_plugin_list")]
pub fn plugin_list(&self) -> Vec<Plugin> {
unsafe {
FromGlibPtrContainer::from_glib_full(ffi::gst_registry_get_plugin_list(
self.to_glib_none().0,
))
}
}
#[doc(alias = "gst_registry_lookup")] #[doc(alias = "gst_registry_lookup")]
pub fn lookup(&self, filename: &str) -> Option<Plugin> { pub fn lookup(&self, filename: &str) -> Option<Plugin> {
unsafe { unsafe {
@ -176,30 +116,6 @@ impl Registry {
} }
} }
#[doc(alias = "gst_registry_plugin_filter")]
pub fn plugin_filter<P: FnMut(&Plugin) -> bool>(&self, filter: P, first: bool) -> Vec<Plugin> {
let filter_data: P = filter;
unsafe extern "C" fn filter_func<P: FnMut(&Plugin) -> bool>(
plugin: *mut ffi::GstPlugin,
user_data: glib::ffi::gpointer,
) -> glib::ffi::gboolean {
let plugin = from_glib_borrow(plugin);
let callback: *mut P = user_data as *const _ as usize as *mut P;
let res = (*callback)(&plugin);
res.into_glib()
}
let filter = Some(filter_func::<P> as _);
let super_callback0: &P = &filter_data;
unsafe {
FromGlibPtrContainer::from_glib_full(ffi::gst_registry_plugin_filter(
self.to_glib_none().0,
filter,
first.into_glib(),
super_callback0 as *const _ as usize as *mut _,
))
}
}
#[doc(alias = "gst_registry_remove_feature")] #[doc(alias = "gst_registry_remove_feature")]
pub fn remove_feature(&self, feature: &impl IsA<PluginFeature>) { pub fn remove_feature(&self, feature: &impl IsA<PluginFeature>) {
unsafe { unsafe {

View file

@ -5,6 +5,8 @@
use crate::Object; use crate::Object;
use crate::PluginFeature; use crate::PluginFeature;
#[cfg(any(feature = "v1_14", feature = "dox"))]
#[cfg_attr(feature = "dox", doc(cfg(feature = "v1_14")))]
use glib::translate::*; use glib::translate::*;
glib::wrapper! { glib::wrapper! {
@ -28,13 +30,6 @@ impl TracerFactory {
)) ))
} }
} }
#[doc(alias = "gst_tracer_factory_get_list")]
#[doc(alias = "get_list")]
pub fn list() -> Vec<TracerFactory> {
assert_initialized_main_thread!();
unsafe { FromGlibPtrContainer::from_glib_full(ffi::gst_tracer_factory_get_list()) }
}
} }
unsafe impl Send for TracerFactory {} unsafe impl Send for TracerFactory {}

View file

@ -42,13 +42,6 @@ impl TypeFindFactory {
)) ))
} }
} }
#[doc(alias = "gst_type_find_factory_get_list")]
#[doc(alias = "get_list")]
pub fn list() -> Vec<TypeFindFactory> {
assert_initialized_main_thread!();
unsafe { FromGlibPtrContainer::from_glib_full(ffi::gst_type_find_factory_get_list()) }
}
} }
unsafe impl Send for TypeFindFactory {} unsafe impl Send for TypeFindFactory {}

View file

@ -58,6 +58,10 @@ pub trait DeviceMonitorExtManual: 'static {
#[doc(alias = "gst_device_monitor_remove_filter")] #[doc(alias = "gst_device_monitor_remove_filter")]
fn remove_filter(&self, filter_id: DeviceMonitorFilterId) fn remove_filter(&self, filter_id: DeviceMonitorFilterId)
-> Result<(), glib::error::BoolError>; -> Result<(), glib::error::BoolError>;
#[doc(alias = "gst_device_monitor_get_devices")]
#[doc(alias = "get_devices")]
fn devices(&self) -> glib::List<crate::Device>;
} }
impl<O: IsA<DeviceMonitor>> DeviceMonitorExtManual for O { impl<O: IsA<DeviceMonitor>> DeviceMonitorExtManual for O {
@ -95,4 +99,12 @@ impl<O: IsA<DeviceMonitor>> DeviceMonitorExtManual for O {
) )
} }
} }
fn devices(&self) -> glib::List<crate::Device> {
unsafe {
FromGlibPtrContainer::from_glib_full(ffi::gst_device_monitor_get_devices(
self.as_ref().to_glib_none().0,
))
}
}
} }

View file

@ -36,6 +36,10 @@ pub trait DeviceProviderExtManual: 'static {
#[doc(alias = "get_metadata")] #[doc(alias = "get_metadata")]
#[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>;
#[doc(alias = "gst_device_provider_get_devices")]
#[doc(alias = "get_devices")]
fn devices(&self) -> glib::List<crate::Device>;
} }
impl<O: IsA<DeviceProvider>> DeviceProviderExtManual for O { impl<O: IsA<DeviceProvider>> DeviceProviderExtManual for O {
@ -53,4 +57,12 @@ impl<O: IsA<DeviceProvider>> DeviceProviderExtManual for O {
} }
} }
} }
fn devices(&self) -> glib::List<crate::Device> {
unsafe {
FromGlibPtrContainer::from_glib_full(ffi::gst_device_provider_get_devices(
self.as_ref().to_glib_none().0,
))
}
}
} }

View file

@ -0,0 +1,16 @@
// Take a look at the license at the top of the repository in the LICENSE file.
use crate::DeviceProviderFactory;
use glib::translate::*;
impl DeviceProviderFactory {
#[doc(alias = "gst_device_provider_factory_list_get_device_providers")]
pub fn factories(minrank: crate::Rank) -> glib::List<DeviceProviderFactory> {
assert_initialized_main_thread!();
unsafe {
FromGlibPtrContainer::from_glib_full(
ffi::gst_device_provider_factory_list_get_device_providers(minrank.into_glib()),
)
}
}
}

View file

@ -3,10 +3,11 @@
#[cfg(any(feature = "v1_20", feature = "dox"))] #[cfg(any(feature = "v1_20", feature = "dox"))]
use crate::Element; use crate::Element;
use crate::ElementFactory; use crate::ElementFactory;
use crate::Rank;
use crate::StaticPadTemplate;
#[cfg(any(feature = "v1_20", feature = "dox"))] #[cfg(any(feature = "v1_20", feature = "dox"))]
use glib::prelude::*; use glib::prelude::*;
#[cfg(any(feature = "v1_20", feature = "dox"))]
use glib::translate::*; use glib::translate::*;
impl ElementFactory { impl ElementFactory {
@ -62,4 +63,38 @@ impl ElementFactory {
.ok_or_else(|| glib::bool_error!("Failed to create element from factory name")) .ok_or_else(|| glib::bool_error!("Failed to create element from factory name"))
} }
} }
#[doc(alias = "gst_element_factory_get_static_pad_templates")]
#[doc(alias = "get_static_pad_templates")]
pub fn static_pad_templates(&self) -> glib::List<StaticPadTemplate> {
unsafe {
glib::List::from_glib_none_static(ffi::gst_element_factory_get_static_pad_templates(
self.to_glib_none().0,
) as *mut _)
}
}
#[doc(alias = "gst_element_factory_list_is_type")]
pub fn has_type(&self, type_: crate::ElementFactoryType) -> bool {
unsafe {
from_glib(ffi::gst_element_factory_list_is_type(
self.to_glib_none().0,
type_.into_glib(),
))
}
}
#[doc(alias = "gst_element_factory_list_get_elements")]
pub fn factories_with_type(
type_: crate::ElementFactoryType,
minrank: Rank,
) -> glib::List<ElementFactory> {
assert_initialized_main_thread!();
unsafe {
FromGlibPtrContainer::from_glib_full(ffi::gst_element_factory_list_get_elements(
type_.into_glib(),
minrank.into_glib(),
))
}
}
} }

View file

@ -5,7 +5,7 @@ use glib::translate::*;
bitflags! { bitflags! {
#[doc(alias = "GstElementFactoryListType")] #[doc(alias = "GstElementFactoryListType")]
pub struct ElementFactoryListType: u64 { pub struct ElementFactoryType: u64 {
#[doc(alias = "GST_ELEMENT_FACTORY_TYPE_DECODER")] #[doc(alias = "GST_ELEMENT_FACTORY_TYPE_DECODER")]
const DECODER = ffi::GST_ELEMENT_FACTORY_TYPE_DECODER as u64; const DECODER = ffi::GST_ELEMENT_FACTORY_TYPE_DECODER as u64;
#[doc(alias = "GST_ELEMENT_FACTORY_TYPE_ENCODER")] #[doc(alias = "GST_ELEMENT_FACTORY_TYPE_ENCODER")]
@ -57,7 +57,7 @@ bitflags! {
} }
#[doc(hidden)] #[doc(hidden)]
impl IntoGlib for ElementFactoryListType { impl IntoGlib for ElementFactoryType {
type GlibType = ffi::GstElementFactoryListType; type GlibType = ffi::GstElementFactoryListType;
fn into_glib(self) -> ffi::GstElementFactoryListType { fn into_glib(self) -> ffi::GstElementFactoryListType {
@ -66,9 +66,9 @@ impl IntoGlib for ElementFactoryListType {
} }
#[doc(hidden)] #[doc(hidden)]
impl FromGlib<ffi::GstElementFactoryListType> for ElementFactoryListType { impl FromGlib<ffi::GstElementFactoryListType> for ElementFactoryType {
unsafe fn from_glib(value: ffi::GstElementFactoryListType) -> ElementFactoryListType { unsafe fn from_glib(value: ffi::GstElementFactoryListType) -> ElementFactoryType {
skip_assert_initialized!(); skip_assert_initialized!();
ElementFactoryListType::from_bits_truncate(value) ElementFactoryType::from_bits_truncate(value)
} }
} }

View file

@ -10,6 +10,9 @@ use crate::Element;
use crate::Object; use crate::Object;
use crate::ParseContext; use crate::ParseContext;
use crate::ParseFlags; use crate::ParseFlags;
#[cfg(any(feature = "v1_18", feature = "dox"))]
#[cfg_attr(feature = "dox", doc(cfg(feature = "v1_18")))]
use crate::Tracer;
pub fn parse_bin_from_description_with_name( pub fn parse_bin_from_description_with_name(
bin_description: &str, bin_description: &str,
@ -190,6 +193,14 @@ pub fn type_is_plugin_api(type_: glib::types::Type) -> Option<crate::PluginAPIFl
} }
} }
#[cfg(any(feature = "v1_18", feature = "dox"))]
#[cfg_attr(feature = "dox", doc(cfg(feature = "v1_18")))]
#[doc(alias = "gst_tracing_get_active_tracers")]
pub fn active_tracers() -> glib::List<Tracer> {
assert_initialized_main_thread!();
unsafe { FromGlibPtrContainer::from_glib_full(ffi::gst_tracing_get_active_tracers()) }
}
#[cfg(test)] #[cfg(test)]
mod tests { mod tests {
use super::*; use super::*;

View file

@ -142,10 +142,11 @@ mod pipeline;
mod allocation_params; mod allocation_params;
pub use self::allocation_params::AllocationParams; pub use self::allocation_params::AllocationParams;
mod element_factory_list_type; mod element_factory_type;
pub use element_factory_list_type::*; pub use element_factory_type::*;
mod tracer; mod tracer;
mod tracer_factory;
// OS dependent Bus extensions (also import the other platform mod for doc) // OS dependent Bus extensions (also import the other platform mod for doc)
#[cfg(any(all(unix, feature = "v1_14"), feature = "dox"))] #[cfg(any(all(unix, feature = "v1_14"), feature = "dox"))]
@ -164,6 +165,7 @@ mod date_time;
mod date_time_serde; mod date_time_serde;
mod device_monitor; mod device_monitor;
mod device_provider; mod device_provider;
mod device_provider_factory;
mod enums; mod enums;
pub use crate::enums::MessageType; pub use crate::enums::MessageType;
mod ghost_pad; mod ghost_pad;
@ -171,6 +173,7 @@ mod gobject;
mod iterator; mod iterator;
mod object; mod object;
mod pad; mod pad;
mod registry;
pub use crate::pad::PadBuilder; pub use crate::pad::PadBuilder;
mod control_binding; mod control_binding;
mod control_source; mod control_source;
@ -204,6 +207,7 @@ pub mod stream_collection;
mod typefind; mod typefind;
pub use crate::typefind::*; pub use crate::typefind::*;
mod typefind_factory;
pub mod format; pub mod format;
pub use crate::format::{ pub use crate::format::{

97
gstreamer/src/registry.rs Normal file
View file

@ -0,0 +1,97 @@
// Take a look at the license at the top of the repository in the LICENSE file.
use crate::Plugin;
use crate::PluginFeature;
use crate::Registry;
use glib::translate::*;
impl Registry {
#[doc(alias = "gst_registry_feature_filter")]
pub fn features_filtered<P: FnMut(&PluginFeature) -> bool>(
&self,
filter: P,
first: bool,
) -> glib::List<PluginFeature> {
let filter_data: P = filter;
unsafe extern "C" fn filter_func<P: FnMut(&PluginFeature) -> bool>(
feature: *mut ffi::GstPluginFeature,
user_data: glib::ffi::gpointer,
) -> glib::ffi::gboolean {
let feature = from_glib_borrow(feature);
let callback: *mut P = user_data as *const _ as usize as *mut P;
let res = (*callback)(&feature);
res.into_glib()
}
let filter = Some(filter_func::<P> as _);
let super_callback0: &P = &filter_data;
unsafe {
FromGlibPtrContainer::from_glib_full(ffi::gst_registry_feature_filter(
self.to_glib_none().0,
filter,
first.into_glib(),
super_callback0 as *const _ as usize as *mut _,
))
}
}
#[doc(alias = "gst_registry_get_feature_list")]
#[doc(alias = "get_feature_list")]
pub fn features(&self, type_: glib::types::Type) -> glib::List<PluginFeature> {
unsafe {
FromGlibPtrContainer::from_glib_full(ffi::gst_registry_get_feature_list(
self.to_glib_none().0,
type_.into_glib(),
))
}
}
#[doc(alias = "gst_registry_get_feature_list_by_plugin")]
#[doc(alias = "get_feature_list_by_plugin")]
pub fn features_by_plugin(&self, name: &str) -> glib::List<PluginFeature> {
unsafe {
FromGlibPtrContainer::from_glib_full(ffi::gst_registry_get_feature_list_by_plugin(
self.to_glib_none().0,
name.to_glib_none().0,
))
}
}
#[doc(alias = "gst_registry_get_plugin_list")]
#[doc(alias = "get_plugin_list")]
pub fn plugins(&self) -> glib::List<Plugin> {
unsafe {
FromGlibPtrContainer::from_glib_full(ffi::gst_registry_get_plugin_list(
self.to_glib_none().0,
))
}
}
#[doc(alias = "gst_registry_plugin_filter")]
pub fn plugins_filtered<P: FnMut(&Plugin) -> bool>(
&self,
filter: P,
first: bool,
) -> glib::List<Plugin> {
let filter_data: P = filter;
unsafe extern "C" fn filter_func<P: FnMut(&Plugin) -> bool>(
plugin: *mut ffi::GstPlugin,
user_data: glib::ffi::gpointer,
) -> glib::ffi::gboolean {
let plugin = from_glib_borrow(plugin);
let callback: *mut P = user_data as *const _ as usize as *mut P;
let res = (*callback)(&plugin);
res.into_glib()
}
let filter = Some(filter_func::<P> as _);
let super_callback0: &P = &filter_data;
unsafe {
FromGlibPtrContainer::from_glib_full(ffi::gst_registry_plugin_filter(
self.to_glib_none().0,
filter,
first.into_glib(),
super_callback0 as *const _ as usize as *mut _,
))
}
}
}

View file

@ -0,0 +1,18 @@
// Take a look at the license at the top of the repository in the LICENSE file.
use crate::TracerFactory;
#[cfg(any(feature = "v1_14", feature = "dox"))]
#[cfg_attr(feature = "dox", doc(cfg(feature = "v1_14")))]
use glib::translate::*;
impl TracerFactory {
#[cfg(any(feature = "v1_14", feature = "dox"))]
#[cfg_attr(feature = "dox", doc(cfg(feature = "v1_14")))]
#[doc(alias = "gst_tracer_factory_get_list")]
#[doc(alias = "get_list")]
pub fn factories() -> glib::List<TracerFactory> {
assert_initialized_main_thread!();
unsafe { FromGlibPtrContainer::from_glib_full(ffi::gst_tracer_factory_get_list()) }
}
}

View file

@ -172,7 +172,7 @@ impl<T: AsRef<[u8]>> SliceTypeFind<T> {
} }
pub fn run(&mut self) { pub fn run(&mut self) {
let factories = TypeFindFactory::list(); let factories = TypeFindFactory::factories();
for factory in factories { for factory in factories {
factory.call_function(self); factory.call_function(self);
@ -247,9 +247,7 @@ mod tests {
fn test_typefind_call_function() { fn test_typefind_call_function() {
crate::init().unwrap(); crate::init().unwrap();
let xml_factory = TypeFindFactory::list() let xml_factory = TypeFindFactory::factories()
.iter()
.cloned()
.find(|f| { .find(|f| {
f.caps() f.caps()
.map(|c| { .map(|c| {

View file

@ -0,0 +1,14 @@
// Take a look at the license at the top of the repository in the LICENSE file.
use crate::TypeFindFactory;
use glib::translate::*;
impl TypeFindFactory {
#[doc(alias = "gst_type_find_factory_get_list")]
#[doc(alias = "get_list")]
pub fn factories() -> glib::List<TypeFindFactory> {
assert_initialized_main_thread!();
unsafe { FromGlibPtrContainer::from_glib_full(ffi::gst_type_find_factory_get_list()) }
}
}