forked from mirrors/gstreamer-rs
gstreamer: Add support for gst::CustomMeta
This commit is contained in:
parent
80ee1edec5
commit
7c5303c492
1 changed files with 189 additions and 0 deletions
|
@ -175,6 +175,18 @@ impl<'a> MetaRef<'a, Meta> {
|
||||||
None
|
None
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#[cfg(any(feature = "v1_20", feature = "dox"))]
|
||||||
|
#[cfg_attr(feature = "dox", doc(cfg(feature = "v1_20")))]
|
||||||
|
pub fn try_as_custom_meta(&self) -> Option<&MetaRef<'a, CustomMeta>> {
|
||||||
|
unsafe {
|
||||||
|
if ffi::gst_meta_info_is_custom(&*self.0.info) == glib::ffi::GFALSE {
|
||||||
|
return None;
|
||||||
|
}
|
||||||
|
|
||||||
|
Some(&*(self as *const MetaRef<'a, Meta> as *const MetaRef<'a, CustomMeta>))
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
impl<'a, T, U> MetaRefMut<'a, T, U> {
|
impl<'a, T, U> MetaRefMut<'a, T, U> {
|
||||||
|
@ -250,6 +262,30 @@ impl<'a, U> MetaRefMut<'a, Meta, U> {
|
||||||
None
|
None
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#[cfg(any(feature = "v1_20", feature = "dox"))]
|
||||||
|
#[cfg_attr(feature = "dox", doc(cfg(feature = "v1_20")))]
|
||||||
|
pub fn try_as_custom_meta(&self) -> Option<&MetaRefMut<'a, CustomMeta, U>> {
|
||||||
|
unsafe {
|
||||||
|
if ffi::gst_meta_info_is_custom(&*self.0.info) == glib::ffi::GFALSE {
|
||||||
|
return None;
|
||||||
|
}
|
||||||
|
|
||||||
|
Some(&*(self as *const MetaRefMut<'a, Meta, U> as *const MetaRefMut<'a, CustomMeta, U>))
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
#[cfg(any(feature = "v1_20", feature = "dox"))]
|
||||||
|
#[cfg_attr(feature = "dox", doc(cfg(feature = "v1_20")))]
|
||||||
|
pub fn try_as_mut_custom_meta(&mut self) -> Option<&mut MetaRefMut<'a, CustomMeta, U>> {
|
||||||
|
unsafe {
|
||||||
|
if ffi::gst_meta_info_is_custom(&*self.0.info) == glib::ffi::GFALSE {
|
||||||
|
return None;
|
||||||
|
}
|
||||||
|
|
||||||
|
Some(&mut *(self as *mut MetaRefMut<'a, Meta, U> as *mut MetaRefMut<'a, CustomMeta, U>))
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
#[repr(transparent)]
|
#[repr(transparent)]
|
||||||
|
@ -457,6 +493,159 @@ impl fmt::Debug for ReferenceTimestampMeta {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#[cfg(any(feature = "v1_20", feature = "dox"))]
|
||||||
|
#[cfg_attr(feature = "dox", doc(cfg(feature = "v1_20")))]
|
||||||
|
#[repr(transparent)]
|
||||||
|
#[doc(alias = "GstCustomMeta")]
|
||||||
|
pub struct CustomMeta(ffi::GstCustomMeta);
|
||||||
|
|
||||||
|
#[cfg(any(feature = "v1_20", feature = "dox"))]
|
||||||
|
#[cfg_attr(feature = "dox", doc(cfg(feature = "v1_20")))]
|
||||||
|
unsafe impl Send for CustomMeta {}
|
||||||
|
#[cfg(any(feature = "v1_20", feature = "dox"))]
|
||||||
|
#[cfg_attr(feature = "dox", doc(cfg(feature = "v1_20")))]
|
||||||
|
unsafe impl Sync for CustomMeta {}
|
||||||
|
|
||||||
|
#[cfg(any(feature = "v1_20", feature = "dox"))]
|
||||||
|
#[cfg_attr(feature = "dox", doc(cfg(feature = "v1_20")))]
|
||||||
|
impl CustomMeta {
|
||||||
|
#[doc(alias = "gst_meta_register_custom")]
|
||||||
|
pub fn register<
|
||||||
|
F: Fn(&mut BufferRef, &CustomMeta, &BufferRef, glib::Quark) -> bool + Send + Sync + 'static,
|
||||||
|
>(
|
||||||
|
name: &str,
|
||||||
|
tags: &[&str],
|
||||||
|
transform_func: F,
|
||||||
|
) {
|
||||||
|
unsafe extern "C" fn transform_func_trampoline<
|
||||||
|
F: Fn(&mut BufferRef, &CustomMeta, &BufferRef, glib::Quark) -> bool
|
||||||
|
+ Send
|
||||||
|
+ Sync
|
||||||
|
+ 'static,
|
||||||
|
>(
|
||||||
|
dest: *mut ffi::GstBuffer,
|
||||||
|
meta: *mut ffi::GstCustomMeta,
|
||||||
|
src: *mut ffi::GstBuffer,
|
||||||
|
type_: glib::ffi::GQuark,
|
||||||
|
_data: glib::ffi::gpointer,
|
||||||
|
user_data: glib::ffi::gpointer,
|
||||||
|
) -> glib::ffi::gboolean {
|
||||||
|
let func = &*(user_data as *const F);
|
||||||
|
let res = func(
|
||||||
|
BufferRef::from_mut_ptr(dest),
|
||||||
|
&*(meta as *const CustomMeta),
|
||||||
|
BufferRef::from_ptr(src),
|
||||||
|
from_glib(type_),
|
||||||
|
);
|
||||||
|
res.into_glib()
|
||||||
|
}
|
||||||
|
|
||||||
|
unsafe extern "C" fn transform_func_free<F>(ptr: glib::ffi::gpointer) {
|
||||||
|
let _ = Box::from_raw(ptr as *mut F);
|
||||||
|
}
|
||||||
|
|
||||||
|
unsafe {
|
||||||
|
ffi::gst_meta_register_custom(
|
||||||
|
name.to_glib_none().0,
|
||||||
|
tags.to_glib_none().0,
|
||||||
|
Some(transform_func_trampoline::<F>),
|
||||||
|
Box::into_raw(Box::new(transform_func)) as glib::ffi::gpointer,
|
||||||
|
Some(transform_func_free::<F>),
|
||||||
|
);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
#[doc(alias = "gst_buffer_add_custom_meta")]
|
||||||
|
pub fn add<'a>(
|
||||||
|
buffer: &'a mut BufferRef,
|
||||||
|
name: &str,
|
||||||
|
) -> Result<MetaRefMut<'a, Self, Standalone>, glib::BoolError> {
|
||||||
|
skip_assert_initialized!();
|
||||||
|
unsafe {
|
||||||
|
let meta = ffi::gst_buffer_add_custom_meta(buffer.as_mut_ptr(), name.to_glib_none().0);
|
||||||
|
|
||||||
|
if meta.is_null() {
|
||||||
|
return Err(glib::bool_error!("Failed to add custom meta"));
|
||||||
|
}
|
||||||
|
|
||||||
|
Ok(MetaRefMut {
|
||||||
|
meta: &mut *(meta as *mut Self),
|
||||||
|
buffer,
|
||||||
|
mode: PhantomData,
|
||||||
|
})
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
#[doc(alias = "gst_buffer_get_custom_meta")]
|
||||||
|
pub fn from_buffer<'a>(
|
||||||
|
buffer: &'a BufferRef,
|
||||||
|
name: &str,
|
||||||
|
) -> Result<MetaRef<'a, Self>, glib::BoolError> {
|
||||||
|
skip_assert_initialized!();
|
||||||
|
unsafe {
|
||||||
|
let meta = ffi::gst_buffer_get_custom_meta(buffer.as_mut_ptr(), name.to_glib_none().0);
|
||||||
|
|
||||||
|
if meta.is_null() {
|
||||||
|
return Err(glib::bool_error!("Failed to get custom meta"));
|
||||||
|
}
|
||||||
|
|
||||||
|
Ok(MetaRef {
|
||||||
|
meta: &*(meta as *const Self),
|
||||||
|
buffer,
|
||||||
|
})
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
#[doc(alias = "gst_buffer_get_custom_meta")]
|
||||||
|
pub fn from_mut_buffer<'a>(
|
||||||
|
buffer: &'a mut BufferRef,
|
||||||
|
name: &str,
|
||||||
|
) -> Result<MetaRefMut<'a, Self, Standalone>, glib::BoolError> {
|
||||||
|
skip_assert_initialized!();
|
||||||
|
unsafe {
|
||||||
|
let meta = ffi::gst_buffer_get_custom_meta(buffer.as_mut_ptr(), name.to_glib_none().0);
|
||||||
|
|
||||||
|
if meta.is_null() {
|
||||||
|
return Err(glib::bool_error!("Failed to get custom meta"));
|
||||||
|
}
|
||||||
|
|
||||||
|
Ok(MetaRefMut {
|
||||||
|
meta: &mut *(meta as *mut Self),
|
||||||
|
buffer,
|
||||||
|
mode: PhantomData,
|
||||||
|
})
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
#[doc(alias = "gst_custom_meta_get_structure")]
|
||||||
|
pub fn structure(&self) -> &crate::StructureRef {
|
||||||
|
unsafe {
|
||||||
|
crate::StructureRef::from_glib_borrow(ffi::gst_custom_meta_get_structure(mut_override(
|
||||||
|
&self.0,
|
||||||
|
)))
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
#[doc(alias = "gst_custom_meta_get_structure")]
|
||||||
|
pub fn mut_structure(&mut self) -> &mut crate::StructureRef {
|
||||||
|
unsafe {
|
||||||
|
crate::StructureRef::from_glib_borrow_mut(ffi::gst_custom_meta_get_structure(
|
||||||
|
&mut self.0,
|
||||||
|
))
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
#[doc(alias = "gst_custom_meta_has_name")]
|
||||||
|
pub fn has_name(&self, name: &str) -> bool {
|
||||||
|
unsafe {
|
||||||
|
from_glib(ffi::gst_custom_meta_has_name(
|
||||||
|
mut_override(&self.0),
|
||||||
|
name.to_glib_none().0,
|
||||||
|
))
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
#[cfg(test)]
|
#[cfg(test)]
|
||||||
mod tests {
|
mod tests {
|
||||||
use super::*;
|
use super::*;
|
||||||
|
|
Loading…
Reference in a new issue