From 3f220ce5d9144b4eba1d8ec6c09fcb21e69cd08a Mon Sep 17 00:00:00 2001 From: Thibault Saunier Date: Wed, 6 Nov 2024 17:53:17 -0300 Subject: [PATCH] tracer: Add memory init/free hooks Part-of: --- gstreamer/src/lib.rs | 3 ++ gstreamer/src/memory.rs | 82 ++++++++++++++++++++++++++++++++ gstreamer/src/subclass/tracer.rs | 27 +++++++++++ 3 files changed, 112 insertions(+) diff --git a/gstreamer/src/lib.rs b/gstreamer/src/lib.rs index 561f993c8..68a018c5f 100644 --- a/gstreamer/src/lib.rs +++ b/gstreamer/src/lib.rs @@ -131,6 +131,9 @@ mod buffer_cursor; pub use crate::buffer_cursor::{BufferCursor, BufferRefCursor}; pub mod memory; mod memory_wrapped; +#[cfg(feature = "v1_26")] +#[cfg_attr(docsrs, doc(cfg(feature = "v1_26")))] +pub use crate::memory::MemoryRefTrace; pub use crate::memory::{MappedMemory, Memory, MemoryMap, MemoryRef}; #[cfg(feature = "serde")] mod buffer_serde; diff --git a/gstreamer/src/memory.rs b/gstreamer/src/memory.rs index 12d78ffae..a3c2a709f 100644 --- a/gstreamer/src/memory.rs +++ b/gstreamer/src/memory.rs @@ -949,6 +949,88 @@ macro_rules! memory_object_wrapper { }; } +#[cfg(feature = "v1_26")] +#[cfg_attr(docsrs, doc(cfg(feature = "v1_26")))] +#[doc(alias = "GstMemory")] +pub struct MemoryRefTrace(ffi::GstMemory); +#[cfg(feature = "v1_26")] +#[cfg_attr(docsrs, doc(cfg(feature = "v1_26")))] +impl MemoryRefTrace { + pub unsafe fn from_ptr<'a>(ptr: *mut ffi::GstMemory) -> &'a MemoryRefTrace { + assert!(!ptr.is_null()); + + &*(ptr as *const Self) + } + + pub fn as_ptr(&self) -> *const ffi::GstMemory { + self as *const Self as *const ffi::GstMemory + } + + #[doc(alias = "get_allocator")] + #[inline] + pub fn allocator(&self) -> Option<&Allocator> { + unsafe { + if self.0.allocator.is_null() { + None + } else { + Some(&*(&self.0.allocator as *const *mut ffi::GstAllocator as *const Allocator)) + } + } + } + + #[doc(alias = "get_parent")] + #[inline] + pub fn parent(&self) -> Option<&MemoryRef> { + unsafe { + if self.0.parent.is_null() { + None + } else { + Some(MemoryRef::from_ptr(self.0.parent)) + } + } + } + + #[doc(alias = "get_maxsize")] + #[inline] + pub fn maxsize(&self) -> usize { + self.0.maxsize + } + + #[doc(alias = "get_align")] + #[inline] + pub fn align(&self) -> usize { + self.0.align + } + + #[doc(alias = "get_offset")] + #[inline] + pub fn offset(&self) -> usize { + self.0.offset + } + + #[doc(alias = "get_size")] + #[inline] + pub fn size(&self) -> usize { + self.0.size + } + + #[doc(alias = "get_flags")] + #[inline] + pub fn flags(&self) -> crate::MemoryFlags { + unsafe { from_glib(self.0.mini_object.flags) } + } + + #[doc(alias = "gst_memory_is_type")] + pub fn is_type(&self, mem_type: &str) -> bool { + unsafe { + from_glib(ffi::gst_memory_is_type( + self as *const Self as *mut ffi::GstMemory, + mem_type.to_glib_none().0, + )) + } + } +} + #[cfg(test)] mod tests { #[test] diff --git a/gstreamer/src/subclass/tracer.rs b/gstreamer/src/subclass/tracer.rs index c636b6e43..47942abc8 100644 --- a/gstreamer/src/subclass/tracer.rs +++ b/gstreamer/src/subclass/tracer.rs @@ -89,6 +89,15 @@ pub trait TracerImpl: TracerImplExt + GstObjectImpl + Send + Sync { #[cfg(feature = "v1_20")] #[cfg_attr(docsrs, doc(cfg(feature = "v1_20")))] fn plugin_feature_loaded(&self, ts: u64, feature: &crate::PluginFeature) {} + #[cfg(feature = "v1_26")] + #[cfg_attr(docsrs, doc(cfg(feature = "v1_26")))] + fn memory_init(&self, ts: u64, mem: &crate::MemoryRefTrace) {} + #[cfg(feature = "v1_26")] + #[cfg_attr(docsrs, doc(cfg(feature = "v1_26")))] + fn memory_free_pre(&self, ts: u64, mem: &crate::MemoryRef) {} + #[cfg(feature = "v1_26")] + #[cfg_attr(docsrs, doc(cfg(feature = "v1_26")))] + fn memory_free_post(&self, ts: u64, mem: std::ptr::NonNull) {} } #[cfg(not(feature = "v1_26"))] @@ -476,4 +485,22 @@ define_tracer_hooks! { let feature = crate::PluginFeature::from_glib_borrow(feature); this.plugin_feature_loaded(ts, &feature) }; + + #[cfg(feature = "v1_26")] + #[cfg_attr(docsrs, doc(cfg(feature = "v1_26")))] + MemoryInit("memory-init") = |this, ts, memory: *mut ffi::GstMemory| { + let memory = crate::MemoryRefTrace::from_ptr(memory); + this.memory_init(ts, memory) + }; + #[cfg(feature = "v1_26")] + #[cfg_attr(docsrs, doc(cfg(feature = "v1_26")))] + MemoryFreePre("memory-free-pre") = |this, ts, memory: *mut ffi::GstMemory| { + let memory = crate::MemoryRef::from_ptr(memory); + this.memory_free_pre(ts, memory) + }; + #[cfg(feature = "v1_26")] + #[cfg_attr(docsrs, doc(cfg(feature = "v1_26")))] + MemoryFreePost("memory-free-post") = |this, ts, memory: *mut ffi::GstMemory| { + this.memory_free_post(ts, std::ptr::NonNull::new_unchecked(memory)) + }; }