rtc_rtcp/extended_report/
unknown.rs

1use super::*;
2
3/// UnknownReportBlock is used to store bytes for any report block
4/// that has an unknown Report Block Type.
5#[derive(Debug, Default, PartialEq, Eq, Clone)]
6pub struct UnknownReportBlock {
7    pub bytes: Bytes,
8}
9
10impl fmt::Display for UnknownReportBlock {
11    fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
12        write!(f, "{self:?}")
13    }
14}
15
16impl UnknownReportBlock {
17    pub fn xr_header(&self) -> XRHeader {
18        XRHeader {
19            block_type: BlockType::Unknown,
20            type_specific: 0,
21            block_length: (self.raw_size() / 4 - 1) as u16,
22        }
23    }
24}
25
26impl Packet for UnknownReportBlock {
27    fn header(&self) -> Header {
28        Header::default()
29    }
30
31    /// destination_ssrc returns an array of ssrc values that this report block refers to.
32    fn destination_ssrc(&self) -> Vec<u32> {
33        vec![]
34    }
35
36    fn raw_size(&self) -> usize {
37        XR_HEADER_LENGTH + self.bytes.len()
38    }
39
40    fn as_any(&self) -> &dyn Any {
41        self
42    }
43    fn equal(&self, other: &dyn Packet) -> bool {
44        other.as_any().downcast_ref::<UnknownReportBlock>() == Some(self)
45    }
46    fn cloned(&self) -> Box<dyn Packet> {
47        Box::new(self.clone())
48    }
49}
50
51impl MarshalSize for UnknownReportBlock {
52    fn marshal_size(&self) -> usize {
53        self.raw_size()
54    }
55}
56
57impl Marshal for UnknownReportBlock {
58    /// marshal_to encodes the UnknownReportBlock in binary
59    fn marshal_to(&self, mut buf: &mut [u8]) -> Result<usize> {
60        if buf.remaining_mut() < self.marshal_size() {
61            return Err(Error::BufferTooShort);
62        }
63
64        let h = self.xr_header();
65        let n = h.marshal_to(buf)?;
66        buf = &mut buf[n..];
67
68        buf.put(self.bytes.clone());
69
70        Ok(self.marshal_size())
71    }
72}
73
74impl Unmarshal for UnknownReportBlock {
75    /// Unmarshal decodes the UnknownReportBlock from binary
76    fn unmarshal<B>(raw_packet: &mut B) -> Result<Self>
77    where
78        Self: Sized,
79        B: Buf,
80    {
81        if raw_packet.remaining() < XR_HEADER_LENGTH {
82            return Err(Error::PacketTooShort);
83        }
84
85        let xr_header = XRHeader::unmarshal(raw_packet)?;
86        let block_length = match xr_header.block_length.checked_mul(4) {
87            Some(length) => length,
88            None => return Err(Error::InvalidBlockSize),
89        };
90        if raw_packet.remaining() < block_length as usize {
91            return Err(Error::PacketTooShort);
92        }
93
94        let bytes = raw_packet.copy_to_bytes(block_length as usize);
95
96        Ok(UnknownReportBlock { bytes })
97    }
98}