use alloc::vec::Vec;
use bytes::Bytes;
use core::time::Duration;
use std::time::Instant;
#[derive(Debug, Clone, PartialEq, Eq)]
pub struct MediaPacket {
pub payload: Bytes,
pub fin: bool,
pub counts_as_video: bool,
}
impl MediaPacket {
#[must_use]
pub fn video(payload: Bytes, fin: bool) -> Self {
Self {
payload,
fin,
counts_as_video: true,
}
}
#[must_use]
pub fn non_video(payload: Bytes, fin: bool) -> Self {
Self {
payload,
fin,
counts_as_video: false,
}
}
}
#[must_use]
pub fn chunk_payload(data: impl AsRef<[u8]>, chunk_size: usize) -> Vec<MediaPacket> {
let data = data.as_ref();
if data.is_empty() || chunk_size == 0 {
return Vec::new();
}
let chunks: Vec<_> = data.chunks(chunk_size).collect();
let last = chunks.len().saturating_sub(1);
chunks
.into_iter()
.enumerate()
.map(|(index, chunk)| MediaPacket::video(Bytes::copy_from_slice(chunk), index == last))
.collect()
}
#[derive(Debug, Clone, PartialEq, Eq)]
pub struct EncodedFrame {
pub id: u64,
pub captured_at: Instant,
pub target_bitrate: u64,
pub packets: Vec<MediaPacket>,
}
#[derive(Debug, Clone, PartialEq, Eq)]
pub(crate) struct PacketMeta {
pub seq: u64,
pub frame_id: u64,
pub is_filler: bool,
pub len: usize,
pub queued_at: Instant,
pub at_head_at: Instant,
pub fin: bool,
pub counts_as_video: bool,
}
#[derive(Debug, Clone, PartialEq, Eq)]
pub struct SentPacket {
pub seq: u64,
pub len: usize,
pub sent_at: Instant,
}
#[derive(Debug, Clone, PartialEq, Eq)]
pub struct AckInfo {
pub seq: u64,
pub len: usize,
pub acked_at: Instant,
}
#[derive(Debug, Clone, PartialEq, Eq)]
pub struct LostPacket {
pub seq: u64,
pub len: usize,
pub lost_at: Instant,
}
#[derive(Debug, Clone, Copy, PartialEq)]
pub struct EncoderAdvice {
pub target_bitrate_bps: u64,
pub pause: bool,
pub alpha: f64,
}
impl EncoderAdvice {
pub const INITIAL: Self = Self {
target_bitrate_bps: 0,
pause: false,
alpha: 1.0,
};
}
#[derive(Debug, Clone, Copy, PartialEq, Eq)]
#[must_use]
pub enum CaptureAdvice {
Encode,
Hold,
EncodeHeld {
captured_at: Instant,
},
SkipHeld {
captured_at: Instant,
},
}
#[derive(Debug, Clone, PartialEq, Eq)]
pub enum TransmitAction {
SendPacket {
payload: Bytes,
},
SendFiller {
payload: Bytes,
},
WaitUntil(Instant),
Idle,
}
#[derive(Debug, Clone)]
pub enum VidaptiveInput {
PacketsEnqueued(EncodedFrame),
Ack(AckInfo),
Loss(LostPacket),
Tick,
}
#[derive(Debug, Clone, PartialEq)]
pub struct VidaptiveOutput {
pub transmit: Option<TransmitAction>,
pub encoder: EncoderAdvice,
}
#[derive(Debug, Clone, Copy, PartialEq)]
pub(crate) struct FrameServiceSample {
pub service_time: Duration,
pub target_bitrate_bps: u64,
pub cc_rate_bytes_per_sec: u64,
pub at: Instant,
}