use crate::wrap::{Wrap16, Wrap32};
use alloc::vec::Vec;
use pnet_macros::packet;
use pnet_macros_support::{
packet::PrimitiveValues,
types::{u1, u16be, u2, u32be, u4, u7},
};
#[packet]
#[derive(Eq, PartialEq)]
pub struct Rtp {
pub version: u2,
pub padding: u1,
pub extension: u1,
pub csrc_count: u4,
pub marker: u1,
#[construct_with(u7)]
pub payload_type: RtpType,
#[construct_with(u16be)]
pub sequence: Wrap16,
#[construct_with(u32be)]
pub timestamp: Wrap32,
pub ssrc: u32be,
#[length = "csrc_count"]
pub csrc_list: Vec<u32be>,
#[payload]
pub payload: Vec<u8>,
}
#[packet]
#[derive(Eq, PartialEq)]
pub struct RtpExtension {
pub info: u16be,
pub length: u16be,
#[length = "4 * length"]
pub ext_data: Vec<u8>,
#[payload]
pub payload: Vec<u8>,
}
#[derive(Copy, Clone, Debug, Eq, PartialEq)]
#[non_exhaustive]
pub enum RtpType {
Pcmu,
Gsm,
G723,
Dvi4(u8),
Lpc,
Pcma,
G722,
L16Stereo,
L16Mono,
Qcelp,
Cn,
Mpa,
G728,
G729,
CelB,
Jpeg,
Nv,
H261,
Mpv,
Mp2t,
H263,
Dynamic(u8),
Reserved(u8),
Unassigned(u8),
Illegal(u8),
}
impl RtpType {
#[must_use]
pub fn new(val: u7) -> Self {
match val {
0 => Self::Pcmu,
3 => Self::Gsm,
4 => Self::G723,
5 | 6 | 16 | 17 => Self::Dvi4(val),
7 => Self::Lpc,
8 => Self::Pcma,
9 => Self::G722,
10 => Self::L16Stereo,
11 => Self::L16Mono,
12 => Self::Qcelp,
13 => Self::Cn,
14 => Self::Mpa,
15 => Self::G728,
18 => Self::G729,
25 => Self::CelB,
26 => Self::Jpeg,
28 => Self::Nv,
31 => Self::H261,
32 => Self::Mpv,
33 => Self::Mp2t,
34 => Self::H263,
1..=2 | 19 | 72..=76 => Self::Reserved(val),
96..=127 => Self::Dynamic(val),
128..=255 => Self::Illegal(val),
_ => Self::Unassigned(val),
}
}
}
impl PrimitiveValues for RtpType {
type T = (u7,);
fn to_primitive_values(&self) -> Self::T {
match self {
Self::Pcmu => (0,),
Self::Gsm => (3,),
Self::G723 => (4,),
Self::Lpc => (7,),
Self::Pcma => (8,),
Self::G722 => (9,),
Self::L16Stereo => (10,),
Self::L16Mono => (11,),
Self::Qcelp => (12,),
Self::Cn => (13,),
Self::Mpa => (14,),
Self::G728 => (15,),
Self::G729 => (18,),
Self::CelB => (25,),
Self::Jpeg => (26,),
Self::Nv => (28,),
Self::H261 => (31,),
Self::Mpv => (32,),
Self::Mp2t => (33,),
Self::H263 => (34,),
Self::Dvi4(val)
| Self::Dynamic(val)
| Self::Unassigned(val)
| Self::Reserved(val)
| Self::Illegal(val) => (*val,),
}
}
}