rtp_parse/rtcp/
rtcp_sender_info.rs

1use anyhow::{Context, Result};
2use bit_cursor::{
3    bit_read::BitRead, bit_read_exts::BitReadExts, bit_write::BitWrite,
4    bit_write_exts::BitWriteExts, byte_order::NetworkOrder,
5};
6
7/// https://datatracker.ietf.org/doc/html/rfc3550#section-6.4.1
8///        +=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+
9/// sender |              NTP timestamp, most significant word             |
10/// info   +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
11///        |             NTP timestamp, least significant word             |
12///        +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
13///        |                         RTP timestamp                         |
14///        +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
15///        |                     sender's packet count                     |
16///        +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
17///        |                      sender's octet count                     |
18///        +=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+
19#[derive(Debug)]
20pub struct RtcpSenderInfo {
21    pub ntp_timestamp_msw: u32,
22    pub ntp_timestamp_lsw: u32,
23    pub rtp_timestamp: u32,
24    pub sender_packet_count: u32,
25    pub sender_octet_count: u32,
26}
27
28pub fn read_rtcp_sender_info<R: BitRead>(buf: &mut R) -> Result<RtcpSenderInfo> {
29    Ok(RtcpSenderInfo {
30        ntp_timestamp_msw: buf
31            .read_u32::<NetworkOrder>()
32            .context("ntp_timestamp_msw")?,
33        ntp_timestamp_lsw: buf
34            .read_u32::<NetworkOrder>()
35            .context("ntp_timestamp_lsw")?,
36        rtp_timestamp: buf.read_u32::<NetworkOrder>().context("rtp_timestamp")?,
37        sender_packet_count: buf
38            .read_u32::<NetworkOrder>()
39            .context("sender_packet_count")?,
40        sender_octet_count: buf
41            .read_u32::<NetworkOrder>()
42            .context("sender_octet_count")?,
43    })
44}
45
46pub fn write_rtcp_sender_info<W: BitWrite>(
47    buf: &mut W,
48    rtcp_sender_info: &RtcpSenderInfo,
49) -> Result<()> {
50    buf.write_u32::<NetworkOrder>(rtcp_sender_info.ntp_timestamp_msw)
51        .context("ntp_timestamp_msw")?;
52    buf.write_u32::<NetworkOrder>(rtcp_sender_info.ntp_timestamp_lsw)
53        .context("ntp_timestamp_lsw")?;
54    buf.write_u32::<NetworkOrder>(rtcp_sender_info.rtp_timestamp)
55        .context("rtp_timestamp")?;
56    buf.write_u32::<NetworkOrder>(rtcp_sender_info.sender_packet_count)
57        .context("sender_packet_count")?;
58    buf.write_u32::<NetworkOrder>(rtcp_sender_info.sender_octet_count)
59        .context("sender_octet_count")?;
60
61    Ok(())
62}