xref: /xiu/protocol/rtsp/src/rtp/rtcp/rtcp_rr.rs (revision b36cf5da)
1 use super::errors::RtcpError;
2 use super::rtcp_header::RtcpHeader;
3 use crate::rtp::utils::Marshal;
4 use crate::rtp::utils::Unmarshal;
5 use byteorder::BigEndian;
6 use bytes::BytesMut;
7 use bytesio::bytes_reader::BytesReader;
8 use bytesio::bytes_writer::BytesWriter;
9 
10 #[derive(Debug, Clone, Default)]
11 pub struct ReportBlock {
12     pub ssrc: u32,
13     pub fraction_lost: u8,
14     pub cumutlative_num_of_packets_lost: u32,
15     pub extended_highest_seq_number: u32,
16     pub jitter: u32,
17     pub lsr: u32,
18     pub dlsr: u32,
19 }
20 
21 impl Unmarshal<&mut BytesReader, Result<Self, RtcpError>> for ReportBlock {
unmarshal(reader: &mut BytesReader) -> Result<Self, RtcpError> where Self: Sized,22     fn unmarshal(reader: &mut BytesReader) -> Result<Self, RtcpError>
23     where
24         Self: Sized,
25     {
26         Ok(ReportBlock {
27             ssrc: reader.read_u32::<BigEndian>()?,
28             fraction_lost: reader.read_u8()?,
29             cumutlative_num_of_packets_lost: reader.read_u24::<BigEndian>()?,
30             extended_highest_seq_number: reader.read_u32::<BigEndian>()?,
31             jitter: reader.read_u32::<BigEndian>()?,
32             lsr: reader.read_u32::<BigEndian>()?,
33             dlsr: reader.read_u32::<BigEndian>()?,
34         })
35     }
36 }
37 
38 impl Marshal<Result<BytesMut, RtcpError>> for ReportBlock {
marshal(&self) -> Result<BytesMut, RtcpError>39     fn marshal(&self) -> Result<BytesMut, RtcpError> {
40         let mut writer = BytesWriter::default();
41 
42         writer.write_u32::<BigEndian>(self.ssrc)?;
43         writer.write_u8(self.fraction_lost)?;
44         writer.write_u24::<BigEndian>(self.cumutlative_num_of_packets_lost)?;
45         writer.write_u32::<BigEndian>(self.extended_highest_seq_number)?;
46         writer.write_u32::<BigEndian>(self.jitter)?;
47         writer.write_u32::<BigEndian>(self.lsr)?;
48         writer.write_u32::<BigEndian>(self.dlsr)?;
49 
50         Ok(writer.extract_current_bytes())
51     }
52 }
53 
54 #[derive(Debug, Clone, Default)]
55 pub struct RtcpReceiverReport {
56     pub header: RtcpHeader,
57     pub ssrc: u32,
58     pub report_blocks: Vec<ReportBlock>,
59 }
60 
61 impl Unmarshal<BytesMut, Result<Self, RtcpError>> for RtcpReceiverReport {
unmarshal(data: BytesMut) -> Result<Self, RtcpError> where Self: Sized,62     fn unmarshal(data: BytesMut) -> Result<Self, RtcpError>
63     where
64         Self: Sized,
65     {
66         let mut reader = BytesReader::new(data);
67 
68         let mut receiver_report = RtcpReceiverReport {
69             header: RtcpHeader::unmarshal(&mut reader)?,
70             ssrc: reader.read_u32::<BigEndian>()?,
71             ..Default::default()
72         };
73 
74         for _ in 0..receiver_report.header.report_count {
75             let report_block = ReportBlock::unmarshal(&mut reader)?;
76             receiver_report.report_blocks.push(report_block);
77         }
78 
79         Ok(receiver_report)
80     }
81 }
82 
83 impl Marshal<Result<BytesMut, RtcpError>> for RtcpReceiverReport {
marshal(&self) -> Result<BytesMut, RtcpError>84     fn marshal(&self) -> Result<BytesMut, RtcpError> {
85         let mut writer = BytesWriter::default();
86 
87         let header_bytesmut = self.header.marshal()?;
88         writer.write(&header_bytesmut[..])?;
89 
90         writer.write_u32::<BigEndian>(self.ssrc)?;
91         for report_block in &self.report_blocks {
92             let data = report_block.marshal()?;
93             writer.write(&data[..])?;
94         }
95 
96         Ok(writer.extract_current_bytes())
97     }
98 }
99