rtp_parse/rtcp/rtcp_rr.rs
1use parsely_rs::*;
2
3use super::{rtcp_header::RtcpHeader, rtcp_report_block::RtcpReportBlock};
4
5/// https://datatracker.ietf.org/doc/html/rfc3550#section-6.4.2
6/// 0 1 2 3
7/// 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
8/// +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
9/// header |V=2|P| RC | PT=RR=201 | length |
10/// +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
11/// | SSRC of packet sender |
12/// +=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+
13/// report | SSRC_1 (SSRC of first source) |
14/// block +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
15/// 1 | fraction lost | cumulative number of packets lost |
16/// +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
17/// | extended highest sequence number received |
18/// +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
19/// | interarrival jitter |
20/// +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
21/// | last SR (LSR) |
22/// +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
23/// | delay since last SR (DLSR) |
24/// +=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+
25/// report | SSRC_2 (SSRC of second source) |
26/// block +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
27/// 2 : ... :
28/// +=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+
29/// | profile-specific extensions |
30/// +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
31#[derive(Debug, ParselyRead, ParselyWrite)]
32#[parsely_read(required_context("rtcp_header: RtcpHeader"))]
33pub struct RtcpRrPacket {
34 #[parsely_read(assign_from = "rtcp_header")]
35 #[parsely_write(sync_with(
36 "self.payload_length_bytes()",
37 "self.report_blocks.len().try_into()"
38 ))]
39 pub header: RtcpHeader,
40 pub sender_ssrc: u32,
41 #[parsely_read(count = "header.report_count.into()")]
42 pub report_blocks: Vec<RtcpReportBlock>,
43}
44
45impl RtcpRrPacket {
46 pub const PT: u8 = 201;
47
48 pub fn payload_length_bytes(&self) -> u16 {
49 (self.report_blocks.len() * RtcpReportBlock::SIZE_BYTES) as u16
50 }
51}