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}