forked from mirrors/gstreamer-rs
Allow creating buffers from AsRef<[u8]> and AsMut<[u8]>
Not just from Vec<u8>.
This commit is contained in:
parent
b24f628772
commit
342d89dd44
1 changed files with 41 additions and 12 deletions
|
@ -64,28 +64,57 @@ impl GstRc<BufferRef> {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
unsafe extern "C" fn vec_drop(vec: glib_ffi::gpointer) {
|
unsafe extern "C" fn drop_box<T>(vec: glib_ffi::gpointer) {
|
||||||
let vec: Box<Vec<u8>> = Box::from_raw(vec as *mut Vec<u8>);
|
let slice: Box<T> = Box::from_raw(vec as *mut T);
|
||||||
drop(vec);
|
drop(slice);
|
||||||
}
|
}
|
||||||
|
|
||||||
pub fn from_vec(vec: Vec<u8>) -> Option<Self> {
|
pub fn from_mut_slice<T: AsMut<[u8]>>(slice: T) -> Option<Self> {
|
||||||
assert_initialized_main_thread!();
|
assert_initialized_main_thread!();
|
||||||
|
|
||||||
let raw = unsafe {
|
let raw = unsafe {
|
||||||
let mut vec = Box::new(vec);
|
let mut b = Box::new(slice);
|
||||||
let maxsize = vec.capacity();
|
let (size, data) = {
|
||||||
let size = vec.len();
|
let slice = (*b).as_mut();
|
||||||
let data = vec.as_mut_ptr();
|
(slice.len(), slice.as_mut_ptr())
|
||||||
let user_data = Box::into_raw(vec);
|
};
|
||||||
|
let user_data = Box::into_raw(b);
|
||||||
ffi::gst_buffer_new_wrapped_full(
|
ffi::gst_buffer_new_wrapped_full(
|
||||||
ffi::GstMemoryFlags::empty(),
|
ffi::GstMemoryFlags::empty(),
|
||||||
data as glib_ffi::gpointer,
|
data as glib_ffi::gpointer,
|
||||||
maxsize,
|
size,
|
||||||
0,
|
0,
|
||||||
size,
|
size,
|
||||||
user_data as glib_ffi::gpointer,
|
user_data as glib_ffi::gpointer,
|
||||||
Some(Buffer::vec_drop),
|
Some(Self::drop_box::<T>),
|
||||||
|
)
|
||||||
|
};
|
||||||
|
|
||||||
|
if raw.is_null() {
|
||||||
|
None
|
||||||
|
} else {
|
||||||
|
Some(unsafe { from_glib_full(raw) })
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
pub fn from_slice<T: AsRef<[u8]>>(slice: T) -> Option<Self> {
|
||||||
|
assert_initialized_main_thread!();
|
||||||
|
|
||||||
|
let raw = unsafe {
|
||||||
|
let b = Box::new(slice);
|
||||||
|
let (size, data) = {
|
||||||
|
let slice = (*b).as_ref();
|
||||||
|
(slice.len(), slice.as_ptr())
|
||||||
|
};
|
||||||
|
let user_data = Box::into_raw(b);
|
||||||
|
ffi::gst_buffer_new_wrapped_full(
|
||||||
|
ffi::GST_MEMORY_FLAG_READONLY,
|
||||||
|
data as glib_ffi::gpointer,
|
||||||
|
size,
|
||||||
|
0,
|
||||||
|
size,
|
||||||
|
user_data as glib_ffi::gpointer,
|
||||||
|
Some(Self::drop_box::<T>),
|
||||||
)
|
)
|
||||||
};
|
};
|
||||||
|
|
||||||
|
@ -462,7 +491,7 @@ mod tests {
|
||||||
fn test_writability() {
|
fn test_writability() {
|
||||||
::init().unwrap();
|
::init().unwrap();
|
||||||
|
|
||||||
let mut buffer = Buffer::from_vec(vec![1, 2, 3, 4]).unwrap();
|
let mut buffer = Buffer::from_slice(vec![1, 2, 3, 4]).unwrap();
|
||||||
{
|
{
|
||||||
let data = buffer.map_readable().unwrap();
|
let data = buffer.map_readable().unwrap();
|
||||||
assert_eq!(data.as_slice(), vec![1, 2, 3, 4].as_slice());
|
assert_eq!(data.as_slice(), vec![1, 2, 3, 4].as_slice());
|
||||||
|
|
Loading…
Reference in a new issue