1use crate::{sys, mem, ErrorCode, Application, Channels, SampleRate, Bandwidth, Bitrate, Signal, InbandFec, FrameDuration};
2
3use mem::alloc::vec::Vec;
4
5pub struct Encoder {
7 inner: mem::Unique<sys::OpusEncoder>,
8 channels: Channels,
9}
10
11impl Encoder {
12 pub fn new(channels: Channels, rate: SampleRate, app: Application) -> Result<Self, ErrorCode> {
14 let size = unsafe {
15 sys::opus_encoder_get_size(channels as _)
16 };
17
18 if size == 0 {
19 return Err(ErrorCode::Internal);
20 }
21
22 let mut encoder = match mem::Unique::new(size as _) {
23 Some(inner) => Encoder {
24 inner,
25 channels,
26 },
27 None => return Err(ErrorCode::AllocFail)
28 };
29
30 let result = unsafe {
31 sys::opus_encoder_init(encoder.inner.as_mut(), rate as _, channels as _, app as _)
32 };
33
34 map_sys_error!(result => encoder)
35 }
36
37 #[inline(always)]
38 pub fn channels(&self) -> Channels {
42 self.channels
43 }
44
45 pub fn encode_to(&mut self, input: &[u16], output: &mut [mem::MaybeUninit<u8>]) -> Result<usize, ErrorCode> {
53 let result = unsafe {
54 sys::opus_encode(self.inner.as_mut(),
55 input.as_ptr() as _, (input.len() / (self.channels as usize)) as _,
56 output.as_mut_ptr() as _, output.len() as _)
57 };
58
59 map_sys_error!(result => result as _)
60 }
61
62 #[inline(always)]
63 pub fn encode_to_slice(&mut self, input: &[u16], output: &mut [u8]) -> Result<usize, ErrorCode> {
67 self.encode_to(input, unsafe { mem::transmute(output) })
68 }
69
70 #[inline(always)]
71 pub fn encode_to_vec(&mut self, input: &[u16], output: &mut Vec<u8>) -> Result<usize, ErrorCode> {
79 let initial_len = output.len();
80 let result = self.encode_to(input, output.spare_capacity_mut())?;
81 unsafe {
82 output.set_len(initial_len + result);
83 }
84 Ok(result)
85 }
86
87 pub fn encode_float_to(&mut self, input: &[f32], output: &mut [mem::MaybeUninit<u8>]) -> Result<usize, ErrorCode> {
102 let result = unsafe {
103 sys::opus_encode_float(self.inner.as_mut(),
104 input.as_ptr(), (input.len() / (self.channels as usize)) as _,
105 output.as_mut_ptr() as _, output.len() as _)
106 };
107
108 map_sys_error!(result => result as _)
109 }
110
111 #[inline(always)]
112 pub fn encode_float_to_slice(&mut self, input: &[f32], output: &mut [u8]) -> Result<usize, ErrorCode> {
116 self.encode_float_to(input, unsafe { mem::transmute(output) })
117 }
118
119 #[inline(always)]
120 pub fn encode_float_to_vec(&mut self, input: &[f32], output: &mut Vec<u8>) -> Result<usize, ErrorCode> {
128 let initial_len = output.len();
129 let result = self.encode_float_to(input, output.spare_capacity_mut())?;
130 unsafe {
131 output.set_len(initial_len + result);
132 }
133 Ok(result)
134 }
135
136 #[inline]
137 pub fn reset(&mut self) -> Result<(), ErrorCode> {
139 let result = unsafe {
140 sys::opus_encoder_ctl(self.inner.as_mut(), sys::OPUS_RESET_STATE)
141 };
142
143 map_sys_error!(result => ())
144 }
145
146 #[inline]
147 pub fn get_look_ahead(&mut self) -> Result<u32, ErrorCode> {
151 let mut value: i32 = 0;
152 let result = unsafe {
153 sys::opus_encoder_ctl(self.inner.as_mut(), sys::OPUS_GET_LOOKAHEAD_REQUEST, &mut value)
154 };
155
156 map_sys_error!(result => match value.is_negative() {
157 false => value as _,
158 true => return Err(ErrorCode::unknown())
159 })
160 }
161
162 #[inline]
163 pub fn get_bitrate(&mut self) -> Result<Bitrate, ErrorCode> {
165 let mut value: i32 = 0;
166 let result = unsafe {
167 sys::opus_encoder_ctl(self.inner.as_mut(), sys::OPUS_GET_BITRATE_REQUEST, &mut value)
168 };
169
170 map_sys_error!(result => value.into())
171 }
172
173 #[inline]
174 pub fn set_bitrate(&mut self, value: Bitrate) -> Result<(), ErrorCode> {
176 let value: i32 = value.into();
177 let result = unsafe {
178 sys::opus_encoder_ctl(self.inner.as_mut(), sys::OPUS_SET_BITRATE_REQUEST, value)
179 };
180
181 map_sys_error!(result => ())
182 }
183
184 #[inline]
185 pub fn get_vbr(&mut self) -> Result<bool, ErrorCode> {
187 let mut value: i32 = 0;
188 let result = unsafe {
189 sys::opus_encoder_ctl(self.inner.as_mut(), sys::OPUS_GET_VBR_REQUEST, &mut value)
190 };
191
192 map_sys_error!(result => value == 1)
193 }
194
195 #[inline]
196 pub fn set_vbr(&mut self, value: bool) -> Result<(), ErrorCode> {
200 let value: i32 = match value {
201 true => 1,
202 false => 0
203 };
204 let result = unsafe {
205 sys::opus_encoder_ctl(self.inner.as_mut(), sys::OPUS_SET_VBR_REQUEST, value)
206 };
207
208 map_sys_error!(result => ())
209 }
210
211 #[inline]
212 pub fn get_vbr_constraint(&mut self) -> Result<bool, ErrorCode> {
214 let mut value: i32 = 0;
215 let result = unsafe {
216 sys::opus_encoder_ctl(self.inner.as_mut(), sys::OPUS_GET_VBR_CONSTRAINT_REQUEST, &mut value)
217 };
218
219 map_sys_error!(result => value == 1)
220 }
221
222 #[inline]
223 pub fn set_vbr_constraint(&mut self, value: bool) -> Result<(), ErrorCode> {
233 let value: i32 = match value {
234 true => 1,
235 false => 0
236 };
237 let result = unsafe {
238 sys::opus_encoder_ctl(self.inner.as_mut(), sys::OPUS_SET_VBR_CONSTRAINT_REQUEST, value)
239 };
240
241 map_sys_error!(result => ())
242 }
243
244 #[inline]
245 pub fn get_force_channels(&mut self) -> Result<Option<Channels>, ErrorCode> {
247 let mut value: i32 = 0;
248 let result = unsafe {
249 sys::opus_encoder_ctl(self.inner.as_mut(), sys::OPUS_GET_FORCE_CHANNELS_REQUEST, &mut value)
250 };
251
252 map_sys_error!(result => match value {
253 1 => Some(Channels::Mono),
254 2 => Some(Channels::Stereo),
255 _ => None,
256 })
257 }
258
259 #[inline]
260 pub fn set_force_channels(&mut self, value: Option<Channels>) -> Result<(), ErrorCode> {
266 let value = match value {
267 Some(value) => value as i32,
268 None => sys::OPUS_AUTO
269 };
270 let result = unsafe {
271 sys::opus_encoder_ctl(self.inner.as_mut(), sys::OPUS_SET_FORCE_CHANNELS_REQUEST, value)
272 };
273
274 map_sys_error!(result => ())
275 }
276
277 #[inline]
278 pub fn get_complexity(&mut self) -> Result<u8, ErrorCode> {
280 let mut value: i32 = 0;
281 let result = unsafe {
282 sys::opus_encoder_ctl(self.inner.as_mut(), sys::OPUS_GET_COMPLEXITY_REQUEST, &mut value)
283 };
284
285 map_sys_error!(result => value as _)
286 }
287
288 #[inline]
289 pub fn set_complexity(&mut self, value: u8) -> Result<(), ErrorCode> {
293 let result = unsafe {
294 sys::opus_encoder_ctl(self.inner.as_mut(), sys::OPUS_SET_COMPLEXITY_REQUEST, value as i32)
295 };
296
297 map_sys_error!(result => ())
298 }
299
300 #[inline]
301 pub fn get_signal(&mut self) -> Result<Signal, ErrorCode> {
303 let mut value: i32 = 0;
304 let result = unsafe {
305 sys::opus_encoder_ctl(self.inner.as_mut(), sys::OPUS_GET_SIGNAL_REQUEST, &mut value)
306 };
307
308 map_sys_error!(result => value.into())
309 }
310
311 #[inline]
312 pub fn set_signal(&mut self, value: Signal) -> Result<(), ErrorCode> {
316 let result = unsafe {
317 sys::opus_encoder_ctl(self.inner.as_mut(), sys::OPUS_SET_SIGNAL_REQUEST, value as i32)
318 };
319
320 map_sys_error!(result => ())
321 }
322
323 #[inline]
324 pub fn get_application(&mut self) -> Result<Application, ErrorCode> {
326 let mut value: i32 = 0;
327 let result = unsafe {
328 sys::opus_encoder_ctl(self.inner.as_mut(), sys::OPUS_GET_APPLICATION_REQUEST, &mut value)
329 };
330
331 map_sys_error!(result => match Application::from_sys(value) {
332 Some(value) => value,
333 None => return Err(ErrorCode::unknown())
334 })
335 }
336
337 #[inline]
338 pub fn set_application(&mut self, value: Application) -> Result<(), ErrorCode> {
342 let result = unsafe {
343 sys::opus_encoder_ctl(self.inner.as_mut(), sys::OPUS_SET_APPLICATION_REQUEST, value as i32)
344 };
345
346 map_sys_error!(result => ())
347 }
348
349 #[inline]
350 pub fn get_bandwidth(&mut self) -> Result<Bandwidth, ErrorCode> {
352 let mut value: i32 = 0;
353 let result = unsafe {
354 sys::opus_encoder_ctl(self.inner.as_mut(), sys::OPUS_GET_BANDWIDTH_REQUEST, &mut value)
355 };
356
357 map_sys_error!(result => value.into())
358 }
359
360 #[inline]
361 pub fn set_bandwidth(&mut self, value: Bandwidth) -> Result<(), ErrorCode> {
368 let result = unsafe {
369 sys::opus_encoder_ctl(self.inner.as_mut(), sys::OPUS_SET_BANDWIDTH_REQUEST, value as i32)
370 };
371
372 map_sys_error!(result => ())
373 }
374
375 #[inline]
376 pub fn get_max_bandwidth(&mut self) -> Result<Bandwidth, ErrorCode> {
378 let mut value: i32 = 0;
379 let result = unsafe {
380 sys::opus_encoder_ctl(self.inner.as_mut(), sys::OPUS_GET_MAX_BANDWIDTH_REQUEST, &mut value)
381 };
382
383 map_sys_error!(result => value.into())
384 }
385
386 #[inline]
387 pub fn set_max_bandwidth(&mut self, value: Bandwidth) -> Result<(), ErrorCode> {
394 let result = unsafe {
395 sys::opus_encoder_ctl(self.inner.as_mut(), sys::OPUS_SET_MAX_BANDWIDTH_REQUEST, value as i32)
396 };
397
398 map_sys_error!(result => ())
399 }
400
401 #[inline]
402 pub fn get_inband_fec(&mut self) -> Result<InbandFec, ErrorCode> {
404 let mut value: i32 = 0;
405 let result = unsafe {
406 sys::opus_encoder_ctl(self.inner.as_mut(), sys::OPUS_GET_INBAND_FEC_REQUEST, &mut value)
407 };
408
409 map_sys_error!(result => match value {
410 0 => InbandFec::Off,
411 1 => InbandFec::Mode1,
412 2 => InbandFec::Mode2,
413 _ => return Err(ErrorCode::unknown()),
414 })
415 }
416
417 #[inline]
418 pub fn set_inband_fec(&mut self, value: InbandFec) -> Result<(), ErrorCode> {
424 let result = unsafe {
425 sys::opus_encoder_ctl(self.inner.as_mut(), sys::OPUS_SET_INBAND_FEC_REQUEST, value as i32)
426 };
427
428 map_sys_error!(result => ())
429 }
430
431 #[inline]
432 pub fn get_packet_loss(&mut self) -> Result<u8, ErrorCode> {
434 let mut value: i32 = 0;
435 let result = unsafe {
436 sys::opus_encoder_ctl(self.inner.as_mut(), sys::OPUS_GET_PACKET_LOSS_PERC_REQUEST, &mut value)
437 };
438
439 map_sys_error!(result => value as _)
440 }
441
442 #[inline]
443 pub fn set_packet_loss(&mut self, value: u8) -> Result<(), ErrorCode> {
449 let result = unsafe {
450 sys::opus_encoder_ctl(self.inner.as_mut(), sys::OPUS_SET_PACKET_LOSS_PERC_REQUEST, value as i32)
451 };
452
453 map_sys_error!(result => ())
454 }
455
456 #[inline]
457 pub fn get_prediction_disabled(&mut self) -> Result<bool, ErrorCode> {
459 let mut value: i32 = 0;
460 let result = unsafe {
461 sys::opus_encoder_ctl(self.inner.as_mut(), sys::OPUS_GET_PREDICTION_DISABLED_REQUEST, &mut value)
462 };
463
464 map_sys_error!(result => value == 1)
465 }
466
467 #[inline]
468 pub fn set_prediction_disabled(&mut self, value: bool) -> Result<(), ErrorCode> {
472 let value: i32 = match value {
473 true => 1,
474 false => 0,
475 };
476
477 let result = unsafe {
478 sys::opus_encoder_ctl(self.inner.as_mut(), sys::OPUS_SET_PREDICTION_DISABLED_REQUEST, value)
479 };
480
481 map_sys_error!(result => ())
482 }
483
484 #[inline]
485 pub fn get_lsb_depth(&mut self) -> Result<u8, ErrorCode> {
487 let mut value: i32 = 0;
488 let result = unsafe {
489 sys::opus_encoder_ctl(self.inner.as_mut(), sys::OPUS_GET_LSB_DEPTH_REQUEST, &mut value)
490 };
491
492 map_sys_error!(result => value as _)
493 }
494
495 #[inline]
496 pub fn set_lsb_depth(&mut self, value: u8) -> Result<(), ErrorCode> {
508 let result = unsafe {
509 sys::opus_encoder_ctl(self.inner.as_mut(), sys::OPUS_SET_LSB_DEPTH_REQUEST, value as i32)
510 };
511
512 map_sys_error!(result => ())
513 }
514
515 #[inline]
516 pub fn get_frame_duration(&mut self) -> Result<FrameDuration, ErrorCode> {
518 let mut value: i32 = 0;
519 let result = unsafe {
520 sys::opus_encoder_ctl(self.inner.as_mut(), sys::OPUS_GET_EXPERT_FRAME_DURATION_REQUEST, &mut value)
521 };
522
523 map_sys_error!(result => match value {
524 sys::OPUS_FRAMESIZE_ARG => FrameDuration::SizeArg,
525 sys::OPUS_FRAMESIZE_2_5_MS => FrameDuration::Size2_5,
526 sys::OPUS_FRAMESIZE_5_MS => FrameDuration::Size5,
527 sys::OPUS_FRAMESIZE_10_MS => FrameDuration::Size10,
528 sys::OPUS_FRAMESIZE_20_MS => FrameDuration::Size20,
529 sys::OPUS_FRAMESIZE_40_MS => FrameDuration::Size40,
530 sys::OPUS_FRAMESIZE_60_MS => FrameDuration::Size60,
531 sys::OPUS_FRAMESIZE_80_MS => FrameDuration::Size80,
532 sys::OPUS_FRAMESIZE_100_MS => FrameDuration::Size100,
533 sys::OPUS_FRAMESIZE_120_MS => FrameDuration::Size120,
534 _ => return Err(ErrorCode::unknown()),
535 })
536 }
537
538 #[inline]
539 pub fn set_frame_duration(&mut self, value: FrameDuration) -> Result<(), ErrorCode> {
547 let result = unsafe {
548 sys::opus_encoder_ctl(self.inner.as_mut(), sys::OPUS_SET_EXPERT_FRAME_DURATION_REQUEST, value as i32)
549 };
550
551 map_sys_error!(result => ())
552 }
553
554 #[inline]
555 pub fn get_dred_duration(&mut self) -> Result<u8, ErrorCode> {
557 let mut value: i32 = 0;
558 let result = unsafe {
559 sys::opus_encoder_ctl(self.inner.as_mut(), sys::OPUS_GET_DRED_DURATION_REQUEST, &mut value)
560 };
561
562 map_sys_error!(result => value as _)
563 }
564
565 #[inline]
566 pub fn set_dred_duration(&mut self, value: u8) -> Result<(), ErrorCode> {
570 let result = unsafe {
571 sys::opus_encoder_ctl(self.inner.as_mut(), sys::OPUS_SET_DRED_DURATION_REQUEST, value as i32)
572 };
573
574 map_sys_error!(result => ())
575 }
576
577 #[inline]
578 pub fn get_sample_rate(&mut self) -> Result<SampleRate, ErrorCode> {
580 let mut value: i32 = 0;
581 let result = unsafe {
582 sys::opus_encoder_ctl(self.inner.as_mut(), sys::OPUS_GET_SAMPLE_RATE_REQUEST, &mut value)
583 };
584
585 map_sys_error!(result => match value {
586 8000 => SampleRate::Hz8000,
587 12000 => SampleRate::Hz12000,
588 16000 => SampleRate::Hz16000,
589 24000 => SampleRate::Hz24000,
590 48000 => SampleRate::Hz48000,
591 _ => return Err(ErrorCode::unknown())
592 })
593 }
594
595 #[inline]
596 pub fn get_dtx(&mut self) -> Result<bool, ErrorCode> {
598 let mut value: i32 = 0;
599 let result = unsafe {
600 sys::opus_encoder_ctl(self.inner.as_mut(), sys::OPUS_GET_DTX_REQUEST, &mut value)
601 };
602
603 map_sys_error!(result => value == 1)
604 }
605
606 #[inline]
607 pub fn set_dtx(&mut self, value: bool) -> Result<(), ErrorCode> {
611 let value: i32 = match value {
612 true => 1,
613 false => 0,
614 };
615
616 let result = unsafe {
617 sys::opus_encoder_ctl(self.inner.as_mut(), sys::OPUS_SET_DTX_REQUEST, value)
618 };
619
620 map_sys_error!(result => ())
621 }
622
623 #[inline]
624 pub fn get_phase_inversion_disabled(&mut self) -> Result<bool, ErrorCode> {
626 let mut value: i32 = 0;
627 let result = unsafe {
628 sys::opus_encoder_ctl(self.inner.as_mut(), sys::OPUS_GET_PHASE_INVERSION_DISABLED_REQUEST, &mut value)
629 };
630
631 map_sys_error!(result => value == 1)
632 }
633
634 #[inline]
635 pub fn set_phase_inversion_disabled(&mut self, value: bool) -> Result<(), ErrorCode> {
640 let value: i32 = match value {
641 true => 1,
642 false => 0,
643 };
644
645 let result = unsafe {
646 sys::opus_encoder_ctl(self.inner.as_mut(), sys::OPUS_SET_PHASE_INVERSION_DISABLED_REQUEST, value)
647 };
648
649 map_sys_error!(result => ())
650 }
651}
652
653unsafe impl Send for Encoder {}