pub const PCR_CLOCK_US: u64 = 27; pub const PCR_CLOCK_MS: u64 = PCR_CLOCK_US * 1_000;
pub const PCR_SYSTEM_CLOCK: u64 = PCR_CLOCK_US * 1_000_000;
pub const PCR_NONE: u64 = (1 << 33) * 300;
pub const PCR_MAX: u64 = PCR_NONE - 1;
#[inline]
pub fn pcr_delta(last_pcr: u64, current_pcr: u64) -> u64 {
if current_pcr >= last_pcr {
current_pcr - last_pcr
} else {
current_pcr + PCR_MAX - last_pcr
}
}
#[inline]
pub fn pcr_to_stc(last_pcr: u64, bytes: u64, last_delta: u64, last_bytes: u64) -> u64 {
last_delta * bytes / last_bytes + last_pcr
}
#[inline]
pub fn pcr_jitter_ns(pcr: u64, stc: u64) -> i64 {
let mut result = {
if pcr < stc {
pcr + PCR_MAX - stc
} else {
pcr - stc
}
} as i64;
if result > PCR_SYSTEM_CLOCK as i64 {
result -= PCR_MAX as i64;
}
result * 1000 / PCR_CLOCK_US as i64
}
#[inline]
pub fn pcr_to_us(pcr: u64) -> u64 {
pcr / PCR_CLOCK_US
}
#[inline]
pub fn pcr_to_ms(pcr: u64) -> u64 {
pcr / PCR_CLOCK_MS
}
#[inline]
pub fn pcr_delta_bitrate(delta: u64, bytes: u64) -> u64 {
(bytes * 8) / pcr_to_ms(delta)
}