rtc_rtcp/extended_report/
unknown.rs1use super::*;
2
3#[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 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 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 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}