rtp_parse/rtcp/
rtcp_fb_header.rs

1use anyhow::{Context, Result};
2use bit_cursor::{
3    bit_read_exts::BitReadExts, bit_write_exts::BitWriteExts, byte_order::NetworkOrder,
4};
5
6use crate::{PacketBuffer, PacketBufferMut};
7
8/// https://datatracker.ietf.org/doc/html/rfc4585#section-6.1
9/// +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
10/// |                  SSRC of packet sender                        |
11/// +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
12/// |                  SSRC of media source                         |
13/// +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
14#[derive(Debug)]
15pub struct RtcpFbHeader {
16    pub sender_ssrc: u32,
17    pub media_source_ssrc: u32,
18}
19
20pub fn read_rtcp_fb_header<B: PacketBuffer>(buf: &mut B) -> Result<RtcpFbHeader> {
21    let sender_ssrc = buf.read_u32::<NetworkOrder>().context("sender ssrc")?;
22    let media_source_ssrc = buf.read_u32::<NetworkOrder>().context("media ssrc")?;
23
24    Ok(RtcpFbHeader {
25        sender_ssrc,
26        media_source_ssrc,
27    })
28}
29
30pub fn write_rtcp_fb_header<B: PacketBufferMut>(
31    buf: &mut B,
32    fb_header: &RtcpFbHeader,
33) -> Result<()> {
34    buf.write_u32::<NetworkOrder>(fb_header.sender_ssrc)
35        .context("sender ssrc")?;
36    buf.write_u32::<NetworkOrder>(fb_header.media_source_ssrc)
37        .context("media_source_ssrc")?;
38
39    Ok(())
40}