xref: /xiu/protocol/rtsp/src/rtp/rtcp/rtcp_sr.rs (revision b36cf5da)
1 use super::errors::RtcpError;
2 use super::rtcp_header::RtcpHeader;
3 use super::rtcp_rr::ReportBlock;
4 use crate::rtp::utils::Marshal;
5 use crate::rtp::utils::Unmarshal;
6 use byteorder::BigEndian;
7 use bytes::BytesMut;
8 use bytesio::bytes_reader::BytesReader;
9 use bytesio::bytes_writer::BytesWriter;
10 
11 // 0                   1                   2                   3
12 // 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1
13 // 			+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
14 // header 	|V=2|P|    RC   |   PT=SR=200   |             length            |
15 // 			+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
16 // 			|                         SSRC of sender                        |
17 // 			+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+
18 // sender 	|              NTP timestamp, most significant word             |
19 // info   	+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
20 // 			|             NTP timestamp, least significant word             |
21 // 			+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
22 // 			|                         RTP timestamp                         |
23 // 			+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
24 // 			|                     sender's packet count                     |
25 // 			+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
26 // 			|                      sender's octet count                     |
27 // 			+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+
28 // report 	|                 SSRC_1 (SSRC of first source)                 |
29 // block  	+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
30 // 1    	| fraction lost |       cumulative number of packets lost       |
31 // 			+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
32 // 			|           extended highest sequence number received           |
33 // 			+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
34 // 			|                      interarrival jitter                      |
35 // 			+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
36 // 			|                         last SR (LSR)                         |
37 // 			+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
38 // 			|                   delay since last SR (DLSR)                  |
39 // 			+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+
40 // report 	|                 SSRC_2 (SSRC of second source)                |
41 // block  	+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
42 // 2    	:                               ...                             :
43 // 			+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+
44 // 			|                  profile-specific extensions                  |
45 // 			+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
46 
47 #[derive(Debug, Clone, Default)]
48 pub struct RtcpSenderReport {
49     pub header: RtcpHeader,
50     pub ssrc: u32,
51     pub ntp: u64,
52     rtp_timestamp: u32,
53     sender_packet_count: u32,
54     sender_octet_count: u32,
55     pub report_blocks: Vec<ReportBlock>,
56 }
57 
58 impl Unmarshal<&mut BytesReader, Result<Self, RtcpError>> for RtcpSenderReport {
unmarshal(reader: &mut BytesReader) -> Result<Self, RtcpError> where Self: Sized,59     fn unmarshal(reader: &mut BytesReader) -> Result<Self, RtcpError>
60     where
61         Self: Sized,
62     {
63         let mut sender_report = RtcpSenderReport {
64             header: RtcpHeader::unmarshal(reader)?,
65             ssrc: reader.read_u32::<BigEndian>()?,
66             ntp: reader.read_u64::<BigEndian>()?,
67             rtp_timestamp: reader.read_u32::<BigEndian>()?,
68             sender_packet_count: reader.read_u32::<BigEndian>()?,
69             sender_octet_count: reader.read_u32::<BigEndian>()?,
70             ..Default::default()
71         };
72 
73         for _ in 0..sender_report.header.report_count {
74             let report_block = ReportBlock::unmarshal(reader)?;
75             sender_report.report_blocks.push(report_block);
76         }
77 
78         Ok(sender_report)
79     }
80 }
81 
82 impl Marshal<Result<BytesMut, RtcpError>> for RtcpSenderReport {
marshal(&self) -> Result<BytesMut, RtcpError>83     fn marshal(&self) -> Result<BytesMut, RtcpError> {
84         let mut writer = BytesWriter::default();
85 
86         let header_bytesmut = self.header.marshal()?;
87         writer.write(&header_bytesmut[..])?;
88 
89         writer.write_u32::<BigEndian>(self.ssrc)?;
90         writer.write_u64::<BigEndian>(self.ntp)?;
91         writer.write_u32::<BigEndian>(self.rtp_timestamp)?;
92         writer.write_u32::<BigEndian>(self.sender_packet_count)?;
93         writer.write_u32::<BigEndian>(self.sender_octet_count)?;
94 
95         for report_block in &self.report_blocks {
96             let data = report_block.marshal()?;
97             writer.write(&data[..])?;
98         }
99 
100         Ok(writer.extract_current_bytes())
101     }
102 }
103