68 lines
2.1 KiB
Rust
68 lines
2.1 KiB
Rust
//! Headless timing check against real segments; run inside the rig for device audio.
|
|
use clipbin_core::store::Store;
|
|
use clipbin_media::player::{Picture, Player};
|
|
use std::{
|
|
thread,
|
|
time::{Duration, Instant},
|
|
};
|
|
fn main() {
|
|
let directory = std::env::args().nth(1).expect("session root");
|
|
let id = std::env::args()
|
|
.nth(2)
|
|
.unwrap_or_else(|| "1".into())
|
|
.parse()
|
|
.unwrap();
|
|
let player = Player::new();
|
|
player.resize((800, 450));
|
|
player.open(
|
|
Store {
|
|
root: directory.into(),
|
|
},
|
|
id,
|
|
Duration::ZERO,
|
|
);
|
|
thread::sleep(Duration::from_millis(250));
|
|
player.play(true);
|
|
let begin = Instant::now();
|
|
let mut last = None;
|
|
let mut frames = 0;
|
|
for _ in 0..700 {
|
|
thread::sleep(Duration::from_millis(10));
|
|
let snapshot = player.snapshot();
|
|
assert!(snapshot.audio_error.is_none(), "{:?}", snapshot.audio_error);
|
|
if let Picture::Frame(frame) = snapshot.picture {
|
|
if let Some(video_time) = snapshot.video_time {
|
|
assert!(
|
|
video_time.abs_diff(snapshot.time) <= Duration::from_millis(20),
|
|
"video out of sync: {video_time:?} vs {:?}",
|
|
snapshot.time
|
|
);
|
|
}
|
|
if last
|
|
.as_ref()
|
|
.is_none_or(|previous| !std::sync::Arc::ptr_eq(previous, &frame))
|
|
{
|
|
frames += 1;
|
|
}
|
|
last = Some(frame);
|
|
}
|
|
}
|
|
let snapshot = player.snapshot();
|
|
println!(
|
|
"playback_check wall={:.3} session={:.3} displayed_frames={frames}",
|
|
begin.elapsed().as_secs_f64(),
|
|
snapshot.time.as_secs_f64()
|
|
);
|
|
assert!(
|
|
snapshot.time >= Duration::from_secs(6),
|
|
"audio master clock stalled: {snapshot:?}"
|
|
);
|
|
player.audio(false, 0.5);
|
|
thread::sleep(Duration::from_secs(1));
|
|
player.audio(true, 0.5);
|
|
let before = snapshot.time;
|
|
thread::sleep(Duration::from_secs(1));
|
|
assert!(player.snapshot().time > before, "muted wall clock stalled");
|
|
player.close();
|
|
}
|