const PT_PSFB: u8 = 206;
pub fn build_pli(sender_ssrc: u32, media_ssrc: u32) -> Vec<u8> {
let mut p = Vec::with_capacity(12);
p.push(0x80 | 1);
p.push(PT_PSFB);
p.extend_from_slice(&2u16.to_be_bytes());
p.extend_from_slice(&sender_ssrc.to_be_bytes());
p.extend_from_slice(&media_ssrc.to_be_bytes());
p
}
pub fn build_fir(sender_ssrc: u32, media_ssrc: u32, seq_nr: u8) -> Vec<u8> {
let mut p = Vec::with_capacity(20);
p.push(0x80 | 4);
p.push(PT_PSFB);
p.extend_from_slice(&4u16.to_be_bytes());
p.extend_from_slice(&sender_ssrc.to_be_bytes());
p.extend_from_slice(&0u32.to_be_bytes()); p.extend_from_slice(&media_ssrc.to_be_bytes()); p.push(seq_nr);
p.extend_from_slice(&[0, 0, 0]); p
}
#[cfg(test)]
mod tests {
use super::*;
#[test]
fn pli_has_correct_header_and_ssrcs() {
let p = build_pli(0x1111_1111, 0x2222_2222);
assert_eq!(p.len(), 12);
assert_eq!(p[0], 0x81); assert_eq!(p[1], 206); assert_eq!(u16::from_be_bytes([p[2], p[3]]), 2); assert_eq!(&p[4..8], &0x1111_1111u32.to_be_bytes());
assert_eq!(&p[8..12], &0x2222_2222u32.to_be_bytes());
}
#[test]
fn fir_carries_seq_and_target_ssrc() {
let p = build_fir(1, 0xDEAD_BEEF, 7);
assert_eq!(p.len(), 20);
assert_eq!(p[0], 0x84); assert_eq!(&p[12..16], &0xDEAD_BEEFu32.to_be_bytes());
assert_eq!(p[16], 7); }
}