mirror of
https://gitlab.freedesktop.org/gstreamer/gstreamer-rs.git
synced 2025-01-31 19:32:31 +00:00
audio: Add reorder_channels_with_reorder_map binding
Also add some checks to reorder_channels() and buffer_reorder_channels() to validate the buffer size. Co-authored-by: Sebastian Dröge <sebastian@centricular.com> Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer-rs/-/merge_requests/1624>
This commit is contained in:
parent
bd6984a1dc
commit
aa73ead983
1 changed files with 56 additions and 0 deletions
|
@ -345,10 +345,17 @@ pub fn buffer_reorder_channels(
|
||||||
) -> Result<(), glib::BoolError> {
|
) -> Result<(), glib::BoolError> {
|
||||||
skip_assert_initialized!();
|
skip_assert_initialized!();
|
||||||
|
|
||||||
|
assert!(channels > 0 && channels <= 64);
|
||||||
|
|
||||||
if from.len() != to.len() || from.len() > 64 {
|
if from.len() != to.len() || from.len() > 64 {
|
||||||
return Err(glib::bool_error!("Invalid number of channels"));
|
return Err(glib::bool_error!("Invalid number of channels"));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
let formatinfo = crate::AudioFormatInfo::from_format(format);
|
||||||
|
if buffer.size() % ((formatinfo.width() * channels) as usize) != 0 {
|
||||||
|
return Err(glib::bool_error!("Incomplete number of samples in buffer"));
|
||||||
|
}
|
||||||
|
|
||||||
let valid: bool = unsafe {
|
let valid: bool = unsafe {
|
||||||
from_glib(ffi::gst_audio_buffer_reorder_channels(
|
from_glib(ffi::gst_audio_buffer_reorder_channels(
|
||||||
buffer.as_mut_ptr(),
|
buffer.as_mut_ptr(),
|
||||||
|
@ -379,6 +386,12 @@ pub fn reorder_channels(
|
||||||
if from.len() != to.len() || from.len() > 64 {
|
if from.len() != to.len() || from.len() > 64 {
|
||||||
return Err(glib::bool_error!("Invalid number of channels"));
|
return Err(glib::bool_error!("Invalid number of channels"));
|
||||||
}
|
}
|
||||||
|
assert!(channels > 0 && channels <= 64);
|
||||||
|
|
||||||
|
let formatinfo = crate::AudioFormatInfo::from_format(format);
|
||||||
|
if data.len() % ((formatinfo.width() * channels) as usize) != 0 {
|
||||||
|
return Err(glib::bool_error!("Incomplete number of samples in buffer"));
|
||||||
|
}
|
||||||
|
|
||||||
let valid: bool = unsafe {
|
let valid: bool = unsafe {
|
||||||
from_glib(ffi::gst_audio_reorder_channels(
|
from_glib(ffi::gst_audio_reorder_channels(
|
||||||
|
@ -432,3 +445,46 @@ pub fn channel_reorder_map(
|
||||||
Err(glib::bool_error!("Failed to reorder channels"))
|
Err(glib::bool_error!("Failed to reorder channels"))
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#[cfg(feature = "v1_26")]
|
||||||
|
#[cfg_attr(docsrs, doc(cfg(feature = "v1_26")))]
|
||||||
|
#[doc(alias = "gst_audio_reorder_channels_with_reorder_map")]
|
||||||
|
pub fn reorder_channels_with_reorder_map(
|
||||||
|
data: &mut [u8],
|
||||||
|
bps: usize,
|
||||||
|
channels: u32,
|
||||||
|
reorder_map: &[usize],
|
||||||
|
) -> Result<(), glib::BoolError> {
|
||||||
|
skip_assert_initialized!();
|
||||||
|
|
||||||
|
assert!(bps > 0 && bps <= 64);
|
||||||
|
assert!(channels > 0 && channels <= 64);
|
||||||
|
if data.len() % (bps * channels as usize) != 0 {
|
||||||
|
return Err(glib::bool_error!("Incomplete number of samples in buffer"));
|
||||||
|
}
|
||||||
|
if reorder_map.len() < channels as usize {
|
||||||
|
return Err(glib::bool_error!("Too small reorder map"));
|
||||||
|
}
|
||||||
|
|
||||||
|
let mut reorder_map_raw = mem::MaybeUninit::<[i32; 64]>::uninit();
|
||||||
|
for (i, c) in reorder_map[..channels as usize].iter().enumerate() {
|
||||||
|
if *c >= channels as usize {
|
||||||
|
return Err(glib::bool_error!("Invalid channel id in reorder map"));
|
||||||
|
}
|
||||||
|
unsafe {
|
||||||
|
*(reorder_map_raw.as_mut_ptr() as *mut i32).add(i) = *c as i32;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
unsafe {
|
||||||
|
ffi::gst_audio_reorder_channels_with_reorder_map(
|
||||||
|
data.as_mut_ptr() as *mut _,
|
||||||
|
data.len(),
|
||||||
|
bps as i32,
|
||||||
|
channels as i32,
|
||||||
|
reorder_map_raw.as_ptr() as *const i32,
|
||||||
|
);
|
||||||
|
};
|
||||||
|
|
||||||
|
Ok(())
|
||||||
|
}
|
||||||
|
|
Loading…
Reference in a new issue