1pub mod g729;
2
3pub const FRAME_SAMPLES: usize = 80;
5pub const VOICE_FRAME_BYTES: usize = 10;
7
8pub 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 [0u8; 11]
30 }
31}
32
33pub 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}