rtc_rtcp/extended_report/
rrt.rs1use super::*;
2
3const RRT_REPORT_BLOCK_LENGTH: u16 = 8;
4
5#[derive(Debug, Default, PartialEq, Eq, Clone)]
18pub struct ReceiverReferenceTimeReportBlock {
19 pub ntp_timestamp: u64,
21}
22
23impl fmt::Display for ReceiverReferenceTimeReportBlock {
24 fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
25 write!(f, "{self:?}")
26 }
27}
28
29impl ReceiverReferenceTimeReportBlock {
30 pub fn xr_header(&self) -> XRHeader {
32 XRHeader {
33 block_type: BlockType::ReceiverReferenceTime,
34 type_specific: 0,
35 block_length: (self.raw_size() / 4 - 1) as u16,
36 }
37 }
38}
39
40impl Packet for ReceiverReferenceTimeReportBlock {
41 fn header(&self) -> Header {
42 Header::default()
43 }
44
45 fn destination_ssrc(&self) -> Vec<u32> {
47 vec![]
48 }
49
50 fn raw_size(&self) -> usize {
51 XR_HEADER_LENGTH + RRT_REPORT_BLOCK_LENGTH as usize
52 }
53
54 fn as_any(&self) -> &dyn Any {
55 self
56 }
57 fn equal(&self, other: &dyn Packet) -> bool {
58 other
59 .as_any()
60 .downcast_ref::<ReceiverReferenceTimeReportBlock>()
61 == Some(self)
62 }
63 fn cloned(&self) -> Box<dyn Packet> {
64 Box::new(self.clone())
65 }
66}
67
68impl MarshalSize for ReceiverReferenceTimeReportBlock {
69 fn marshal_size(&self) -> usize {
70 self.raw_size()
71 }
72}
73
74impl Marshal for ReceiverReferenceTimeReportBlock {
75 fn marshal_to(&self, mut buf: &mut [u8]) -> Result<usize> {
77 if buf.remaining_mut() < self.marshal_size() {
78 return Err(Error::BufferTooShort);
79 }
80
81 let h = self.xr_header();
82 let n = h.marshal_to(buf)?;
83 buf = &mut buf[n..];
84
85 buf.put_u64(self.ntp_timestamp);
86
87 Ok(self.marshal_size())
88 }
89}
90
91impl Unmarshal for ReceiverReferenceTimeReportBlock {
92 fn unmarshal<B>(raw_packet: &mut B) -> Result<Self>
94 where
95 Self: Sized,
96 B: Buf,
97 {
98 if raw_packet.remaining() < XR_HEADER_LENGTH {
99 return Err(Error::PacketTooShort);
100 }
101
102 let xr_header = XRHeader::unmarshal(raw_packet)?;
103 let block_length = match xr_header.block_length.checked_mul(4) {
104 Some(length) => length,
105 None => return Err(Error::InvalidBlockSize),
106 };
107 if block_length != RRT_REPORT_BLOCK_LENGTH || raw_packet.remaining() < block_length as usize
108 {
109 return Err(Error::PacketTooShort);
110 }
111
112 let ntp_timestamp = raw_packet.get_u64();
113
114 Ok(ReceiverReferenceTimeReportBlock { ntp_timestamp })
115 }
116}