xref: /webrtc/rtcp/src/extended_report/unknown.rs (revision 5d8fe953)
1 use 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)]
6 pub struct UnknownReportBlock {
7     pub bytes: Bytes,
8 }
9 
10 impl fmt::Display for UnknownReportBlock {
fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result11     fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
12         write!(f, "{self:?}")
13     }
14 }
15 
16 impl UnknownReportBlock {
xr_header(&self) -> XRHeader17     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 
26 impl Packet for UnknownReportBlock {
header(&self) -> Header27     fn header(&self) -> Header {
28         Header::default()
29     }
30 
31     /// destination_ssrc returns an array of ssrc values that this report block refers to.
destination_ssrc(&self) -> Vec<u32>32     fn destination_ssrc(&self) -> Vec<u32> {
33         vec![]
34     }
35 
raw_size(&self) -> usize36     fn raw_size(&self) -> usize {
37         XR_HEADER_LENGTH + self.bytes.len()
38     }
39 
as_any(&self) -> &(dyn Any + Send + Sync)40     fn as_any(&self) -> &(dyn Any + Send + Sync) {
41         self
42     }
equal(&self, other: &(dyn Packet + Send + Sync)) -> bool43     fn equal(&self, other: &(dyn Packet + Send + Sync)) -> bool {
44         other
45             .as_any()
46             .downcast_ref::<UnknownReportBlock>()
47             .map_or(false, |a| self == a)
48     }
cloned(&self) -> Box<dyn Packet + Send + Sync>49     fn cloned(&self) -> Box<dyn Packet + Send + Sync> {
50         Box::new(self.clone())
51     }
52 }
53 
54 impl MarshalSize for UnknownReportBlock {
marshal_size(&self) -> usize55     fn marshal_size(&self) -> usize {
56         self.raw_size()
57     }
58 }
59 
60 impl Marshal for UnknownReportBlock {
61     /// marshal_to encodes the UnknownReportBlock in binary
marshal_to(&self, mut buf: &mut [u8]) -> Result<usize>62     fn marshal_to(&self, mut buf: &mut [u8]) -> Result<usize> {
63         if buf.remaining_mut() < self.marshal_size() {
64             return Err(error::Error::BufferTooShort.into());
65         }
66 
67         let h = self.xr_header();
68         let n = h.marshal_to(buf)?;
69         buf = &mut buf[n..];
70 
71         buf.put(self.bytes.clone());
72 
73         Ok(self.marshal_size())
74     }
75 }
76 
77 impl Unmarshal for UnknownReportBlock {
78     /// Unmarshal decodes the UnknownReportBlock from binary
unmarshal<B>(raw_packet: &mut B) -> Result<Self> where Self: Sized, B: Buf,79     fn unmarshal<B>(raw_packet: &mut B) -> Result<Self>
80     where
81         Self: Sized,
82         B: Buf,
83     {
84         if raw_packet.remaining() < XR_HEADER_LENGTH {
85             return Err(error::Error::PacketTooShort.into());
86         }
87 
88         let xr_header = XRHeader::unmarshal(raw_packet)?;
89         let block_length = xr_header.block_length * 4;
90         if raw_packet.remaining() < block_length as usize {
91             return Err(error::Error::PacketTooShort.into());
92         }
93 
94         let bytes = raw_packet.copy_to_bytes(block_length as usize);
95 
96         Ok(UnknownReportBlock { bytes })
97     }
98 }
99