From 4173ad037183a5208b6edf46e0a4669db66c6f3d Mon Sep 17 00:00:00 2001 From: Jean-Marc Valin Date: Wed, 20 Jul 2016 15:10:10 -0400 Subject: [PATCH] Add encode methods returning newly-created Vecs --- src/lib.rs | 16 ++++++++++++++++ tests/tests.rs | 6 ++++++ 2 files changed, 22 insertions(+) diff --git a/src/lib.rs b/src/lib.rs index dc46b50..1df9762 100644 --- a/src/lib.rs +++ b/src/lib.rs @@ -153,6 +153,22 @@ impl Encoder { Ok(len as usize) } + /// Encode an Opus frame to a new buffer. + pub fn encode_vec(&mut self, input: &[i16], max_size: usize) -> Result> { + let mut output: Vec = vec![0; max_size]; + let result = try!(self.encode(input, output.as_mut_slice())); + output.truncate(result); + Ok(output) + } + + /// Encode an Opus frame from floating point input to a new buffer. + pub fn encode_vec_float(&mut self, input: &[f32], max_size: usize) -> Result> { + let mut output: Vec = vec![0; max_size]; + let result = try!(self.encode_float(input, output.as_mut_slice())); + output.truncate(result); + Ok(output) + } + /// Reset the codec state to be equivalent to a freshly initialized state. pub fn reset_state(&mut self) -> Result<()> { check("opus_encoder_ctl(OPUS_RESET_STATE)", unsafe { ffi::opus_encoder_ctl(self.ptr, OPUS_RESET_STATE) }) diff --git a/tests/tests.rs b/tests/tests.rs index 87ef41a..2a818e6 100644 --- a/tests/tests.rs +++ b/tests/tests.rs @@ -24,6 +24,9 @@ fn encode_mono() { let len = encoder.encode(&[0_i16; MONO_20MS], &mut output).unwrap(); assert!(len > 170 && len < 190); + + let myvec = encoder.encode_vec(&[1_i16; MONO_20MS], output.len()).unwrap(); + assert!(myvec.len() > 120 && myvec.len() < 140); } #[test] @@ -46,6 +49,9 @@ fn encode_stereo() { // Very small buffer should still succeed let len = encoder.encode(&[95_i16; 2 * MONO_20MS], &mut [0; 20]).unwrap(); assert!(len <= 20); + + let myvec = encoder.encode_vec(&[95_i16; 2 * MONO_20MS], 20).unwrap(); + assert!(myvec.len() <= 20); } #[test]