From 3e17102166b8cf98729c03f08e2bd3cca38db48f Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Sebastian=20Dr=C3=B6ge?= Date: Sat, 14 Jan 2017 18:04:55 +0100 Subject: [PATCH] Add API to create a Buffer from a Vec with memory reuse and use it for the Speex headers --- gst-plugin-flv/src/flvdemux.rs | 29 ++++++++++++++--------- gst-plugin/src/buffer.rs | 42 ++++++++++++++++++++++++++++++++++ 2 files changed, 60 insertions(+), 11 deletions(-) diff --git a/gst-plugin-flv/src/flvdemux.rs b/gst-plugin-flv/src/flvdemux.rs index 1a1568da..d8abfd17 100644 --- a/gst-plugin-flv/src/flvdemux.rs +++ b/gst-plugin-flv/src/flvdemux.rs @@ -194,10 +194,8 @@ impl AudioFormat { }) } flavors::SoundFormat::SPEEX => { - let mut header = Buffer::new_with_size(80).unwrap(); - { - let mut map = header.map_readwrite().unwrap(); - let mut data = Cursor::new(map.as_mut_slice()); + let header = { + let mut data = Cursor::new(Vec::with_capacity(80)); data.write(b"Speex 1.1.12").unwrap(); data.write(&[0; 14]).unwrap(); data.write_u32le(1).unwrap(); // version @@ -213,19 +211,28 @@ impl AudioFormat { data.write_u32le(0).unwrap(); // extra headers data.write_u32le(0).unwrap(); // reserved 1 data.write_u32le(0).unwrap(); // reserved 2 - } + + assert_eq!(data.position(), 80); + + data.into_inner() + }; + let header = Buffer::new_from_vec(header).unwrap(); let comment_size = 4 + 7 /* nothing */ + 4 + 1; - let mut comment = Buffer::new_with_size(comment_size).unwrap(); - { - let mut map = comment.map_readwrite().unwrap(); - let mut data = Cursor::new(map.as_mut_slice()); + let comment = { + let mut data = Cursor::new(Vec::with_capacity(comment_size)); data.write_u32le(7).unwrap(); // length of "nothing" data.write(b"nothing").unwrap(); // "vendor" string data.write_u32le(0).unwrap(); // number of elements - data.write_u8(1); - } + data.write_u8(1).unwrap(); + + assert_eq!(data.position() as usize, comment_size); + + data.into_inner() + }; + let comment = Buffer::new_from_vec(comment).unwrap(); + Some(Caps::new_simple("audio/x-speex", &[("streamheader", &vec![header.into(), comment.into()].into())])) diff --git a/gst-plugin/src/buffer.rs b/gst-plugin/src/buffer.rs index 9ac811e0..cbf65661 100644 --- a/gst-plugin/src/buffer.rs +++ b/gst-plugin/src/buffer.rs @@ -151,6 +151,48 @@ impl Buffer { } } + extern "C" fn vec_drop(vec: *mut c_void) { + let vec: Box> = unsafe { Box::from_raw(vec as *mut Vec) }; + drop(vec); + } + + pub fn new_from_vec(vec: Vec) -> Option { + extern "C" { + fn gst_buffer_new_wrapped_full(flags: u32, + data: *mut u8, + maxsize: usize, + offset: usize, + size: usize, + user_data: *mut c_void, + destroy_notify: extern "C" fn(*mut c_void)) + -> *mut c_void; + } + + let raw = unsafe { + let mut vec = Box::new(vec); + let maxsize = vec.capacity(); + let size = vec.len(); + let data = vec.as_mut_ptr(); + let user_data = Box::into_raw(vec); + gst_buffer_new_wrapped_full(0, + data, + maxsize, + 0, + size, + user_data as *mut c_void, + Buffer::vec_drop) + }; + + if raw.is_null() { + None + } else { + Some(Buffer { + raw: raw, + owned: true, + }) + } + } + pub fn map_read(&self) -> Option { extern "C" { fn gst_buffer_map(buffer: *mut c_void,