use ezk_g722::libg722::{decoder::Decoder, encoder::Encoder, Bitrate};
pub const G722_PAYLOAD_TYPE: u8 = 9;
pub const G722_SAMPLE_RATE: u32 = 16000;
pub const G722_RTP_RATE: u32 = 8000;
pub struct G722Codec {
encoder: Encoder,
decoder: Decoder,
}
impl G722Codec {
pub fn new() -> Self {
Self {
encoder: Encoder::new(Bitrate::Mode1_64000, false, false),
decoder: Decoder::new(Bitrate::Mode1_64000, false, false),
}
}
pub fn payload_type(&self) -> u8 {
G722_PAYLOAD_TYPE
}
pub fn name(&self) -> &'static str {
"G722"
}
pub fn sample_rate(&self) -> u32 {
G722_SAMPLE_RATE
}
pub fn rtp_rate(&self) -> u32 {
G722_RTP_RATE
}
pub fn samples_per_frame(&self) -> usize {
320 }
pub fn bytes_per_frame(&self) -> usize {
160 }
pub fn encode(&mut self, pcm: &[i16]) -> Vec<u8> {
self.encoder.encode(pcm)
}
pub fn decode(&mut self, data: &[u8]) -> Vec<i16> {
self.decoder.decode(data)
}
pub fn reset(&mut self) {
self.encoder = Encoder::new(Bitrate::Mode1_64000, false, false);
self.decoder = Decoder::new(Bitrate::Mode1_64000, false, false);
}
}
impl Default for G722Codec {
fn default() -> Self {
Self::new()
}
}
#[cfg(test)]
pub(crate) fn silence_frame() -> Vec<u8> {
vec![0u8; 160]
}
#[cfg(test)]
mod tests {
use super::*;
#[test]
fn test_encode_decode_roundtrip() {
let mut codec = G722Codec::new();
let samples: Vec<i16> = (0..320)
.map(|i| ((i as f32 * 0.1).sin() * 16000.0) as i16)
.collect();
let encoded = codec.encode(&samples);
assert_eq!(encoded.len(), 160);
let decoded = codec.decode(&encoded);
assert_eq!(decoded.len(), 320);
let non_zero = decoded.iter().filter(|&&s| s != 0).count();
assert!(non_zero > decoded.len() / 2);
}
#[test]
fn test_frame_sizes() {
let codec = G722Codec::new();
assert_eq!(codec.sample_rate(), 16000);
assert_eq!(codec.rtp_rate(), 8000);
assert_eq!(codec.samples_per_frame(), 320);
assert_eq!(codec.bytes_per_frame(), 160);
}
#[test]
fn test_payload_type() {
let codec = G722Codec::new();
assert_eq!(codec.payload_type(), 9);
}
#[test]
fn test_name() {
let codec = G722Codec::new();
assert_eq!(codec.name(), "G722");
}
#[test]
fn test_reset() {
let mut codec = G722Codec::new();
let samples = vec![1000i16; 320];
let _ = codec.encode(&samples);
codec.reset();
let encoded = codec.encode(&samples);
assert_eq!(encoded.len(), 160);
}
#[test]
fn test_silence_frame() {
let frame = silence_frame();
assert_eq!(frame.len(), 160);
}
#[test]
fn test_default() {
let codec = G722Codec::default();
assert_eq!(codec.payload_type(), 9);
}
}