rtp/extension/transport_cc_extension/
mod.rs1#[cfg(test)]
2mod transport_cc_extension_test;
3
4use bytes::{Buf, BufMut};
5use serde::{Deserialize, Serialize};
6use util::marshal::{Marshal, MarshalSize, Unmarshal};
7
8use crate::error::Error;
9
10pub const TRANSPORT_CC_EXTENSION_SIZE: usize = 2;
12
13#[derive(PartialEq, Eq, Debug, Default, Copy, Clone, Serialize, Deserialize)]
23pub struct TransportCcExtension {
24 pub transport_sequence: u16,
25}
26
27impl Unmarshal for TransportCcExtension {
28 fn unmarshal<B>(raw_packet: &mut B) -> Result<Self, util::Error>
30 where
31 Self: Sized,
32 B: Buf,
33 {
34 if raw_packet.remaining() < TRANSPORT_CC_EXTENSION_SIZE {
35 return Err(Error::ErrBufferTooSmall.into());
36 }
37 let b0 = raw_packet.get_u8();
38 let b1 = raw_packet.get_u8();
39
40 let transport_sequence = ((b0 as u16) << 8) | b1 as u16;
41 Ok(TransportCcExtension { transport_sequence })
42 }
43}
44
45impl MarshalSize for TransportCcExtension {
46 fn marshal_size(&self) -> usize {
48 TRANSPORT_CC_EXTENSION_SIZE
49 }
50}
51
52impl Marshal for TransportCcExtension {
53 fn marshal_to(&self, mut buf: &mut [u8]) -> Result<usize, util::Error> {
55 if buf.remaining_mut() < TRANSPORT_CC_EXTENSION_SIZE {
56 return Err(Error::ErrBufferTooSmall.into());
57 }
58 buf.put_u16(self.transport_sequence);
59 Ok(TRANSPORT_CC_EXTENSION_SIZE)
60 }
61}