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: <https://gitlab.freedesktop.org/gstreamer/gstreamer-rs/-/merge_requests/1725>
This commit is contained in:
Sebastian Dröge 2025-04-10 15:53:19 +03:00 committed by Backport Bot
parent fd9cc77438
commit e978e247dd

View file

@ -13,7 +13,6 @@ pub enum Writable {}
pub struct AudioBuffer<T> { pub struct AudioBuffer<T> {
// Has to be boxed because it contains self-references // Has to be boxed because it contains self-references
audio_buffer: Box<ffi::GstAudioBuffer>, audio_buffer: Box<ffi::GstAudioBuffer>,
buffer: gst::Buffer,
phantom: PhantomData<T>, phantom: PhantomData<T>,
} }
@ -43,7 +42,8 @@ impl<T> AudioBuffer<T> {
pub fn into_buffer(self) -> gst::Buffer { pub fn into_buffer(self) -> gst::Buffer {
unsafe { unsafe {
let mut s = mem::ManuallyDrop::new(self); 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); ffi::gst_audio_buffer_unmap(&mut *s.audio_buffer);
ptr::drop_in_place(&mut s.audio_buffer); ptr::drop_in_place(&mut s.audio_buffer);
@ -166,7 +166,11 @@ impl<T> Drop for AudioBuffer<T> {
#[inline] #[inline]
fn drop(&mut self) { fn drop(&mut self) {
unsafe { 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); ffi::gst_audio_buffer_unmap(&mut *self.audio_buffer);
drop(buffer);
} }
} }
} }
@ -182,6 +186,9 @@ impl AudioBuffer<Readable> {
assert!(info.is_valid()); assert!(info.is_valid());
unsafe { 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 mut audio_buffer = Box::new(mem::MaybeUninit::zeroed().assume_init());
let res: bool = from_glib(ffi::gst_audio_buffer_map( let res: bool = from_glib(ffi::gst_audio_buffer_map(
&mut *audio_buffer, &mut *audio_buffer,
@ -191,11 +198,10 @@ impl AudioBuffer<Readable> {
)); ));
if !res { if !res {
Err(buffer) Err(mem::ManuallyDrop::into_inner(buffer))
} else { } else {
Ok(Self { Ok(Self {
audio_buffer, audio_buffer,
buffer,
phantom: PhantomData, phantom: PhantomData,
}) })
} }
@ -219,6 +225,9 @@ impl AudioBuffer<Writable> {
assert!(info.is_valid()); assert!(info.is_valid());
unsafe { 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 mut audio_buffer = Box::new(mem::MaybeUninit::zeroed().assume_init());
let res: bool = from_glib(ffi::gst_audio_buffer_map( let res: bool = from_glib(ffi::gst_audio_buffer_map(
&mut *audio_buffer, &mut *audio_buffer,
@ -228,11 +237,10 @@ impl AudioBuffer<Writable> {
)); ));
if !res { if !res {
Err(buffer) Err(mem::ManuallyDrop::into_inner(buffer))
} else { } else {
Ok(Self { Ok(Self {
audio_buffer, audio_buffer,
buffer,
phantom: PhantomData, phantom: PhantomData,
}) })
} }