diff --git a/src/codec/packet/mod.rs b/src/codec/packet/mod.rs index b5f81aa..4f9be91 100644 --- a/src/codec/packet/mod.rs +++ b/src/codec/packet/mod.rs @@ -6,6 +6,7 @@ pub use self::flag::Flags; use std::marker::PhantomData; use std::mem; +use std::slice; use libc::c_int; use ffi::*; @@ -47,6 +48,15 @@ impl Packet { } } + pub fn copy(data: &[u8]) -> Self { + use std::io::Write; + + let mut packet = Packet::new(data.len()); + packet.data_mut().unwrap().write(data).unwrap(); + + packet + } + pub fn shrink(&mut self, size: usize) { unsafe { av_shrink_packet(&mut self.0, size as c_int); @@ -123,6 +133,28 @@ impl Packet { SideDataIter::new(&self.0) } + pub fn data(&self) -> Option<&[u8]> { + unsafe { + if self.0.data.is_null() { + None + } + else { + Some(slice::from_raw_parts(self.0.data, self.0.size as usize)) + } + } + } + + pub fn data_mut(&mut self) -> Option<&mut [u8]> { + unsafe { + if self.0.data.is_null() { + None + } + else { + Some(slice::from_raw_parts_mut(self.0.data, self.0.size as usize)) + } + } + } + pub fn read(&mut self, format: &mut format::context::Input) -> Result<(), Error> { unsafe { match av_read_frame(format.as_mut_ptr(), self.as_mut_ptr()) {