use bytes::Bytes;
use crate::RtpCsrc;
#[derive(Debug, Clone, Copy, PartialEq, Eq)]
pub enum MediaFrameType {
Audio,
Video,
Data,
}
#[derive(Debug, Clone)]
pub struct MediaFrame {
pub frame_type: MediaFrameType,
pub data: Bytes,
pub timestamp: u32,
pub sequence: u16,
pub marker: bool,
pub payload_type: u8,
pub ssrc: u32,
pub csrcs: Vec<RtpCsrc>,
}
impl MediaFrame {
pub fn new(
frame_type: MediaFrameType,
data: impl Into<Bytes>,
timestamp: u32,
sequence: u16,
marker: bool,
payload_type: u8,
ssrc: u32,
) -> Self {
Self {
frame_type,
data: data.into(),
timestamp,
sequence,
marker,
payload_type,
ssrc,
csrcs: Vec::new(),
}
}
pub fn with_csrcs(
frame_type: MediaFrameType,
data: impl Into<Bytes>,
timestamp: u32,
sequence: u16,
marker: bool,
payload_type: u8,
ssrc: u32,
csrcs: Vec<RtpCsrc>,
) -> Self {
Self {
frame_type,
data: data.into(),
timestamp,
sequence,
marker,
payload_type,
ssrc,
csrcs,
}
}
}
#[cfg(test)]
mod tests {
use super::*;
#[test]
fn new_preserves_bytes_payload_allocation() {
let payload = Bytes::from_static(b"payload");
let ptr = payload.as_ptr();
let frame = MediaFrame::new(MediaFrameType::Audio, payload.clone(), 10, 20, false, 0, 30);
assert_eq!(frame.data.as_ptr(), ptr);
assert_eq!(frame.data, payload);
}
}