use super::sample::Sample;
use super::track::TrackSpec;
#[non_exhaustive]
#[derive(Debug, Clone, Copy, PartialEq, Eq, Default)]
pub struct EventProvenance {
pub pid: Option<u16>,
pub packet_index: Option<u64>,
}
#[non_exhaustive]
#[derive(Debug, Clone, Copy, PartialEq, Eq)]
pub enum DiscontinuityKind {
Signalled,
TimelineReanchored,
BudgetExceeded {
bytes: u64,
},
}
impl DiscontinuityKind {
pub fn name(&self) -> &'static str {
match self {
DiscontinuityKind::Signalled => "signalled",
DiscontinuityKind::TimelineReanchored => "timeline reanchored",
DiscontinuityKind::BudgetExceeded { .. } => "budget exceeded",
}
}
}
broadcast_common::impl_spec_display!(DiscontinuityKind);
#[non_exhaustive]
#[derive(Debug, Clone, Copy, PartialEq, Eq)]
pub enum AbandonReason {
ConfigUnrecoverable,
BudgetExceeded,
}
impl AbandonReason {
pub fn name(&self) -> &'static str {
match self {
AbandonReason::ConfigUnrecoverable => "config unrecoverable",
AbandonReason::BudgetExceeded => "budget exceeded",
}
}
}
broadcast_common::impl_spec_display!(AbandonReason);
#[non_exhaustive]
#[derive(Debug, Clone, Copy, PartialEq, Eq)]
pub enum InputDegradation {
TransportError,
ContinuityGap {
expected: u8,
got: u8,
},
}
impl InputDegradation {
pub fn name(&self) -> &'static str {
match self {
InputDegradation::TransportError => "transport error",
InputDegradation::ContinuityGap { .. } => "continuity gap",
}
}
}
broadcast_common::impl_spec_display!(InputDegradation);
#[non_exhaustive]
#[derive(Debug, Clone)]
pub enum DemuxEvent {
TrackAdded(TrackSpec),
TrackUpdated(TrackSpec),
#[non_exhaustive]
TrackRemoved {
track_id: u32,
provenance: EventProvenance,
},
#[non_exhaustive]
TrackAbandoned {
track_id: Option<u32>,
reason: AbandonReason,
provenance: EventProvenance,
},
#[non_exhaustive]
Sample {
track_id: u32,
sample: Sample,
},
#[non_exhaustive]
ClockReference {
ticks: u64,
clock_hz: u32,
discontinuous: bool,
provenance: EventProvenance,
},
#[non_exhaustive]
Discontinuity {
track: Option<u32>,
kind: DiscontinuityKind,
provenance: EventProvenance,
},
#[non_exhaustive]
InputDegraded {
track: Option<u32>,
kind: InputDegradation,
provenance: EventProvenance,
},
#[non_exhaustive]
TracksResolved {
generation: u32,
},
}
impl DemuxEvent {
pub fn clock_reference(
ticks: u64,
clock_hz: u32,
discontinuous: bool,
provenance: EventProvenance,
) -> Self {
DemuxEvent::ClockReference {
ticks,
clock_hz,
discontinuous,
provenance,
}
}
pub fn discontinuity(
track: Option<u32>,
kind: DiscontinuityKind,
provenance: EventProvenance,
) -> Self {
DemuxEvent::Discontinuity {
track,
kind,
provenance,
}
}
pub fn track_removed(track_id: u32, provenance: EventProvenance) -> Self {
DemuxEvent::TrackRemoved {
track_id,
provenance,
}
}
pub fn track_abandoned(
track_id: Option<u32>,
reason: AbandonReason,
provenance: EventProvenance,
) -> Self {
DemuxEvent::TrackAbandoned {
track_id,
reason,
provenance,
}
}
pub fn sample(track_id: u32, sample: Sample) -> Self {
DemuxEvent::Sample { track_id, sample }
}
pub fn input_degraded(
track: Option<u32>,
kind: InputDegradation,
provenance: EventProvenance,
) -> Self {
DemuxEvent::InputDegraded {
track,
kind,
provenance,
}
}
pub fn tracks_resolved(generation: u32) -> Self {
DemuxEvent::TracksResolved { generation }
}
}