mirror of
https://gitlab.freedesktop.org/gstreamer/gstreamer-rs.git
synced 2025-04-15 04:14:07 +00:00
Merge branch 'videoframe-audioframe-cleanups' into 'main'
video-frame / audio-frame: Minor cleanups See merge request gstreamer/gstreamer-rs!1712
This commit is contained in:
commit
3991680fb7
2 changed files with 39 additions and 36 deletions
|
@ -13,7 +13,6 @@ pub enum Writable {}
|
|||
pub struct AudioBuffer<T> {
|
||||
// Has to be boxed because it contains self-references
|
||||
audio_buffer: Box<ffi::GstAudioBuffer>,
|
||||
buffer: gst::Buffer,
|
||||
phantom: PhantomData<T>,
|
||||
}
|
||||
|
||||
|
@ -43,7 +42,8 @@ impl<T> AudioBuffer<T> {
|
|||
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);
|
||||
|
||||
|
@ -151,7 +151,6 @@ impl<T> AudioBuffer<T> {
|
|||
pub fn as_audio_buffer_ref(&self) -> AudioBufferRef<&gst::BufferRef> {
|
||||
AudioBufferRef {
|
||||
audio_buffer: AudioBufferPtr::Borrowed(ptr::NonNull::from(&*self.audio_buffer)),
|
||||
unmap: false,
|
||||
phantom: PhantomData,
|
||||
}
|
||||
}
|
||||
|
@ -166,7 +165,11 @@ impl<T> Drop for AudioBuffer<T> {
|
|||
#[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 +185,9 @@ impl AudioBuffer<Readable> {
|
|||
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 +197,10 @@ impl AudioBuffer<Readable> {
|
|||
));
|
||||
|
||||
if !res {
|
||||
Err(buffer)
|
||||
Err(mem::ManuallyDrop::into_inner(buffer))
|
||||
} else {
|
||||
Ok(Self {
|
||||
audio_buffer,
|
||||
buffer,
|
||||
phantom: PhantomData,
|
||||
})
|
||||
}
|
||||
|
@ -219,6 +224,9 @@ impl AudioBuffer<Writable> {
|
|||
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 +236,10 @@ impl AudioBuffer<Writable> {
|
|||
));
|
||||
|
||||
if !res {
|
||||
Err(buffer)
|
||||
Err(mem::ManuallyDrop::into_inner(buffer))
|
||||
} else {
|
||||
Ok(Self {
|
||||
audio_buffer,
|
||||
buffer,
|
||||
phantom: PhantomData,
|
||||
})
|
||||
}
|
||||
|
@ -271,7 +278,6 @@ impl AudioBuffer<Writable> {
|
|||
pub fn as_mut_audio_buffer_ref(&mut self) -> AudioBufferRef<&mut gst::BufferRef> {
|
||||
AudioBufferRef {
|
||||
audio_buffer: AudioBufferPtr::Borrowed(ptr::NonNull::from(&mut *self.audio_buffer)),
|
||||
unmap: false,
|
||||
phantom: PhantomData,
|
||||
}
|
||||
}
|
||||
|
@ -284,6 +290,7 @@ impl AudioBuffer<Writable> {
|
|||
|
||||
#[derive(Debug)]
|
||||
enum AudioBufferPtr {
|
||||
// Has to be boxed because it contains self-references
|
||||
Owned(Box<ffi::GstAudioBuffer>),
|
||||
Borrowed(ptr::NonNull<ffi::GstAudioBuffer>),
|
||||
}
|
||||
|
@ -311,9 +318,7 @@ impl ops::DerefMut for AudioBufferPtr {
|
|||
}
|
||||
|
||||
pub struct AudioBufferRef<T> {
|
||||
// Has to be boxed because it contains self-references
|
||||
audio_buffer: AudioBufferPtr,
|
||||
unmap: bool,
|
||||
phantom: PhantomData<T>,
|
||||
}
|
||||
|
||||
|
@ -448,7 +453,6 @@ impl<'a> AudioBufferRef<&'a gst::BufferRef> {
|
|||
audio_buffer: AudioBufferPtr::Borrowed(ptr::NonNull::new_unchecked(
|
||||
audio_buffer as *mut _,
|
||||
)),
|
||||
unmap: false,
|
||||
phantom: PhantomData,
|
||||
})
|
||||
}
|
||||
|
@ -476,7 +480,6 @@ impl<'a> AudioBufferRef<&'a gst::BufferRef> {
|
|||
} else {
|
||||
Ok(Self {
|
||||
audio_buffer: AudioBufferPtr::Owned(audio_buffer),
|
||||
unmap: true,
|
||||
phantom: PhantomData,
|
||||
})
|
||||
}
|
||||
|
@ -496,7 +499,6 @@ impl<'a> AudioBufferRef<&'a mut gst::BufferRef> {
|
|||
|
||||
Borrowed::new(Self {
|
||||
audio_buffer: AudioBufferPtr::Borrowed(ptr::NonNull::new_unchecked(audio_buffer)),
|
||||
unmap: false,
|
||||
phantom: PhantomData,
|
||||
})
|
||||
}
|
||||
|
@ -524,7 +526,6 @@ impl<'a> AudioBufferRef<&'a mut gst::BufferRef> {
|
|||
} else {
|
||||
Ok(Self {
|
||||
audio_buffer: AudioBufferPtr::Owned(audio_buffer),
|
||||
unmap: true,
|
||||
phantom: PhantomData,
|
||||
})
|
||||
}
|
||||
|
@ -586,7 +587,7 @@ impl<T> Drop for AudioBufferRef<T> {
|
|||
#[inline]
|
||||
fn drop(&mut self) {
|
||||
unsafe {
|
||||
if self.unmap {
|
||||
if matches!(self.audio_buffer, AudioBufferPtr::Owned(..)) {
|
||||
ffi::gst_audio_buffer_unmap(&mut *self.audio_buffer);
|
||||
}
|
||||
}
|
||||
|
|
|
@ -50,7 +50,6 @@ fn plane_buffer_info<T: IsVideoFrame>(
|
|||
|
||||
pub struct VideoFrame<T> {
|
||||
frame: ffi::GstVideoFrame,
|
||||
buffer: gst::Buffer,
|
||||
phantom: PhantomData<T>,
|
||||
}
|
||||
|
||||
|
@ -245,7 +244,7 @@ impl<T> VideoFrame<T> {
|
|||
pub fn into_buffer(self) -> gst::Buffer {
|
||||
unsafe {
|
||||
let mut s = mem::ManuallyDrop::new(self);
|
||||
let buffer = ptr::read(&s.buffer);
|
||||
let buffer = from_glib_none(s.frame.buffer);
|
||||
ffi::gst_video_frame_unmap(&mut s.frame);
|
||||
buffer
|
||||
}
|
||||
|
@ -326,10 +325,8 @@ impl<T> VideoFrame<T> {
|
|||
|
||||
#[inline]
|
||||
pub unsafe fn from_glib_full(frame: ffi::GstVideoFrame) -> Self {
|
||||
let buffer = gst::Buffer::from_glib_none(frame.buffer);
|
||||
Self {
|
||||
frame,
|
||||
buffer,
|
||||
phantom: PhantomData,
|
||||
}
|
||||
}
|
||||
|
@ -346,11 +343,8 @@ impl<T> VideoFrame<T> {
|
|||
|
||||
#[inline]
|
||||
pub fn into_raw(self) -> ffi::GstVideoFrame {
|
||||
unsafe {
|
||||
let mut s = mem::ManuallyDrop::new(self);
|
||||
ptr::drop_in_place(&mut s.buffer);
|
||||
s.frame
|
||||
}
|
||||
let s = mem::ManuallyDrop::new(self);
|
||||
s.frame
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -375,11 +369,15 @@ impl VideoFrame<Readable> {
|
|||
|
||||
unsafe {
|
||||
let mut frame = mem::MaybeUninit::uninit();
|
||||
// Takes another reference of the buffer but only
|
||||
// when successful, so we can safely return the buffer
|
||||
// on failure and on success drop the additional
|
||||
// reference.
|
||||
let res: bool = from_glib(ffi::gst_video_frame_map(
|
||||
frame.as_mut_ptr(),
|
||||
info.to_glib_none().0 as *mut _,
|
||||
buffer.to_glib_none().0,
|
||||
ffi::GST_VIDEO_FRAME_MAP_FLAG_NO_REF | gst::ffi::GST_MAP_READ,
|
||||
gst::ffi::GST_MAP_READ,
|
||||
));
|
||||
|
||||
if !res {
|
||||
|
@ -388,7 +386,6 @@ impl VideoFrame<Readable> {
|
|||
let frame = frame.assume_init();
|
||||
Ok(Self {
|
||||
frame,
|
||||
buffer,
|
||||
phantom: PhantomData,
|
||||
})
|
||||
}
|
||||
|
@ -407,12 +404,16 @@ impl VideoFrame<Readable> {
|
|||
|
||||
unsafe {
|
||||
let mut frame = mem::MaybeUninit::uninit();
|
||||
// Takes another reference of the buffer but only
|
||||
// when successful, so we can safely return the buffer
|
||||
// on failure and on success drop the additional
|
||||
// reference.
|
||||
let res: bool = from_glib(ffi::gst_video_frame_map_id(
|
||||
frame.as_mut_ptr(),
|
||||
info.to_glib_none().0 as *mut _,
|
||||
buffer.to_glib_none().0,
|
||||
id,
|
||||
ffi::GST_VIDEO_FRAME_MAP_FLAG_NO_REF | gst::ffi::GST_MAP_READ,
|
||||
gst::ffi::GST_MAP_READ,
|
||||
));
|
||||
|
||||
if !res {
|
||||
|
@ -421,7 +422,6 @@ impl VideoFrame<Readable> {
|
|||
let frame = frame.assume_init();
|
||||
Ok(Self {
|
||||
frame,
|
||||
buffer,
|
||||
phantom: PhantomData,
|
||||
})
|
||||
}
|
||||
|
@ -446,13 +446,15 @@ impl VideoFrame<Writable> {
|
|||
|
||||
unsafe {
|
||||
let mut frame = mem::MaybeUninit::uninit();
|
||||
// Takes another reference of the buffer but only
|
||||
// when successful, so we can safely return the buffer
|
||||
// on failure and on success drop the additional
|
||||
// reference.
|
||||
let res: bool = from_glib(ffi::gst_video_frame_map(
|
||||
frame.as_mut_ptr(),
|
||||
info.to_glib_none().0 as *mut _,
|
||||
buffer.to_glib_none().0,
|
||||
ffi::GST_VIDEO_FRAME_MAP_FLAG_NO_REF
|
||||
| gst::ffi::GST_MAP_READ
|
||||
| gst::ffi::GST_MAP_WRITE,
|
||||
gst::ffi::GST_MAP_READ | gst::ffi::GST_MAP_WRITE,
|
||||
));
|
||||
|
||||
if !res {
|
||||
|
@ -461,7 +463,6 @@ impl VideoFrame<Writable> {
|
|||
let frame = frame.assume_init();
|
||||
Ok(Self {
|
||||
frame,
|
||||
buffer,
|
||||
phantom: PhantomData,
|
||||
})
|
||||
}
|
||||
|
@ -480,14 +481,16 @@ impl VideoFrame<Writable> {
|
|||
|
||||
unsafe {
|
||||
let mut frame = mem::MaybeUninit::uninit();
|
||||
// Takes another reference of the buffer but only
|
||||
// when successful, so we can safely return the buffer
|
||||
// on failure and on success drop the additional
|
||||
// reference.
|
||||
let res: bool = from_glib(ffi::gst_video_frame_map_id(
|
||||
frame.as_mut_ptr(),
|
||||
info.to_glib_none().0 as *mut _,
|
||||
buffer.to_glib_none().0,
|
||||
id,
|
||||
ffi::GST_VIDEO_FRAME_MAP_FLAG_NO_REF
|
||||
| gst::ffi::GST_MAP_READ
|
||||
| gst::ffi::GST_MAP_WRITE,
|
||||
gst::ffi::GST_MAP_READ | gst::ffi::GST_MAP_WRITE,
|
||||
));
|
||||
|
||||
if !res {
|
||||
|
@ -496,7 +499,6 @@ impl VideoFrame<Writable> {
|
|||
let frame = frame.assume_init();
|
||||
Ok(Self {
|
||||
frame,
|
||||
buffer,
|
||||
phantom: PhantomData,
|
||||
})
|
||||
}
|
||||
|
|
Loading…
Reference in a new issue