From e978e247dd47f0a9a5eb3d78c8aca5daf570df05 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Sebastian=20Dr=C3=B6ge?= Date: Thu, 10 Apr 2025 15:53:19 +0300 Subject: [PATCH] audio-buffer: Store buffer directly as part of the GstAudioBuffer There's no need to store it separately. As GstAudioBuffer does not own a reference to the buffer it has to be manually unreffed after unmapping. Part-of: --- gstreamer-audio/src/audio_buffer.rs | 20 ++++++++++++++------ 1 file changed, 14 insertions(+), 6 deletions(-) diff --git a/gstreamer-audio/src/audio_buffer.rs b/gstreamer-audio/src/audio_buffer.rs index 682593ff6..589056078 100644 --- a/gstreamer-audio/src/audio_buffer.rs +++ b/gstreamer-audio/src/audio_buffer.rs @@ -13,7 +13,6 @@ pub enum Writable {} pub struct AudioBuffer { // Has to be boxed because it contains self-references audio_buffer: Box, - buffer: gst::Buffer, phantom: PhantomData, } @@ -43,7 +42,8 @@ impl AudioBuffer { pub fn into_buffer(self) -> gst::Buffer { unsafe { let mut s = mem::ManuallyDrop::new(self); - let buffer = ptr::read(&s.buffer); + // Take ownership of the buffer stored here when mapping before unmapping + let buffer = from_glib_none(s.audio_buffer.buffer); ffi::gst_audio_buffer_unmap(&mut *s.audio_buffer); ptr::drop_in_place(&mut s.audio_buffer); @@ -166,7 +166,11 @@ impl Drop for AudioBuffer { #[inline] fn drop(&mut self) { unsafe { + // Take ownership again of the buffer that was stored here when mapping + // and then drop it after unmapping. + let buffer = gst::Buffer::from_glib_full(self.audio_buffer.buffer); ffi::gst_audio_buffer_unmap(&mut *self.audio_buffer); + drop(buffer); } } } @@ -182,6 +186,9 @@ impl AudioBuffer { assert!(info.is_valid()); unsafe { + // Store the buffer as part of the audio buffer, we will retrieve / unref it + // again at a later time. + let buffer = mem::ManuallyDrop::new(buffer); let mut audio_buffer = Box::new(mem::MaybeUninit::zeroed().assume_init()); let res: bool = from_glib(ffi::gst_audio_buffer_map( &mut *audio_buffer, @@ -191,11 +198,10 @@ impl AudioBuffer { )); if !res { - Err(buffer) + Err(mem::ManuallyDrop::into_inner(buffer)) } else { Ok(Self { audio_buffer, - buffer, phantom: PhantomData, }) } @@ -219,6 +225,9 @@ impl AudioBuffer { assert!(info.is_valid()); unsafe { + // Store the buffer as part of the audio buffer, we will retrieve / unref it + // again at a later time. + let buffer = mem::ManuallyDrop::new(buffer); let mut audio_buffer = Box::new(mem::MaybeUninit::zeroed().assume_init()); let res: bool = from_glib(ffi::gst_audio_buffer_map( &mut *audio_buffer, @@ -228,11 +237,10 @@ impl AudioBuffer { )); if !res { - Err(buffer) + Err(mem::ManuallyDrop::into_inner(buffer)) } else { Ok(Self { audio_buffer, - buffer, phantom: PhantomData, }) }