Skip to main content

rtc_rtp/codec/g7xx/
mod.rs

1#[cfg(test)]
2mod g7xx_test;
3
4use crate::packetizer::Payloader;
5use shared::error::Result;
6
7use bytes::Bytes;
8
9/// G711Payloader payloads G711 packets
10pub type G711Payloader = G7xxPayloader;
11/// G722Payloader payloads G722 packets
12pub type G722Payloader = G7xxPayloader;
13
14#[derive(Default, Debug, Copy, Clone)]
15/// Packetizes G.711/G.722 audio, which needs no fragmentation — one payload per frame.
16pub struct G7xxPayloader;
17
18impl Payloader for G7xxPayloader {
19    /// Payload fragments an G7xx packet across one or more byte arrays
20    fn payload(&mut self, mtu: usize, payload: &Bytes) -> Result<Vec<Bytes>> {
21        if payload.is_empty() || mtu == 0 {
22            return Ok(vec![]);
23        }
24
25        let mut payload_data_remaining = payload.len();
26        let mut payload_data_index = 0;
27        let mut payloads = Vec::with_capacity(payload_data_remaining / mtu);
28        while payload_data_remaining > 0 {
29            let current_fragment_size = std::cmp::min(mtu, payload_data_remaining);
30            payloads.push(
31                payload.slice(payload_data_index..payload_data_index + current_fragment_size),
32            );
33
34            payload_data_remaining -= current_fragment_size;
35            payload_data_index += current_fragment_size;
36        }
37
38        Ok(payloads)
39    }
40
41    fn clone_to(&self) -> Box<dyn Payloader> {
42        Box::new(*self)
43    }
44}