audio_codec/
g729.rs

1use super::{Decoder, Encoder, PcmBuf, Sample};
2
3const L_FRAME: usize = 80; // 10ms frame at 8kHz
4const L_FRAME_COMPRESSED: usize = 10; // G.729 frame size in bytes
5
6/// G.729 audio decoder using g729-sys
7pub struct G729Decoder {
8    decoder: g729_sys::Decoder,
9}
10
11impl G729Decoder {
12    /// Create a new G.729 decoder instance
13    pub fn new() -> Self {
14        Self {
15            decoder: g729_sys::Decoder::new().expect("Failed to create g729 decoder"),
16        }
17    }
18}
19
20unsafe impl Send for G729Decoder {}
21unsafe impl Sync for G729Decoder {}
22
23impl Decoder for G729Decoder {
24    fn decode(&mut self, data: &[u8]) -> PcmBuf {
25        if data.is_empty() {
26            return vec![];
27        }
28
29        // G.729 processes 10-byte frames
30        let mut output = Vec::new();
31        let mut pos = 0;
32
33        while pos + L_FRAME_COMPRESSED <= data.len() {
34            let frame_data = &data[pos..pos + L_FRAME_COMPRESSED];
35            // g729-sys: decode(frame, bfi, vad, dtx) -> [i16;80]
36            let decoded_frame = self.decoder.decode(frame_data, false, false, false);
37            output.extend_from_slice(&decoded_frame);
38
39            pos += L_FRAME_COMPRESSED;
40        }
41
42        output
43    }
44
45    fn sample_rate(&self) -> u32 {
46        8000 // G.729 operates at 8kHz
47    }
48
49    fn channels(&self) -> u16 {
50        1 // G.729 is always mono
51    }
52}
53
54/// G.729 audio encoder using g729-sys
55pub struct G729Encoder {
56    encoder: g729_sys::Encoder,
57}
58
59impl G729Encoder {
60    /// Create a new G.729 encoder instance
61    pub fn new() -> Self {
62        Self {
63            // The argument typically enables/disables Annex B (VAD/DTX). Use false by default.
64            encoder: g729_sys::Encoder::new(false).expect("Failed to create g729 encoder"),
65        }
66    }
67}
68
69unsafe impl Send for G729Encoder {}
70unsafe impl Sync for G729Encoder {}
71
72impl Encoder for G729Encoder {
73    fn encode(&mut self, samples: &[Sample]) -> Vec<u8> {
74        if samples.is_empty() {
75            return vec![];
76        }
77
78        let mut output = Vec::new();
79        let mut pos = 0;
80
81        // Process samples in 80-sample (10ms @ 8kHz) frames
82        while pos + L_FRAME <= samples.len() {
83            let mut frame_arr = [0i16; L_FRAME];
84            frame_arr.copy_from_slice(&samples[pos..pos + L_FRAME]);
85
86            let encoded_frame = self.encoder.encode(&frame_arr);
87            output.extend_from_slice(&encoded_frame);
88
89            pos += L_FRAME;
90        }
91
92        output
93    }
94
95    fn sample_rate(&self) -> u32 {
96        8000 // G.729 operates at 8kHz
97    }
98
99    fn channels(&self) -> u16 {
100        1 // G.729 is always mono
101    }
102}