use broadcast_common::{Parse, Serialize};
use rtp_packet::rfc8285::{
ExtensionElements, OneByteElement, OneByteElements, OneByteId, parse_extensions,
};
use rtp_packet::{HeaderExtension, RtpPacket};
fn main() {
let elements = OneByteElements(vec![
OneByteElement {
id: OneByteId::new(1).expect("1 is in the valid 1..=14 range"),
data: &[0x2A], },
OneByteElement {
id: OneByteId::new(2).expect("2 is in the valid 1..=14 range"),
data: b"mid", },
]);
let mut ext_data = vec![0u8; elements.serialized_len()];
elements
.serialize_into(&mut ext_data)
.expect("serialize extension elements");
println!(
"encoded {} extension-data bytes (word-aligned): {}",
ext_data.len(),
ext_data
.iter()
.map(|b| format!("{b:02x}"))
.collect::<Vec<_>>()
.join(" ")
);
let pkt = RtpPacket {
marker: true,
payload_type: 96,
sequence_number: 1,
timestamp: 3600,
ssrc: 0x1234_5678,
csrc: vec![],
extension: Some(HeaderExtension {
profile_id: rtp_packet::rfc8285::ONE_BYTE_PROFILE_ID,
data: &ext_data,
}),
padding: None,
payload: b"example payload",
};
let mut wire = vec![0u8; pkt.serialized_len()];
pkt.serialize_into(&mut wire).expect("serialize RTP packet");
println!("serialized RTP packet: {} bytes", wire.len());
let reparsed = RtpPacket::parse(&wire).expect("parse RTP packet");
let ext = reparsed.extension.expect("X=1");
let decoded = parse_extensions(&ext).expect("recognized RFC 8285 profile_id");
let ExtensionElements::OneByte(one_byte) = decoded else {
panic!("expected the one-byte form (profile_id 0xBEDE)");
};
println!("decoded {} extension elements:", one_byte.elements().len());
for e in one_byte.elements() {
println!(" id={:>2} data={:02x?}", e.id.get(), e.data);
}
let mut re_ext_data = vec![0u8; one_byte.serialized_len()];
one_byte
.serialize_into(&mut re_ext_data)
.expect("serialize decoded elements");
assert_eq!(re_ext_data, ext_data);
println!(
"round trip byte-identical: OK ({} bytes)",
re_ext_data.len()
);
}