use std::time::{Duration, SystemTime, UNIX_EPOCH};
pub fn rtp_timestamp_to_duration(timestamp: u32, clock_rate: u32) -> Duration {
if clock_rate == 0 {
return Duration::from_secs(0);
}
let seconds = timestamp / clock_rate;
let remainder = timestamp % clock_rate;
let nanos = ((remainder as u64) * 1_000_000_000) / (clock_rate as u64);
Duration::new(seconds as u64, nanos as u32)
}
pub fn duration_to_rtp_timestamp(duration: Duration, clock_rate: u32) -> u32 {
let seconds = duration.as_secs();
let nanos = duration.subsec_nanos();
let timestamp_seconds = seconds * (clock_rate as u64);
let timestamp_fraction = ((nanos as u64) * (clock_rate as u64)) / 1_000_000_000;
(timestamp_seconds + timestamp_fraction) as u32
}
pub fn current_rtp_timestamp(clock_rate: u32) -> u32 {
let now = SystemTime::now()
.duration_since(UNIX_EPOCH)
.unwrap_or_else(|_| Duration::from_secs(0));
duration_to_rtp_timestamp(now, clock_rate)
}
pub fn rtp_timestamp_diff(a: u32, b: u32) -> u32 {
if a > b && a - b > 0x80000000 {
return b + (0xFFFFFFFF - a) + 1;
} else if b > a && b - a > 0x80000000 {
return a + (0xFFFFFFFF - b) + 1;
} else if a > b {
return a - b;
} else {
return b - a;
}
}
pub mod clock_rates {
pub const AUDIO_8KHZ: u32 = 8000;
pub const AUDIO_16KHZ: u32 = 16000;
pub const AUDIO_48KHZ: u32 = 48000;
pub const VIDEO_90KHZ: u32 = 90000;
}
#[cfg(test)]
mod tests {
use super::*;
#[test]
fn test_timestamp_conversion() {
let duration = Duration::from_millis(125);
let timestamp = duration_to_rtp_timestamp(duration, 8000);
assert_eq!(timestamp, 1000);
let converted_duration = rtp_timestamp_to_duration(timestamp, 8000);
assert_eq!(converted_duration.as_millis(), 125);
let duration = Duration::from_secs(1);
let timestamp = duration_to_rtp_timestamp(duration, 48000);
assert_eq!(timestamp, 48000);
let converted_duration = rtp_timestamp_to_duration(timestamp, 48000);
assert_eq!(converted_duration.as_secs(), 1);
}
#[test]
fn test_timestamp_diff() {
assert_eq!(rtp_timestamp_diff(1000, 2000), 1000);
assert_eq!(rtp_timestamp_diff(2000, 1000), 1000);
assert_eq!(rtp_timestamp_diff(0xFFFFFFFF, 10), 11);
assert_eq!(rtp_timestamp_diff(10, 0xFFFFFFFF), 11);
assert_eq!(rtp_timestamp_diff(1, 0x70000000), 0x70000000 - 1);
assert_eq!(rtp_timestamp_diff(0x70000000, 1), 0x70000000 - 1);
}
}