1use super::{Decoder, Encoder, PcmBuf, Sample};
2pub use opus_rs::Application as OpusApplication;
3use opus_rs::{Application, OpusDecoder as OpusDecoderRaw, OpusEncoder as OpusEncoderRaw};
4
5pub struct OpusDecoder {
6 decoder: OpusDecoderRaw,
7 sample_rate: u32,
8 channels: u16,
9 w_output_f32: Vec<f32>,
10 w_pcm_i16: Vec<i16>,
11}
12
13impl OpusDecoder {
14 pub fn new(sample_rate: u32, channels: u16) -> Self {
16 let decoder = OpusDecoderRaw::new(sample_rate as i32, channels as usize)
17 .expect("Failed to create Opus decoder");
18
19 Self {
20 decoder,
21 sample_rate,
22 channels,
23 w_output_f32: Vec::new(),
24 w_pcm_i16: Vec::new(),
25 }
26 }
27
28 pub fn new_default() -> Self {
30 Self::new(48000, 2)
31 }
32
33 pub fn decode_into(&mut self, data: &[u8], output: &mut [i16]) -> usize {
34 let channels = usize::from(self.channels);
35 if channels == 0 || data.is_empty() {
36 return 0;
37 }
38
39 let frame_size = (self.sample_rate as usize * 20) / 1000;
41 let max_samples = frame_size * channels;
42 if self.w_output_f32.len() < max_samples {
43 self.w_output_f32.resize(max_samples, 0.0);
44 }
45
46 match self
47 .decoder
48 .decode(data, frame_size, &mut self.w_output_f32[..max_samples])
49 {
50 Ok(len) => {
51 let total_samples = len * channels;
52 if total_samples == 0 {
53 return 0;
54 }
55
56 if self.w_pcm_i16.len() < total_samples {
57 self.w_pcm_i16.resize(total_samples, 0);
58 }
59
60 for i in 0..total_samples {
61 self.w_pcm_i16[i] =
62 (self.w_output_f32[i] * 32768.0).clamp(-32768.0, 32767.0) as i16;
63 }
64
65 let n = total_samples.min(output.len());
66 output[..n].copy_from_slice(&self.w_pcm_i16[..n]);
67 n
68 }
69 Err(_) => 0,
70 }
71 }
72}
73
74impl Decoder for OpusDecoder {
75 fn decode(&mut self, data: &[u8]) -> PcmBuf {
76 let channels = usize::from(self.channels);
77 if channels == 0 || data.is_empty() {
78 return Vec::new();
79 }
80
81 let frame_size = (self.sample_rate as usize * 20) / 1000;
82 let max_samples = frame_size * channels;
83 let mut pcm = vec![0i16; max_samples];
84 let n = self.decode_into(data, &mut pcm);
85 pcm.truncate(n);
86 pcm
87 }
88
89 fn sample_rate(&self) -> u32 {
90 self.sample_rate
91 }
92
93 fn channels(&self) -> u16 {
94 self.channels
95 }
96}
97
98pub struct OpusEncoder {
99 encoder: OpusEncoderRaw,
100 sample_rate: u32,
101 channels: u16,
102 w_input_f32: Vec<f32>,
103 w_packet: Vec<u8>,
104}
105
106impl OpusEncoder {
107 pub fn new_with_application(sample_rate: u32, channels: u16, application: Application) -> Self {
108 let encoder = OpusEncoderRaw::new(sample_rate as i32, channels as usize, application)
109 .expect("Failed to create Opus encoder");
110
111 Self {
112 encoder,
113 sample_rate,
114 channels,
115 w_input_f32: Vec::new(),
116 w_packet: vec![0u8; 1275],
117 }
118 }
119
120 pub fn new(sample_rate: u32, channels: u16) -> Self {
125 let app = if channels == 2 {
126 Application::Audio
127 } else {
128 Application::Voip
129 };
130 let mut enc = Self::new_with_application(sample_rate, channels, app);
131 enc.encoder.bitrate_bps = if channels == 2 { 64000 } else { 48000 };
132 enc.encoder.complexity = if channels == 2 { 5 } else { 0 };
133 enc
134 }
135
136 pub fn new_default() -> Self {
138 Self::new(48000, 2)
139 }
140
141 pub fn set_bitrate(&mut self, bitrate_bps: i32) {
143 self.encoder.bitrate_bps = bitrate_bps;
144 }
145
146 pub fn set_complexity(&mut self, complexity: i32) {
148 self.encoder.complexity = complexity;
149 }
150
151 pub fn set_cbr(&mut self, cbr: bool) {
153 self.encoder.use_cbr = cbr;
154 }
155
156 pub fn encode_into(&mut self, samples: &[Sample], output: &mut [u8]) -> Option<usize> {
160 let channels = usize::from(self.channels);
161 if samples.is_empty() || channels == 0 || samples.len() % channels != 0 {
162 return None;
163 }
164
165 let frame_size = samples.len() / channels;
166
167 if self.w_input_f32.len() < samples.len() {
168 self.w_input_f32.resize(samples.len(), 0.0);
169 }
170 for (dst, &s) in self.w_input_f32[..samples.len()]
171 .iter_mut()
172 .zip(samples.iter())
173 {
174 *dst = s as f32 / 32768.0;
175 }
176
177 self.encoder
178 .encode(&self.w_input_f32[..samples.len()], frame_size, output)
179 .ok()
180 }
181
182 fn encode_raw(&mut self, samples: &[Sample]) -> Vec<u8> {
183 let channels = usize::from(self.channels);
184 if samples.is_empty() || channels == 0 || samples.len() % channels != 0 {
185 return Vec::new();
186 }
187
188 let frame_size = samples.len() / channels;
189
190 if self.w_input_f32.len() < samples.len() {
191 self.w_input_f32.resize(samples.len(), 0.0);
192 }
193 for (dst, &s) in self.w_input_f32[..samples.len()]
194 .iter_mut()
195 .zip(samples.iter())
196 {
197 *dst = s as f32 / 32768.0;
198 }
199
200 match self.encoder.encode(
201 &self.w_input_f32[..samples.len()],
202 frame_size,
203 &mut self.w_packet,
204 ) {
205 Ok(len) => {
206 let mut out = Vec::with_capacity(len);
207 out.extend_from_slice(&self.w_packet[..len]);
208 out
209 }
210 Err(_) => Vec::new(),
211 }
212 }
213}
214
215impl Encoder for OpusEncoder {
216 fn encode(&mut self, samples: &[Sample]) -> Vec<u8> {
217 self.encode_raw(samples)
218 }
219
220 fn sample_rate(&self) -> u32 {
221 self.sample_rate
222 }
223
224 fn channels(&self) -> u16 {
225 self.channels
226 }
227}