host/x11: default to XDamage capture; drop --untimed from viewers
X11 full-desktop capture used `ximagesrc use-damage=false`, which copies the whole root window every frame. On servers without working MIT-SHM (and CPU-bound everywhere else) this collapses to ~1 fps — a field test over an xlibre host played back at roughly one frame per minute. Default to `use-damage=true` (XDamage re-grabs only changed regions); keep `PIXELPASS_X11_NO_DAMAGE=1` as an escape hatch for driver artifacts. Also drop `--untimed` from both mpv invocations (viewer banner + the interactive launcher). `--untimed` displays each frame as it decodes and ignores audio timestamps, which drifts a shared *video* progressively out of sync with its audio. Pacing to the audio clock keeps A/V synced at a negligible latency cost. Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
This commit is contained in:
+14
-4
@@ -37,12 +37,22 @@ pub async fn start(opts: &HostOpts, quality: &EffectiveQuality) -> Result<Captur
|
||||
}
|
||||
};
|
||||
|
||||
// XDamage capture (`use-damage=true`) only re-grabs changed screen
|
||||
// regions instead of copying the whole root window every frame. On a busy
|
||||
// desktop that is the difference between a usable framerate and ~1 fps —
|
||||
// `use-damage=false` does a full XGetImage per frame, which collapses on
|
||||
// servers without working MIT-SHM (and pins the CPU everywhere else).
|
||||
// Kept as the default; `PIXELPASS_X11_NO_DAMAGE=1` restores full-frame
|
||||
// capture if a driver produces partial-update artifacts with damage on.
|
||||
let use_damage = if std::env::var_os("PIXELPASS_X11_NO_DAMAGE").is_some() {
|
||||
"use-damage=false"
|
||||
} else {
|
||||
"use-damage=true"
|
||||
};
|
||||
let mut source_args = vec![
|
||||
"ximagesrc".to_string(),
|
||||
// Full frames (no damage regions) to avoid partial-update artifacts;
|
||||
// use-damage=true is a later CPU optimization. show-pointer matches
|
||||
// Wayland's CursorMode::Embedded.
|
||||
"use-damage=false".to_string(),
|
||||
// show-pointer matches Wayland's CursorMode::Embedded.
|
||||
use_damage.to_string(),
|
||||
"show-pointer=true".to_string(),
|
||||
];
|
||||
if let Some(xid) = xid {
|
||||
|
||||
Reference in New Issue
Block a user