fix(video): vsync remote canvas draws
Some checks failed
Mirror to GitHub / mirror (push) Failing after 31s
Build Release Binaries / build-amd64 (push) Failing after 3m24s

This commit is contained in:
Siavash Sameni
2026-05-26 08:46:11 +04:00
parent f65b399a21
commit 8415804a1a
3 changed files with 14 additions and 7 deletions

5
.gitignore vendored
View File

@@ -12,6 +12,11 @@ npm-debug.log*
yarn-debug.log* yarn-debug.log*
yarn-error.log* yarn-error.log*
dev-debug.log dev-debug.log
# Debug frame dump artifacts
android-frame-dumps/
wzp-frame-dumps.tar
# Dependency directories # Dependency directories
node_modules/ node_modules/
# Environment variables # Environment variables

View File

@@ -739,6 +739,10 @@ let remoteFrameSerial = 0;
let remoteDrawInFlight = false; let remoteDrawInFlight = false;
let remotePendingFrame: { serial: number; width: number; height: number; jpeg_b64: string } | null = null; let remotePendingFrame: { serial: number; width: number; height: number; jpeg_b64: string } | null = null;
function nextAnimationFrame() {
return new Promise<void>(resolve => requestAnimationFrame(() => resolve()));
}
async function drawRemoteFrame(frame: { serial: number; width: number; height: number; jpeg_b64: string }) { async function drawRemoteFrame(frame: { serial: number; width: number; height: number; jpeg_b64: string }) {
const img = new Image(); const img = new Image();
img.src = `data:image/jpeg;base64,${frame.jpeg_b64}`; img.src = `data:image/jpeg;base64,${frame.jpeg_b64}`;
@@ -751,6 +755,8 @@ async function drawRemoteFrame(frame: { serial: number; width: number; height: n
}); });
} }
if (frame.serial !== remoteFrameSerial) return;
await nextAnimationFrame();
if (frame.serial !== remoteFrameSerial) return; if (frame.serial !== remoteFrameSerial) return;
if (vdRemoteVideo.width !== frame.width) vdRemoteVideo.width = frame.width; if (vdRemoteVideo.width !== frame.width) vdRemoteVideo.width = frame.width;
if (vdRemoteVideo.height !== frame.height) vdRemoteVideo.height = frame.height; if (vdRemoteVideo.height !== frame.height) vdRemoteVideo.height = frame.height;

View File

@@ -3,9 +3,9 @@ set -euo pipefail
PACKAGE="${1:-com.wzp.desktop}" PACKAGE="${1:-com.wzp.desktop}"
OUT_DIR="${2:-android-frame-dumps}" OUT_DIR="${2:-android-frame-dumps}"
REMOTE_TAR="/sdcard/wzp-frame-dumps.tar"
LOCAL_TAR="wzp-frame-dumps.tar" LOCAL_TAR="wzp-frame-dumps.tar"
APP_DUMP_DIR="files/com.wzp.desktop/.wzp" APP_DUMP_DIR="${WZP_ANDROID_DUMP_ROOT:-.wzp}"
trap 'rm -f "$LOCAL_TAR"' EXIT
if [ "${1:-}" = "-h" ] || [ "${1:-}" = "--help" ]; then if [ "${1:-}" = "-h" ] || [ "${1:-}" = "--help" ]; then
echo "Usage: $0 [package] [out-dir]" echo "Usage: $0 [package] [out-dir]"
@@ -15,11 +15,7 @@ if [ "${1:-}" = "-h" ] || [ "${1:-}" = "--help" ]; then
fi fi
echo ">>> Packaging frame dumps from $PACKAGE..." echo ">>> Packaging frame dumps from $PACKAGE..."
adb shell "run-as $PACKAGE tar -C $APP_DUMP_DIR -cf $REMOTE_TAR frame-dumps" adb exec-out "run-as $PACKAGE tar -C $APP_DUMP_DIR -cf - frame-dumps" > "$LOCAL_TAR"
echo ">>> Pulling $REMOTE_TAR..."
adb pull "$REMOTE_TAR" "$LOCAL_TAR"
adb shell "rm -f $REMOTE_TAR" >/dev/null 2>&1 || true
rm -rf "$OUT_DIR" rm -rf "$OUT_DIR"
mkdir -p "$OUT_DIR" mkdir -p "$OUT_DIR"