use std::time::Instant;
use videocall_codecs::encoder::{Encodable, EncoderConfig};
use videocall_codecs::testing::i420::moving_box;
use videocall_codecs::vp9::Vp9Encoder;
const FRAME_BUDGET_MS: f64 = 33.0;
#[test]
#[ignore = "perf gate: run with cargo test --release -- --ignored"]
fn perf_median_encode_frame_under_33ms_640x480() {
let (w, h) = (640u32, 480u32);
let cfg = EncoderConfig {
width: w,
height: h,
..Default::default()
};
let mut enc = Vp9Encoder::new(cfg).expect("encoder init");
for t in 0..10u32 {
let frame = moving_box(w, h, t);
let _ = enc.encode(t as i64, &frame);
}
let mut times_ms = Vec::with_capacity(300);
for t in 10..310u32 {
let frame = moving_box(w, h, t);
let start = Instant::now();
let _ = enc.encode(t as i64, &frame);
times_ms.push(start.elapsed().as_secs_f64() * 1000.0);
}
times_ms.sort_by(|a, b| a.partial_cmp(b).unwrap());
let pct = |p: f64| times_ms[(((times_ms.len() - 1) as f64) * p) as usize];
let (p50, p90, p99) = (pct(0.50), pct(0.90), pct(0.99));
println!("encode latency ms: p50={p50:.3} p90={p90:.3} p99={p99:.3}");
assert!(
p50 < FRAME_BUDGET_MS,
"median encode {p50:.3} ms exceeds {FRAME_BUDGET_MS} ms realtime budget"
);
}