1use super::{Decoder, Encoder, PcmBuf, Sample};
2
3const L_FRAME: usize = 80; const L_FRAME_COMPRESSED: usize = 10; pub struct G729Decoder {
8 decoder: g729_sys::Decoder,
9}
10
11impl G729Decoder {
12 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 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 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 }
48
49 fn channels(&self) -> u16 {
50 1 }
52}
53
54pub struct G729Encoder {
56 encoder: g729_sys::Encoder,
57}
58
59impl G729Encoder {
60 pub fn new() -> Self {
62 Self {
63 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 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 }
98
99 fn channels(&self) -> u16 {
100 1 }
102}