Skip to main content

g729_sys/
lib.rs

1pub mod g729;
2
3/// One G.729 frame contains 80 16-bit PCM samples at 8 kHz.
4pub const FRAME_SAMPLES: usize = 80;
5/// Voice frame payload length in bytes (10 bytes = 80 bits).
6pub const VOICE_FRAME_BYTES: usize = 10;
7
8/// Encoder wrapper.
9pub struct Encoder {
10    inner: g729::encoder::Encoder,
11}
12
13impl Encoder {
14    pub fn new(enable_vad: bool) -> anyhow::Result<Self> {
15        Ok(Self {
16            inner: g729::encoder::Encoder::new(enable_vad),
17        })
18    }
19
20    pub fn encode(&mut self, input_80_samples: &[i16; FRAME_SAMPLES]) -> Vec<u8> {
21        let mut out = [0u8; VOICE_FRAME_BYTES];
22        let mut len: u8 = 0;
23        self.inner.encode(input_80_samples, &mut out, &mut len);
24        out[..len as usize].to_vec()
25    }
26
27    pub fn rfc3389_payload(&mut self) -> [u8; 11] {
28        // Not implemented in Rust backend yet, return zeros or implement if needed
29        [0u8; 11]
30    }
31}
32
33/// Decoder wrapper.
34pub struct Decoder {
35    inner: g729::decoder::Decoder,
36}
37
38impl Decoder {
39    pub fn new() -> anyhow::Result<Self> {
40        Ok(Self {
41            inner: g729::decoder::Decoder::new(),
42        })
43    }
44
45    pub fn decode(
46        &mut self,
47        payload: &[u8],
48        frame_erased: bool,
49        is_sid: bool,
50        rfc3389: bool,
51    ) -> [i16; FRAME_SAMPLES] {
52        let mut out = [0i16; FRAME_SAMPLES];
53        let len = payload.len() as u8;
54        let payload_opt = if len > 0 { Some(payload) } else { None };
55
56        self.inner.decode(
57            payload_opt,
58            len,
59            frame_erased as u8,
60            is_sid as u8,
61            rfc3389 as u8,
62            &mut out,
63        );
64        out
65    }
66}