feat(portal): BWE-driven resolution adaptation + duplicate frame skipping
WebRTC client bandwidth estimate now drives both encoder bitrate and resolution tier selection, replacing the previous static-target encoder. - webrtc.rs: enable str0m BWE (seeded at 5 Mbps), surface EgressBitrateEstimate + KeyframeRequest events, expose get_bwe_estimate() / set_need_keyframe() - state_portal.rs: wire bitrate/resolution channels between the WebRTC thread and the encode thread; tier ladder [1440p, 1080p, 720p] with downscale at 60% budget and upscale hysteresis (120% sustained 10s) - avhw.rs: SwEncImport::poll_resolution_commands() rebuilds the import filter graph on UpdateResolution; SwEncEncode::recreate_encoder() rebuilds sws/enc_video/yuv_frame atomically; hash_sampled_y_plane() skips duplicate frames; VBV x264opts cap IDR bursts; H.264 level 4.0 (muxer) / 4.2 (WebRTC) - state.rs: sync wlr-screencopy GOP to fps*2 max 20 for parity - fix: drain bitrate_rx + resolution_rx BEFORE the stride check in encode_cpu_frame() so the new (smaller-stride) frame produced after a resolution change does not hit the stale (larger) enc_width and crash the encode thread - WebRTC GOP widened to fps*2 max 20 (was fps/2 max 10)
This commit is contained in:
+8
-2
@@ -461,14 +461,20 @@ mod tests {
|
||||
// 100 values: 0.0 through 99.0
|
||||
let data: Vec<f64> = (0..100).map(|i| i as f64).collect();
|
||||
let result = p95_f64(&data);
|
||||
assert!((result - 95.0).abs() < 1.0, "p95 of 0..100 should be ~95, got {result}");
|
||||
assert!(
|
||||
(result - 95.0).abs() < 1.0,
|
||||
"p95 of 0..100 should be ~95, got {result}"
|
||||
);
|
||||
}
|
||||
|
||||
#[test]
|
||||
fn p95_ms_microseconds() {
|
||||
let data: Vec<u64> = (0..100).map(|i| i * 1000).collect(); // 0ms..99ms
|
||||
let result = p95_ms(&data);
|
||||
assert!((result - 95.0).abs() < 1.0, "p95_ms should be ~95ms, got {result}");
|
||||
assert!(
|
||||
(result - 95.0).abs() < 1.0,
|
||||
"p95_ms should be ~95ms, got {result}"
|
||||
);
|
||||
}
|
||||
|
||||
#[test]
|
||||
|
||||
Reference in New Issue
Block a user