use crate::{
rtcp::{MutableRtcpPacket, RtcpPacket, RtcpType},
rtp::{MutableRtpPacket, RtpPacket, RtpType},
};
#[derive(Debug)]
pub enum Demuxed<'a> {
Rtp(RtpPacket<'a>),
Rtcp(RtcpPacket<'a>),
FailedParse(DemuxType),
TooSmall,
}
#[derive(Debug)]
pub enum DemuxedMut<'a> {
Rtp(MutableRtpPacket<'a>),
Rtcp(MutableRtcpPacket<'a>),
FailedParse(DemuxType),
TooSmall,
}
#[must_use]
pub fn demux(pkt: &[u8]) -> Demuxed {
if pkt.len() < 2 {
Demuxed::TooSmall
} else {
let pt = classify_pt(pkt);
match pt {
DemuxType::Rtp(_) => RtpPacket::new(pkt).map(Demuxed::Rtp),
DemuxType::Rtcp(rt) => rt.decode(pkt).map(Demuxed::Rtcp),
}
.unwrap_or(Demuxed::FailedParse(pt))
}
}
pub fn demux_mut(pkt: &mut [u8]) -> DemuxedMut {
if pkt.len() < 2 {
DemuxedMut::TooSmall
} else {
let pt = classify_pt(pkt);
match pt {
DemuxType::Rtp(_) => MutableRtpPacket::new(pkt).map(DemuxedMut::Rtp),
DemuxType::Rtcp(rt) => rt.decode_mut(pkt).map(DemuxedMut::Rtcp),
}
.unwrap_or(DemuxedMut::FailedParse(pt))
}
}
#[derive(Copy, Clone, Debug, Eq, PartialEq)]
pub enum DemuxType {
Rtp(RtpType),
Rtcp(RtcpType),
}
#[inline]
fn classify_pt(pkt: &[u8]) -> DemuxType {
match RtcpType::new(pkt[1]) {
RtcpType::Reserved(a) | RtcpType::Unassigned(a) =>
DemuxType::Rtp(RtpType::new(a & 0b0111_1111)),
a => DemuxType::Rtcp(a),
}
}