use crate::{CoreError, SourceId};
#[derive(Clone, Copy, Debug, Eq, PartialEq)]
pub struct MediaTime {
ticks: i64,
timescale: u32,
}
impl Default for MediaTime {
fn default() -> Self {
Self {
ticks: 0,
timescale: 1,
}
}
}
impl MediaTime {
pub const fn new(ticks: i64, timescale: u32) -> Result<Self, CoreError> {
if timescale == 0 {
return Err(CoreError::InvalidMediaTime);
}
Ok(Self { ticks, timescale })
}
#[must_use]
pub const fn ticks(self) -> i64 {
self.ticks
}
#[must_use]
pub const fn timescale(self) -> u32 {
self.timescale
}
#[must_use]
pub fn as_nanos(self) -> i64 {
let ticks = i128::from(self.ticks);
let scale = i128::from(self.timescale);
let nanos = ticks
.saturating_mul(1_000_000_000)
.checked_div(scale)
.unwrap_or(0);
i64::try_from(nanos).unwrap_or(if nanos.is_positive() {
i64::MAX
} else {
i64::MIN
})
}
#[must_use]
pub fn duration_since_ns(self, earlier: Self) -> i64 {
self.as_nanos().saturating_sub(earlier.as_nanos())
}
}
#[derive(Clone, Copy, Debug, PartialEq)]
pub struct FrameStamp {
pub source_id: SourceId,
pub frame_index: u64,
pub pts: MediaTime,
pub wall_clock_ns: Option<i64>,
}
impl FrameStamp {
#[must_use]
pub fn new(
source_id: SourceId,
frame_index: u64,
pts: MediaTime,
wall_clock_ns: Option<i64>,
) -> Self {
Self {
source_id,
frame_index,
pts,
wall_clock_ns,
}
}
}