1use crate::{sys, mem, ErrorCode};
3
4use core::marker;
5use core::convert::TryInto;
6
7pub fn pad_packet(input: &mut [u8], new_len: usize) -> Result<(), ErrorCode> {
11 let len = match input.len().try_into() {
12 Ok(data_len) => data_len,
13 Err(_) => return Err(ErrorCode::bad_arg()),
14 };
15 let new_len = match new_len.try_into() {
16 Ok(data_len) => data_len,
17 Err(_) => return Err(ErrorCode::bad_arg()),
18 };
19 let data = input.as_mut_ptr();
20
21 let result = unsafe {
22 sys::opus_packet_pad(data, len, new_len)
23 };
24
25 map_sys_error!(result => ())
26}
27
28pub fn unpad_packet(input: &mut [u8]) -> Result<usize, ErrorCode> {
34 let len = match input.len().try_into() {
35 Ok(data_len) => data_len,
36 Err(_) => return Err(ErrorCode::bad_arg()),
37 };
38 let data = input.as_mut_ptr();
39
40 let result = unsafe {
41 sys::opus_packet_unpad(data, len)
42 };
43
44 map_sys_error!(result => result as usize)
45}
46
47#[repr(transparent)]
48pub struct Repacketizer {
50 inner: mem::Unique<sys::OpusRepacketizer>
51}
52
53impl Repacketizer {
54 pub fn new() -> Result<Self, ErrorCode> {
56 let size = unsafe {
57 sys::opus_repacketizer_get_size()
58 };
59
60 if size == 0 {
61 return Err(ErrorCode::Internal);
62 }
63
64 let mut this = match mem::Unique::new(size as _) {
65 Some(inner) => Self {
66 inner,
67 },
68 None => return Err(ErrorCode::AllocFail)
69 };
70
71 this.reset();
72
73 Ok(this)
74 }
75
76 #[inline(always)]
77 pub fn reset(&mut self) {
79 unsafe {
80 sys::opus_repacketizer_init(self.inner.as_mut());
81 }
82 }
83
84 #[inline(always)]
85 pub fn start<'a, 'buf>(&'a mut self) -> OngoingRepacketizer<'a, 'buf> {
87 OngoingRepacketizer {
88 inner: self,
89 _buf_lifetime: marker::PhantomData
90 }
91 }
92
93 pub fn combine_all(&mut self, bufs: &[&[u8]], out: &mut [mem::MaybeUninit<u8>]) -> Result<usize, ErrorCode> {
97 let mut state = self.start();
98 for buf in bufs {
99 state.add_packet(buf)?;
100 }
101 state.create_full_packet(out)
102 }
103}
104
105unsafe impl Send for Repacketizer {}
106
107#[repr(transparent)]
108pub struct OngoingRepacketizer<'a, 'buf> {
117 inner: &'a mut Repacketizer,
118 _buf_lifetime: marker::PhantomData<&'buf [u8]>
119}
120
121impl<'a, 'buf> OngoingRepacketizer<'a, 'buf> {
122 #[inline(always)]
123 fn as_state(&self) -> &mem::Unique<sys::OpusRepacketizer> {
124 &self.inner.inner
125 }
126
127 #[inline(always)]
128 fn as_state_mut(&mut self) -> &mut mem::Unique<sys::OpusRepacketizer> {
129 &mut self.inner.inner
130 }
131
132 #[inline(always)]
133 pub fn reset(&mut self) {
135 self.inner.reset();
136 }
137
138 #[inline(always)]
139 pub fn get_nb_frames(&self) -> u32 {
142 unsafe {
143 sys::opus_repacketizer_get_nb_frames(self.as_state().as_pseudo_mut()) as _
144 }
145 }
146
147 pub fn add_packet(&mut self, input: &'buf [u8]) -> Result<(), ErrorCode> {
164 let len = match input.len().try_into() {
165 Ok(data_len) => data_len,
166 Err(_) => return Err(ErrorCode::bad_arg()),
167 };
168 let data = input.as_ptr();
169
170 let result = unsafe {
171 sys::opus_repacketizer_cat(self.as_state_mut().as_mut(), data, len)
172 };
173
174 map_sys_error!(result => ())
175 }
176
177 #[inline(always)]
178 pub fn with_packet<'new_buf>(self, input: &'new_buf [u8]) -> Result<OngoingRepacketizer<'a, 'new_buf>, ErrorCode> where 'buf: 'new_buf {
182 let mut new = self;
183 new.add_packet(input)?;
184 Ok(new)
185 }
186
187 pub fn create_packet(&self, range: (u32, u32), out: &mut [mem::MaybeUninit<u8>]) -> Result<usize, ErrorCode> {
198 let begin = match range.0.try_into() {
199 Ok(begin) => begin,
200 Err(_) => return Err(ErrorCode::bad_arg()),
201 };
202 let end = match range.1.try_into() {
203 Ok(end) => end,
204 Err(_) => return Err(ErrorCode::bad_arg()),
205 };
206
207 let out_len = match out.len().try_into() {
208 Ok(out_len) => out_len,
209 Err(_) => return Err(ErrorCode::bad_arg()),
210 };
211
212 let result = unsafe {
213 sys::opus_repacketizer_out_range(self.as_state().as_pseudo_mut(), begin, end, out.as_mut_ptr() as _, out_len)
214 };
215
216 map_sys_error!(result => result as _)
217 }
218
219 #[inline(always)]
220 pub fn create_full_packet(&self, out: &mut [mem::MaybeUninit<u8>]) -> Result<usize, ErrorCode> {
224 let out_len = match out.len().try_into() {
225 Ok(out_len) => out_len,
226 Err(_) => return Err(ErrorCode::bad_arg()),
227 };
228
229 let result = unsafe {
230 sys::opus_repacketizer_out(self.as_state().as_pseudo_mut(), out.as_mut_ptr() as _, out_len)
231 };
232
233 map_sys_error!(result => result as _)
234 }
235}
236
237impl<'a, 'buf> Drop for OngoingRepacketizer<'a, 'buf> {
238 #[inline(always)]
239 fn drop(&mut self) {
240 self.inner.reset();
241 }
242}