1use super::{Decoder, Encoder};
2use crate::{media::PcmBuf, media::Sample};
3pub enum Bitrate {
4 Mode1_64000,
5 Mode2_56000,
6 Mode3_48000,
7}
8
9const QUANT_DECISION_LEVEL: [i32; 32] = [
11 0, 35, 72, 110, 150, 190, 233, 276, 323, 370, 422, 473, 530, 587, 650, 714, 786, 858, 940,
12 1023, 1121, 1219, 1339, 1458, 1612, 1765, 1980, 2195, 2557, 2919, 0, 0,
13];
14
15const QUANT_INDEX_NEG: [i32; 32] = [
17 0, 63, 62, 31, 30, 29, 28, 27, 26, 25, 24, 23, 22, 21, 20, 19, 18, 17, 16, 15, 14, 13, 12, 11,
18 10, 9, 8, 7, 6, 5, 4, 0,
19];
20
21const QUANT_INDEX_POS: [i32; 32] = [
23 0, 61, 60, 59, 58, 57, 56, 55, 54, 53, 52, 51, 50, 49, 48, 47, 46, 45, 44, 43, 42, 41, 40, 39,
24 38, 37, 36, 35, 34, 33, 32, 0,
25];
26
27const SCALE_FACTOR_ADJUST_LOW: [i32; 8] = [-60, -30, 58, 172, 334, 538, 1198, 3042];
29
30const LOG_SCALE_FACTOR_MAP: [i32; 16] = [0, 7, 6, 5, 4, 3, 2, 1, 7, 6, 5, 4, 3, 2, 1, 0];
32
33const INV_LOG_BASE: [i32; 32] = [
35 2048, 2093, 2139, 2186, 2233, 2282, 2332, 2383, 2435, 2489, 2543, 2599, 2656, 2714, 2774, 2834,
36 2896, 2960, 3025, 3091, 3158, 3228, 3298, 3371, 3444, 3520, 3597, 3676, 3756, 3838, 3922, 4008,
37];
38
39const QUANT_MULT_LOW_4BIT: [i32; 16] = [
41 0, -20456, -12896, -8968, -6288, -4240, -2584, -1200, 20456, 12896, 8968, 6288, 4240, 2584,
42 1200, 0,
43];
44
45const QUANT_MULT_HIGH_2BIT: [i32; 4] = [-7408, -1616, 7408, 1616];
47
48const QMF_FILTER_COEFS: [i32; 12] = [3, -11, 12, 32, -210, 951, 3876, -805, 362, -156, 53, -11];
50
51const HIGH_QUANT_INDEX_NEG: [i32; 3] = [0, 1, 0];
53
54const HIGH_QUANT_INDEX_POS: [i32; 3] = [0, 3, 2];
56
57const SCALE_FACTOR_ADJUST_HIGH: [i32; 3] = [0, -214, 798];
59
60const HIGH_LOG_SCALE_MAP: [i32; 4] = [2, 1, 2, 1];
62
63const QUANT_MULT_56K: [i32; 32] = [
65 -280, -280, -23352, -17560, -14120, -11664, -9752, -8184, -6864, -5712, -4696, -3784, -2960,
66 -2208, -1520, -880, 23352, 17560, 14120, 11664, 9752, 8184, 6864, 5712, 4696, 3784, 2960, 2208,
67 1520, 880, 280, -280,
68];
69
70const QUANT_MULT_64K: [i32; 64] = [
72 -136, -136, -136, -136, -24808, -21904, -19008, -16704, -14984, -13512, -12280, -11192, -10232,
73 -9360, -8576, -7856, -7192, -6576, -6000, -5456, -4944, -4464, -4008, -3576, -3168, -2776,
74 -2400, -2032, -1688, -1360, -1040, -728, 24808, 21904, 19008, 16704, 14984, 13512, 12280,
75 11192, 10232, 9360, 8576, 7856, 7192, 6576, 6000, 5456, 4944, 4464, 4008, 3576, 3168, 2776,
76 2400, 2032, 1688, 1360, 1040, 728, 432, 136, -432, -136,
77];
78
79impl Bitrate {
80 fn bits_per_sample(&self) -> i32 {
81 match self {
82 Bitrate::Mode1_64000 => 8,
83 Bitrate::Mode2_56000 => 7,
84 Bitrate::Mode3_48000 => 6,
85 }
86 }
87}
88
89#[derive(Default)]
92struct G722Band {
93 signal_estimate: i32,
95 pole_filter_output: i32,
97 zero_filter_output: i32,
99 reconstructed_signal: [i32; 3],
101 pole_coefficients: [i32; 3],
103 pole_coefficients_temp: [i32; 3],
105 partial_reconstructed: [i32; 3],
107 difference_signal: [i32; 7],
109 zero_coefficients: [i32; 7],
111 zero_coefficients_temp: [i32; 7],
113 sign_bits: [i32; 7],
115 log_scale_factor: i32,
117 quantizer_step_size: i32,
119}
120
121fn saturate(amp: i32) -> i32 {
122 amp.clamp(i16::MIN as i32, i16::MAX as i32)
123}
124
125fn block4(band: &mut G722Band, d: i32) {
129 band.difference_signal[0] = d;
132 band.reconstructed_signal[0] = saturate(band.signal_estimate + d);
134
135 band.partial_reconstructed[0] = saturate(band.zero_filter_output + d);
138
139 for i in 0..3 {
142 band.sign_bits[i] = band.partial_reconstructed[i] >> 15;
143 }
144
145 let a1_scaled = saturate(band.pole_coefficients[1] << 2);
147
148 let mut a2_update = if band.sign_bits[0] == band.sign_bits[1] {
150 -a1_scaled
151 } else {
152 a1_scaled
153 };
154 a2_update = a2_update.min(32767);
155
156 let mut a2_adj = a2_update >> 7;
158 if band.sign_bits[0] == band.sign_bits[2] {
159 a2_adj += 128;
160 } else {
161 a2_adj -= 128;
162 }
163
164 a2_adj += (band.pole_coefficients[2] * 32512) >> 15;
166
167 band.pole_coefficients_temp[2] = a2_adj.clamp(-12288, 12288);
169
170 band.sign_bits[0] = band.partial_reconstructed[0] >> 15; band.sign_bits[1] = band.partial_reconstructed[1] >> 15; let sign_factor = if band.sign_bits[0] == band.sign_bits[1] {
176 192
177 } else {
178 -192
179 };
180 let leakage = (band.pole_coefficients[1] * 32640) >> 15;
181
182 band.pole_coefficients_temp[1] = saturate(sign_factor + leakage);
184
185 let limit = saturate(15360 - band.pole_coefficients_temp[2]);
187
188 if band.pole_coefficients_temp[1] > limit {
191 band.pole_coefficients_temp[1] = limit;
192 } else if band.pole_coefficients_temp[1] < -limit {
193 band.pole_coefficients_temp[1] = -limit;
194 }
195
196 let step_size = if d == 0 { 0 } else { 128 };
198 band.sign_bits[0] = d >> 15; for i in 1..7 {
202 band.sign_bits[i] = band.difference_signal[i] >> 15; let adj = if band.sign_bits[i] == band.sign_bits[0] {
205 step_size
206 } else {
207 -step_size
208 };
209 let leakage = (band.zero_coefficients[i] * 32640) >> 15;
211 band.zero_coefficients_temp[i] = saturate(adj + leakage);
213 }
214
215 for i in (1..7).rev() {
218 band.difference_signal[i] = band.difference_signal[i - 1];
219 }
220
221 for i in 1..7 {
223 band.zero_coefficients[i] = band.zero_coefficients_temp[i];
224 }
225
226 for i in (1..3).rev() {
228 band.reconstructed_signal[i] = band.reconstructed_signal[i - 1];
229 band.partial_reconstructed[i] = band.partial_reconstructed[i - 1];
230 band.pole_coefficients[i] = band.pole_coefficients_temp[i];
231 }
232
233 let r1_adj = saturate(band.reconstructed_signal[1] + band.reconstructed_signal[1]); let pole1 = (band.pole_coefficients[1] * r1_adj) >> 15;
237
238 let r2_adj = saturate(band.reconstructed_signal[2] + band.reconstructed_signal[2]); let pole2 = (band.pole_coefficients[2] * r2_adj) >> 15;
240
241 band.pole_filter_output = saturate(pole1 + pole2);
243
244 band.zero_filter_output = 0;
247 for i in 1..7 {
248 let d_adj = saturate(band.difference_signal[i] + band.difference_signal[i]); band.zero_filter_output += (band.zero_coefficients[i] * d_adj) >> 15;
250 }
251 band.zero_filter_output = saturate(band.zero_filter_output);
252
253 band.signal_estimate = saturate(band.pole_filter_output + band.zero_filter_output);
256}
257
258pub struct G722Encoder {
259 packed: bool,
260 eight_k: bool,
261 bits_per_sample: i32,
262 x: [i32; 24],
263 band: [G722Band; 2],
264 out_buffer: u32,
265 out_bits: i32,
266}
267
268pub struct G722Decoder {
269 packed: bool,
270 eight_k: bool,
271 bits_per_sample: i32,
272 x: [i32; 24],
273 band: [G722Band; 2],
274 in_buffer: u32,
275 in_bits: i32,
276}
277
278impl G722Encoder {
279 pub fn new() -> Self {
280 Self::with_options(Bitrate::Mode1_64000, false, false)
281 }
282
283 pub fn with_options(rate: Bitrate, eight_k: bool, packed: bool) -> Self {
285 let mut encoder = Self {
286 packed,
287 eight_k,
288 bits_per_sample: rate.bits_per_sample(),
289 x: [0; 24],
290 band: [G722Band::default(), G722Band::default()],
291 out_buffer: 0,
292 out_bits: 0,
293 };
294
295 encoder.band[0].log_scale_factor = 32 << 2; encoder.band[1].log_scale_factor = 8 << 2; encoder
300 }
301
302 fn g722_encode(&mut self, amp: &[i16]) -> Vec<u8> {
305 let mut output = Vec::with_capacity(amp.len() / 2 + 1);
307
308 let mut xlow: i32;
310 let mut xhigh: i32 = 0;
311 let mut input_idx = 0;
312
313 while input_idx < amp.len() {
315 if self.eight_k {
317 xlow = amp[input_idx] as i32 >> 1;
319 input_idx += 1;
320 } else {
321 for i in 0..22 {
324 self.x[i] = self.x[i + 2];
325 }
326
327 self.x[22] = amp[input_idx] as i32;
329 input_idx += 1;
330 self.x[23] = if input_idx < amp.len() {
331 amp[input_idx] as i32
332 } else {
333 0 };
335 input_idx += 1;
336
337 let mut sumeven = 0;
339 let mut sumodd = 0;
340 for i in 0..12 {
341 sumodd += self.x[2 * i] * QMF_FILTER_COEFS[i];
342 sumeven += self.x[2 * i + 1] * QMF_FILTER_COEFS[11 - i];
343 }
344
345 xlow = (sumeven + sumodd) >> 14;
347 xhigh = (sumeven - sumodd) >> 14;
348 }
349
350 let code = if self.eight_k {
352 self.encode_low_band(xlow, true)
354 } else {
355 let ilow = self.encode_low_band(xlow, false);
357 let ihigh = self.encode_high_band(xhigh);
358 (ihigh << 6 | ilow) >> (8 - self.bits_per_sample)
359 };
360
361 self.output_code(code, &mut output);
363 }
364
365 if self.packed && self.out_bits > 0 {
367 output.push((self.out_buffer & 0xFF) as u8);
368 }
369
370 output
371 }
372
373 fn encode_low_band(&mut self, xlow: i32, is_eight_k: bool) -> i32 {
376 let el = saturate(xlow - self.band[0].signal_estimate);
378
379 let wd = if el >= 0 { el } else { -(el + 1) };
381
382 let mut quantization_idx = 1;
384 while quantization_idx < 30 {
385 let decision_level =
386 (QUANT_DECISION_LEVEL[quantization_idx] * self.band[0].log_scale_factor) >> 12;
387 if wd < decision_level {
388 break;
389 }
390 quantization_idx += 1;
391 }
392
393 let ilow = if el < 0 {
395 QUANT_INDEX_NEG[quantization_idx]
396 } else {
397 QUANT_INDEX_POS[quantization_idx]
398 };
399
400 let ril = ilow >> 2;
402 let wd2 = QUANT_MULT_LOW_4BIT[ril as usize];
403 let dlow = (self.band[0].log_scale_factor * wd2) >> 15;
404
405 let il4 = LOG_SCALE_FACTOR_MAP[ril as usize];
407 let mut nb = (self.band[0].quantizer_step_size * 127) >> 7;
408 nb += SCALE_FACTOR_ADJUST_LOW[il4 as usize];
409 self.band[0].quantizer_step_size = nb.clamp(0, 18432);
410
411 let wd1 = self.band[0].quantizer_step_size >> 6 & 31;
413 let wd2 = 8 - (self.band[0].quantizer_step_size >> 11);
414 let wd3 = if wd2 < 0 {
415 INV_LOG_BASE[wd1 as usize] << -wd2
416 } else {
417 INV_LOG_BASE[wd1 as usize] >> wd2
418 };
419 self.band[0].log_scale_factor = wd3 << 2;
420
421 block4(&mut self.band[0], dlow);
423
424 if is_eight_k {
426 ((0xc0 | ilow) >> 8) - self.bits_per_sample
427 } else {
428 ilow
429 }
430 }
431
432 fn encode_high_band(&mut self, xhigh: i32) -> i32 {
435 let eh = saturate(xhigh - self.band[1].signal_estimate);
437
438 let wd = if eh >= 0 { eh } else { -(eh + 1) };
440 let decision_level = (564 * self.band[1].log_scale_factor) >> 12;
441
442 let mih = if wd >= decision_level { 2 } else { 1 };
444 let ihigh = if eh < 0 {
445 HIGH_QUANT_INDEX_NEG[mih as usize]
446 } else {
447 HIGH_QUANT_INDEX_POS[mih as usize]
448 };
449
450 let wd2 = QUANT_MULT_HIGH_2BIT[ihigh as usize];
452 let dhigh = (self.band[1].log_scale_factor * wd2) >> 15;
453
454 let ih2 = HIGH_LOG_SCALE_MAP[ihigh as usize];
456 let mut nb = (self.band[1].quantizer_step_size * 127) >> 7;
457 nb += SCALE_FACTOR_ADJUST_HIGH[ih2 as usize];
458 self.band[1].quantizer_step_size = nb.clamp(0, 22528);
459
460 let wd1 = self.band[1].quantizer_step_size >> 6 & 31;
462 let wd2 = 10 - (self.band[1].quantizer_step_size >> 11);
463 let wd3 = if wd2 < 0 {
464 INV_LOG_BASE[wd1 as usize] << -wd2
465 } else {
466 INV_LOG_BASE[wd1 as usize] >> wd2
467 };
468 self.band[1].log_scale_factor = wd3 << 2;
469
470 block4(&mut self.band[1], dhigh);
472
473 ihigh
474 }
475
476 fn output_code(&mut self, code: i32, output: &mut Vec<u8>) {
478 if self.packed {
479 self.out_buffer |= (code as u32) << self.out_bits;
481 self.out_bits += self.bits_per_sample;
482
483 if self.out_bits >= 8 {
485 output.push((self.out_buffer & 0xFF) as u8);
486 self.out_bits -= 8;
487 self.out_buffer >>= 8;
488 }
489 } else {
490 output.push(code as u8);
492 }
493 }
494}
495
496impl G722Decoder {
497 pub fn new() -> Self {
498 Self::with_options(Bitrate::Mode1_64000, false, false)
499 }
500
501 pub fn with_options(rate: Bitrate, packed: bool, eight_k: bool) -> Self {
502 Self {
503 packed,
504 eight_k,
505 bits_per_sample: rate.bits_per_sample(),
506 x: Default::default(),
507 band: Default::default(),
508 in_buffer: 0,
509 in_bits: 0,
510 }
511 }
512
513 fn extract_code(&mut self, data: &[u8], idx: &mut usize) -> i32 {
515 if self.packed {
516 if self.in_bits < self.bits_per_sample {
518 self.in_buffer |= (data[*idx] as u32) << self.in_bits;
519 *idx += 1;
520 self.in_bits += 8;
521 }
522 let code = (self.in_buffer & ((1 << self.bits_per_sample) - 1) as u32) as i32;
523 self.in_buffer >>= self.bits_per_sample;
524 self.in_bits -= self.bits_per_sample;
525 code
526 } else {
527 let code = data[*idx] as i32;
529 *idx += 1;
530 code
531 }
532 }
533
534 fn parse_code(&self, code: i32) -> (i32, i32, i32) {
536 match self.bits_per_sample {
538 7 => {
539 let wd1 = code & 0x1f;
541 let ihigh = (code >> 5) & 0x3;
542 let wd2 = QUANT_MULT_56K[wd1 as usize];
543 (wd1 >> 1, ihigh, wd2)
544 }
545 6 => {
546 let wd1 = code & 0xf;
548 let ihigh = (code >> 4) & 0x3;
549 let wd2 = QUANT_MULT_LOW_4BIT[wd1 as usize];
550 (wd1, ihigh, wd2)
551 }
552 _ => {
553 let wd1 = code & 0x3f;
555 let ihigh = (code >> 6) & 0x3;
556 let wd2 = QUANT_MULT_64K[wd1 as usize];
557 (wd1 >> 2, ihigh, wd2)
558 }
559 }
560 }
561
562 fn process_low_band(&mut self, wd1: i32, wd2: i32) -> i32 {
564 let dequant = (self.band[0].log_scale_factor * wd2) >> 15;
566
567 let rlow = self.band[0].signal_estimate + dequant;
569
570 let rlow = rlow.clamp(-16384, 16383);
572
573 let wd2 = QUANT_MULT_LOW_4BIT[wd1 as usize];
575 let dlowt = (self.band[0].log_scale_factor * wd2) >> 15;
576
577 let wd2 = LOG_SCALE_FACTOR_MAP[wd1 as usize];
579 let mut wd1 = (self.band[0].quantizer_step_size * 127) >> 7;
580 wd1 += SCALE_FACTOR_ADJUST_LOW[wd2 as usize];
581 self.band[0].quantizer_step_size = wd1.clamp(0, 18432);
582
583 let wd1 = (self.band[0].quantizer_step_size >> 6) & 31;
585 let wd2 = 8 - (self.band[0].quantizer_step_size >> 11);
586 let wd3 = if wd2 < 0 {
587 INV_LOG_BASE[wd1 as usize] << -wd2
588 } else {
589 INV_LOG_BASE[wd1 as usize] >> wd2
590 };
591 self.band[0].log_scale_factor = wd3 << 2;
592
593 block4(&mut self.band[0], dlowt);
595
596 rlow
597 }
598
599 fn process_high_band(&mut self, ihigh: i32) -> i32 {
601 let wd2 = QUANT_MULT_HIGH_2BIT[ihigh as usize];
603 let dhigh = (self.band[1].log_scale_factor * wd2) >> 15;
604
605 let rhigh = dhigh + self.band[1].signal_estimate;
607
608 let rhigh = rhigh.clamp(-16384, 16383);
610
611 let wd2 = HIGH_LOG_SCALE_MAP[ihigh as usize];
613 let mut wd1 = (self.band[1].quantizer_step_size * 127) >> 7;
614 wd1 += SCALE_FACTOR_ADJUST_HIGH[wd2 as usize];
615 self.band[1].quantizer_step_size = wd1.clamp(0, 22528);
616
617 let wd1 = (self.band[1].quantizer_step_size >> 6) & 31;
619 let wd2 = 10 - (self.band[1].quantizer_step_size >> 11);
620 let wd3 = if wd2 < 0 {
621 INV_LOG_BASE[wd1 as usize] << -wd2
622 } else {
623 INV_LOG_BASE[wd1 as usize] >> wd2
624 };
625 self.band[1].log_scale_factor = wd3 << 2;
626
627 block4(&mut self.band[1], dhigh);
629
630 rhigh
631 }
632
633 fn apply_qmf_synthesis(&mut self, rlow: i32, rhigh: i32) -> [i16; 2] {
635 for i in 0..22 {
637 self.x[i] = self.x[i + 2];
638 }
639
640 self.x[22] = rlow + rhigh;
642 self.x[23] = rlow - rhigh;
643
644 let mut xout1 = 0;
646 let mut xout2 = 0;
647
648 for i in 0..12 {
649 xout2 += self.x[2 * i] * QMF_FILTER_COEFS[i];
650 xout1 += self.x[2 * i + 1] * QMF_FILTER_COEFS[11 - i];
651 }
652
653 [saturate(xout1 >> 11) as i16, saturate(xout2 >> 11) as i16]
655 }
656
657 pub fn decode_frame(&mut self, data: &[u8]) -> PcmBuf {
660 let mut output = Vec::with_capacity(data.len() * 2);
661 let mut idx = 0;
662
663 while idx < data.len() {
664 let code = self.extract_code(data, &mut idx);
666
667 let (wd1, ihigh, wd2) = self.parse_code(code);
669
670 let rlow = self.process_low_band(wd1, wd2);
672
673 if self.eight_k {
674 output.push((rlow << 1) as i16);
676 } else {
677 let rhigh = self.process_high_band(ihigh);
679
680 let samples = self.apply_qmf_synthesis(rlow, rhigh);
682 output.extend_from_slice(&samples);
683 }
684 }
685
686 output
687 }
688}
689
690impl Encoder for G722Encoder {
691 fn encode(&mut self, samples: &[Sample]) -> Vec<u8> {
692 self.g722_encode(samples)
693 }
694
695 fn sample_rate(&self) -> u32 {
696 16000 }
698
699 fn channels(&self) -> u16 {
700 1 }
702}
703
704impl Decoder for G722Decoder {
705 fn decode(&mut self, data: &[u8]) -> PcmBuf {
706 self.decode_frame(data)
707 }
708
709 fn sample_rate(&self) -> u32 {
710 16000
711 }
712
713 fn channels(&self) -> u16 {
714 1
715 }
716}