mirror of
https://gitlab.freedesktop.org/gstreamer/gstreamer-rs.git
synced 2024-11-22 09:31:06 +00:00
caps: Add bindings for foreach()
, map_in_place() and
filter_map_in_place()`
This commit is contained in:
parent
1b46bca2db
commit
843d3749b7
2 changed files with 106 additions and 1 deletions
|
@ -475,6 +475,111 @@ impl CapsRef {
|
|||
pub fn serialize(&self, flags: crate::SerializeFlags) -> glib::GString {
|
||||
unsafe { from_glib_full(ffi::gst_caps_serialize(&self.0, flags.into_glib())) }
|
||||
}
|
||||
|
||||
#[doc(alias = "gst_caps_foreach")]
|
||||
pub fn foreach<F: FnMut(&CapsFeaturesRef, &StructureRef) -> std::ops::ControlFlow<()>>(
|
||||
&self,
|
||||
mut func: F,
|
||||
) -> bool {
|
||||
unsafe {
|
||||
unsafe extern "C" fn trampoline<
|
||||
F: FnMut(&CapsFeaturesRef, &StructureRef) -> std::ops::ControlFlow<()>,
|
||||
>(
|
||||
features: *mut ffi::GstCapsFeatures,
|
||||
s: *mut ffi::GstStructure,
|
||||
user_data: glib::ffi::gpointer,
|
||||
) -> glib::ffi::gboolean {
|
||||
let func = &mut *(user_data as *mut F);
|
||||
let res = func(
|
||||
CapsFeaturesRef::from_glib_borrow(features),
|
||||
StructureRef::from_glib_borrow(s),
|
||||
);
|
||||
|
||||
matches!(res, std::ops::ControlFlow::Continue(_)).into_glib()
|
||||
}
|
||||
let func = &mut func as *mut F;
|
||||
from_glib(ffi::gst_caps_foreach(
|
||||
self.as_ptr(),
|
||||
Some(trampoline::<F>),
|
||||
func as glib::ffi::gpointer,
|
||||
))
|
||||
}
|
||||
}
|
||||
|
||||
#[doc(alias = "gst_caps_map_in_place")]
|
||||
pub fn map_in_place<
|
||||
F: FnMut(&mut CapsFeaturesRef, &mut StructureRef) -> std::ops::ControlFlow<()>,
|
||||
>(
|
||||
&mut self,
|
||||
mut func: F,
|
||||
) -> bool {
|
||||
unsafe {
|
||||
unsafe extern "C" fn trampoline<
|
||||
F: FnMut(&mut CapsFeaturesRef, &mut StructureRef) -> std::ops::ControlFlow<()>,
|
||||
>(
|
||||
features: *mut ffi::GstCapsFeatures,
|
||||
s: *mut ffi::GstStructure,
|
||||
user_data: glib::ffi::gpointer,
|
||||
) -> glib::ffi::gboolean {
|
||||
let func = &mut *(user_data as *mut F);
|
||||
let res = func(
|
||||
CapsFeaturesRef::from_glib_borrow_mut(features),
|
||||
StructureRef::from_glib_borrow_mut(s),
|
||||
);
|
||||
|
||||
matches!(res, std::ops::ControlFlow::Continue(_)).into_glib()
|
||||
}
|
||||
let func = &mut func as *mut F;
|
||||
from_glib(ffi::gst_caps_map_in_place(
|
||||
self.as_mut_ptr(),
|
||||
Some(trampoline::<F>),
|
||||
func as glib::ffi::gpointer,
|
||||
))
|
||||
}
|
||||
}
|
||||
|
||||
#[doc(alias = "gst_caps_filter_and_map_in_place")]
|
||||
pub fn filter_map_in_place<
|
||||
F: FnMut(&mut CapsFeaturesRef, &mut StructureRef) -> CapsFilterMapAction,
|
||||
>(
|
||||
&mut self,
|
||||
mut func: F,
|
||||
) {
|
||||
unsafe {
|
||||
unsafe extern "C" fn trampoline<
|
||||
F: FnMut(&mut CapsFeaturesRef, &mut StructureRef) -> CapsFilterMapAction,
|
||||
>(
|
||||
features: *mut ffi::GstCapsFeatures,
|
||||
s: *mut ffi::GstStructure,
|
||||
user_data: glib::ffi::gpointer,
|
||||
) -> glib::ffi::gboolean {
|
||||
let func = &mut *(user_data as *mut F);
|
||||
|
||||
let res = func(
|
||||
CapsFeaturesRef::from_glib_borrow_mut(features),
|
||||
StructureRef::from_glib_borrow_mut(s),
|
||||
);
|
||||
|
||||
match res {
|
||||
CapsFilterMapAction::Keep => glib::ffi::GTRUE,
|
||||
CapsFilterMapAction::Remove => glib::ffi::GFALSE,
|
||||
}
|
||||
}
|
||||
|
||||
let func = &mut func as *mut F;
|
||||
ffi::gst_caps_filter_and_map_in_place(
|
||||
self.as_mut_ptr(),
|
||||
Some(trampoline::<F>),
|
||||
func as glib::ffi::gpointer,
|
||||
);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
#[derive(Debug)]
|
||||
pub enum CapsFilterMapAction {
|
||||
Keep,
|
||||
Remove,
|
||||
}
|
||||
|
||||
macro_rules! define_iter(
|
||||
|
|
|
@ -65,7 +65,7 @@ pub use crate::structure::{Structure, StructureRef};
|
|||
mod structure_serde;
|
||||
|
||||
pub mod caps;
|
||||
pub use crate::caps::{Caps, CapsRef};
|
||||
pub use crate::caps::{Caps, CapsFilterMapAction, CapsRef};
|
||||
mod caps_features;
|
||||
#[cfg(feature = "ser_de")]
|
||||
mod caps_serde;
|
||||
|
|
Loading…
Reference in a new issue