use std::time::{Duration, Instant};
use crate::rtp_::MidRid;
use crate::util::not_happening;
#[derive(Debug, Clone, Copy, PartialEq, Eq)]
pub struct QueueSnapshot {
pub created_at: Instant,
pub size: usize,
pub packet_count: u32,
pub total_queue_time_origin: Duration,
pub last_emitted: Option<Instant>,
pub first_unsent: Option<Instant>,
pub priority: QueuePriority,
}
#[derive(Default, Debug, Copy, Clone, PartialEq, Eq, PartialOrd, Ord)]
pub enum QueuePriority {
Media = 0,
Padding = 1,
#[default]
Empty = 2,
}
impl QueueSnapshot {
pub fn update_priority(&mut self, priority: QueuePriority) {
if self.packet_count > 0 {
self.priority = priority;
} else {
self.priority = QueuePriority::Empty;
}
}
}
impl Default for QueueSnapshot {
fn default() -> Self {
Self {
created_at: not_happening(),
size: Default::default(),
packet_count: Default::default(),
total_queue_time_origin: Default::default(),
last_emitted: Default::default(),
first_unsent: Default::default(),
priority: QueuePriority::default(),
}
}
}
#[derive(Debug, Clone, Copy)]
pub struct QueueState {
pub midrid: MidRid,
pub unpaced: bool,
pub use_for_padding: bool,
pub snapshot: QueueSnapshot,
}
#[derive(Debug, Clone, Copy)]
pub struct PaddingRequest {
pub midrid: MidRid,
pub padding: usize,
}
impl QueueSnapshot {
pub fn merge(&mut self, other: &Self) {
self.created_at = self.created_at.min(other.created_at);
self.size += other.size;
self.packet_count += other.packet_count;
self.total_queue_time_origin += other.total_queue_time_origin;
self.last_emitted = self.last_emitted.max(other.last_emitted);
self.first_unsent = match (self.first_unsent, other.first_unsent) {
(None, None) => None,
(None, Some(v2)) => Some(v2),
(Some(v1), None) => Some(v1),
(Some(v1), Some(v2)) => Some(v1.min(v2)),
};
self.priority = self.priority.min(other.priority);
}
pub fn total_queue_time(&self, now: Instant) -> Duration {
self.total_queue_time_origin + self.packet_count * (now - self.created_at)
}
}