use serde::{Deserialize, Serialize};
#[derive(Debug, Clone, Copy, PartialEq, Eq, Serialize, Deserialize)]
pub enum FrameType {
KeyFrame,
DeltaFrame,
}
#[derive(Debug, Clone, Copy, PartialEq, Eq, Serialize, Deserialize, Default)]
pub enum FrameCodec {
#[default]
Unspecified,
Vp8,
Vp9Profile0Level10Bit8,
}
impl FrameCodec {
pub fn as_webcodecs_str(&self) -> Option<&'static str> {
match self {
FrameCodec::Unspecified => None,
FrameCodec::Vp8 => Some("vp8"),
FrameCodec::Vp9Profile0Level10Bit8 => Some("vp09.00.10.08"),
}
}
pub fn is_known(&self) -> bool {
!matches!(self, FrameCodec::Unspecified)
}
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct VideoFrame {
pub sequence_number: u64,
pub frame_type: FrameType,
#[serde(default)]
pub codec: FrameCodec,
pub data: Vec<u8>,
pub timestamp: f64,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct FrameBuffer {
pub frame: VideoFrame,
pub arrival_time_ms: u128,
}
impl FrameBuffer {
pub fn new(frame: VideoFrame, arrival_time_ms: u128) -> Self {
Self {
frame,
arrival_time_ms,
}
}
pub fn sequence_number(&self) -> u64 {
self.frame.sequence_number
}
pub fn is_keyframe(&self) -> bool {
self.frame.frame_type == FrameType::KeyFrame
}
}