use std::time::Instant;
use str0m::format::PayloadParams;
use str0m::media::MediaTime;
use crate::ids::{SfuMid, SfuPt, SfuRid};
#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash)]
#[non_exhaustive]
pub enum SfuMediaKind {
Audio,
Video,
}
impl SfuMediaKind {
#[allow(dead_code)]
pub(crate) fn from_str0m(k: str0m::media::MediaKind) -> Self {
match k {
str0m::media::MediaKind::Audio => Self::Audio,
str0m::media::MediaKind::Video => Self::Video,
}
}
#[allow(dead_code)]
pub(crate) fn to_str0m(self) -> str0m::media::MediaKind {
match self {
Self::Audio => str0m::media::MediaKind::Audio,
Self::Video => str0m::media::MediaKind::Video,
}
}
}
#[derive(Debug)]
pub struct SfuMediaPayload {
mid: SfuMid,
pt: SfuPt,
rid: Option<SfuRid>,
data: Vec<u8>,
network_time: Instant,
contiguous: bool,
time: MediaTime,
params: PayloadParams,
}
impl SfuMediaPayload {
pub fn mid(&self) -> SfuMid {
self.mid
}
pub fn pt(&self) -> SfuPt {
self.pt
}
pub fn rid(&self) -> Option<SfuRid> {
self.rid
}
pub fn data(&self) -> &[u8] {
&self.data
}
pub fn network_time(&self) -> Instant {
self.network_time
}
pub fn contiguous(&self) -> bool {
self.contiguous
}
pub(crate) fn clone_write_parts(
&self,
) -> (
str0m::media::Pt,
Instant,
MediaTime,
Option<str0m::media::Rid>,
Vec<u8>,
PayloadParams,
) {
(
self.pt.to_str0m(),
self.network_time,
self.time,
self.rid.map(|r| r.to_str0m()),
self.data.clone(),
self.params,
)
}
pub(crate) fn from_str0m(mut data: str0m::media::MediaData) -> Self {
Self {
mid: SfuMid::from_str0m(data.mid),
pt: SfuPt::from_str0m(data.pt),
rid: data.rid.map(SfuRid::from_str0m),
data: std::mem::take(&mut data.data),
network_time: data.network_time,
contiguous: data.contiguous,
time: data.time,
params: data.params,
}
}
}
#[cfg(test)]
mod tests {
use super::*;
#[test]
fn media_kind_roundtrip() {
for k in [
str0m::media::MediaKind::Audio,
str0m::media::MediaKind::Video,
] {
let wrapped = SfuMediaKind::from_str0m(k);
assert_eq!(wrapped.to_str0m(), k);
}
}
}