Skip to main content

ezk_rtp/
lib.rs

1use bytes::Bytes;
2use ezk::{Frame, MediaType};
3use std::str::Utf8Error;
4
5mod depacketizer;
6mod media_type;
7mod ntp_timestamp;
8mod packetizer;
9mod rtp_packet;
10mod session;
11
12pub use depacketizer::DePacketizer;
13pub use media_type::{Rtp, RtpConfig, RtpConfigRange};
14pub use ntp_timestamp::NtpTimestamp;
15pub use packetizer::Packetizer;
16pub use rtp_packet::*;
17pub use session::Session;
18
19pub use rtcp_types;
20pub use rtp_types;
21
22#[derive(Debug)]
23pub enum DecodeError {
24    Incomplete,
25    InvalidVersion,
26    InvalidAlignment,
27
28    UnknownPayloadType(u8),
29    UnknownFmt(u8),
30    UnknownTag(u8),
31
32    Utf8(Utf8Error),
33}
34
35impl From<Utf8Error> for DecodeError {
36    fn from(value: Utf8Error) -> Self {
37        Self::Utf8(value)
38    }
39}
40
41/// A media type that can be packed into RTP packets
42///
43/// Usually encoded audio or video
44pub trait Payloadable: Sized + MediaType {
45    type Payloader: Payloader<Self>;
46    type DePayloader: DePayloader<Self>;
47
48    /// Statically assigned payload type
49    const STATIC_PT: Option<u8>;
50
51    /// Create the payload with the given configuration
52    fn make_payloader(config: Self::Config) -> Self::Payloader;
53
54    /// Create a depayloader and negotiate
55    fn make_depayloader(available: Vec<Self::ConfigRange>) -> (Self::Config, Self::DePayloader);
56}
57
58/// Create RTP payload from media data
59pub trait Payloader<M: MediaType>: Send + 'static {
60    /// Payload a given frame
61    fn payload(&mut self, frame: Frame<M>, max_size: usize) -> impl Iterator<Item = Bytes> + '_;
62}
63
64pub trait DePayloader<M: MediaType>: Send + 'static {
65    fn depayload(&mut self, payload: &[u8]) -> M::FrameData;
66}