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