diff --git a/.claude/skills/steam-frame/SKILL.md b/.claude/skills/steam-frame/SKILL.md index 0437825..48c9f1c 100644 --- a/.claude/skills/steam-frame/SKILL.md +++ b/.claude/skills/steam-frame/SKILL.md @@ -48,3 +48,9 @@ running `--help`: `paste-to-frame.sh`, `serve-bootstrap.sh` and - `sudo` on the Frame asks for the user's Developer Mode password. Hand those steps to the user (open Terminal) and keep automation to non-sudo commands. - The Mac uses BSD userland and zsh (no `timeout`, use `head -n`). +- **First-party first.** For any new capability, investigate the first-party + way before anything else: Valve (SteamOS, Steam, Steam Link), Apple (the Mac + and iPhone), and KDE (the Frame's desktop is Plasma). It's usually the best + answer. If it isn't, write down why not. If it is, find what Frame Control + can do to make it easier to set up (install over SSH, pre-seed settings, + pair automatically, tell the user the one setting to turn on). diff --git a/.github/workflows/checks.yml b/.github/workflows/checks.yml index fb1e7fd..f131fe4 100644 --- a/.github/workflows/checks.yml +++ b/.github/workflows/checks.yml @@ -35,7 +35,9 @@ jobs: - name: Server tests run: python -m unittest discover -s tests -v - name: App syntax - run: node --check app/main.js && node --check app/build/make-icon.js && node --check app/build/fetch-deps.js && node --check app/preload.js && node --check app/install-link.js + run: node --check app/main.js && node --check app/build/make-icon.js && node --check app/build/fetch-deps.js && node --check app/preload.js && node --check app/install-link.js && node --check app/updater.js + - name: Updater tests + run: node --test app/test/updater.test.js - name: Website run: node --test site/test/*.test.mjs && node --check site/public/js/site.js && node --check site/public/js/feedback.js diff --git a/.gitignore b/.gitignore index 290267a..ba02656 100644 --- a/.gitignore +++ b/.gitignore @@ -5,6 +5,7 @@ apk-catalog/data/index-v2*.json* compat-db/.env.lakebed.server compat-db/.lakebed/ tests/smoke/results/ +mac/bin/ # Downloaded at build time (frame/kdeconnect/fetch.py, app/build/fetch-deps.js) frame/kdeconnect/packages/ diff --git a/README.md b/README.md index 6cb767b..8518264 100644 --- a/README.md +++ b/README.md @@ -110,6 +110,10 @@ already ships (sideloading a game copies Valve's own devkit scripts to a computer. Build it from [`ios/`](ios) in Xcode; see [docs/iphone.md](docs/iphone.md). The app brings its own Python and `adb`; SSH is built into macOS and Windows. +From 0.4 it updates itself: when a new version is published, a banner offers +**Update and restart**. It sends anonymous usage statistics, which you can turn +off. Sharing compatibility results and error details is opt-in. See +[docs/privacy.md](docs/privacy.md). Google doesn't publish `adb` for arm64 Linux, so that build uses your distribution's. If you already have `adb`, the app uses yours. @@ -178,9 +182,11 @@ entry to `~/.ssh/config` and keys at `~/.ssh/id_ed25519_frame` and ## Feedback This is a first public test, so reports are really useful, especially from -Windows and Linux. The quickest way is the -[feedback form](https://frame-control.pages.dev/feedback/): no GitHub account -needed, and it opens an issue here. Please include: +Windows and Linux. The quickest way is **Report a problem** in the app (the +warning-sign button at the top, or **Help → Report a Problem…**). It adds +diagnostics with personal details removed, shows you exactly what's included, +and sends it privately to the maintainer; nothing is published. Without the app, +use the [feedback form](https://frame-control.pages.dev/feedback/). Please include: - what you tried and what happened - your computer's OS and your SteamOS build (Steam Settings → System) @@ -204,9 +210,12 @@ Frame's software fits together, all checked against a real headset and labelled | [Sideloading Linux and Windows games](docs/sideloading.md) | A .zip, folder or .exe as a Steam Devkit Game, runtime detection | | [Install links for websites](docs/web-install.md) | `frame-control://install` links and manifests, the rules, a button to paste | | [Steam games](docs/steam-games.md) · [VR video](docs/vr-video.md) · [WebXR in Chromium](docs/webxr-chromium.md) | Installing and buying, watching VR180/360, the Chromium build | +| [Mac in the headset](docs/mac-in-headset.md) | Mac windows and screens as panels in the Frame, with laser and keyboard input | +| [VR mods and custom songs](docs/mods.md) | Per-game feasibility, real-Frame results and blockers; no installer yet | | [SSH](docs/ssh.md) · [Streaming](docs/streaming.md) · [Files](docs/file-transfer.md) · [Panels](docs/panels.md) · [Tailscale](docs/tailscale.md) | Topic notes | | [Frame Control for iPhone](docs/iphone.md) | The iPhone and iPad app, how it runs the server on the Frame, pairing | | [Recovery and OS images](docs/recovery-and-images.md) | Where to download the Frame's OS, what's inside, testing without the headset | +| [AI agents and assistant](docs/agents.md) | Key-free MCP tools, human approvals, and an opt-in assistant panel | | [Testing](docs/testing.md) | Unit tests, end-to-end tests against a fake Frame in Docker, and the headset smoke test | | [Open questions](docs/open-questions.md) | What's still unchecked | @@ -240,7 +249,8 @@ cd app && npm install && npm start # run the app from the checkout The server is Python stdlib only; the app is Electron. GitHub Actions runs the tests on macOS, Windows and Linux, and a `v*` tag builds all three installers -into the release. See [building](docs/frame-control.md#building). +into a draft release, which reaches users once published. See +[building](docs/frame-control.md#building) and [releasing](docs/releasing.md). ## License diff --git a/app/main.js b/app/main.js index 06c10f1..3a93318 100644 --- a/app/main.js +++ b/app/main.js @@ -10,6 +10,7 @@ const net = require("net"); const os = require("os"); const path = require("path"); const { SCHEME, parseInstallLink, linkFromArgv } = require("./install-link"); +const updater = require("./updater"); const run = promisify(execFile); @@ -114,7 +115,11 @@ function ping(target) { } async function startServer() { + // The version and whether this is a built app go to ui/frame_telemetry.py, which + // sends nothing from a source checkout. const env = { ...process.env, PATH: await loginPath(), FRAME_CONTROL_APP: "1", + FRAME_CONTROL_VERSION: app.getVersion(), FRAME_CONTROL_LOG: LOG, + ...(app.isPackaged ? { FRAME_CONTROL_PACKAGED: "1" } : {}), ...(fs.existsSync(TOOLS) ? { FRAME_CONTROL_TOOLS: TOOLS } : {}) }; python = await findPython(env); if (!python) throw new Error(`Frame Control needs Python 3.8 or later. ${PYTHON_HELP}`); @@ -245,6 +250,9 @@ function fromUi(e) { ipcMain.handle("clipboard:read", (e) => fromUi(e) ? clipboard.readText() : ""); ipcMain.handle("connection:setup", (e) => { if (fromUi(e)) setUpConnection(); }); ipcMain.on("keys:capture", (e, on) => { if (fromUi(e)) win.webContents.setIgnoreMenuShortcuts(on === true); }); +ipcMain.handle("update:get", (e) => fromUi(e) ? publicUpdate() : null); +ipcMain.handle("update:check", (e) => fromUi(e) ? checkForUpdate({ manual: true }).then(publicUpdate) : null); +ipcMain.handle("update:install", (e) => { if (fromUi(e)) installUpdate(); }); // frame-control://install links from websites (docs/web-install.md). They can // arrive before the window or server exists (macOS open-url on a cold launch), @@ -277,6 +285,81 @@ ipcMain.on("install-link:ready", (e) => { deliverLinks(); }); +// ---- updates (app/updater.js, docs/releasing.md) ---- +// Checked shortly after launch and every few hours; the page shows a banner and +// the Update button calls installUpdate. +const UPDATE_EVERY = 6 * 3600 * 1000; +const update = { status: "idle", current: app.getVersion(), latest: null, error: null, progress: 0, how: null }; + +function publicUpdate() { + const r = update.latest; + return { status: update.status, current: update.current, error: update.error, progress: update.progress, + latest: r && { version: r.version, notes: r.notes, page: r.page }, + canInstall: !!update.how && update.how.method !== "manual", why: update.how && update.how.why }; +} + +function setUpdate(fields) { + Object.assign(update, fields); + if (win && linkPage === win.webContents) win.webContents.send("update:state", publicUpdate()); +} + +async function checkForUpdate({ manual = false } = {}) { + if (["checking", "downloading", "ready"].includes(update.status)) return; + setUpdate({ status: "checking", error: null }); + try { + const latest = await updater.latestRelease(); + const how = updater.updateMethod({ platform: process.platform, isPackaged: app.isPackaged, + execPath: process.execPath, env: process.env, + exists: fs.existsSync, writable: updater.writable }); + if (updater.isNewer(latest.version, update.current)) { + setUpdate({ status: "available", latest, how }); + if (manual) offerUpdateDialog(); + } else { + setUpdate({ status: "none", latest, how }); + if (manual) dialog.showMessageBox(win, { type: "info", message: "Frame Control is up to date", + detail: `You have ${update.current}, the newest version.` }); + } + } catch (e) { + // A failed check: nothing to install, and never an older release kept from before. + setUpdate({ status: "check-failed", error: e.message, latest: null }); + if (manual) dialog.showMessageBox(win, { type: "warning", message: "Couldn't check for updates", detail: e.message }); + } +} + +async function offerUpdateDialog() { + const r = update.latest; + const { response } = await dialog.showMessageBox(win, { + type: "info", message: `Frame Control ${r.version} is available`, + detail: `You have ${update.current}.` + (update.how.method === "manual" ? ` Download it from the release page (${update.how.why}).` : ""), + buttons: [update.how.method === "manual" ? "Open Release Page" : "Update and Restart", "Later"], defaultId: 0, cancelId: 1, + }); + if (response === 0) installUpdate(); +} + +async function installUpdate() { + // "error" here only ever means an install failed, so trying again is safe. + if (update.status !== "available" && update.status !== "error") return; + if (!update.latest || !updater.isNewer(update.latest.version, update.current)) return; + if (!update.how || update.how.method === "manual") { shell.openExternal(update.latest.page); return; } + setUpdate({ status: "downloading", progress: 0, error: null }); + try { + const start = await updater.prepare(update.latest, update.how, + (done, total) => { if (total) setUpdate({ progress: done / total }); }, update.current); + setUpdate({ status: "ready", progress: 1 }); + start(); + quitting = true; + app.quit(); + } catch (e) { + setUpdate({ status: "error", error: e.message }); + } +} + +function scheduleUpdateChecks() { + if (process.env.FRAME_CONTROL_NO_UPDATE_CHECK === "1") return; + setTimeout(checkForUpdate, 8000); + setInterval(checkForUpdate, UPDATE_EVERY).unref(); +} + function registerScheme() { // A checkout runs as `electron .`, so the OS must be told the script too. // (macOS takes the scheme from Info.plist, which only the built app has.) @@ -338,7 +421,11 @@ async function setUpConnection() { function buildMenu() { const template = [ - ...(IS_MAC ? [{ role: "appMenu" }] : []), + ...(IS_MAC ? [{ label: app.name, submenu: [ + { role: "about" }, { label: "Check for Updates…", click: () => checkForUpdate({ manual: true }) }, + { type: "separator" }, { role: "services" }, { type: "separator" }, + { role: "hide" }, { role: "hideOthers" }, { role: "unhide" }, { type: "separator" }, { role: "quit" }, + ] }] : []), { role: "fileMenu" }, { role: "editMenu" }, { @@ -365,7 +452,15 @@ function buildMenu() { ...(IS_MAC ? [{ role: "windowMenu" }] : []), { role: "help", - submenu: [{ label: "Project on GitHub", click: () => shell.openExternal("https://github.com/saphid/steam-frame") }], + submenu: [ + ...(IS_MAC ? [] : [{ label: "Check for Updates…", click: () => checkForUpdate({ manual: true }) }]), + { label: "Report a Problem…", click: () => { + if (win && url && linkPage === win.webContents) win.webContents.send("report:open"); + else shell.openExternal("https://frame-control.pages.dev/feedback/"); // the page isn't up + } }, + { label: "Release Notes", click: () => shell.openExternal(updater.RELEASES) }, + { label: "Project on GitHub", click: () => shell.openExternal("https://github.com/saphid/steam-frame") }, + ], }, ]; Menu.setApplicationMenu(Menu.buildFromTemplate(template)); @@ -388,6 +483,7 @@ if (!app.requestSingleInstanceLock()) { registerScheme(); buildMenu(); createWindow(); + scheduleUpdateChecks(); }); app.on("activate", () => { if (!win) createWindow(); }); app.on("window-all-closed", () => app.quit()); diff --git a/app/package-lock.json b/app/package-lock.json index f8f2d77..264b1dd 100644 --- a/app/package-lock.json +++ b/app/package-lock.json @@ -1,12 +1,12 @@ { "name": "frame-control", - "version": "0.3.1", + "version": "0.4.0", "lockfileVersion": 3, "requires": true, "packages": { "": { "name": "frame-control", - "version": "0.3.1", + "version": "0.4.0", "license": "MIT", "devDependencies": { "electron": "^44.4.5", diff --git a/app/package.json b/app/package.json index d2943dd..ca083aa 100644 --- a/app/package.json +++ b/app/package.json @@ -1,7 +1,7 @@ { "name": "frame-control", "productName": "Frame Control", - "version": "0.3.1", + "version": "0.4.0", "description": "Desktop app for managing a Valve Steam Frame over SSH", "private": true, "main": "main.js", @@ -9,8 +9,8 @@ "scripts": { "start": "env -u ELECTRON_RUN_AS_NODE electron .", "icon": "env -u ELECTRON_RUN_AS_NODE electron build/make-icon.js", - "dist": "node build/fetch-deps.js mac arm64 && electron-builder --mac --arm64 --publish never", - "dist:dir": "node build/fetch-deps.js mac arm64 && electron-builder --mac --arm64 --dir", + "dist": "sh ../mac/frame-mac-view/build.sh && node build/fetch-deps.js mac arm64 && electron-builder --mac --arm64 --publish never", + "dist:dir": "sh ../mac/frame-mac-view/build.sh && node build/fetch-deps.js mac arm64 && electron-builder --mac --arm64 --dir", "dist:linux": "node build/fetch-deps.js linux x64 arm64 && electron-builder --linux --x64 --arm64 --publish never", "dist:win": "node build/fetch-deps.js win x64 && electron-builder --win --x64 --publish never" }, @@ -37,6 +37,7 @@ "main.js", "preload.js", "install-link.js", + "updater.js", "package.json", "build/icon.png" ], @@ -46,7 +47,8 @@ "to": "ui", "filter": [ "*.py", - "*.html" + "*.html", + "telemetry.json" ] }, { @@ -64,6 +66,14 @@ "*.py" ] }, + { + "from": "../frame/openxr-compat", + "to": "frame/openxr-compat", + "filter": [ + "XrApiLayer_FRAME_compat.json", + "prebuilt/**/*.so" + ] + }, { "from": "../frame/devkit-utils", "to": "frame/devkit-utils", @@ -123,9 +133,19 @@ "dmg", "zip" ], + "extraResources": [ + { + "from": "../mac/bin", + "to": "mac/bin", + "filter": [ + "frame-mac-view" + ] + } + ], "extendInfo": { "NSAppleEventsUsageDescription": "Frame Control opens Terminal for SSH sessions and for power actions that need the Developer Mode password.", - "NSLocalNetworkUsageDescription": "Frame Control connects to your Steam Frame over SSH on the local network." + "NSLocalNetworkUsageDescription": "Frame Control connects to your Steam Frame over SSH on the local network.", + "NSScreenCaptureUsageDescription": "Frame Control shows your Mac's windows and screens inside the Steam Frame when you ask it to." }, "artifactName": "Frame-Control-mac-${arch}.${ext}" }, diff --git a/app/preload.js b/app/preload.js index 24065a4..c8579b4 100644 --- a/app/preload.js +++ b/app/preload.js @@ -5,6 +5,7 @@ // It can open Set Up Connection when the headset can't be reached. // It also receives frame-control://install links (docs/web-install.md): only // what the link asked for, never an install; the page asks the user first. +// And it passes update state both ways: see app/updater.js. const { contextBridge, ipcRenderer, webUtils } = require("electron"); contextBridge.exposeInMainWorld("frameApp", { @@ -13,6 +14,21 @@ contextBridge.exposeInMainWorld("frameApp", { // While the keyboard-and-trackpad panel holds the keyboard, ⌘W, ⌘R and the rest go to the Frame. captureKeys: (on) => ipcRenderer.send("keys:capture", !!on), pathForFile: (file) => { try { return webUtils.getPathForFile(file) || ""; } catch { return ""; } }, + // Updates (app/updater.js): the page shows a banner and an Update button. + update: { + get: () => ipcRenderer.invoke("update:get"), + check: () => ipcRenderer.invoke("update:check"), + install: () => ipcRenderer.invoke("update:install"), + onState: (cb) => { + ipcRenderer.removeAllListeners("update:state"); + ipcRenderer.on("update:state", (_e, s) => cb(s)); + }, + }, + // Help → Report a Problem… opens the page's report dialog (ui/frame_report.py). + onReportProblem: (cb) => { + ipcRenderer.removeAllListeners("report:open"); + ipcRenderer.on("report:open", () => cb()); + }, onInstallLink: (cb) => { ipcRenderer.removeAllListeners("install-link"); ipcRenderer.on("install-link", (_e, req) => cb({ kind: req.kind, target: req.target })); diff --git a/app/test/updater.test.js b/app/test/updater.test.js new file mode 100644 index 0000000..4bf9594 --- /dev/null +++ b/app/test/updater.test.js @@ -0,0 +1,59 @@ +// Run: node --test app/test/ +const test = require("node:test"); +const assert = require("node:assert"); +const { isNewer, assetName, updateMethod, macBundle } = require("../updater"); + +test("versions compare numerically, and a release beats its pre-releases", () => { + assert.ok(isNewer("0.3.10", "0.3.9")); + assert.ok(isNewer("v1.0.0", "0.9.9")); + assert.ok(!isNewer("0.3.1", "0.3.1")); + assert.ok(!isNewer("0.3.0", "0.3.1")); + assert.ok(isNewer("1.0.0", "1.0.0-beta.1")); + assert.ok(!isNewer("1.0.0-beta.1", "1.0.0")); + assert.ok(!isNewer("garbage", "0.1.0")); +}); + +test("asset names match what electron-builder publishes", () => { + assert.strictEqual(assetName("darwin", "arm64", "mac-zip"), "Frame-Control-mac-arm64.zip"); + assert.strictEqual(assetName("win32", "x64", "nsis"), "Frame-Control-Setup-x64.exe"); + assert.strictEqual(assetName("linux", "x64", "appimage"), "Frame-Control-linux-x86_64.AppImage"); + assert.strictEqual(assetName("linux", "arm64", "appimage"), "Frame-Control-linux-arm64.AppImage"); +}); + +const base = { isPackaged: true, env: {}, exists: () => false, writable: () => true }; + +test("macOS updates in place only from a writable, non-translocated location", () => { + const exe = "/Applications/Frame Control.app/Contents/MacOS/Frame Control"; + assert.strictEqual(macBundle(exe), "/Applications/Frame Control.app"); + assert.deepStrictEqual(updateMethod({ ...base, platform: "darwin", execPath: exe }), + { method: "mac-zip", bundle: "/Applications/Frame Control.app" }); + const dmg = "/Volumes/Frame Control 0.3.1/Frame Control.app/Contents/MacOS/Frame Control"; + assert.strictEqual(updateMethod({ ...base, platform: "darwin", execPath: dmg }).method, "manual"); + const trans = "/private/var/folders/x/AppTranslocation/ABC/d/Frame Control.app/Contents/MacOS/Frame Control"; + assert.strictEqual(updateMethod({ ...base, platform: "darwin", execPath: trans }).method, "manual"); + assert.strictEqual(updateMethod({ ...base, platform: "darwin", execPath: exe, writable: () => false }).method, "manual"); +}); + +test("Windows needs the installer's copy; Linux needs an AppImage", () => { + const exe = "C:\\Users\\a\\AppData\\Local\\Programs\\Frame Control\\Frame Control.exe"; + assert.strictEqual(updateMethod({ ...base, platform: "win32", execPath: exe, exists: () => true }).method, "nsis"); + assert.strictEqual(updateMethod({ ...base, platform: "win32", execPath: exe }).method, "manual"); + assert.strictEqual(updateMethod({ ...base, platform: "linux", execPath: "/opt/x", env: { APPIMAGE: "/home/a/F.AppImage" } }).method, + "appimage"); + assert.strictEqual(updateMethod({ ...base, platform: "linux", execPath: "/opt/Frame Control/frame-control" }).method, "manual"); + assert.strictEqual(updateMethod({ ...base, isPackaged: false, platform: "darwin", execPath: "x" }).method, "manual"); +}); + +test("update.json assets always download from this repository's release", () => { + const r = require("../updater").fromManifest({ version: "0.4.0", notes: "n", assets: [ + { name: "Frame-Control-mac-arm64.zip", url: "https://evil.example/x.zip", digest: "sha256:" + "a".repeat(64) }] }); + assert.strictEqual(r.assets[0].url, "https://github.com/saphid/frame-control/releases/download/v0.4.0/Frame-Control-mac-arm64.zip"); + assert.throws(() => require("../updater").fromManifest({ version: "nope", assets: [] })); +}); + +test("prepare refuses a release that isn't newer (no downgrades)", async () => { + const { prepare } = require("../updater"); + const release = { version: "0.3.1", assets: [] }; + await assert.rejects(prepare(release, { method: "appimage", appImage: "/nonexistent/x" }, null, "0.4.0"), /isn't newer/); + await assert.rejects(prepare(release, { method: "appimage", appImage: "/nonexistent/x" }, null, "0.3.1"), /isn't newer/); +}); diff --git a/app/updater.js b/app/updater.js new file mode 100644 index 0000000..85caab5 --- /dev/null +++ b/app/updater.js @@ -0,0 +1,250 @@ +// Update checks and self-update for the desktop app (docs/releasing.md). +// +// The newest version is GitHub's "latest" release of saphid/frame-control. Drafts +// and pre-releases never count, so a build reaches people only when the +// maintainer publishes it after testing (scripts/publish-release.sh). That +// script attaches update.json (version, notes, each asset's SHA-256), read +// through github.com's latest/download link: the REST API allows only 60 +// unauthenticated requests an hour per IP address, shared by everyone behind +// the same router, so it's only the fallback. +// +// Every download is checked against the SHA-256 digest GitHub records for the +// asset before anything is replaced. How the update is applied: +// macOS the .zip: unpacked next to the running app, swapped in by a small +// script once the app has quit, then reopened. +// Windows the NSIS installer, run silently over the current install; it +// reopens the app. A copy unpacked from the .zip is updated by hand. +// Linux the AppImage replaces itself; .deb installs are updated by hand. +// When the app can't update itself it opens the release page instead. +const { execFile, spawn } = require("child_process"); +const crypto = require("crypto"); +const fs = require("fs"); +const https = require("https"); +const os = require("os"); +const path = require("path"); + +const REPO = "saphid/frame-control"; // renamed from saphid/steam-frame; GitHub redirects the old name +const LATEST = `https://api.github.com/repos/${REPO}/releases/latest`; +const MANIFEST = `https://github.com/${REPO}/releases/latest/download/update.json`; +const RELEASES = `https://github.com/${REPO}/releases`; + +// "0.3.1" or "v0.3.1" -> [0, 3, 1]; pre-release suffixes sort before the release. +function parseVersion(v) { + const m = String(v || "").trim().replace(/^v/i, "").match(/^(\d+)\.(\d+)\.(\d+)(?:-([0-9A-Za-z.-]+))?$/); + return m ? { nums: [+m[1], +m[2], +m[3]], pre: m[4] || null } : null; +} + +function isNewer(candidate, current) { + const a = parseVersion(candidate), b = parseVersion(current); + if (!a || !b) return false; + for (let i = 0; i < 3; i++) if (a.nums[i] !== b.nums[i]) return a.nums[i] > b.nums[i]; + if (a.pre === b.pre) return false; + if (!a.pre) return true; // 1.0.0 is newer than 1.0.0-beta + if (!b.pre) return false; + return a.pre > b.pre; +} + +// The asset this copy of the app updates from, by the names electron-builder gives them. +function assetName(platform, arch, method) { + if (method === "mac-zip") return `Frame-Control-mac-${arch}.zip`; + if (method === "nsis") return `Frame-Control-Setup-${arch}.exe`; + if (method === "appimage") return `Frame-Control-linux-${arch === "x64" ? "x86_64" : arch}.AppImage`; + return null; +} + +// How this copy can update itself: mac-zip, nsis, appimage, or manual (with why). +function updateMethod({ platform, isPackaged, execPath, env, exists, writable }) { + if (!isPackaged) return { method: "manual", why: "running from a source checkout" }; + if (platform === "darwin") { + const bundle = macBundle(execPath); + if (!bundle) return { method: "manual", why: "can't find the app bundle" }; + if (bundle.includes("/AppTranslocation/") || bundle.startsWith("/Volumes/")) { + return { method: "manual", why: "move Frame Control to Applications first" }; + } + if (!writable(path.dirname(bundle))) return { method: "manual", why: `${path.dirname(bundle)} isn't writable` }; + return { method: "mac-zip", bundle }; + } + if (platform === "win32") { + // electron-builder's NSIS install puts its uninstaller next to the app. + const dir = path.dirname(execPath); + if (exists(path.join(dir, "Uninstall Frame Control.exe"))) return { method: "nsis" }; + return { method: "manual", why: "not installed with the installer" }; + } + if (platform === "linux" && env.APPIMAGE) { + if (!writable(path.dirname(env.APPIMAGE))) return { method: "manual", why: "the AppImage's folder isn't writable" }; + return { method: "appimage", appImage: env.APPIMAGE }; + } + return { method: "manual", why: "installed from a package" }; +} + +function macBundle(execPath) { + const i = execPath.indexOf(".app/Contents/MacOS/"); + return i < 0 ? null : execPath.slice(0, i + 4); +} + +function get(url, { headers = {}, timeout = 20000, redirects = 5 } = {}) { + return new Promise((resolve, reject) => { + const req = https.get(url, { headers: { "user-agent": "FrameControl-updater", ...headers }, timeout }, (res) => { + if ([301, 302, 303, 307, 308].includes(res.statusCode) && res.headers.location && redirects > 0) { + res.resume(); + const next = new URL(res.headers.location, url); + if (next.protocol !== "https:") return reject(new Error("refusing a non-HTTPS redirect")); + return resolve(get(next.href, { headers, timeout, redirects: redirects - 1 })); + } + if (res.statusCode !== 200) { res.resume(); return reject(new Error(`HTTP ${res.statusCode} from ${new URL(url).host}`)); } + resolve(res); + }); + req.on("timeout", () => req.destroy(new Error("timed out"))); + req.on("error", reject); + }); +} + +async function getJson(url, headers) { + const res = await get(url, { headers }); + let body = ""; + for await (const chunk of res) body += chunk; + return JSON.parse(body); +} + +// update.json and the API's release both become { version, notes, page, assets }. +function fromManifest(m) { + if (!parseVersion(m.version) || !Array.isArray(m.assets)) throw new Error("update.json is malformed"); + const base = `https://github.com/${REPO}/releases/download/v${String(m.version).replace(/^v/i, "")}/`; + return { version: String(m.version).replace(/^v/i, ""), notes: String(m.notes || "").slice(0, 4000), + page: m.page || RELEASES, + // Assets always come from this repository's release, whatever the manifest says. + assets: m.assets.map((a) => ({ name: String(a.name), url: base + encodeURIComponent(String(a.name)), + size: a.size, digest: a.digest || null })) }; +} + +function fromApi(r) { + if (r.draft || r.prerelease) throw new Error("GitHub returned an unpublished release"); + return { version: String(r.tag_name || "").replace(/^v/i, ""), notes: String(r.body || "").slice(0, 4000), + page: r.html_url || RELEASES, + assets: (r.assets || []).map((a) => ({ name: a.name, url: a.browser_download_url, size: a.size, + digest: a.digest || null })) }; +} + +async function latestRelease() { + try { + return fromManifest(await getJson(MANIFEST)); + } catch (e) { + if (!/HTTP 404/.test(e.message)) throw e; // releases before update.json existed + } + return fromApi(await getJson(LATEST, { accept: "application/vnd.github+json" })); +} + +async function download(asset, dest, onProgress) { + const m = /^sha256:([0-9a-f]{64})$/.exec(asset.digest || ""); + if (!m) throw new Error(`GitHub has no SHA-256 for ${asset.name}, so it can't be checked`); + const res = await get(asset.url, { timeout: 60000 }); + const total = +res.headers["content-length"] || asset.size || 0; + const hash = crypto.createHash("sha256"); + // "wx": a new file only, never through an existing file or symlink at that path. + const out = fs.createWriteStream(dest, { mode: 0o755, flags: "wx" }); + let done = 0; + await new Promise((resolve, reject) => { + res.on("data", (chunk) => { hash.update(chunk); done += chunk.length; onProgress && onProgress(done, total); }); + res.on("error", reject); + out.on("error", reject); + out.on("finish", resolve); + res.pipe(out); + }); + if (hash.digest("hex") !== m[1]) { + fs.rmSync(dest, { force: true }); + throw new Error(`${asset.name} didn't match its SHA-256; nothing was changed`); + } +} + +const run = (cmd, args) => new Promise((resolve, reject) => + execFile(cmd, args, { timeout: 120000 }, (err, stdout, stderr) => err ? reject(new Error((stderr || err.message).trim())) : resolve(stdout))); + +// Waits for this process to exit, swaps the new bundle in (putting the old one +// back if that fails), and reopens the app. +const MAC_SWAP = `set -u +pid="$1"; app="$2"; new="$3"; stage="$4" +while kill -0 "$pid" 2>/dev/null; do sleep 0.2; done +old="$stage/old.app" +if mv "$app" "$old"; then + if mv "$new" "$app"; then rm -rf "$old"; else mv "$old" "$app"; fi +fi +xattr -dr com.apple.quarantine "$app" 2>/dev/null +rm -rf "$stage" +open "$app" +`; + +async function applyMac(release, bundle, onProgress) { + const asset = release.assets.find((a) => a.name === assetName("darwin", process.arch, "mac-zip")); + if (!asset) throw new Error(`the release has no ${assetName("darwin", process.arch, "mac-zip")}`); + // Staged beside the app, so the final move stays on one volume. + const stage = fs.mkdtempSync(path.join(path.dirname(bundle), ".frame-control-update-")); + try { + const zip = path.join(stage, asset.name); + await download(asset, zip, onProgress); + await run("/usr/bin/ditto", ["-x", "-k", zip, stage]); + fs.rmSync(zip, { force: true }); + const name = fs.readdirSync(stage).find((n) => n.endsWith(".app")); + if (!name) throw new Error("the download has no app in it"); + const fresh = path.join(stage, name); + const version = (await run("/usr/bin/plutil", ["-extract", "CFBundleShortVersionString", "raw", + path.join(fresh, "Contents", "Info.plist")])).trim(); + if (version !== release.version) throw new Error(`the download is version ${version}, not ${release.version}`); + const script = path.join(stage, "swap.sh"); + fs.writeFileSync(script, MAC_SWAP); + return () => spawn("/bin/sh", [script, String(process.pid), bundle, fresh, stage], + { detached: true, stdio: "ignore" }).unref(); + } catch (e) { + fs.rmSync(stage, { recursive: true, force: true }); + throw e; + } +} + +async function applyNsis(release, onProgress) { + const asset = release.assets.find((a) => a.name === assetName("win32", process.arch, "nsis")); + if (!asset) throw new Error(`the release has no ${assetName("win32", process.arch, "nsis")}`); + const dir = fs.mkdtempSync(path.join(os.tmpdir(), "frame-control-update-")); + const exe = path.join(dir, asset.name); + await download(asset, exe, onProgress); + // /S: silent, into the existing install. --force-run: open the app afterwards. + return () => spawn(exe, ["--updated", "/S", "--force-run"], { detached: true, stdio: "ignore" }).unref(); +} + +async function applyAppImage(release, appImage, onProgress) { + const asset = release.assets.find((a) => a.name === assetName("linux", process.arch, "appimage")); + if (!asset) throw new Error(`the release has no ${assetName("linux", process.arch, "appimage")}`); + // A private folder beside the AppImage, so the final rename stays on one filesystem. + const stage = fs.mkdtempSync(path.join(path.dirname(appImage), ".frame-control-update-")); + try { + const next = path.join(stage, asset.name); + await download(asset, next, onProgress); + fs.chmodSync(next, 0o755); + fs.renameSync(next, appImage); // the running copy keeps its open file + } finally { + fs.rmSync(stage, { recursive: true, force: true }); + } + // Without FUSE the AppImage runs extracted (--appimage-extract-and-run, which isn't passed + // on to the app); a FUSE mount lives under /tmp/.mount_*. Keep the same mode on restart. + const extracted = process.env.APPIMAGE_EXTRACT_AND_RUN === "1" || !process.execPath.includes("/.mount_"); + const env = { ...process.env, APPIMAGE: appImage, ...(extracted ? { APPIMAGE_EXTRACT_AND_RUN: "1" } : {}) }; + // Started only once this process has exited, or the new copy would lose the single-instance lock. + return () => spawn("/bin/sh", ["-c", 'while kill -0 "$1" 2>/dev/null; do sleep 0.2; done; exec "$2"', + "sh", String(process.pid), appImage], { detached: true, stdio: "ignore", env }).unref(); +} + +// Downloads and prepares the update; returns a function that starts the swap, +// to be called just before the app quits. +async function prepare(release, how, onProgress, current) { + if (!isNewer(release.version, current)) throw new Error(`${release.version} isn't newer than ${current}`); + if (how.method === "mac-zip") return applyMac(release, how.bundle, onProgress); + if (how.method === "nsis") return applyNsis(release, onProgress); + if (how.method === "appimage") return applyAppImage(release, how.appImage, onProgress); + throw new Error(how.why || "this copy can't update itself"); +} + +function writable(dir) { + try { fs.accessSync(dir, fs.constants.W_OK); return true; } catch { return false; } +} + +module.exports = { REPO, RELEASES, parseVersion, isNewer, assetName, updateMethod, macBundle, latestRelease, + fromManifest, fromApi, + download, prepare, writable }; diff --git a/bench/pages/present.html b/bench/pages/present.html new file mode 100644 index 0000000..2e783fd --- /dev/null +++ b/bench/pages/present.html @@ -0,0 +1,24 @@ + + +fmv-present + + diff --git a/bench/pages/scroll.html b/bench/pages/scroll.html new file mode 100644 index 0000000..602ced9 --- /dev/null +++ b/bench/pages/scroll.html @@ -0,0 +1,32 @@ + + +fmv-bench scroll +
+ diff --git a/bench/pages/type.html b/bench/pages/type.html new file mode 100644 index 0000000..288904c --- /dev/null +++ b/bench/pages/type.html @@ -0,0 +1,9 @@ + + +fmv-bench type + + diff --git a/bench/results/2026-09-28-1d05f57-usb1.json b/bench/results/2026-09-28-1d05f57-usb1.json new file mode 100644 index 0000000..47c65d3 --- /dev/null +++ b/bench/results/2026-09-28-1d05f57-usb1.json @@ -0,0 +1,677 @@ +{ + "label": "usb1", + "date": "2026-09-28T21:16:03", + "commit": "1d05f57", + "config": { + "quality": "balanced", + "mode": "separate", + "net": "none", + "delay_ms": 0, + "buffer_ms": 250, + "host": "10.86.200.233", + "ssh_opts": [], + "encoder": "", + "duration_s": 15.0, + "browser_flags": [] + }, + "frame_build": "20260925.6191901", + "mac": "26.5.2", + "headset": "", + "scenarios": [ + { + "scenario": "test", + "frames_sent": 911, + "frames_drawn": 911, + "frames_shown": 610, + "duration_s": 15.2, + "stages_ms": { + "capture": { + "p50": 0.0, + "p95": 0.0, + "p99": 0.0, + "n": 911 + }, + "queue": { + "p50": 0.0, + "p95": 0.1, + "p99": 0.1, + "n": 911 + }, + "encode": { + "p50": 4.4, + "p95": 5.0, + "p99": 5.2, + "n": 911 + }, + "socket": { + "p50": 0.1, + "p95": 0.2, + "p99": 0.2, + "n": 911 + }, + "network": { + "p50": 1.1, + "p95": 1.6, + "p99": 2.1, + "n": 911 + }, + "decode": { + "p50": 1.2, + "p95": 2.6, + "p99": 3.9, + "n": 911 + }, + "draw": { + "p50": 0.4, + "p95": 0.9, + "p99": 1.5, + "n": 911 + }, + "present": { + "p50": 5.8, + "p95": 13.6, + "p99": 16.7, + "n": 610 + }, + "content": { + "p50": 7.3, + "p95": 8.8, + "p99": 10.0, + "n": 911 + }, + "content_shown": { + "p50": 13.6, + "p95": 20.4, + "p99": 24.9, + "n": 610 + } + }, + "fps": 59.9, + "fps_shown": 40.1, + "late_pct": 0.22, + "stall_max": 32.3, + "stalls_over_100ms": 0, + "mbps": 0.48, + "keyframes": 1, + "size": "1280x720", + "captured": 912, + "viewer_never_drawn": 0, + "input_ms": { + "p50": 16.6, + "p95": 24.3, + "p99": 24.5, + "n": 30 + }, + "input_shown_ms": { + "p50": 20.8, + "p95": 31.8, + "p99": 33.8, + "n": 22 + }, + "input_parts_ms": { + "uplink": { + "p50": 0.7, + "p95": 1.0, + "p99": 1.0, + "n": 30 + }, + "mac": { + "p50": 9.1, + "p95": 15.0, + "p99": 15.2, + "n": 30 + }, + "back": { + "p50": 7.2, + "p95": 8.5, + "p99": 12.7, + "n": 30 + } + }, + "inputs": { + "asked": 30, + "sent": 30, + "seen": 30 + }, + "timeline": [ + { + "t": 0, + "fps": 60, + "mbps": 0.5, + "content_p50": 7.3, + "content_p95": 8.6, + "bitrate": 5529600, + "tier": 0, + "w": 1280, + "net": null + }, + { + "t": 1, + "fps": 60, + "mbps": 0.5, + "content_p50": 7.1, + "content_p95": 8.9, + "bitrate": 5529600, + "tier": 0, + "w": 1280, + "net": null + }, + { + "t": 2, + "fps": 59, + "mbps": 0.48, + "content_p50": 7.2, + "content_p95": 8.6, + "bitrate": 5529600, + "tier": 0, + "w": 1280, + "net": null + }, + { + "t": 3, + "fps": 60, + "mbps": 0.49, + "content_p50": 7.1, + "content_p95": 9.0, + "bitrate": 5529600, + "tier": 0, + "w": 1280, + "net": null + }, + { + "t": 4, + "fps": 60, + "mbps": 0.49, + "content_p50": 6.9, + "content_p95": 8.2, + "bitrate": 5529600, + "tier": 0, + "w": 1280, + "net": null + }, + { + "t": 5, + "fps": 60, + "mbps": 0.58, + "content_p50": 7.3, + "content_p95": 8.1, + "bitrate": 5529600, + "tier": 0, + "w": 1280, + "net": null + }, + { + "t": 6, + "fps": 60, + "mbps": 0.47, + "content_p50": 7.4, + "content_p95": 8.6, + "bitrate": 5529600, + "tier": 0, + "w": 1280, + "net": null + }, + { + "t": 7, + "fps": 60, + "mbps": 0.46, + "content_p50": 7.4, + "content_p95": 8.8, + "bitrate": 5529600, + "tier": 0, + "w": 1280, + "net": null + }, + { + "t": 8, + "fps": 60, + "mbps": 0.47, + "content_p50": 7.3, + "content_p95": 8.9, + "bitrate": 5529600, + "tier": 0, + "w": 1280, + "net": null + }, + { + "t": 9, + "fps": 60, + "mbps": 0.46, + "content_p50": 7.3, + "content_p95": 8.8, + "bitrate": 5529600, + "tier": 0, + "w": 1280, + "net": null + }, + { + "t": 10, + "fps": 60, + "mbps": 0.45, + "content_p50": 7.3, + "content_p95": 8.7, + "bitrate": 5529600, + "tier": 0, + "w": 1280, + "net": null + }, + { + "t": 11, + "fps": 60, + "mbps": 0.45, + "content_p50": 7.4, + "content_p95": 9.2, + "bitrate": 5529600, + "tier": 0, + "w": 1280, + "net": null + }, + { + "t": 12, + "fps": 60, + "mbps": 0.46, + "content_p50": 7.4, + "content_p95": 8.4, + "bitrate": 5529600, + "tier": 0, + "w": 1280, + "net": null + }, + { + "t": 13, + "fps": 60, + "mbps": 0.46, + "content_p50": 7.6, + "content_p95": 9.7, + "bitrate": 5529600, + "tier": 0, + "w": 1280, + "net": null + }, + { + "t": 14, + "fps": 60, + "mbps": 0.46, + "content_p50": 7.6, + "content_p95": 8.5, + "bitrate": 5529600, + "tier": 0, + "w": 1280, + "net": null + }, + { + "t": 15, + "fps": 12, + "mbps": 0.09, + "content_p50": 7.5, + "content_p95": 9.6, + "bitrate": 5529600, + "tier": 0, + "w": 1280, + "net": null + } + ], + "adapt": [], + "content_p50": 7.3, + "content_p95": 8.8, + "input_p50": 16.6, + "input_p95": 24.3, + "grades": { + "input_replies": "local", + "content_p50": "local", + "content_p95": "local", + "input_p50": "local", + "input_p95": "local", + "fps": "local", + "late_pct": "local", + "stall_max": "local" + }, + "controller": { + "adapt": true, + "baseRtt": 0.917, + "ceiling": 5529600, + "fps": 60, + "inFlight": 1, + "scale": 1, + "slack": 41.666, + "target": 5529600, + "tier": 0 + }, + "events": [], + "source_fps": 60.0, + "cpu": { + "mac_agent_pct": 16.7, + "frame_viewer_pct": 48.5, + "frame_tailscaled_pct": 0.5, + "frame_sshd_pct": 1.1, + "frame_gamescope_pct": 12.0, + "frame_total_pct": 39.3 + }, + "viewer": "h264 software; ANGLE (Mesa, zink Vulkan 1.4(Turnip Adreno (TM) 750 (MESA_TURNIP)), OpenGL 4.6); raf 137 Hz", + "show_s": 1.15, + "panel": "valve.steam.desktopgame.2001639889", + "src": "test" + }, + { + "scenario": "scroll", + "frames_sent": 848, + "frames_drawn": 848, + "frames_shown": 617, + "duration_s": 15.1, + "stages_ms": { + "capture": { + "p50": -3.9, + "p95": 4.2, + "p99": 7.3, + "n": 848 + }, + "queue": { + "p50": 0.0, + "p95": 0.1, + "p99": 0.1, + "n": 848 + }, + "encode": { + "p50": 6.7, + "p95": 9.7, + "p99": 17.7, + "n": 848 + }, + "socket": { + "p50": 0.1, + "p95": 0.2, + "p99": 0.4, + "n": 848 + }, + "network": { + "p50": 1.7, + "p95": 2.7, + "p99": 5.7, + "n": 848 + }, + "decode": { + "p50": 5.9, + "p95": 10.3, + "p99": 13.1, + "n": 848 + }, + "draw": { + "p50": 0.7, + "p95": 1.6, + "p99": 2.2, + "n": 848 + }, + "present": { + "p50": 4.4, + "p95": 15.8, + "p99": 20.6, + "n": 617 + }, + "content": { + "p50": 15.7, + "p95": 23.0, + "p99": 39.3, + "n": 848 + }, + "content_shown": { + "p50": 21.3, + "p95": 34.1, + "p99": 45.6, + "n": 617 + } + }, + "fps": 56.1, + "fps_shown": 40.7, + "late_pct": 3.3, + "stall_max": 238.5, + "stalls_over_100ms": 1, + "mbps": 9.01, + "keyframes": 1, + "size": "1920x1290", + "captured": 857, + "viewer_never_drawn": 0, + "input_ms": { + "n": 0 + }, + "input_shown_ms": { + "n": 0 + }, + "input_parts_ms": { + "uplink": { + "n": 0 + }, + "mac": { + "n": 0 + }, + "back": { + "n": 0 + } + }, + "inputs": { + "asked": 0, + "sent": 0, + "seen": 0 + }, + "timeline": [ + { + "t": 0, + "fps": 44, + "mbps": 8.13, + "content_p50": 15.7, + "content_p95": 35.7, + "bitrate": 14860800, + "tier": 0, + "w": 1920, + "net": null + }, + { + "t": 1, + "fps": 56, + "mbps": 7.04, + "content_p50": 16.3, + "content_p95": 47.3, + "bitrate": 7430400, + "tier": 0, + "w": 1920, + "net": null + }, + { + "t": 2, + "fps": 57, + "mbps": 8.58, + "content_p50": 16.0, + "content_p95": 22.6, + "bitrate": 10055362, + "tier": 0, + "w": 1920, + "net": null + }, + { + "t": 3, + "fps": 56, + "mbps": 9.29, + "content_p50": 16.4, + "content_p95": 21.1, + "bitrate": 14860800, + "tier": 0, + "w": 1920, + "net": null + }, + { + "t": 4, + "fps": 58, + "mbps": 9.01, + "content_p50": 15.6, + "content_p95": 21.7, + "bitrate": 14860800, + "tier": 0, + "w": 1920, + "net": null + }, + { + "t": 5, + "fps": 57, + "mbps": 9.13, + "content_p50": 15.9, + "content_p95": 21.7, + "bitrate": 14860800, + "tier": 0, + "w": 1920, + "net": null + }, + { + "t": 6, + "fps": 56, + "mbps": 11.63, + "content_p50": 16.1, + "content_p95": 22.1, + "bitrate": 14860800, + "tier": 0, + "w": 1920, + "net": null + }, + { + "t": 7, + "fps": 57, + "mbps": 8.7, + "content_p50": 16.3, + "content_p95": 22.2, + "bitrate": 14860800, + "tier": 0, + "w": 1920, + "net": null + }, + { + "t": 8, + "fps": 57, + "mbps": 9.24, + "content_p50": 15.7, + "content_p95": 21.2, + "bitrate": 14860800, + "tier": 0, + "w": 1920, + "net": null + }, + { + "t": 9, + "fps": 57, + "mbps": 9.21, + "content_p50": 15.0, + "content_p95": 20.5, + "bitrate": 14860800, + "tier": 0, + "w": 1920, + "net": null + }, + { + "t": 10, + "fps": 56, + "mbps": 8.55, + "content_p50": 15.7, + "content_p95": 20.6, + "bitrate": 14860800, + "tier": 0, + "w": 1920, + "net": null + }, + { + "t": 11, + "fps": 58, + "mbps": 9.51, + "content_p50": 14.7, + "content_p95": 19.9, + "bitrate": 14860800, + "tier": 0, + "w": 1920, + "net": null + }, + { + "t": 12, + "fps": 57, + "mbps": 8.75, + "content_p50": 16.0, + "content_p95": 20.4, + "bitrate": 14860800, + "tier": 0, + "w": 1920, + "net": null + }, + { + "t": 13, + "fps": 58, + "mbps": 9.25, + "content_p50": 15.0, + "content_p95": 20.7, + "bitrate": 14860800, + "tier": 0, + "w": 1920, + "net": null + }, + { + "t": 14, + "fps": 57, + "mbps": 9.13, + "content_p50": 15.3, + "content_p95": 21.0, + "bitrate": 14860800, + "tier": 0, + "w": 1920, + "net": null + }, + { + "t": 15, + "fps": 7, + "mbps": 1.17, + "content_p50": 14.2, + "content_p95": 15.3, + "bitrate": 14860800, + "tier": 0, + "w": 1920, + "net": null + } + ], + "adapt": [], + "content_p50": 15.7, + "content_p95": 23.0, + "input_p50": null, + "input_p95": null, + "grades": { + "content_p50": "local", + "content_p95": "local", + "fps": "acceptable", + "late_pct": "acceptable", + "stall_max": "acceptable" + }, + "controller": { + "adapt": true, + "baseRtt": 1.25, + "ceiling": 14860800, + "fps": 60, + "inFlight": 0, + "scale": 1, + "slack": 41.666, + "target": 14860800, + "tier": 0 + }, + "events": [ + { + "t": 1.06, + "e": "down to 7430 kbit/s: queue 35 ms, held 4, oldest 32 ms, base 1 ms, sent 6282 got 4914 wants 11892" + } + ], + "source_fps": 56.8, + "cpu": { + "mac_agent_pct": 8.8, + "frame_viewer_pct": 74.8, + "frame_tailscaled_pct": 0.3, + "frame_sshd_pct": 1.2, + "frame_gamescope_pct": 10.5, + "frame_total_pct": 39.0 + }, + "viewer": "h264 software; ANGLE (Mesa, zink Vulkan 1.4(Turnip Adreno (TM) 750 (MESA_TURNIP)), OpenGL 4.6); raf 137 Hz", + "show_s": 1.16, + "panel": "valve.steam.desktopgame.2001968301", + "src": "separate:7914" + } + ] +} \ No newline at end of file diff --git a/bench/results/2026-09-28-1d05f57-usb2.json b/bench/results/2026-09-28-1d05f57-usb2.json new file mode 100644 index 0000000..88464f7 --- /dev/null +++ b/bench/results/2026-09-28-1d05f57-usb2.json @@ -0,0 +1,690 @@ +{ + "label": "usb2", + "date": "2026-09-28T21:17:48", + "commit": "1d05f57", + "config": { + "quality": "balanced", + "mode": "separate", + "net": "none", + "delay_ms": 0, + "buffer_ms": 250, + "host": "10.86.200.233", + "ssh_opts": [], + "encoder": "", + "duration_s": 15.0, + "browser_flags": [] + }, + "frame_build": "20260925.6191901", + "mac": "26.5.2", + "headset": "", + "scenarios": [ + { + "scenario": "test", + "frames_sent": 913, + "frames_drawn": 913, + "frames_shown": 856, + "duration_s": 15.2, + "stages_ms": { + "capture": { + "p50": 0.0, + "p95": 0.0, + "p99": 0.0, + "n": 913 + }, + "queue": { + "p50": 0.0, + "p95": 0.1, + "p99": 0.1, + "n": 913 + }, + "encode": { + "p50": 4.3, + "p95": 4.9, + "p99": 5.2, + "n": 913 + }, + "socket": { + "p50": 0.1, + "p95": 0.2, + "p99": 0.2, + "n": 913 + }, + "network": { + "p50": 0.9, + "p95": 1.2, + "p99": 1.7, + "n": 913 + }, + "decode": { + "p50": 1.1, + "p95": 2.5, + "p99": 3.8, + "n": 913 + }, + "draw": { + "p50": 0.3, + "p95": 0.8, + "p99": 1.2, + "n": 913 + }, + "present": { + "p50": 2.6, + "p95": 8.6, + "p99": 15.9, + "n": 856 + }, + "content": { + "p50": 6.9, + "p95": 8.4, + "p99": 9.6, + "n": 913 + }, + "content_shown": { + "p50": 9.7, + "p95": 15.8, + "p99": 23.1, + "n": 856 + } + }, + "fps": 60.0, + "fps_shown": 56.3, + "late_pct": 0.0, + "stall_max": 22.0, + "stalls_over_100ms": 0, + "mbps": 0.57, + "keyframes": 1, + "size": "1280x720", + "captured": 913, + "viewer_never_drawn": 0, + "input_ms": { + "p50": 16.9, + "p95": 24.1, + "p99": 26.1, + "n": 33 + }, + "input_shown_ms": { + "p50": 19.7, + "p95": 26.6, + "p99": 29.2, + "n": 31 + }, + "input_parts_ms": { + "uplink": { + "p50": 0.7, + "p95": 2.5, + "p99": 5.7, + "n": 33 + }, + "mac": { + "p50": 8.1, + "p95": 15.4, + "p99": 17.2, + "n": 33 + }, + "back": { + "p50": 7.3, + "p95": 8.3, + "p99": 8.9, + "n": 33 + } + }, + "inputs": { + "asked": 30, + "sent": 33, + "seen": 33 + }, + "timeline": [ + { + "t": 0, + "fps": 60, + "mbps": 0.49, + "content_p50": 7.1, + "content_p95": 8.7, + "bitrate": 5529600, + "tier": 0, + "w": 1280, + "net": null + }, + { + "t": 1, + "fps": 60, + "mbps": 0.47, + "content_p50": 7.0, + "content_p95": 8.3, + "bitrate": 5529600, + "tier": 0, + "w": 1280, + "net": null + }, + { + "t": 2, + "fps": 60, + "mbps": 0.48, + "content_p50": 6.9, + "content_p95": 8.4, + "bitrate": 5529600, + "tier": 0, + "w": 1280, + "net": null + }, + { + "t": 3, + "fps": 60, + "mbps": 0.48, + "content_p50": 7.0, + "content_p95": 9.1, + "bitrate": 5529600, + "tier": 0, + "w": 1280, + "net": null + }, + { + "t": 4, + "fps": 60, + "mbps": 0.5, + "content_p50": 6.8, + "content_p95": 8.5, + "bitrate": 5529600, + "tier": 0, + "w": 1280, + "net": null + }, + { + "t": 5, + "fps": 60, + "mbps": 0.67, + "content_p50": 7.0, + "content_p95": 8.2, + "bitrate": 5529600, + "tier": 0, + "w": 1280, + "net": null + }, + { + "t": 6, + "fps": 60, + "mbps": 0.59, + "content_p50": 7.0, + "content_p95": 8.2, + "bitrate": 5529600, + "tier": 0, + "w": 1280, + "net": null + }, + { + "t": 7, + "fps": 60, + "mbps": 0.63, + "content_p50": 6.7, + "content_p95": 7.5, + "bitrate": 5529600, + "tier": 0, + "w": 1280, + "net": null + }, + { + "t": 8, + "fps": 60, + "mbps": 0.62, + "content_p50": 6.9, + "content_p95": 8.2, + "bitrate": 5529600, + "tier": 0, + "w": 1280, + "net": null + }, + { + "t": 9, + "fps": 60, + "mbps": 0.64, + "content_p50": 6.8, + "content_p95": 8.0, + "bitrate": 5529600, + "tier": 0, + "w": 1280, + "net": null + }, + { + "t": 10, + "fps": 60, + "mbps": 0.67, + "content_p50": 6.8, + "content_p95": 8.3, + "bitrate": 5529600, + "tier": 0, + "w": 1280, + "net": null + }, + { + "t": 11, + "fps": 60, + "mbps": 0.62, + "content_p50": 6.7, + "content_p95": 7.9, + "bitrate": 5529600, + "tier": 0, + "w": 1280, + "net": null + }, + { + "t": 12, + "fps": 60, + "mbps": 0.59, + "content_p50": 6.8, + "content_p95": 7.9, + "bitrate": 5529600, + "tier": 0, + "w": 1280, + "net": null + }, + { + "t": 13, + "fps": 60, + "mbps": 0.57, + "content_p50": 6.7, + "content_p95": 8.3, + "bitrate": 5529600, + "tier": 0, + "w": 1280, + "net": null + }, + { + "t": 14, + "fps": 60, + "mbps": 0.58, + "content_p50": 7.0, + "content_p95": 8.7, + "bitrate": 5529600, + "tier": 0, + "w": 1280, + "net": null + }, + { + "t": 15, + "fps": 13, + "mbps": 0.13, + "content_p50": 6.4, + "content_p95": 7.3, + "bitrate": 5529600, + "tier": 0, + "w": 1280, + "net": null + } + ], + "adapt": [], + "content_p50": 6.9, + "content_p95": 8.4, + "input_p50": 16.9, + "input_p95": 24.1, + "grades": { + "input_replies": "local", + "content_p50": "local", + "content_p95": "local", + "input_p50": "local", + "input_p95": "local", + "fps": "local", + "late_pct": "local", + "stall_max": "local" + }, + "controller": { + "adapt": true, + "baseRtt": 0.709, + "ceiling": 5529600, + "fps": 60, + "inFlight": 0, + "scale": 1, + "slack": 41.666, + "target": 5529600, + "tier": 0 + }, + "events": [], + "source_fps": 60.1, + "cpu": { + "mac_agent_pct": 17.9, + "frame_viewer_pct": 51.9, + "frame_tailscaled_pct": 0.2, + "frame_sshd_pct": 1.1, + "frame_gamescope_pct": 9.6, + "frame_total_pct": 27.9 + }, + "viewer": "h264 software; ANGLE (Mesa, zink Vulkan 1.4(Turnip Adreno (TM) 750 (MESA_TURNIP)), OpenGL 4.6); raf 134 Hz", + "show_s": 1.15, + "panel": "valve.steam.desktopgame.2001639889", + "src": "test" + }, + { + "scenario": "scroll", + "frames_sent": 868, + "frames_drawn": 868, + "frames_shown": 868, + "duration_s": 15.2, + "stages_ms": { + "capture": { + "p50": -4.2, + "p95": 0.5, + "p99": 6.7, + "n": 868 + }, + "queue": { + "p50": 0.0, + "p95": 0.1, + "p99": 0.2, + "n": 868 + }, + "encode": { + "p50": 6.8, + "p95": 10.2, + "p99": 17.9, + "n": 868 + }, + "socket": { + "p50": 0.1, + "p95": 0.2, + "p99": 0.4, + "n": 868 + }, + "network": { + "p50": 1.5, + "p95": 2.3, + "p99": 7.6, + "n": 868 + }, + "decode": { + "p50": 5.9, + "p95": 10.2, + "p99": 20.3, + "n": 868 + }, + "draw": { + "p50": 0.7, + "p95": 1.4, + "p99": 2.1, + "n": 868 + }, + "present": { + "p50": 0.9, + "p95": 6.1, + "p99": 6.8, + "n": 868 + }, + "content": { + "p50": 15.3, + "p95": 23.5, + "p99": 53.1, + "n": 868 + }, + "content_shown": { + "p50": 17.7, + "p95": 25.6, + "p99": 57.5, + "n": 868 + } + }, + "fps": 57.2, + "fps_shown": 57.2, + "late_pct": 3.23, + "stall_max": 108.0, + "stalls_over_100ms": 1, + "mbps": 9.84, + "keyframes": 1, + "size": "1920x1290", + "captured": 870, + "viewer_never_drawn": 0, + "input_ms": { + "p50": 24.2, + "p95": 36.3, + "p99": 36.3, + "n": 6 + }, + "input_shown_ms": { + "p50": 24.8, + "p95": 38.5, + "p99": 38.5, + "n": 6 + }, + "input_parts_ms": { + "uplink": { + "p50": 2.0, + "p95": 5.4, + "p99": 5.4, + "n": 6 + }, + "mac": { + "p50": 7.5, + "p95": 15.8, + "p99": 15.8, + "n": 6 + }, + "back": { + "p50": 15.3, + "p95": 16.1, + "p99": 16.1, + "n": 6 + } + }, + "inputs": { + "asked": 0, + "sent": 6, + "seen": 6 + }, + "timeline": [ + { + "t": 0, + "fps": 53, + "mbps": 9.21, + "content_p50": 16.1, + "content_p95": 71.2, + "bitrate": 14860800, + "tier": 0, + "w": 1920, + "net": null + }, + { + "t": 1, + "fps": 57, + "mbps": 9.64, + "content_p50": 15.9, + "content_p95": 46.8, + "bitrate": 14860800, + "tier": 0, + "w": 1920, + "net": null + }, + { + "t": 2, + "fps": 58, + "mbps": 8.99, + "content_p50": 14.8, + "content_p95": 19.2, + "bitrate": 14860800, + "tier": 0, + "w": 1920, + "net": null + }, + { + "t": 3, + "fps": 57, + "mbps": 9.72, + "content_p50": 15.2, + "content_p95": 22.3, + "bitrate": 14860800, + "tier": 0, + "w": 1920, + "net": null + }, + { + "t": 4, + "fps": 58, + "mbps": 9.64, + "content_p50": 16.1, + "content_p95": 23.5, + "bitrate": 14860800, + "tier": 0, + "w": 1920, + "net": null + }, + { + "t": 5, + "fps": 57, + "mbps": 11.27, + "content_p50": 15.6, + "content_p95": 20.9, + "bitrate": 14860800, + "tier": 0, + "w": 1920, + "net": null + }, + { + "t": 6, + "fps": 58, + "mbps": 10.44, + "content_p50": 15.1, + "content_p95": 19.1, + "bitrate": 14860800, + "tier": 0, + "w": 1920, + "net": null + }, + { + "t": 7, + "fps": 57, + "mbps": 9.31, + "content_p50": 15.0, + "content_p95": 19.9, + "bitrate": 14860800, + "tier": 0, + "w": 1920, + "net": null + }, + { + "t": 8, + "fps": 58, + "mbps": 11.69, + "content_p50": 15.9, + "content_p95": 22.0, + "bitrate": 14860800, + "tier": 0, + "w": 1920, + "net": null + }, + { + "t": 9, + "fps": 58, + "mbps": 10.31, + "content_p50": 14.5, + "content_p95": 20.7, + "bitrate": 14860800, + "tier": 0, + "w": 1920, + "net": null + }, + { + "t": 10, + "fps": 57, + "mbps": 10.47, + "content_p50": 15.2, + "content_p95": 20.6, + "bitrate": 14860800, + "tier": 0, + "w": 1920, + "net": null + }, + { + "t": 11, + "fps": 58, + "mbps": 9.44, + "content_p50": 15.3, + "content_p95": 20.5, + "bitrate": 14860800, + "tier": 0, + "w": 1920, + "net": null + }, + { + "t": 12, + "fps": 57, + "mbps": 9.17, + "content_p50": 15.9, + "content_p95": 18.7, + "bitrate": 14860800, + "tier": 0, + "w": 1920, + "net": null + }, + { + "t": 13, + "fps": 58, + "mbps": 8.77, + "content_p50": 15.1, + "content_p95": 18.6, + "bitrate": 14860800, + "tier": 0, + "w": 1920, + "net": null + }, + { + "t": 14, + "fps": 58, + "mbps": 9.72, + "content_p50": 15.2, + "content_p95": 19.8, + "bitrate": 14860800, + "tier": 0, + "w": 1920, + "net": null + }, + { + "t": 15, + "fps": 9, + "mbps": 1.33, + "content_p50": 14.8, + "content_p95": 17.7, + "bitrate": 14860800, + "tier": 0, + "w": 1920, + "net": null + } + ], + "adapt": [], + "content_p50": 15.3, + "content_p95": 23.5, + "input_p50": 24.2, + "input_p95": 36.3, + "grades": { + "input_replies": "local", + "content_p50": "local", + "content_p95": "local", + "input_p50": "local", + "input_p95": "local", + "fps": "acceptable", + "late_pct": "acceptable", + "stall_max": "acceptable" + }, + "controller": { + "adapt": true, + "baseRtt": 1.375, + "ceiling": 14860800, + "fps": 60, + "inFlight": 1, + "scale": 1, + "slack": 41.666, + "target": 14860800, + "tier": 0 + }, + "events": [], + "source_fps": 57.2, + "cpu": { + "mac_agent_pct": 11.4, + "frame_viewer_pct": 83.5, + "frame_tailscaled_pct": 0.3, + "frame_sshd_pct": 1.5, + "frame_gamescope_pct": 9.7, + "frame_total_pct": 32.5 + }, + "viewer": "h264 software; ANGLE (Mesa, zink Vulkan 1.4(Turnip Adreno (TM) 750 (MESA_TURNIP)), OpenGL 4.6); raf 139 Hz", + "show_s": 1.15, + "panel": "valve.steam.desktopgame.2001786096", + "src": "separate:8187" + } + ] +} \ No newline at end of file diff --git a/bench/results/2026-09-28-1d05f57-wifi1.json b/bench/results/2026-09-28-1d05f57-wifi1.json new file mode 100644 index 0000000..ba818b0 --- /dev/null +++ b/bench/results/2026-09-28-1d05f57-wifi1.json @@ -0,0 +1,682 @@ +{ + "label": "wifi1", + "date": "2026-09-28T21:16:56", + "commit": "1d05f57", + "config": { + "quality": "balanced", + "mode": "separate", + "net": "none", + "delay_ms": 0, + "buffer_ms": 250, + "host": "frame", + "ssh_opts": [], + "encoder": "", + "duration_s": 15.0, + "browser_flags": [] + }, + "frame_build": "20260925.6191901", + "mac": "26.5.2", + "headset": "", + "scenarios": [ + { + "scenario": "test", + "frames_sent": 912, + "frames_drawn": 912, + "frames_shown": 611, + "duration_s": 15.2, + "stages_ms": { + "capture": { + "p50": 0.0, + "p95": 0.0, + "p99": 0.0, + "n": 912 + }, + "queue": { + "p50": 0.0, + "p95": 0.1, + "p99": 0.1, + "n": 912 + }, + "encode": { + "p50": 4.3, + "p95": 4.9, + "p99": 5.1, + "n": 912 + }, + "socket": { + "p50": 0.1, + "p95": 0.2, + "p99": 0.2, + "n": 912 + }, + "network": { + "p50": 4.0, + "p95": 5.3, + "p99": 7.8, + "n": 912 + }, + "decode": { + "p50": 1.1, + "p95": 2.8, + "p99": 4.0, + "n": 912 + }, + "draw": { + "p50": 0.4, + "p95": 0.8, + "p99": 1.2, + "n": 912 + }, + "present": { + "p50": 5.9, + "p95": 14.0, + "p99": 18.5, + "n": 611 + }, + "content": { + "p50": 10.1, + "p95": 12.3, + "p99": 13.9, + "n": 912 + }, + "content_shown": { + "p50": 16.7, + "p95": 23.6, + "p99": 28.3, + "n": 611 + } + }, + "fps": 60.0, + "fps_shown": 40.1, + "late_pct": 0.11, + "stall_max": 25.8, + "stalls_over_100ms": 0, + "mbps": 0.48, + "keyframes": 1, + "size": "1280x720", + "captured": 912, + "viewer_never_drawn": 0, + "input_ms": { + "p50": 26.4, + "p95": 34.2, + "p99": 53.5, + "n": 30 + }, + "input_shown_ms": { + "p50": 28.6, + "p95": 41.5, + "p99": 55.9, + "n": 18 + }, + "input_parts_ms": { + "uplink": { + "p50": 8.9, + "p95": 20.4, + "p99": 28.0, + "n": 30 + }, + "mac": { + "p50": 5.1, + "p95": 14.5, + "p99": 16.2, + "n": 30 + }, + "back": { + "p50": 10.1, + "p95": 13.7, + "p99": 13.8, + "n": 30 + } + }, + "inputs": { + "asked": 30, + "sent": 30, + "seen": 30 + }, + "timeline": [ + { + "t": 0, + "fps": 60, + "mbps": 0.51, + "content_p50": 10.3, + "content_p95": 11.9, + "bitrate": 5529600, + "tier": 0, + "w": 1280, + "net": null + }, + { + "t": 1, + "fps": 60, + "mbps": 0.47, + "content_p50": 10.5, + "content_p95": 12.1, + "bitrate": 5529600, + "tier": 0, + "w": 1280, + "net": null + }, + { + "t": 2, + "fps": 60, + "mbps": 0.49, + "content_p50": 10.1, + "content_p95": 12.8, + "bitrate": 5529600, + "tier": 0, + "w": 1280, + "net": null + }, + { + "t": 3, + "fps": 60, + "mbps": 0.48, + "content_p50": 9.9, + "content_p95": 11.6, + "bitrate": 5529600, + "tier": 0, + "w": 1280, + "net": null + }, + { + "t": 4, + "fps": 60, + "mbps": 0.47, + "content_p50": 9.7, + "content_p95": 11.8, + "bitrate": 5529600, + "tier": 0, + "w": 1280, + "net": null + }, + { + "t": 5, + "fps": 60, + "mbps": 0.59, + "content_p50": 10.2, + "content_p95": 11.7, + "bitrate": 5529600, + "tier": 0, + "w": 1280, + "net": null + }, + { + "t": 6, + "fps": 60, + "mbps": 0.47, + "content_p50": 10.2, + "content_p95": 12.3, + "bitrate": 5529600, + "tier": 0, + "w": 1280, + "net": null + }, + { + "t": 7, + "fps": 60, + "mbps": 0.47, + "content_p50": 9.7, + "content_p95": 12.1, + "bitrate": 5529600, + "tier": 0, + "w": 1280, + "net": null + }, + { + "t": 8, + "fps": 60, + "mbps": 0.47, + "content_p50": 10.4, + "content_p95": 13.1, + "bitrate": 5529600, + "tier": 0, + "w": 1280, + "net": null + }, + { + "t": 9, + "fps": 60, + "mbps": 0.47, + "content_p50": 9.9, + "content_p95": 12.7, + "bitrate": 5529600, + "tier": 0, + "w": 1280, + "net": null + }, + { + "t": 10, + "fps": 60, + "mbps": 0.47, + "content_p50": 9.8, + "content_p95": 12.4, + "bitrate": 5529600, + "tier": 0, + "w": 1280, + "net": null + }, + { + "t": 11, + "fps": 60, + "mbps": 0.46, + "content_p50": 10.3, + "content_p95": 12.7, + "bitrate": 5529600, + "tier": 0, + "w": 1280, + "net": null + }, + { + "t": 12, + "fps": 60, + "mbps": 0.49, + "content_p50": 10.2, + "content_p95": 12.0, + "bitrate": 5529600, + "tier": 0, + "w": 1280, + "net": null + }, + { + "t": 13, + "fps": 60, + "mbps": 0.48, + "content_p50": 10.0, + "content_p95": 11.3, + "bitrate": 5529600, + "tier": 0, + "w": 1280, + "net": null + }, + { + "t": 14, + "fps": 60, + "mbps": 0.46, + "content_p50": 10.2, + "content_p95": 12.3, + "bitrate": 5529600, + "tier": 0, + "w": 1280, + "net": null + }, + { + "t": 15, + "fps": 12, + "mbps": 0.1, + "content_p50": 10.7, + "content_p95": 11.4, + "bitrate": 5529600, + "tier": 0, + "w": 1280, + "net": null + } + ], + "adapt": [], + "content_p50": 10.1, + "content_p95": 12.3, + "input_p50": 26.4, + "input_p95": 34.2, + "grades": { + "input_replies": "local", + "content_p50": "local", + "content_p95": "local", + "input_p50": "local", + "input_p95": "local", + "fps": "local", + "late_pct": "local", + "stall_max": "local" + }, + "controller": { + "adapt": true, + "baseRtt": 4.958, + "ceiling": 5529600, + "fps": 60, + "inFlight": 1, + "scale": 1, + "slack": 47.417, + "target": 2764800, + "tier": 0 + }, + "events": [ + { + "t": 16.58, + "e": "down to 2764 kbit/s: queue 19 ms, held 6, oldest 210 ms, base 4 ms, sent 322 got 265 wants 459" + } + ], + "source_fps": 60.0, + "cpu": { + "mac_agent_pct": 15.7, + "frame_viewer_pct": 42.5, + "frame_tailscaled_pct": 5.5, + "frame_sshd_pct": 0.7, + "frame_gamescope_pct": 8.7, + "frame_total_pct": 26.1 + }, + "viewer": "h264 software; ANGLE (Mesa, zink Vulkan 1.4(Turnip Adreno (TM) 750 (MESA_TURNIP)), OpenGL 4.6); raf 136 Hz", + "show_s": 1.26, + "panel": "valve.steam.desktopgame.2001639889", + "src": "test" + }, + { + "scenario": "scroll", + "frames_sent": 852, + "frames_drawn": 852, + "frames_shown": 614, + "duration_s": 15.2, + "stages_ms": { + "capture": { + "p50": -4.4, + "p95": 2.6, + "p99": 4.2, + "n": 852 + }, + "queue": { + "p50": 0.0, + "p95": 0.1, + "p99": 0.1, + "n": 852 + }, + "encode": { + "p50": 6.7, + "p95": 9.8, + "p99": 16.7, + "n": 852 + }, + "socket": { + "p50": 0.1, + "p95": 0.2, + "p99": 0.2, + "n": 852 + }, + "network": { + "p50": 5.3, + "p95": 13.1, + "p99": 28.2, + "n": 852 + }, + "decode": { + "p50": 6.0, + "p95": 10.9, + "p99": 19.0, + "n": 852 + }, + "draw": { + "p50": 0.7, + "p95": 1.4, + "p99": 1.8, + "n": 852 + }, + "present": { + "p50": 4.1, + "p95": 16.2, + "p99": 20.6, + "n": 614 + }, + "content": { + "p50": 19.5, + "p95": 31.4, + "p99": 64.5, + "n": 852 + }, + "content_shown": { + "p50": 25.4, + "p95": 38.8, + "p99": 76.7, + "n": 614 + } + }, + "fps": 56.2, + "fps_shown": 40.5, + "late_pct": 4.69, + "stall_max": 253.7, + "stalls_over_100ms": 2, + "mbps": 9.02, + "keyframes": 1, + "size": "1920x1290", + "captured": 866, + "viewer_never_drawn": 0, + "input_ms": { + "n": 0 + }, + "input_shown_ms": { + "n": 0 + }, + "input_parts_ms": { + "uplink": { + "n": 0 + }, + "mac": { + "n": 0 + }, + "back": { + "n": 0 + } + }, + "inputs": { + "asked": 0, + "sent": 0, + "seen": 0 + }, + "timeline": [ + { + "t": 0, + "fps": 45, + "mbps": 7.77, + "content_p50": 19.0, + "content_p95": 163.1, + "bitrate": 14860800, + "tier": 0, + "w": 1920, + "net": null + }, + { + "t": 1, + "fps": 51, + "mbps": 6.54, + "content_p50": 19.4, + "content_p95": 107.0, + "bitrate": 7430400, + "tier": 0, + "w": 1920, + "net": null + }, + { + "t": 2, + "fps": 57, + "mbps": 8.64, + "content_p50": 19.9, + "content_p95": 31.8, + "bitrate": 10055362, + "tier": 0, + "w": 1920, + "net": null + }, + { + "t": 3, + "fps": 58, + "mbps": 9.46, + "content_p50": 19.1, + "content_p95": 24.9, + "bitrate": 14860800, + "tier": 0, + "w": 1920, + "net": null + }, + { + "t": 4, + "fps": 58, + "mbps": 9.11, + "content_p50": 19.4, + "content_p95": 22.9, + "bitrate": 14860800, + "tier": 0, + "w": 1920, + "net": null + }, + { + "t": 5, + "fps": 57, + "mbps": 9.18, + "content_p50": 19.9, + "content_p95": 25.3, + "bitrate": 14860800, + "tier": 0, + "w": 1920, + "net": null + }, + { + "t": 6, + "fps": 58, + "mbps": 11.64, + "content_p50": 19.8, + "content_p95": 49.6, + "bitrate": 14860800, + "tier": 0, + "w": 1920, + "net": null + }, + { + "t": 7, + "fps": 57, + "mbps": 9.12, + "content_p50": 20.5, + "content_p95": 31.1, + "bitrate": 14860800, + "tier": 0, + "w": 1920, + "net": null + }, + { + "t": 8, + "fps": 58, + "mbps": 9.29, + "content_p50": 19.5, + "content_p95": 25.7, + "bitrate": 14860800, + "tier": 0, + "w": 1920, + "net": null + }, + { + "t": 9, + "fps": 57, + "mbps": 9.43, + "content_p50": 19.8, + "content_p95": 49.6, + "bitrate": 14860800, + "tier": 0, + "w": 1920, + "net": null + }, + { + "t": 10, + "fps": 58, + "mbps": 8.59, + "content_p50": 19.2, + "content_p95": 24.8, + "bitrate": 14860800, + "tier": 0, + "w": 1920, + "net": null + }, + { + "t": 11, + "fps": 57, + "mbps": 9.42, + "content_p50": 19.9, + "content_p95": 27.1, + "bitrate": 14860800, + "tier": 0, + "w": 1920, + "net": null + }, + { + "t": 12, + "fps": 58, + "mbps": 9.0, + "content_p50": 20.6, + "content_p95": 31.2, + "bitrate": 14860800, + "tier": 0, + "w": 1920, + "net": null + }, + { + "t": 13, + "fps": 57, + "mbps": 8.84, + "content_p50": 19.6, + "content_p95": 25.3, + "bitrate": 14860800, + "tier": 0, + "w": 1920, + "net": null + }, + { + "t": 14, + "fps": 57, + "mbps": 9.17, + "content_p50": 19.3, + "content_p95": 27.8, + "bitrate": 14860800, + "tier": 0, + "w": 1920, + "net": null + }, + { + "t": 15, + "fps": 9, + "mbps": 1.52, + "content_p50": 19.3, + "content_p95": 30.0, + "bitrate": 14860800, + "tier": 0, + "w": 1920, + "net": null + } + ], + "adapt": [], + "content_p50": 19.5, + "content_p95": 31.4, + "input_p50": null, + "input_p95": null, + "grades": { + "content_p50": "local", + "content_p95": "local", + "fps": "acceptable", + "late_pct": "acceptable", + "stall_max": "bad" + }, + "controller": { + "adapt": true, + "baseRtt": 6.959, + "ceiling": 14860800, + "fps": 60, + "inFlight": 2, + "scale": 1, + "slack": 43.54, + "target": 14860800, + "tier": 0 + }, + "events": [ + { + "t": 1.09, + "e": "down to 7430 kbit/s: queue 131 ms, held 3, oldest 231 ms, base 6 ms, sent 4272 got 3724 wants 9321" + } + ], + "source_fps": 57.0, + "cpu": { + "mac_agent_pct": 8.5, + "frame_viewer_pct": 71.7, + "frame_tailscaled_pct": 8.4, + "frame_sshd_pct": 0.9, + "frame_gamescope_pct": 8.4, + "frame_total_pct": 30.1 + }, + "viewer": "h264 software; ANGLE (Mesa, zink Vulkan 1.4(Turnip Adreno (TM) 750 (MESA_TURNIP)), OpenGL 4.6); raf 139 Hz", + "show_s": 1.25, + "panel": "valve.steam.desktopgame.2001195625", + "src": "separate:8050" + } + ] +} \ No newline at end of file diff --git a/bench/results/2026-09-28-1d05f57-wifi2.json b/bench/results/2026-09-28-1d05f57-wifi2.json new file mode 100644 index 0000000..00f9504 --- /dev/null +++ b/bench/results/2026-09-28-1d05f57-wifi2.json @@ -0,0 +1,682 @@ +{ + "label": "wifi2", + "date": "2026-09-28T21:18:40", + "commit": "1d05f57", + "config": { + "quality": "balanced", + "mode": "separate", + "net": "none", + "delay_ms": 0, + "buffer_ms": 250, + "host": "frame", + "ssh_opts": [], + "encoder": "", + "duration_s": 15.0, + "browser_flags": [] + }, + "frame_build": "20260925.6191901", + "mac": "26.5.2", + "headset": "", + "scenarios": [ + { + "scenario": "test", + "frames_sent": 902, + "frames_drawn": 902, + "frames_shown": 604, + "duration_s": 15.2, + "stages_ms": { + "capture": { + "p50": 0.0, + "p95": 0.0, + "p99": 0.0, + "n": 902 + }, + "queue": { + "p50": 0.0, + "p95": 0.1, + "p99": 0.1, + "n": 902 + }, + "encode": { + "p50": 4.3, + "p95": 5.0, + "p99": 5.3, + "n": 902 + }, + "socket": { + "p50": 0.1, + "p95": 0.2, + "p99": 0.3, + "n": 902 + }, + "network": { + "p50": 3.8, + "p95": 5.3, + "p99": 8.0, + "n": 902 + }, + "decode": { + "p50": 1.1, + "p95": 2.8, + "p99": 3.8, + "n": 902 + }, + "draw": { + "p50": 0.3, + "p95": 0.8, + "p99": 1.2, + "n": 902 + }, + "present": { + "p50": 5.9, + "p95": 17.0, + "p99": 18.6, + "n": 604 + }, + "content": { + "p50": 9.8, + "p95": 12.1, + "p99": 14.4, + "n": 902 + }, + "content_shown": { + "p50": 15.2, + "p95": 27.0, + "p99": 28.4, + "n": 604 + } + }, + "fps": 59.3, + "fps_shown": 39.7, + "late_pct": 0.55, + "stall_max": 187.5, + "stalls_over_100ms": 1, + "mbps": 0.47, + "keyframes": 1, + "size": "1280x720", + "captured": 913, + "viewer_never_drawn": 0, + "input_ms": { + "p50": 27.8, + "p95": 34.9, + "p99": 206.9, + "n": 30 + }, + "input_shown_ms": { + "p50": 35.1, + "p95": 52.6, + "p99": 207.2, + "n": 24 + }, + "input_parts_ms": { + "uplink": { + "p50": 9.8, + "p95": 22.5, + "p99": 184.8, + "n": 30 + }, + "mac": { + "p50": 5.3, + "p95": 14.4, + "p99": 19.6, + "n": 30 + }, + "back": { + "p50": 9.8, + "p95": 13.4, + "p99": 13.9, + "n": 30 + } + }, + "inputs": { + "asked": 30, + "sent": 30, + "seen": 30 + }, + "timeline": [ + { + "t": 0, + "fps": 60, + "mbps": 0.48, + "content_p50": 9.3, + "content_p95": 11.2, + "bitrate": 5529600, + "tier": 0, + "w": 1280, + "net": null + }, + { + "t": 1, + "fps": 50, + "mbps": 0.39, + "content_p50": 9.1, + "content_p95": 14.4, + "bitrate": 2764800, + "tier": 0, + "w": 1280, + "net": null + }, + { + "t": 2, + "fps": 60, + "mbps": 0.48, + "content_p50": 9.2, + "content_p95": 11.8, + "bitrate": 2764800, + "tier": 0, + "w": 1280, + "net": null + }, + { + "t": 3, + "fps": 60, + "mbps": 0.48, + "content_p50": 9.4, + "content_p95": 10.5, + "bitrate": 2764800, + "tier": 0, + "w": 1280, + "net": null + }, + { + "t": 4, + "fps": 60, + "mbps": 0.48, + "content_p50": 9.5, + "content_p95": 12.5, + "bitrate": 3091280, + "tier": 0, + "w": 1280, + "net": null + }, + { + "t": 5, + "fps": 60, + "mbps": 0.47, + "content_p50": 10.0, + "content_p95": 12.8, + "bitrate": 4757991, + "tier": 0, + "w": 1280, + "net": null + }, + { + "t": 6, + "fps": 60, + "mbps": 0.57, + "content_p50": 9.5, + "content_p95": 11.7, + "bitrate": 5529600, + "tier": 0, + "w": 1280, + "net": null + }, + { + "t": 7, + "fps": 60, + "mbps": 0.47, + "content_p50": 9.8, + "content_p95": 11.3, + "bitrate": 5529600, + "tier": 0, + "w": 1280, + "net": null + }, + { + "t": 8, + "fps": 60, + "mbps": 0.47, + "content_p50": 10.2, + "content_p95": 12.2, + "bitrate": 5529600, + "tier": 0, + "w": 1280, + "net": null + }, + { + "t": 9, + "fps": 60, + "mbps": 0.47, + "content_p50": 10.0, + "content_p95": 13.2, + "bitrate": 5529600, + "tier": 0, + "w": 1280, + "net": null + }, + { + "t": 10, + "fps": 60, + "mbps": 0.47, + "content_p50": 10.2, + "content_p95": 12.5, + "bitrate": 5529600, + "tier": 0, + "w": 1280, + "net": null + }, + { + "t": 11, + "fps": 60, + "mbps": 0.45, + "content_p50": 9.9, + "content_p95": 11.6, + "bitrate": 5529600, + "tier": 0, + "w": 1280, + "net": null + }, + { + "t": 12, + "fps": 60, + "mbps": 0.46, + "content_p50": 10.0, + "content_p95": 11.6, + "bitrate": 5529600, + "tier": 0, + "w": 1280, + "net": null + }, + { + "t": 13, + "fps": 60, + "mbps": 0.47, + "content_p50": 10.3, + "content_p95": 12.3, + "bitrate": 5529600, + "tier": 0, + "w": 1280, + "net": null + }, + { + "t": 14, + "fps": 60, + "mbps": 0.48, + "content_p50": 9.8, + "content_p95": 11.6, + "bitrate": 5529600, + "tier": 0, + "w": 1280, + "net": null + }, + { + "t": 15, + "fps": 12, + "mbps": 0.1, + "content_p50": 9.3, + "content_p95": 11.5, + "bitrate": 5529600, + "tier": 0, + "w": 1280, + "net": null + } + ], + "adapt": [], + "content_p50": 9.8, + "content_p95": 12.1, + "input_p50": 27.8, + "input_p95": 34.9, + "grades": { + "input_replies": "local", + "content_p50": "local", + "content_p95": "local", + "input_p50": "local", + "input_p95": "local", + "fps": "local", + "late_pct": "local", + "stall_max": "acceptable" + }, + "controller": { + "adapt": true, + "baseRtt": 5.084, + "ceiling": 5529600, + "fps": 60, + "inFlight": 1, + "scale": 1, + "slack": 49.603, + "target": 5529600, + "tier": 0 + }, + "events": [ + { + "t": 1.77, + "e": "down to 2764 kbit/s: queue 23 ms, held 5, oldest 0 ms, base 5 ms, sent 315 got 315 wants 472" + } + ], + "source_fps": 60.1, + "cpu": { + "mac_agent_pct": 16.1, + "frame_viewer_pct": 40.9, + "frame_tailscaled_pct": 5.2, + "frame_sshd_pct": 0.7, + "frame_gamescope_pct": 8.4, + "frame_total_pct": 25.2 + }, + "viewer": "h264 software; ANGLE (Mesa, zink Vulkan 1.4(Turnip Adreno (TM) 750 (MESA_TURNIP)), OpenGL 4.6); raf 136 Hz", + "show_s": 1.27, + "panel": "valve.steam.desktopgame.2001639889", + "src": "test" + }, + { + "scenario": "scroll", + "frames_sent": 832, + "frames_drawn": 832, + "frames_shown": 602, + "duration_s": 15.1, + "stages_ms": { + "capture": { + "p50": -3.9, + "p95": 0.8, + "p99": 6.8, + "n": 832 + }, + "queue": { + "p50": 0.0, + "p95": 0.1, + "p99": 1.9, + "n": 832 + }, + "encode": { + "p50": 6.8, + "p95": 10.5, + "p99": 18.8, + "n": 832 + }, + "socket": { + "p50": 0.1, + "p95": 0.2, + "p99": 0.5, + "n": 832 + }, + "network": { + "p50": 5.8, + "p95": 18.7, + "p99": 56.7, + "n": 832 + }, + "decode": { + "p50": 5.9, + "p95": 11.7, + "p99": 26.0, + "n": 832 + }, + "draw": { + "p50": 0.7, + "p95": 1.4, + "p99": 1.7, + "n": 832 + }, + "present": { + "p50": 4.4, + "p95": 18.5, + "p99": 25.0, + "n": 602 + }, + "content": { + "p50": 20.2, + "p95": 36.9, + "p99": 90.7, + "n": 832 + }, + "content_shown": { + "p50": 26.4, + "p95": 45.4, + "p99": 101.0, + "n": 602 + } + }, + "fps": 54.9, + "fps_shown": 39.7, + "late_pct": 6.96, + "stall_max": 204.9, + "stalls_over_100ms": 2, + "mbps": 9.04, + "keyframes": 1, + "size": "1920x1290", + "captured": 852, + "viewer_never_drawn": 0, + "input_ms": { + "n": 0 + }, + "input_shown_ms": { + "n": 0 + }, + "input_parts_ms": { + "uplink": { + "n": 0 + }, + "mac": { + "n": 0 + }, + "back": { + "n": 0 + } + }, + "inputs": { + "asked": 0, + "sent": 0, + "seen": 0 + }, + "timeline": [ + { + "t": 0, + "fps": 49, + "mbps": 8.68, + "content_p50": 19.8, + "content_p95": 119.1, + "bitrate": 14860800, + "tier": 0, + "w": 1920, + "net": null + }, + { + "t": 1, + "fps": 47, + "mbps": 6.06, + "content_p50": 19.8, + "content_p95": 88.6, + "bitrate": 7430400, + "tier": 0, + "w": 1920, + "net": null + }, + { + "t": 2, + "fps": 52, + "mbps": 8.07, + "content_p50": 19.4, + "content_p95": 25.5, + "bitrate": 10055362, + "tier": 0, + "w": 1920, + "net": null + }, + { + "t": 3, + "fps": 56, + "mbps": 9.79, + "content_p50": 21.4, + "content_p95": 29.1, + "bitrate": 13549185, + "tier": 0, + "w": 1920, + "net": null + }, + { + "t": 4, + "fps": 57, + "mbps": 8.93, + "content_p50": 21.5, + "content_p95": 35.1, + "bitrate": 14860800, + "tier": 0, + "w": 1920, + "net": null + }, + { + "t": 5, + "fps": 57, + "mbps": 10.59, + "content_p50": 21.1, + "content_p95": 35.4, + "bitrate": 14860800, + "tier": 0, + "w": 1920, + "net": null + }, + { + "t": 6, + "fps": 56, + "mbps": 11.55, + "content_p50": 19.7, + "content_p95": 66.9, + "bitrate": 14860800, + "tier": 0, + "w": 1920, + "net": null + }, + { + "t": 7, + "fps": 57, + "mbps": 8.8, + "content_p50": 18.8, + "content_p95": 24.8, + "bitrate": 14860800, + "tier": 0, + "w": 1920, + "net": null + }, + { + "t": 8, + "fps": 57, + "mbps": 9.17, + "content_p50": 19.5, + "content_p95": 24.4, + "bitrate": 14860800, + "tier": 0, + "w": 1920, + "net": null + }, + { + "t": 9, + "fps": 57, + "mbps": 9.39, + "content_p50": 19.4, + "content_p95": 23.1, + "bitrate": 14860800, + "tier": 0, + "w": 1920, + "net": null + }, + { + "t": 10, + "fps": 57, + "mbps": 8.53, + "content_p50": 19.5, + "content_p95": 38.1, + "bitrate": 14860800, + "tier": 0, + "w": 1920, + "net": null + }, + { + "t": 11, + "fps": 56, + "mbps": 9.23, + "content_p50": 20.7, + "content_p95": 30.9, + "bitrate": 14860800, + "tier": 0, + "w": 1920, + "net": null + }, + { + "t": 12, + "fps": 53, + "mbps": 8.87, + "content_p50": 20.6, + "content_p95": 35.4, + "bitrate": 14860800, + "tier": 0, + "w": 1920, + "net": null + }, + { + "t": 13, + "fps": 57, + "mbps": 8.94, + "content_p50": 20.4, + "content_p95": 28.2, + "bitrate": 14860800, + "tier": 0, + "w": 1920, + "net": null + }, + { + "t": 14, + "fps": 57, + "mbps": 9.14, + "content_p50": 21.0, + "content_p95": 35.5, + "bitrate": 14860800, + "tier": 0, + "w": 1920, + "net": null + }, + { + "t": 15, + "fps": 7, + "mbps": 1.2, + "content_p50": 21.8, + "content_p95": 23.1, + "bitrate": 14860800, + "tier": 0, + "w": 1920, + "net": null + } + ], + "adapt": [], + "content_p50": 20.2, + "content_p95": 36.9, + "input_p50": null, + "input_p95": null, + "grades": { + "content_p50": "local", + "content_p95": "local", + "fps": "acceptable", + "late_pct": "bad", + "stall_max": "acceptable" + }, + "controller": { + "adapt": true, + "baseRtt": 6.833, + "ceiling": 14860800, + "fps": 60, + "inFlight": 2, + "scale": 1, + "slack": 44.791, + "target": 14860800, + "tier": 0 + }, + "events": [ + { + "t": 1.22, + "e": "down to 7430 kbit/s: queue 74 ms, held 7, oldest 235 ms, base 6 ms, sent 5436 got 4487 wants 11082" + } + ], + "source_fps": 56.4, + "cpu": { + "mac_agent_pct": 8.8, + "frame_viewer_pct": 69.5, + "frame_tailscaled_pct": 9.5, + "frame_sshd_pct": 0.8, + "frame_gamescope_pct": 8.4, + "frame_total_pct": 31.8 + }, + "viewer": "h264 software; ANGLE (Mesa, zink Vulkan 1.4(Turnip Adreno (TM) 750 (MESA_TURNIP)), OpenGL 4.6); raf 139 Hz", + "show_s": 1.25, + "panel": "valve.steam.desktopgame.2001116820", + "src": "separate:8327" + } + ] +} \ No newline at end of file diff --git a/bench/results/2026-09-28-39afb23-worn.json b/bench/results/2026-09-28-39afb23-worn.json new file mode 100644 index 0000000..ee0abec --- /dev/null +++ b/bench/results/2026-09-28-39afb23-worn.json @@ -0,0 +1,1180 @@ +{ + "label": "worn", + "date": "2026-09-28T22:01:33", + "commit": "39afb23", + "config": { + "quality": "balanced", + "mode": "separate", + "net": "none", + "delay_ms": 0, + "buffer_ms": 250, + "host": "frame", + "usb": false, + "ssh_opts": [], + "encoder": "", + "duration_s": 20.0, + "browser_flags": [] + }, + "frame_build": "20260925.6191901", + "mac": "26.5.2", + "headset": "", + "scenarios": [ + { + "scenario": "test", + "frames_sent": 1177, + "frames_drawn": 1177, + "frames_shown": 795, + "duration_s": 20.3, + "stages_ms": { + "capture": { + "p50": 0.0, + "p95": 0.0, + "p99": 0.0, + "n": 1177 + }, + "queue": { + "p50": 0.0, + "p95": 0.1, + "p99": 0.1, + "n": 1177 + }, + "encode": { + "p50": 4.4, + "p95": 5.3, + "p99": 5.7, + "n": 1177 + }, + "socket": { + "p50": 0.1, + "p95": 0.2, + "p99": 0.3, + "n": 1177 + }, + "network": { + "p50": 4.5, + "p95": 8.4, + "p99": 15.1, + "n": 1177 + }, + "decode": { + "p50": 1.0, + "p95": 2.5, + "p99": 4.0, + "n": 1177 + }, + "draw": { + "p50": 0.3, + "p95": 0.8, + "p99": 1.4, + "n": 1177 + }, + "present": { + "p50": 5.3, + "p95": 16.2, + "p99": 19.4, + "n": 795 + }, + "content": { + "p50": 10.8, + "p95": 15.3, + "p99": 24.4, + "n": 1177 + }, + "content_shown": { + "p50": 17.0, + "p95": 28.9, + "p99": 32.7, + "n": 795 + } + }, + "fps": 58.0, + "fps_shown": 39.2, + "late_pct": 1.02, + "stall_max": 262.4, + "stalls_over_100ms": 4, + "mbps": 0.45, + "keyframes": 2, + "size": "1280x720", + "captured": 1217, + "viewer_never_drawn": 0, + "input_ms": { + "p50": 25.7, + "p95": 34.4, + "p99": 47.3, + "n": 40 + }, + "input_shown_ms": { + "p50": 29.8, + "p95": 44.3, + "p99": 47.7, + "n": 23 + }, + "input_parts_ms": { + "uplink": { + "p50": 7.4, + "p95": 16.7, + "p99": 18.1, + "n": 40 + }, + "mac": { + "p50": 6.2, + "p95": 16.0, + "p99": 19.2, + "n": 40 + }, + "back": { + "p50": 11.4, + "p95": 15.3, + "p99": 22.9, + "n": 40 + } + }, + "inputs": { + "asked": 40, + "sent": 40, + "seen": 40 + }, + "timeline": [ + { + "t": 0, + "fps": 60, + "mbps": 0.48, + "content_p50": 9.4, + "content_p95": 13.1, + "bitrate": 5529600, + "tier": 0, + "w": 1280, + "net": null + }, + { + "t": 1, + "fps": 60, + "mbps": 0.46, + "content_p50": 9.1, + "content_p95": 10.7, + "bitrate": 5529600, + "tier": 0, + "w": 1280, + "net": null + }, + { + "t": 2, + "fps": 60, + "mbps": 0.46, + "content_p50": 9.2, + "content_p95": 11.9, + "bitrate": 5529600, + "tier": 0, + "w": 1280, + "net": null + }, + { + "t": 3, + "fps": 60, + "mbps": 0.46, + "content_p50": 9.1, + "content_p95": 10.9, + "bitrate": 5529600, + "tier": 0, + "w": 1280, + "net": null + }, + { + "t": 4, + "fps": 60, + "mbps": 0.45, + "content_p50": 9.1, + "content_p95": 11.7, + "bitrate": 5529600, + "tier": 0, + "w": 1280, + "net": null + }, + { + "t": 5, + "fps": 60, + "mbps": 0.45, + "content_p50": 9.2, + "content_p95": 11.6, + "bitrate": 5529600, + "tier": 0, + "w": 1280, + "net": null + }, + { + "t": 6, + "fps": 60, + "mbps": 0.56, + "content_p50": 10.3, + "content_p95": 13.5, + "bitrate": 5529600, + "tier": 0, + "w": 1280, + "net": null + }, + { + "t": 7, + "fps": 60, + "mbps": 0.44, + "content_p50": 10.2, + "content_p95": 13.0, + "bitrate": 5529600, + "tier": 0, + "w": 1280, + "net": null + }, + { + "t": 8, + "fps": 50, + "mbps": 0.38, + "content_p50": 10.4, + "content_p95": 136.5, + "bitrate": 5529600, + "tier": 0, + "w": 1280, + "net": null + }, + { + "t": 9, + "fps": 60, + "mbps": 0.45, + "content_p50": 9.9, + "content_p95": 12.8, + "bitrate": 2764800, + "tier": 0, + "w": 1280, + "net": null + }, + { + "t": 10, + "fps": 60, + "mbps": 0.44, + "content_p50": 9.9, + "content_p95": 12.7, + "bitrate": 2764800, + "tier": 0, + "w": 1280, + "net": null + }, + { + "t": 11, + "fps": 53, + "mbps": 0.39, + "content_p50": 10.2, + "content_p95": 16.6, + "bitrate": 2764800, + "tier": 0, + "w": 1280, + "net": null + }, + { + "t": 12, + "fps": 55, + "mbps": 0.41, + "content_p50": 10.9, + "content_p95": 16.1, + "bitrate": 1382400, + "tier": 0, + "w": 1280, + "net": null + }, + { + "t": 13, + "fps": 60, + "mbps": 0.44, + "content_p50": 12.6, + "content_p95": 15.7, + "bitrate": 1382400, + "tier": 0, + "w": 1280, + "net": null + }, + { + "t": 14, + "fps": 60, + "mbps": 0.42, + "content_p50": 12.8, + "content_p95": 15.4, + "bitrate": 1382400, + "tier": 0, + "w": 1280, + "net": null + }, + { + "t": 15, + "fps": 60, + "mbps": 0.44, + "content_p50": 12.7, + "content_p95": 15.3, + "bitrate": 2256021, + "tier": 0, + "w": 1280, + "net": null + }, + { + "t": 16, + "fps": 60, + "mbps": 0.57, + "content_p50": 13.0, + "content_p95": 16.4, + "bitrate": 3168263, + "tier": 0, + "w": 1280, + "net": null + }, + { + "t": 17, + "fps": 57, + "mbps": 0.43, + "content_p50": 12.8, + "content_p95": 16.7, + "bitrate": 4382456, + "tier": 0, + "w": 1280, + "net": null + }, + { + "t": 18, + "fps": 45, + "mbps": 0.35, + "content_p50": 13.0, + "content_p95": 15.9, + "bitrate": 2435350, + "tier": 0, + "w": 1280, + "net": null + }, + { + "t": 19, + "fps": 60, + "mbps": 0.44, + "content_p50": 13.4, + "content_p95": 15.4, + "bitrate": 2435350, + "tier": 0, + "w": 1280, + "net": null + }, + { + "t": 20, + "fps": 17, + "mbps": 0.12, + "content_p50": 13.7, + "content_p95": 16.1, + "bitrate": 2435350, + "tier": 0, + "w": 1280, + "net": null + } + ], + "adapt": [], + "content_p50": 10.8, + "content_p95": 15.3, + "input_p50": 25.7, + "input_p95": 34.4, + "grades": { + "input_replies": "local", + "content_p50": "local", + "content_p95": "local", + "input_p50": "local", + "input_p95": "local", + "fps": "local", + "late_pct": "acceptable", + "stall_max": "bad" + }, + "controller": { + "adapt": true, + "baseRtt": 5.542, + "ceiling": 5529600, + "fps": 60, + "inFlight": 1, + "scale": 1, + "slack": 50.978, + "target": 3797645, + "tier": 0 + }, + "events": [ + { + "t": 9.07, + "e": "down to 2764 kbit/s: queue 14 ms, held 3, oldest 0 ms, base 5 ms, sent 307 got 322 wants 452" + }, + { + "t": 12.07, + "e": "down to 1382 kbit/s: queue 18 ms, held 6, oldest 242 ms, base 5 ms, sent 295 got 268 wants 466" + }, + { + "t": 18.17, + "e": "down to 2435 kbit/s: queue 20 ms, held 6, oldest 274 ms, base 5 ms, sent 256 got 221 wants 452" + } + ], + "source_fps": 60.0, + "cpu": { + "mac_agent_pct": 16.9, + "frame_viewer_pct": 38.7, + "frame_tailscaled_pct": 5.0, + "frame_sshd_pct": 0.7, + "frame_gamescope_pct": 6.8, + "frame_total_pct": 24.9 + }, + "viewer": "h264 software; ANGLE (Mesa, zink Vulkan 1.4(Turnip Adreno (TM) 750 (MESA_TURNIP)), OpenGL 4.6); raf 141 Hz", + "show_s": 1.99, + "panel": "valve.steam.desktopgame.2001639889", + "src": "test", + "route": "network" + }, + { + "scenario": "scroll", + "frames_sent": 762, + "frames_drawn": 762, + "frames_shown": 651, + "duration_s": 20.2, + "stages_ms": { + "capture": { + "p50": -3.6, + "p95": 0.8, + "p99": 11.0, + "n": 762 + }, + "queue": { + "p50": 0.0, + "p95": 16.2, + "p99": 17.3, + "n": 762 + }, + "encode": { + "p50": 6.5, + "p95": 8.5, + "p99": 14.2, + "n": 762 + }, + "socket": { + "p50": 0.1, + "p95": 0.2, + "p99": 0.2, + "n": 762 + }, + "network": { + "p50": 5.2, + "p95": 115.6, + "p99": 159.6, + "n": 762 + }, + "decode": { + "p50": 5.5, + "p95": 18.4, + "p99": 27.7, + "n": 762 + }, + "draw": { + "p50": 0.6, + "p95": 1.4, + "p99": 1.9, + "n": 762 + }, + "present": { + "p50": 0.5, + "p95": 12.3, + "p99": 23.8, + "n": 651 + }, + "content": { + "p50": 22.2, + "p95": 141.0, + "p99": 175.6, + "n": 762 + }, + "content_shown": { + "p50": 24.6, + "p95": 101.5, + "p99": 177.7, + "n": 651 + } + }, + "fps": 37.7, + "fps_shown": 32.2, + "late_pct": 42.26, + "stall_max": 332.6, + "stalls_over_100ms": 18, + "mbps": 4.94, + "keyframes": 4, + "size": "1920x1290", + "captured": 1097, + "viewer_never_drawn": 0, + "input_ms": { + "n": 0 + }, + "input_shown_ms": { + "n": 0 + }, + "input_parts_ms": { + "uplink": { + "n": 0 + }, + "mac": { + "n": 0 + }, + "back": { + "n": 0 + } + }, + "inputs": { + "asked": 0, + "sent": 0, + "seen": 0 + }, + "timeline": [ + { + "t": 0, + "fps": 55, + "mbps": 9.56, + "content_p50": 19.6, + "content_p95": 26.3, + "bitrate": 14860800, + "tier": 0, + "w": 1920, + "net": null + }, + { + "t": 1, + "fps": 56, + "mbps": 8.8, + "content_p50": 18.9, + "content_p95": 25.6, + "bitrate": 14860800, + "tier": 0, + "w": 1920, + "net": null + }, + { + "t": 2, + "fps": 52, + "mbps": 8.96, + "content_p50": 18.6, + "content_p95": 34.3, + "bitrate": 14860800, + "tier": 0, + "w": 1920, + "net": null + }, + { + "t": 3, + "fps": 57, + "mbps": 9.35, + "content_p50": 18.6, + "content_p95": 24.4, + "bitrate": 14860800, + "tier": 0, + "w": 1920, + "net": null + }, + { + "t": 4, + "fps": 57, + "mbps": 9.8, + "content_p50": 19.6, + "content_p95": 28.2, + "bitrate": 14860800, + "tier": 0, + "w": 1920, + "net": null + }, + { + "t": 5, + "fps": 49, + "mbps": 10.39, + "content_p50": 31.3, + "content_p95": 135.6, + "bitrate": 14860800, + "tier": 0, + "w": 1920, + "net": null + }, + { + "t": 6, + "fps": 48, + "mbps": 8.29, + "content_p50": 53.6, + "content_p95": 175.6, + "bitrate": 8168400, + "tier": 0, + "w": 1920, + "net": null + }, + { + "t": 7, + "fps": 33, + "mbps": 2.07, + "content_p50": 109.8, + "content_p95": 172.8, + "bitrate": 2613888, + "tier": 0, + "w": 1920, + "net": null + }, + { + "t": 8, + "fps": 35, + "mbps": 1.17, + "content_p50": 111.0, + "content_p95": 177.0, + "bitrate": 1094296, + "tier": 4, + "w": 960, + "net": null + }, + { + "t": 9, + "fps": 22, + "mbps": 0.44, + "content_p50": 79.5, + "content_p95": 169.5, + "bitrate": 875436, + "tier": 4, + "w": 960, + "net": null + }, + { + "t": 10, + "fps": 31, + "mbps": 0.56, + "content_p50": 20.5, + "content_p95": 35.1, + "bitrate": 741574, + "tier": 4, + "w": 960, + "net": null + }, + { + "t": 11, + "fps": 21, + "mbps": 0.57, + "content_p50": 27.1, + "content_p95": 42.5, + "bitrate": 1002304, + "tier": 4, + "w": 960, + "net": null + }, + { + "t": 12, + "fps": 30, + "mbps": 0.78, + "content_p50": 22.2, + "content_p95": 29.3, + "bitrate": 801843, + "tier": 4, + "w": 960, + "net": null + }, + { + "t": 13, + "fps": 30, + "mbps": 1.01, + "content_p50": 24.2, + "content_p95": 87.7, + "bitrate": 1232751, + "tier": 4, + "w": 960, + "net": null + }, + { + "t": 14, + "fps": 30, + "mbps": 1.51, + "content_p50": 21.1, + "content_p95": 38.3, + "bitrate": 1806290, + "tier": 4, + "w": 960, + "net": null + }, + { + "t": 15, + "fps": 30, + "mbps": 2.34, + "content_p50": 21.7, + "content_p95": 41.9, + "bitrate": 2876638, + "tier": 4, + "w": 960, + "net": null + }, + { + "t": 16, + "fps": 30, + "mbps": 3.57, + "content_p50": 25.4, + "content_p95": 51.7, + "bitrate": 3994304, + "tier": 3, + "w": 1440, + "net": null + }, + { + "t": 17, + "fps": 30, + "mbps": 4.67, + "content_p50": 31.1, + "content_p95": 54.3, + "bitrate": 5481917, + "tier": 3, + "w": 1440, + "net": null + }, + { + "t": 18, + "fps": 30, + "mbps": 6.77, + "content_p50": 30.3, + "content_p95": 48.0, + "bitrate": 8258121, + "tier": 2, + "w": 1920, + "net": null + }, + { + "t": 19, + "fps": 30, + "mbps": 7.43, + "content_p50": 35.4, + "content_p95": 43.0, + "bitrate": 11157058, + "tier": 2, + "w": 1920, + "net": null + }, + { + "t": 20, + "fps": 6, + "mbps": 1.63, + "content_p50": 33.6, + "content_p95": 41.1, + "bitrate": 12322763, + "tier": 2, + "w": 1920, + "net": null + } + ], + "adapt": [], + "content_p50": 22.2, + "content_p95": 141.0, + "input_p50": null, + "input_p95": null, + "grades": { + "content_p50": "local", + "content_p95": "bad", + "fps": "bad", + "late_pct": "bad", + "stall_max": "bad" + }, + "controller": { + "adapt": true, + "baseRtt": 5.792, + "ceiling": 14860800, + "fps": 45, + "inFlight": 1, + "scale": 1, + "slack": 61.471, + "target": 14860800, + "tier": 1 + }, + "events": [ + { + "t": 6.13, + "e": "down to 11888 kbit/s: queue 56 ms, held 0, oldest 19 ms, base 6 ms, sent 13722 got 14074 wants 14249" + }, + { + "t": 6.73, + "e": "down to 8168 kbit/s: queue 72 ms, held 5, oldest 0 ms, base 6 ms, sent 8768 got 9076 wants 9996" + }, + { + "t": 7.03, + "e": "down to 4084 kbit/s: queue 25 ms, held 5, oldest 221 ms, base 6 ms, sent 5652 got 4017 wants 8949" + }, + { + "t": 7.33, + "e": "down to 3267 kbit/s: queue 364 ms, held 1, oldest 28 ms, base 6 ms, sent 3634 got 4790 wants 12946" + }, + { + "t": 7.73, + "e": "down to 2613 kbit/s: queue 90 ms, held 1, oldest 127 ms, base 6 ms, sent 3380 got 4111 wants 4188" + }, + { + "t": 8.13, + "e": "down to 1367 kbit/s: queue 87 ms, held 3, oldest 8 ms, base 6 ms, sent 1478 got 1519 wants 2178" + }, + { + "t": 8.53, + "e": "down to 1094 kbit/s: queue 122 ms, held 0, oldest 111 ms, base 6 ms, sent 1010 got 1247 wants 1347" + }, + { + "t": 8.73, + "e": "tier 4" + }, + { + "t": 9.13, + "e": "down to 875 kbit/s: queue 147 ms, held 2, oldest 63 ms, base 5 ms, sent 1121 got 1101 wants 1529" + }, + { + "t": 9.73, + "e": "down to 875 kbit/s: queue 50 ms, held 1, oldest 1 ms, base 5 ms, sent 494 got 458 wants 529" + }, + { + "t": 10.03, + "e": "down to 628 kbit/s: queue 72 ms, held 1, oldest 0 ms, base 5 ms, sent 663 got 698 wants 765" + }, + { + "t": 12.13, + "e": "down to 801 kbit/s: queue 42 ms, held 0, oldest 0 ms, base 5 ms, sent 918 got 918 wants 918" + }, + { + "t": 16.43, + "e": "tier 3" + }, + { + "t": 18.63, + "e": "tier 2" + }, + { + "t": 20.73, + "e": "tier 1" + } + ], + "source_fps": 54.3, + "cpu": { + "mac_agent_pct": 6.8, + "frame_viewer_pct": 45.0, + "frame_tailscaled_pct": 7.2, + "frame_sshd_pct": 0.7, + "frame_gamescope_pct": 5.6, + "frame_total_pct": 26.9 + }, + "viewer": "h264 software; ANGLE (Mesa, zink Vulkan 1.4(Turnip Adreno (TM) 750 (MESA_TURNIP)), OpenGL 4.6); raf 139 Hz", + "show_s": 1.3, + "panel": "valve.steam.desktopgame.2001614738", + "src": "separate:8635", + "route": "network" + }, + { + "scenario": "type", + "frames_sent": 242, + "frames_drawn": 242, + "frames_shown": 242, + "duration_s": 21.1, + "stages_ms": { + "capture": { + "p50": -5.7, + "p95": 1.4, + "p99": 6.9, + "n": 242 + }, + "queue": { + "p50": 0.0, + "p95": 0.0, + "p99": 0.1, + "n": 242 + }, + "encode": { + "p50": 6.5, + "p95": 8.3, + "p99": 16.3, + "n": 242 + }, + "socket": { + "p50": 0.1, + "p95": 0.2, + "p99": 0.3, + "n": 242 + }, + "network": { + "p50": 3.3, + "p95": 8.8, + "p99": 18.8, + "n": 242 + }, + "decode": { + "p50": 2.1, + "p95": 4.5, + "p99": 6.6, + "n": 242 + }, + "draw": { + "p50": 0.6, + "p95": 1.4, + "p99": 2.0, + "n": 242 + }, + "present": { + "p50": 0.6, + "p95": 5.1, + "p99": 6.8, + "n": 242 + }, + "content": { + "p50": 13.5, + "p95": 24.3, + "p99": 31.1, + "n": 242 + }, + "content_shown": { + "p50": 15.0, + "p95": 25.1, + "p99": 32.2, + "n": 242 + } + }, + "fps": 11.5, + "fps_shown": 11.5, + "late_pct": 37.45, + "stall_max": 6722.9, + "stalls_over_100ms": 50, + "mbps": 0.07, + "keyframes": 0, + "size": "1920x1290", + "captured": 242, + "viewer_never_drawn": 0, + "input_ms": { + "p50": 56.8, + "p95": 106.3, + "p99": 120.5, + "n": 62 + }, + "input_shown_ms": { + "p50": 57.3, + "p95": 107.1, + "p99": 121.5, + "n": 62 + }, + "input_parts_ms": { + "uplink": { + "p50": 6.7, + "p95": 36.8, + "p99": 38.6, + "n": 62 + }, + "mac": { + "p50": 30.7, + "p95": 66.7, + "p99": 93.7, + "n": 62 + }, + "back": { + "p50": 13.8, + "p95": 25.5, + "p99": 29.5, + "n": 62 + } + }, + "inputs": { + "asked": 65, + "sent": 66, + "seen": 62 + }, + "timeline": [ + { + "t": 0, + "fps": 31, + "mbps": 0.26, + "content_p50": 14.1, + "content_p95": 17.5, + "bitrate": 14860800, + "tier": 0, + "w": 1920, + "net": null + }, + { + "t": 1, + "fps": 22, + "mbps": 0.09, + "content_p50": 12.6, + "content_p95": 16.5, + "bitrate": 14860800, + "tier": 0, + "w": 1920, + "net": null + }, + { + "t": 2, + "fps": 14, + "mbps": 0.06, + "content_p50": 13.4, + "content_p95": 16.9, + "bitrate": 14860800, + "tier": 0, + "w": 1920, + "net": null + }, + { + "t": 3, + "fps": 5, + "mbps": 0.02, + "content_p50": 14.2, + "content_p95": 16.6, + "bitrate": 14860800, + "tier": 0, + "w": 1920, + "net": null + }, + { + "t": 4, + "fps": 8, + "mbps": 0.03, + "content_p50": 13.8, + "content_p95": 17.1, + "bitrate": 14860800, + "tier": 0, + "w": 1920, + "net": null + }, + { + "t": 5, + "fps": 12, + "mbps": 0.08, + "content_p50": 13.6, + "content_p95": 16.1, + "bitrate": 14860800, + "tier": 0, + "w": 1920, + "net": null + }, + { + "t": 6, + "fps": 10, + "mbps": 0.05, + "content_p50": 12.9, + "content_p95": 17.5, + "bitrate": 14860800, + "tier": 0, + "w": 1920, + "net": null + }, + { + "t": 7, + "fps": 12, + "mbps": 0.06, + "content_p50": 13.9, + "content_p95": 19.3, + "bitrate": 14860800, + "tier": 0, + "w": 1920, + "net": null + }, + { + "t": 8, + "fps": 32, + "mbps": 0.21, + "content_p50": 13.5, + "content_p95": 17.2, + "bitrate": 14860800, + "tier": 0, + "w": 1920, + "net": null + }, + { + "t": 9, + "fps": 51, + "mbps": 0.24, + "content_p50": 12.9, + "content_p95": 26.4, + "bitrate": 14860800, + "tier": 0, + "w": 1920, + "net": null + }, + { + "t": 10, + "fps": 19, + "mbps": 0.12, + "content_p50": 15.5, + "content_p95": 29.5, + "bitrate": 14860800, + "tier": 0, + "w": 1920, + "net": null + }, + { + "t": 11, + "fps": 9, + "mbps": 0.05, + "content_p50": 13.0, + "content_p95": 14.7, + "bitrate": 14860800, + "tier": 0, + "w": 1920, + "net": null + }, + { + "t": 12, + "fps": 8, + "mbps": 0.06, + "content_p50": 15.1, + "content_p95": 18.8, + "bitrate": 14860800, + "tier": 0, + "w": 1920, + "net": null + }, + { + "t": 13, + "fps": 6, + "mbps": 0.12, + "content_p50": 15.6, + "content_p95": 20.0, + "bitrate": 14860800, + "tier": 0, + "w": 1920, + "net": null + }, + { + "t": 14, + "fps": 3, + "mbps": 0.01, + "content_p50": 16.9, + "content_p95": 28.8, + "bitrate": 14860800, + "tier": 0, + "w": 1920, + "net": null + } + ], + "adapt": [], + "content_p50": 13.5, + "content_p95": 24.3, + "input_p50": 56.8, + "input_p95": 106.3, + "grades": { + "input_replies": "acceptable", + "content_p50": "local", + "content_p95": "local", + "input_p50": "acceptable", + "input_p95": "acceptable" + }, + "controller": { + "adapt": true, + "baseRtt": 5.958, + "ceiling": 14860800, + "fps": 60, + "inFlight": 0, + "scale": 1, + "slack": 41.666, + "target": 14860800, + "tier": 0 + }, + "events": [], + "source_fps": 11.5, + "cpu": { + "mac_agent_pct": 2.2, + "frame_viewer_pct": 11.7, + "frame_tailscaled_pct": 1.9, + "frame_sshd_pct": 0.0, + "frame_gamescope_pct": 3.5, + "frame_total_pct": 17.1 + }, + "viewer": "h264 software; ANGLE (Mesa, zink Vulkan 1.4(Turnip Adreno (TM) 750 (MESA_TURNIP)), OpenGL 4.6); raf 139 Hz", + "show_s": 1.35, + "panel": "valve.steam.desktopgame.2001525486", + "src": "separate:8785", + "route": "network" + } + ] +} \ No newline at end of file diff --git a/bench/results/2026-09-28-9e4dcdd-final.json b/bench/results/2026-09-28-9e4dcdd-final.json new file mode 100644 index 0000000..f0f657f --- /dev/null +++ b/bench/results/2026-09-28-9e4dcdd-final.json @@ -0,0 +1,1173 @@ +{ + "label": "final", + "date": "2026-09-28T21:02:06", + "commit": "9e4dcdd", + "config": { + "quality": "balanced", + "mode": "separate", + "net": "none", + "delay_ms": 0, + "buffer_ms": 250, + "host": "frame", + "ssh_opts": [], + "encoder": "", + "duration_s": 20.0, + "browser_flags": [] + }, + "frame_build": "20260925.6191901", + "mac": "26.5.2", + "headset": "", + "scenarios": [ + { + "scenario": "test", + "frames_sent": 1216, + "frames_drawn": 1216, + "frames_shown": 640, + "duration_s": 20.3, + "stages_ms": { + "capture": { + "p50": 0.0, + "p95": 0.0, + "p99": 0.0, + "n": 1216 + }, + "queue": { + "p50": 0.0, + "p95": 0.1, + "p99": 0.1, + "n": 1216 + }, + "encode": { + "p50": 4.5, + "p95": 5.2, + "p99": 5.6, + "n": 1216 + }, + "socket": { + "p50": 0.1, + "p95": 0.2, + "p99": 0.4, + "n": 1216 + }, + "network": { + "p50": 4.3, + "p95": 8.9, + "p99": 11.3, + "n": 1216 + }, + "decode": { + "p50": 1.1, + "p95": 2.8, + "p99": 3.6, + "n": 1216 + }, + "draw": { + "p50": 0.4, + "p95": 0.8, + "p99": 2.0, + "n": 1216 + }, + "present": { + "p50": 4.6, + "p95": 14.9, + "p99": 19.7, + "n": 640 + }, + "content": { + "p50": 10.5, + "p95": 16.7, + "p99": 18.9, + "n": 1216 + }, + "content_shown": { + "p50": 15.1, + "p95": 26.4, + "p99": 32.6, + "n": 640 + } + }, + "fps": 60.0, + "fps_shown": 31.6, + "late_pct": 0.66, + "stall_max": 66.0, + "stalls_over_100ms": 0, + "mbps": 0.47, + "keyframes": 2, + "size": "1280x720", + "captured": 1216, + "viewer_never_drawn": 0, + "input_ms": { + "p50": 29.6, + "p95": 36.3, + "p99": 53.4, + "n": 40 + }, + "input_shown_ms": { + "p50": 32.5, + "p95": 46.1, + "p99": 65.7, + "n": 21 + }, + "input_parts_ms": { + "uplink": { + "p50": 10.5, + "p95": 20.3, + "p99": 24.9, + "n": 40 + }, + "mac": { + "p50": 6.5, + "p95": 16.4, + "p99": 19.2, + "n": 40 + }, + "back": { + "p50": 11.9, + "p95": 16.4, + "p99": 17.1, + "n": 40 + } + }, + "inputs": { + "asked": 40, + "sent": 40, + "seen": 40 + }, + "timeline": [ + { + "t": 0, + "fps": 60, + "mbps": 0.49, + "content_p50": 9.5, + "content_p95": 10.6, + "bitrate": 5529600, + "tier": 0, + "w": 1280, + "net": null + }, + { + "t": 1, + "fps": 60, + "mbps": 0.46, + "content_p50": 9.2, + "content_p95": 10.9, + "bitrate": 5529600, + "tier": 0, + "w": 1280, + "net": null + }, + { + "t": 2, + "fps": 60, + "mbps": 0.46, + "content_p50": 9.4, + "content_p95": 10.6, + "bitrate": 5529600, + "tier": 0, + "w": 1280, + "net": null + }, + { + "t": 3, + "fps": 60, + "mbps": 0.47, + "content_p50": 9.7, + "content_p95": 24.0, + "bitrate": 5529600, + "tier": 0, + "w": 1280, + "net": null + }, + { + "t": 4, + "fps": 60, + "mbps": 0.47, + "content_p50": 9.8, + "content_p95": 11.5, + "bitrate": 5529600, + "tier": 0, + "w": 1280, + "net": null + }, + { + "t": 5, + "fps": 60, + "mbps": 0.46, + "content_p50": 9.4, + "content_p95": 11.2, + "bitrate": 5529600, + "tier": 0, + "w": 1280, + "net": null + }, + { + "t": 6, + "fps": 60, + "mbps": 0.57, + "content_p50": 9.5, + "content_p95": 11.1, + "bitrate": 5529600, + "tier": 0, + "w": 1280, + "net": null + }, + { + "t": 7, + "fps": 60, + "mbps": 0.46, + "content_p50": 9.5, + "content_p95": 10.9, + "bitrate": 5529600, + "tier": 0, + "w": 1280, + "net": null + }, + { + "t": 8, + "fps": 60, + "mbps": 0.45, + "content_p50": 9.0, + "content_p95": 10.2, + "bitrate": 5529600, + "tier": 0, + "w": 1280, + "net": null + }, + { + "t": 9, + "fps": 60, + "mbps": 0.47, + "content_p50": 9.5, + "content_p95": 11.3, + "bitrate": 5529600, + "tier": 0, + "w": 1280, + "net": null + }, + { + "t": 10, + "fps": 60, + "mbps": 0.46, + "content_p50": 9.9, + "content_p95": 11.2, + "bitrate": 5529600, + "tier": 0, + "w": 1280, + "net": null + }, + { + "t": 11, + "fps": 60, + "mbps": 0.46, + "content_p50": 10.3, + "content_p95": 12.8, + "bitrate": 5529600, + "tier": 0, + "w": 1280, + "net": null + }, + { + "t": 12, + "fps": 60, + "mbps": 0.46, + "content_p50": 11.3, + "content_p95": 14.5, + "bitrate": 5529600, + "tier": 0, + "w": 1280, + "net": null + }, + { + "t": 13, + "fps": 60, + "mbps": 0.45, + "content_p50": 13.9, + "content_p95": 16.6, + "bitrate": 5529600, + "tier": 0, + "w": 1280, + "net": null + }, + { + "t": 14, + "fps": 60, + "mbps": 0.47, + "content_p50": 14.2, + "content_p95": 16.2, + "bitrate": 5529600, + "tier": 0, + "w": 1280, + "net": null + }, + { + "t": 15, + "fps": 60, + "mbps": 0.45, + "content_p50": 16.6, + "content_p95": 18.6, + "bitrate": 5529600, + "tier": 0, + "w": 1280, + "net": null + }, + { + "t": 16, + "fps": 60, + "mbps": 0.55, + "content_p50": 14.7, + "content_p95": 17.1, + "bitrate": 5529600, + "tier": 0, + "w": 1280, + "net": null + }, + { + "t": 17, + "fps": 60, + "mbps": 0.45, + "content_p50": 14.8, + "content_p95": 18.0, + "bitrate": 5529600, + "tier": 0, + "w": 1280, + "net": null + }, + { + "t": 18, + "fps": 60, + "mbps": 0.44, + "content_p50": 14.3, + "content_p95": 17.3, + "bitrate": 5529600, + "tier": 0, + "w": 1280, + "net": null + }, + { + "t": 19, + "fps": 60, + "mbps": 0.47, + "content_p50": 13.8, + "content_p95": 16.7, + "bitrate": 5529600, + "tier": 0, + "w": 1280, + "net": null + }, + { + "t": 20, + "fps": 16, + "mbps": 0.13, + "content_p50": 15.0, + "content_p95": 16.6, + "bitrate": 5529600, + "tier": 0, + "w": 1280, + "net": null + } + ], + "adapt": [], + "content_p50": 10.5, + "content_p95": 16.7, + "input_p50": 29.6, + "input_p95": 36.3, + "grades": { + "input_replies": "local", + "content_p50": "local", + "content_p95": "local", + "input_p50": "local", + "input_p95": "local", + "fps": "local", + "late_pct": "local", + "stall_max": "local" + }, + "controller": { + "adapt": true, + "baseRtt": 5.625, + "ceiling": 5529600, + "fps": 60, + "inFlight": 2, + "scale": 1, + "slack": 49.79, + "target": 5529600, + "tier": 0 + }, + "events": [], + "source_fps": 59.9, + "cpu": { + "mac_agent_pct": 17.1, + "frame_viewer_pct": 38.5, + "frame_tailscaled_pct": 4.4, + "frame_sshd_pct": 0.8, + "frame_gamescope_pct": 12.3, + "frame_total_pct": 52.0 + }, + "viewer": "h264 software; ANGLE (Mesa, zink Vulkan 1.4(Turnip Adreno (TM) 750 (MESA_TURNIP)), OpenGL 4.6); raf 101 Hz", + "show_s": 1.85, + "panel": "valve.steam.desktopgame.2001639889", + "src": "test" + }, + { + "scenario": "scroll", + "frames_sent": 1130, + "frames_drawn": 1130, + "frames_shown": 800, + "duration_s": 20.2, + "stages_ms": { + "capture": { + "p50": -4.4, + "p95": 3.0, + "p99": 4.6, + "n": 1130 + }, + "queue": { + "p50": 0.0, + "p95": 0.1, + "p99": 0.1, + "n": 1130 + }, + "encode": { + "p50": 6.8, + "p95": 10.5, + "p99": 18.9, + "n": 1130 + }, + "socket": { + "p50": 0.1, + "p95": 0.2, + "p99": 0.3, + "n": 1130 + }, + "network": { + "p50": 5.5, + "p95": 8.6, + "p99": 18.9, + "n": 1130 + }, + "decode": { + "p50": 5.9, + "p95": 9.9, + "p99": 13.8, + "n": 1130 + }, + "draw": { + "p50": 0.8, + "p95": 1.5, + "p99": 2.2, + "n": 1130 + }, + "present": { + "p50": 4.8, + "p95": 15.8, + "p99": 21.3, + "n": 800 + }, + "content": { + "p50": 19.8, + "p95": 27.4, + "p99": 46.3, + "n": 1130 + }, + "content_shown": { + "p50": 25.3, + "p95": 37.8, + "p99": 50.1, + "n": 800 + } + }, + "fps": 55.9, + "fps_shown": 39.6, + "late_pct": 4.78, + "stall_max": 222.5, + "stalls_over_100ms": 2, + "mbps": 9.15, + "keyframes": 2, + "size": "1920x1290", + "captured": 1151, + "viewer_never_drawn": 0, + "input_ms": { + "n": 0 + }, + "input_shown_ms": { + "n": 0 + }, + "input_parts_ms": { + "uplink": { + "n": 0 + }, + "mac": { + "n": 0 + }, + "back": { + "n": 0 + } + }, + "inputs": { + "asked": 0, + "sent": 0, + "seen": 0 + }, + "timeline": [ + { + "t": 0, + "fps": 44, + "mbps": 7.88, + "content_p50": 19.9, + "content_p95": 48.0, + "bitrate": 14860800, + "tier": 0, + "w": 1920, + "net": null + }, + { + "t": 1, + "fps": 46, + "mbps": 5.9, + "content_p50": 18.1, + "content_p95": 104.3, + "bitrate": 7430400, + "tier": 0, + "w": 1920, + "net": null + }, + { + "t": 2, + "fps": 58, + "mbps": 8.45, + "content_p50": 19.6, + "content_p95": 31.6, + "bitrate": 10055362, + "tier": 0, + "w": 1920, + "net": null + }, + { + "t": 3, + "fps": 58, + "mbps": 9.54, + "content_p50": 19.0, + "content_p95": 24.7, + "bitrate": 14860800, + "tier": 0, + "w": 1920, + "net": null + }, + { + "t": 4, + "fps": 57, + "mbps": 9.33, + "content_p50": 19.2, + "content_p95": 25.1, + "bitrate": 14860800, + "tier": 0, + "w": 1920, + "net": null + }, + { + "t": 5, + "fps": 55, + "mbps": 10.11, + "content_p50": 19.3, + "content_p95": 26.5, + "bitrate": 14860800, + "tier": 0, + "w": 1920, + "net": null + }, + { + "t": 6, + "fps": 57, + "mbps": 11.68, + "content_p50": 21.0, + "content_p95": 46.3, + "bitrate": 14860800, + "tier": 0, + "w": 1920, + "net": null + }, + { + "t": 7, + "fps": 57, + "mbps": 8.76, + "content_p50": 20.6, + "content_p95": 29.2, + "bitrate": 14860800, + "tier": 0, + "w": 1920, + "net": null + }, + { + "t": 8, + "fps": 58, + "mbps": 9.21, + "content_p50": 18.9, + "content_p95": 25.8, + "bitrate": 14860800, + "tier": 0, + "w": 1920, + "net": null + }, + { + "t": 9, + "fps": 57, + "mbps": 9.4, + "content_p50": 19.5, + "content_p95": 26.0, + "bitrate": 14860800, + "tier": 0, + "w": 1920, + "net": null + }, + { + "t": 10, + "fps": 57, + "mbps": 8.51, + "content_p50": 19.4, + "content_p95": 24.2, + "bitrate": 14860800, + "tier": 0, + "w": 1920, + "net": null + }, + { + "t": 11, + "fps": 58, + "mbps": 9.46, + "content_p50": 19.3, + "content_p95": 24.4, + "bitrate": 14860800, + "tier": 0, + "w": 1920, + "net": null + }, + { + "t": 12, + "fps": 57, + "mbps": 8.96, + "content_p50": 20.2, + "content_p95": 25.3, + "bitrate": 14860800, + "tier": 0, + "w": 1920, + "net": null + }, + { + "t": 13, + "fps": 57, + "mbps": 8.85, + "content_p50": 20.4, + "content_p95": 26.2, + "bitrate": 14860800, + "tier": 0, + "w": 1920, + "net": null + }, + { + "t": 14, + "fps": 57, + "mbps": 9.16, + "content_p50": 19.6, + "content_p95": 26.8, + "bitrate": 14860800, + "tier": 0, + "w": 1920, + "net": null + }, + { + "t": 15, + "fps": 57, + "mbps": 8.81, + "content_p50": 19.3, + "content_p95": 25.1, + "bitrate": 14860800, + "tier": 0, + "w": 1920, + "net": null + }, + { + "t": 16, + "fps": 58, + "mbps": 11.7, + "content_p50": 21.1, + "content_p95": 37.8, + "bitrate": 14860800, + "tier": 0, + "w": 1920, + "net": null + }, + { + "t": 17, + "fps": 57, + "mbps": 9.27, + "content_p50": 20.2, + "content_p95": 24.6, + "bitrate": 14860800, + "tier": 0, + "w": 1920, + "net": null + }, + { + "t": 18, + "fps": 57, + "mbps": 8.77, + "content_p50": 20.0, + "content_p95": 27.4, + "bitrate": 14860800, + "tier": 0, + "w": 1920, + "net": null + }, + { + "t": 19, + "fps": 57, + "mbps": 9.16, + "content_p50": 20.2, + "content_p95": 26.9, + "bitrate": 14860800, + "tier": 0, + "w": 1920, + "net": null + }, + { + "t": 20, + "fps": 11, + "mbps": 1.8, + "content_p50": 19.9, + "content_p95": 23.7, + "bitrate": 14860800, + "tier": 0, + "w": 1920, + "net": null + } + ], + "adapt": [], + "content_p50": 19.8, + "content_p95": 27.4, + "input_p50": null, + "input_p95": null, + "grades": { + "content_p50": "local", + "content_p95": "local", + "fps": "acceptable", + "late_pct": "acceptable", + "stall_max": "acceptable" + }, + "controller": { + "adapt": true, + "baseRtt": 6.833, + "ceiling": 14860800, + "fps": 60, + "inFlight": 1, + "scale": 1, + "slack": 44.915, + "target": 14860800, + "tier": 0 + }, + "events": [ + { + "t": 1.03, + "e": "down to 7430 kbit/s: queue 149 ms, held 5, oldest 79 ms, base 6 ms, sent 5371 got 5599 wants 11155" + } + ], + "source_fps": 57.0, + "cpu": { + "mac_agent_pct": 9.0, + "frame_viewer_pct": 75.3, + "frame_tailscaled_pct": 9.9, + "frame_sshd_pct": 0.9, + "frame_gamescope_pct": 10.6, + "frame_total_pct": 43.2 + }, + "viewer": "h264 software; ANGLE (Mesa, zink Vulkan 1.4(Turnip Adreno (TM) 750 (MESA_TURNIP)), OpenGL 4.6); raf 31 Hz", + "show_s": 1.31, + "panel": "valve.steam.desktopgame.2001906569", + "src": "separate:7610" + }, + { + "scenario": "type", + "frames_sent": 96, + "frames_drawn": 96, + "frames_shown": 96, + "duration_s": 21.1, + "stages_ms": { + "capture": { + "p50": 0.3, + "p95": 5.5, + "p99": 6.2, + "n": 96 + }, + "queue": { + "p50": 0.0, + "p95": 0.0, + "p99": 0.1, + "n": 96 + }, + "encode": { + "p50": 6.9, + "p95": 10.7, + "p99": 15.1, + "n": 96 + }, + "socket": { + "p50": 0.1, + "p95": 0.2, + "p99": 0.2, + "n": 96 + }, + "network": { + "p50": 4.1, + "p95": 6.3, + "p99": 8.5, + "n": 96 + }, + "decode": { + "p50": 2.2, + "p95": 5.0, + "p99": 6.3, + "n": 96 + }, + "draw": { + "p50": 0.8, + "p95": 1.4, + "p99": 1.9, + "n": 96 + }, + "present": { + "p50": 0.6, + "p95": 1.2, + "p99": 4.5, + "n": 96 + }, + "content": { + "p50": 15.0, + "p95": 21.4, + "p99": 30.7, + "n": 96 + }, + "content_shown": { + "p50": 15.8, + "p95": 22.2, + "p99": 33.0, + "n": 96 + } + }, + "fps": 4.6, + "fps_shown": 4.6, + "late_pct": 82.47, + "stall_max": 1002.0, + "stalls_over_100ms": 74, + "mbps": 0.01, + "keyframes": 0, + "size": "1920x1290", + "captured": 96, + "viewer_never_drawn": 0, + "input_ms": { + "p50": 43.0, + "p95": 60.5, + "p99": 80.0, + "n": 66 + }, + "input_shown_ms": { + "p50": 43.8, + "p95": 61.5, + "p99": 80.7, + "n": 66 + }, + "input_parts_ms": { + "uplink": { + "p50": 4.3, + "p95": 6.9, + "p99": 32.6, + "n": 66 + }, + "mac": { + "p50": 23.5, + "p95": 34.8, + "p99": 39.6, + "n": 66 + }, + "back": { + "p50": 15.0, + "p95": 20.7, + "p99": 21.9, + "n": 66 + } + }, + "inputs": { + "asked": 65, + "sent": 66, + "seen": 66 + }, + "timeline": [ + { + "t": 0, + "fps": 17, + "mbps": 0.04, + "content_p50": 13.7, + "content_p95": 19.4, + "bitrate": 14860800, + "tier": 0, + "w": 1920, + "net": null + }, + { + "t": 1, + "fps": 9, + "mbps": 0.04, + "content_p50": 15.5, + "content_p95": 41.3, + "bitrate": 14860800, + "tier": 0, + "w": 1920, + "net": null + }, + { + "t": 2, + "fps": 7, + "mbps": 0.02, + "content_p50": 14.3, + "content_p95": 18.9, + "bitrate": 14860800, + "tier": 0, + "w": 1920, + "net": null + }, + { + "t": 3, + "fps": 5, + "mbps": 0.02, + "content_p50": 16.3, + "content_p95": 21.4, + "bitrate": 14860800, + "tier": 0, + "w": 1920, + "net": null + }, + { + "t": 4, + "fps": 5, + "mbps": 0.02, + "content_p50": 14.4, + "content_p95": 16.0, + "bitrate": 14860800, + "tier": 0, + "w": 1920, + "net": null + }, + { + "t": 5, + "fps": 5, + "mbps": 0.02, + "content_p50": 13.7, + "content_p95": 20.3, + "bitrate": 14860800, + "tier": 0, + "w": 1920, + "net": null + }, + { + "t": 6, + "fps": 5, + "mbps": 0.02, + "content_p50": 17.8, + "content_p95": 20.0, + "bitrate": 14860800, + "tier": 0, + "w": 1920, + "net": null + }, + { + "t": 7, + "fps": 5, + "mbps": 0.02, + "content_p50": 15.5, + "content_p95": 17.6, + "bitrate": 14860800, + "tier": 0, + "w": 1920, + "net": null + }, + { + "t": 8, + "fps": 5, + "mbps": 0.02, + "content_p50": 14.6, + "content_p95": 16.7, + "bitrate": 14860800, + "tier": 0, + "w": 1920, + "net": null + }, + { + "t": 9, + "fps": 5, + "mbps": 0.02, + "content_p50": 16.5, + "content_p95": 29.6, + "bitrate": 14860800, + "tier": 0, + "w": 1920, + "net": null + }, + { + "t": 10, + "fps": 5, + "mbps": 0.02, + "content_p50": 14.8, + "content_p95": 18.1, + "bitrate": 14860800, + "tier": 0, + "w": 1920, + "net": null + }, + { + "t": 11, + "fps": 5, + "mbps": 0.02, + "content_p50": 16.7, + "content_p95": 18.9, + "bitrate": 14860800, + "tier": 0, + "w": 1920, + "net": null + }, + { + "t": 12, + "fps": 2, + "mbps": 0.01, + "content_p50": 13.6, + "content_p95": 19.6, + "bitrate": 14860800, + "tier": 0, + "w": 1920, + "net": null + }, + { + "t": 13, + "fps": 1, + "mbps": 0.0, + "content_p50": 17.8, + "content_p95": 17.8, + "bitrate": 14860800, + "tier": 0, + "w": 1920, + "net": null + }, + { + "t": 14, + "fps": 2, + "mbps": 0.01, + "content_p50": 19.8, + "content_p95": 20.4, + "bitrate": 14860800, + "tier": 0, + "w": 1920, + "net": null + }, + { + "t": 15, + "fps": 1, + "mbps": 0.0, + "content_p50": 15.7, + "content_p95": 15.7, + "bitrate": 14860800, + "tier": 0, + "w": 1920, + "net": null + }, + { + "t": 16, + "fps": 4, + "mbps": 0.01, + "content_p50": 13.6, + "content_p95": 19.9, + "bitrate": 14860800, + "tier": 0, + "w": 1920, + "net": null + }, + { + "t": 17, + "fps": 3, + "mbps": 0.01, + "content_p50": 15.3, + "content_p95": 30.7, + "bitrate": 14860800, + "tier": 0, + "w": 1920, + "net": null + }, + { + "t": 18, + "fps": 2, + "mbps": 0.01, + "content_p50": 17.4, + "content_p95": 19.3, + "bitrate": 14860800, + "tier": 0, + "w": 1920, + "net": null + }, + { + "t": 19, + "fps": 2, + "mbps": 0.0, + "content_p50": 11.6, + "content_p95": 15.2, + "bitrate": 14860800, + "tier": 0, + "w": 1920, + "net": null + }, + { + "t": 20, + "fps": 1, + "mbps": 0.0, + "content_p50": 14.8, + "content_p95": 14.8, + "bitrate": 14860800, + "tier": 0, + "w": 1920, + "net": null + } + ], + "adapt": [], + "content_p50": 15.0, + "content_p95": 21.4, + "input_p50": 43.0, + "input_p95": 60.5, + "grades": { + "input_replies": "local", + "content_p50": "local", + "content_p95": "local", + "input_p50": "local", + "input_p95": "local" + }, + "controller": { + "adapt": true, + "baseRtt": 5.75, + "ceiling": 14860800, + "fps": 60, + "inFlight": 0, + "scale": 1, + "slack": 41.666, + "target": 14860800, + "tier": 0 + }, + "events": [], + "source_fps": 4.5, + "cpu": { + "mac_agent_pct": 1.4, + "frame_viewer_pct": 5.3, + "frame_tailscaled_pct": 1.5, + "frame_sshd_pct": 0.1, + "frame_gamescope_pct": 5.9, + "frame_total_pct": 28.4 + }, + "viewer": "h264 software; ANGLE (Mesa, zink Vulkan 1.4(Turnip Adreno (TM) 750 (MESA_TURNIP)), OpenGL 4.6); raf 139 Hz", + "show_s": 1.3, + "panel": "valve.steam.desktopgame.2001175832", + "src": "separate:7747" + } + ] +} \ No newline at end of file diff --git a/bench/results/2026-09-28-a3c6e5c-dirty-ab-adapt-clean.json b/bench/results/2026-09-28-a3c6e5c-dirty-ab-adapt-clean.json new file mode 100644 index 0000000..0b1f835 --- /dev/null +++ b/bench/results/2026-09-28-a3c6e5c-dirty-ab-adapt-clean.json @@ -0,0 +1,4211 @@ +{ + "label": "ab-adapt-clean", + "date": "2026-09-28T17:50:22", + "commit": "a3c6e5c+dirty", + "config": { + "quality": "balanced", + "mode": "separate", + "net": "none", + "delay_ms": 0, + "buffer_ms": 250, + "host": "frame", + "ssh_opts": [], + "encoder": "", + "duration_s": 15.0, + "browser_flags": [] + }, + "frame_build": "20260925.6191901", + "mac": "26.5.2", + "headset": ":35.258683 [Info] - 0 - entering standby", + "scenarios": [], + "arms": [ + "off:FRAME_MAC_VIEW_ADAPT=0", + "on:" + ], + "runs": { + "off": [ + [ + { + "scenario": "test", + "frames_sent": 944, + "frames_drawn": 944, + "frames_shown": 648, + "duration_s": 15.7, + "stages_ms": { + "capture": { + "p50": 0.0, + "p95": 0.0, + "p99": 0.0, + "n": 944 + }, + "queue": { + "p50": 0.0, + "p95": 0.1, + "p99": 0.1, + "n": 944 + }, + "encode": { + "p50": 4.3, + "p95": 5.0, + "p99": 5.2, + "n": 944 + }, + "socket": { + "p50": 0.1, + "p95": 0.2, + "p99": 0.2, + "n": 944 + }, + "network": { + "p50": 5.6, + "p95": 9.6, + "p99": 12.9, + "n": 944 + }, + "decode": { + "p50": 1.0, + "p95": 1.7, + "p99": 4.2, + "n": 944 + }, + "draw": { + "p50": 0.3, + "p95": 0.5, + "p99": 0.9, + "n": 944 + }, + "present": { + "p50": 4.5, + "p95": 15.8, + "p99": 18.4, + "n": 648 + }, + "content": { + "p50": 11.5, + "p95": 15.8, + "p99": 19.3, + "n": 944 + }, + "content_shown": { + "p50": 17.0, + "p95": 28.4, + "p99": 31.5, + "n": 648 + } + }, + "fps": 60.1, + "fps_shown": 41.2, + "late_pct": 0.95, + "stall_max": 68.8, + "stalls_over_100ms": 0, + "mbps": 0.48, + "keyframes": 1, + "size": "1280x720", + "captured": 1034, + "viewer_never_drawn": 0, + "input_ms": { + "p50": 28.8, + "p95": 38.1, + "p99": 45.1, + "n": 30 + }, + "input_shown_ms": { + "p50": 30.2, + "p95": 45.6, + "p99": 50.1, + "n": 19 + }, + "input_parts_ms": { + "uplink": { + "p50": 7.1, + "p95": 21.5, + "p99": 23.6, + "n": 30 + }, + "mac": { + "p50": 4.2, + "p95": 15.1, + "p99": 15.8, + "n": 30 + }, + "back": { + "p50": 12.2, + "p95": 16.3, + "p99": 16.9, + "n": 30 + } + }, + "inputs": { + "sent": 30, + "seen": 30 + }, + "timeline": [ + { + "t": 0, + "fps": 60, + "mbps": 0.51, + "content_p50": 10.9, + "content_p95": 16.7, + "bitrate": 5529600, + "tier": 0, + "w": 1280, + "net": null + }, + { + "t": 1, + "fps": 60, + "mbps": 0.49, + "content_p50": 10.2, + "content_p95": 15.2, + "bitrate": 5529600, + "tier": 0, + "w": 1280, + "net": null + }, + { + "t": 2, + "fps": 60, + "mbps": 0.5, + "content_p50": 10.2, + "content_p95": 13.4, + "bitrate": 5529600, + "tier": 0, + "w": 1280, + "net": null + }, + { + "t": 3, + "fps": 60, + "mbps": 0.51, + "content_p50": 10.3, + "content_p95": 15.9, + "bitrate": 5529600, + "tier": 0, + "w": 1280, + "net": null + }, + { + "t": 4, + "fps": 60, + "mbps": 0.5, + "content_p50": 10.4, + "content_p95": 14.7, + "bitrate": 5529600, + "tier": 0, + "w": 1280, + "net": null + }, + { + "t": 5, + "fps": 60, + "mbps": 0.49, + "content_p50": 10.7, + "content_p95": 14.9, + "bitrate": 5529600, + "tier": 0, + "w": 1280, + "net": null + }, + { + "t": 6, + "fps": 60, + "mbps": 0.59, + "content_p50": 10.7, + "content_p95": 13.8, + "bitrate": 5529600, + "tier": 0, + "w": 1280, + "net": null + }, + { + "t": 7, + "fps": 60, + "mbps": 0.48, + "content_p50": 10.1, + "content_p95": 11.9, + "bitrate": 5529600, + "tier": 0, + "w": 1280, + "net": null + }, + { + "t": 8, + "fps": 60, + "mbps": 0.46, + "content_p50": 10.4, + "content_p95": 12.7, + "bitrate": 5529600, + "tier": 0, + "w": 1280, + "net": null + }, + { + "t": 9, + "fps": 60, + "mbps": 0.45, + "content_p50": 10.6, + "content_p95": 14.8, + "bitrate": 5529600, + "tier": 0, + "w": 1280, + "net": null + }, + { + "t": 10, + "fps": 60, + "mbps": 0.44, + "content_p50": 13.8, + "content_p95": 16.4, + "bitrate": 5529600, + "tier": 0, + "w": 1280, + "net": null + }, + { + "t": 11, + "fps": 60, + "mbps": 0.44, + "content_p50": 14.3, + "content_p95": 18.1, + "bitrate": 5529600, + "tier": 0, + "w": 1280, + "net": null + }, + { + "t": 12, + "fps": 60, + "mbps": 0.45, + "content_p50": 13.7, + "content_p95": 15.7, + "bitrate": 5529600, + "tier": 0, + "w": 1280, + "net": null + }, + { + "t": 13, + "fps": 60, + "mbps": 0.45, + "content_p50": 14.1, + "content_p95": 17.3, + "bitrate": 5529600, + "tier": 0, + "w": 1280, + "net": null + }, + { + "t": 14, + "fps": 60, + "mbps": 0.45, + "content_p50": 12.1, + "content_p95": 18.5, + "bitrate": 5529600, + "tier": 0, + "w": 1280, + "net": null + }, + { + "t": 15, + "fps": 44, + "mbps": 0.32, + "content_p50": 12.1, + "content_p95": 13.4, + "bitrate": 5529600, + "tier": 0, + "w": 1280, + "net": null + } + ], + "adapt": [], + "content_p50": 11.5, + "content_p95": 15.8, + "input_p50": 28.8, + "input_p95": 38.1, + "grades": { + "content_p50": "local", + "content_p95": "local", + "input_p50": "local", + "input_p95": "local", + "fps": "local", + "late_pct": "local", + "stall_max": "local" + }, + "controller": { + "adapt": false, + "baseRtt": 5.833, + "ceiling": 5529600, + "fps": 60, + "inFlight": 2, + "scale": 1, + "target": 5529600, + "tier": 0 + }, + "events": [], + "source_fps": 65.9, + "cpu": { + "mac_agent_pct": 16.1, + "frame_viewer_pct": 66.4, + "frame_tailscaled_pct": 5.8, + "frame_sshd_pct": 0.6, + "frame_gamescope_pct": 28.1, + "frame_total_pct": 31.6 + }, + "viewer": "h264 software; ANGLE (Mesa, zink Vulkan 1.4(Turnip Adreno (TM) 750 (MESA_TURNIP)), OpenGL 4.6); raf 142 Hz", + "show_s": 1.52, + "panel": "valve.steam.desktopgame.2001639889", + "src": "test" + }, + { + "scenario": "scroll", + "frames_sent": 742, + "frames_drawn": 742, + "frames_shown": 603, + "duration_s": 15.8, + "stages_ms": { + "capture": { + "p50": -3.8, + "p95": 12.1, + "p99": 22.3, + "n": 742 + }, + "queue": { + "p50": 0.0, + "p95": 0.0, + "p99": 0.1, + "n": 742 + }, + "encode": { + "p50": 6.7, + "p95": 9.0, + "p99": 16.4, + "n": 742 + }, + "socket": { + "p50": 0.1, + "p95": 0.2, + "p99": 0.5, + "n": 742 + }, + "network": { + "p50": 8.1, + "p95": 24.9, + "p99": 61.3, + "n": 742 + }, + "decode": { + "p50": 6.0, + "p95": 12.4, + "p99": 26.2, + "n": 742 + }, + "draw": { + "p50": 0.6, + "p95": 1.2, + "p99": 1.9, + "n": 742 + }, + "present": { + "p50": 2.1, + "p95": 19.6, + "p99": 24.7, + "n": 603 + }, + "content": { + "p50": 19.5, + "p95": 44.4, + "p99": 118.6, + "n": 742 + }, + "content_shown": { + "p50": 25.0, + "p95": 51.3, + "p99": 125.2, + "n": 603 + } + }, + "fps": 47.1, + "fps_shown": 38.3, + "late_pct": 20.92, + "stall_max": 128.0, + "stalls_over_100ms": 2, + "mbps": 9.15, + "keyframes": 1, + "size": "1920x1290", + "captured": 815, + "viewer_never_drawn": 0, + "input_ms": { + "n": 0 + }, + "input_shown_ms": { + "n": 0 + }, + "input_parts_ms": { + "uplink": { + "n": 0 + }, + "mac": { + "n": 0 + }, + "back": { + "n": 0 + } + }, + "inputs": { + "sent": 0, + "seen": 0 + }, + "timeline": [ + { + "t": 0, + "fps": 40, + "mbps": 9.15, + "content_p50": 28.7, + "content_p95": 139.7, + "bitrate": 14860800, + "tier": 0, + "w": 1920, + "net": null + }, + { + "t": 1, + "fps": 36, + "mbps": 7.35, + "content_p50": 23.6, + "content_p95": 37.5, + "bitrate": 14860800, + "tier": 0, + "w": 1920, + "net": null + }, + { + "t": 2, + "fps": 44, + "mbps": 9.92, + "content_p50": 21.9, + "content_p95": 39.6, + "bitrate": 14860800, + "tier": 0, + "w": 1920, + "net": null + }, + { + "t": 3, + "fps": 53, + "mbps": 9.98, + "content_p50": 20.4, + "content_p95": 37.8, + "bitrate": 14860800, + "tier": 0, + "w": 1920, + "net": null + }, + { + "t": 4, + "fps": 45, + "mbps": 9.58, + "content_p50": 20.2, + "content_p95": 41.5, + "bitrate": 14860800, + "tier": 0, + "w": 1920, + "net": null + }, + { + "t": 5, + "fps": 53, + "mbps": 10.27, + "content_p50": 19.2, + "content_p95": 37.5, + "bitrate": 14860800, + "tier": 0, + "w": 1920, + "net": null + }, + { + "t": 6, + "fps": 48, + "mbps": 11.11, + "content_p50": 29.9, + "content_p95": 107.6, + "bitrate": 14860800, + "tier": 0, + "w": 1920, + "net": null + }, + { + "t": 7, + "fps": 44, + "mbps": 8.39, + "content_p50": 24.1, + "content_p95": 34.0, + "bitrate": 14860800, + "tier": 0, + "w": 1920, + "net": null + }, + { + "t": 8, + "fps": 49, + "mbps": 8.68, + "content_p50": 14.5, + "content_p95": 39.3, + "bitrate": 14860800, + "tier": 0, + "w": 1920, + "net": null + }, + { + "t": 9, + "fps": 43, + "mbps": 8.08, + "content_p50": 16.6, + "content_p95": 36.5, + "bitrate": 14860800, + "tier": 0, + "w": 1920, + "net": null + }, + { + "t": 10, + "fps": 53, + "mbps": 8.85, + "content_p50": 15.1, + "content_p95": 25.9, + "bitrate": 14860800, + "tier": 0, + "w": 1920, + "net": null + }, + { + "t": 11, + "fps": 50, + "mbps": 8.82, + "content_p50": 20.1, + "content_p95": 35.0, + "bitrate": 14860800, + "tier": 0, + "w": 1920, + "net": null + }, + { + "t": 12, + "fps": 54, + "mbps": 8.42, + "content_p50": 18.9, + "content_p95": 26.1, + "bitrate": 14860800, + "tier": 0, + "w": 1920, + "net": null + }, + { + "t": 13, + "fps": 52, + "mbps": 9.27, + "content_p50": 12.8, + "content_p95": 28.6, + "bitrate": 14860800, + "tier": 0, + "w": 1920, + "net": null + }, + { + "t": 14, + "fps": 47, + "mbps": 9.89, + "content_p50": 21.5, + "content_p95": 42.1, + "bitrate": 14860800, + "tier": 0, + "w": 1920, + "net": null + }, + { + "t": 15, + "fps": 31, + "mbps": 6.44, + "content_p50": 21.6, + "content_p95": 39.9, + "bitrate": 14860800, + "tier": 0, + "w": 1920, + "net": null + } + ], + "adapt": [], + "content_p50": 19.5, + "content_p95": 44.4, + "input_p50": null, + "input_p95": null, + "grades": { + "content_p50": "local", + "content_p95": "acceptable", + "fps": "acceptable", + "late_pct": "bad", + "stall_max": "acceptable" + }, + "controller": { + "adapt": false, + "baseRtt": 7.541, + "ceiling": 14860800, + "fps": 60, + "inFlight": 1, + "scale": 1, + "target": 14860800, + "tier": 0 + }, + "events": [], + "source_fps": 51.6, + "cpu": { + "mac_agent_pct": 7.1, + "frame_viewer_pct": 80.9, + "frame_tailscaled_pct": 7.9, + "frame_sshd_pct": 0.9, + "frame_gamescope_pct": 25.3, + "frame_total_pct": 31.1 + }, + "viewer": "h264 software; ANGLE (Mesa, zink Vulkan 1.4(Turnip Adreno (TM) 750 (MESA_TURNIP)), OpenGL 4.6); raf 142 Hz", + "show_s": 1.68, + "panel": "valve.steam.desktopgame.2001300498", + "src": "separate:13051" + } + ], + [ + { + "scenario": "test", + "frames_sent": 944, + "frames_drawn": 944, + "frames_shown": 608, + "duration_s": 15.7, + "stages_ms": { + "capture": { + "p50": 0.0, + "p95": 0.0, + "p99": 0.0, + "n": 944 + }, + "queue": { + "p50": 0.0, + "p95": 0.1, + "p99": 0.1, + "n": 944 + }, + "encode": { + "p50": 4.0, + "p95": 4.7, + "p99": 5.2, + "n": 944 + }, + "socket": { + "p50": 0.1, + "p95": 0.2, + "p99": 0.2, + "n": 944 + }, + "network": { + "p50": 4.8, + "p95": 40.4, + "p99": 74.2, + "n": 944 + }, + "decode": { + "p50": 1.1, + "p95": 5.4, + "p99": 10.8, + "n": 944 + }, + "draw": { + "p50": 0.3, + "p95": 0.5, + "p99": 0.9, + "n": 944 + }, + "present": { + "p50": 4.9, + "p95": 17.7, + "p99": 22.2, + "n": 608 + }, + "content": { + "p50": 10.5, + "p95": 52.3, + "p99": 82.1, + "n": 944 + }, + "content_shown": { + "p50": 16.0, + "p95": 33.4, + "p99": 82.8, + "n": 608 + } + }, + "fps": 60.1, + "fps_shown": 38.7, + "late_pct": 3.61, + "stall_max": 120.1, + "stalls_over_100ms": 2, + "mbps": 0.47, + "keyframes": 1, + "size": "1280x720", + "captured": 1034, + "viewer_never_drawn": 0, + "input_ms": { + "p50": 26.7, + "p95": 89.3, + "p99": 106.5, + "n": 30 + }, + "input_shown_ms": { + "p50": 29.4, + "p95": 44.4, + "p99": 106.9, + "n": 18 + }, + "input_parts_ms": { + "uplink": { + "p50": 9.2, + "p95": 38.3, + "p99": 70.5, + "n": 30 + }, + "mac": { + "p50": 5.2, + "p95": 14.1, + "p99": 18.3, + "n": 30 + }, + "back": { + "p50": 10.4, + "p95": 16.2, + "p99": 86.2, + "n": 30 + } + }, + "inputs": { + "sent": 30, + "seen": 30 + }, + "timeline": [ + { + "t": 0, + "fps": 61, + "mbps": 0.48, + "content_p50": 10.3, + "content_p95": 14.0, + "bitrate": 5529600, + "tier": 0, + "w": 1280, + "net": null + }, + { + "t": 1, + "fps": 59, + "mbps": 0.46, + "content_p50": 10.4, + "content_p95": 13.9, + "bitrate": 5529600, + "tier": 0, + "w": 1280, + "net": null + }, + { + "t": 2, + "fps": 60, + "mbps": 0.46, + "content_p50": 9.8, + "content_p95": 11.8, + "bitrate": 5529600, + "tier": 0, + "w": 1280, + "net": null + }, + { + "t": 3, + "fps": 60, + "mbps": 0.46, + "content_p50": 9.7, + "content_p95": 11.2, + "bitrate": 5529600, + "tier": 0, + "w": 1280, + "net": null + }, + { + "t": 4, + "fps": 61, + "mbps": 0.48, + "content_p50": 9.6, + "content_p95": 11.9, + "bitrate": 5529600, + "tier": 0, + "w": 1280, + "net": null + }, + { + "t": 5, + "fps": 59, + "mbps": 0.46, + "content_p50": 9.6, + "content_p95": 11.3, + "bitrate": 5529600, + "tier": 0, + "w": 1280, + "net": null + }, + { + "t": 6, + "fps": 61, + "mbps": 0.57, + "content_p50": 9.9, + "content_p95": 34.8, + "bitrate": 5529600, + "tier": 0, + "w": 1280, + "net": null + }, + { + "t": 7, + "fps": 59, + "mbps": 0.45, + "content_p50": 9.7, + "content_p95": 11.2, + "bitrate": 5529600, + "tier": 0, + "w": 1280, + "net": null + }, + { + "t": 8, + "fps": 61, + "mbps": 0.47, + "content_p50": 9.8, + "content_p95": 13.1, + "bitrate": 5529600, + "tier": 0, + "w": 1280, + "net": null + }, + { + "t": 9, + "fps": 59, + "mbps": 0.46, + "content_p50": 10.5, + "content_p95": 40.3, + "bitrate": 5529600, + "tier": 0, + "w": 1280, + "net": null + }, + { + "t": 10, + "fps": 60, + "mbps": 0.44, + "content_p50": 11.8, + "content_p95": 82.5, + "bitrate": 5529600, + "tier": 0, + "w": 1280, + "net": null + }, + { + "t": 11, + "fps": 60, + "mbps": 0.45, + "content_p50": 12.4, + "content_p95": 68.8, + "bitrate": 5529600, + "tier": 0, + "w": 1280, + "net": null + }, + { + "t": 12, + "fps": 61, + "mbps": 0.46, + "content_p50": 12.4, + "content_p95": 71.7, + "bitrate": 5529600, + "tier": 0, + "w": 1280, + "net": null + }, + { + "t": 13, + "fps": 59, + "mbps": 0.44, + "content_p50": 11.8, + "content_p95": 70.3, + "bitrate": 5529600, + "tier": 0, + "w": 1280, + "net": null + }, + { + "t": 14, + "fps": 61, + "mbps": 0.47, + "content_p50": 11.8, + "content_p95": 70.2, + "bitrate": 5529600, + "tier": 0, + "w": 1280, + "net": null + }, + { + "t": 15, + "fps": 43, + "mbps": 0.32, + "content_p50": 12.1, + "content_p95": 69.0, + "bitrate": 5529600, + "tier": 0, + "w": 1280, + "net": null + } + ], + "adapt": [], + "content_p50": 10.5, + "content_p95": 52.3, + "input_p50": 26.7, + "input_p95": 89.3, + "grades": { + "content_p50": "local", + "content_p95": "acceptable", + "input_p50": "local", + "input_p95": "acceptable", + "fps": "local", + "late_pct": "acceptable", + "stall_max": "acceptable" + }, + "controller": { + "adapt": false, + "baseRtt": 5.458, + "ceiling": 5529600, + "fps": 60, + "inFlight": 5, + "scale": 1, + "target": 5529600, + "tier": 0 + }, + "events": [], + "source_fps": 65.9, + "cpu": { + "mac_agent_pct": 14.0, + "frame_viewer_pct": 66.0, + "frame_tailscaled_pct": 5.1, + "frame_sshd_pct": 0.6, + "frame_gamescope_pct": 28.5, + "frame_total_pct": 32.3 + }, + "viewer": "h264 software; ANGLE (Mesa, zink Vulkan 1.4(Turnip Adreno (TM) 750 (MESA_TURNIP)), OpenGL 4.6); raf 135 Hz", + "show_s": 1.73, + "panel": "valve.steam.desktopgame.2001639889", + "src": "test" + }, + { + "scenario": "scroll", + "frames_sent": 823, + "frames_drawn": 823, + "frames_shown": 523, + "duration_s": 15.6, + "stages_ms": { + "capture": { + "p50": -4.4, + "p95": 5.1, + "p99": 12.6, + "n": 823 + }, + "queue": { + "p50": 0.0, + "p95": 0.0, + "p99": 0.1, + "n": 823 + }, + "encode": { + "p50": 6.6, + "p95": 7.8, + "p99": 10.5, + "n": 823 + }, + "socket": { + "p50": 0.1, + "p95": 0.2, + "p99": 0.2, + "n": 823 + }, + "network": { + "p50": 16.2, + "p95": 90.9, + "p99": 145.2, + "n": 823 + }, + "decode": { + "p50": 8.7, + "p95": 25.2, + "p99": 35.5, + "n": 823 + }, + "draw": { + "p50": 0.6, + "p95": 0.9, + "p99": 1.7, + "n": 823 + }, + "present": { + "p50": 1.9, + "p95": 20.9, + "p99": 26.5, + "n": 523 + }, + "content": { + "p50": 33.3, + "p95": 108.6, + "p99": 167.3, + "n": 823 + }, + "content_shown": { + "p50": 35.0, + "p95": 106.8, + "p99": 141.4, + "n": 523 + } + }, + "fps": 52.6, + "fps_shown": 33.4, + "late_pct": 14.84, + "stall_max": 232.0, + "stalls_over_100ms": 32, + "mbps": 9.35, + "keyframes": 1, + "size": "1920x1290", + "captured": 895, + "viewer_never_drawn": 0, + "input_ms": { + "n": 0 + }, + "input_shown_ms": { + "n": 0 + }, + "input_parts_ms": { + "uplink": { + "n": 0 + }, + "mac": { + "n": 0 + }, + "back": { + "n": 0 + } + }, + "inputs": { + "sent": 0, + "seen": 0 + }, + "timeline": [ + { + "t": 0, + "fps": 52, + "mbps": 8.9, + "content_p50": 30.2, + "content_p95": 85.5, + "bitrate": 14860800, + "tier": 0, + "w": 1920, + "net": null + }, + { + "t": 1, + "fps": 53, + "mbps": 9.82, + "content_p50": 32.6, + "content_p95": 106.3, + "bitrate": 14860800, + "tier": 0, + "w": 1920, + "net": null + }, + { + "t": 2, + "fps": 53, + "mbps": 9.45, + "content_p50": 31.9, + "content_p95": 96.5, + "bitrate": 14860800, + "tier": 0, + "w": 1920, + "net": null + }, + { + "t": 3, + "fps": 56, + "mbps": 9.42, + "content_p50": 37.6, + "content_p95": 99.2, + "bitrate": 14860800, + "tier": 0, + "w": 1920, + "net": null + }, + { + "t": 4, + "fps": 57, + "mbps": 9.26, + "content_p50": 38.2, + "content_p95": 97.2, + "bitrate": 14860800, + "tier": 0, + "w": 1920, + "net": null + }, + { + "t": 5, + "fps": 57, + "mbps": 11.43, + "content_p50": 56.3, + "content_p95": 144.3, + "bitrate": 14860800, + "tier": 0, + "w": 1920, + "net": null + }, + { + "t": 6, + "fps": 50, + "mbps": 8.55, + "content_p50": 27.0, + "content_p95": 104.0, + "bitrate": 14860800, + "tier": 0, + "w": 1920, + "net": null + }, + { + "t": 7, + "fps": 52, + "mbps": 9.63, + "content_p50": 37.1, + "content_p95": 99.2, + "bitrate": 14860800, + "tier": 0, + "w": 1920, + "net": null + }, + { + "t": 8, + "fps": 46, + "mbps": 8.79, + "content_p50": 31.2, + "content_p95": 115.5, + "bitrate": 14860800, + "tier": 0, + "w": 1920, + "net": null + }, + { + "t": 9, + "fps": 55, + "mbps": 9.43, + "content_p50": 29.4, + "content_p95": 97.9, + "bitrate": 14860800, + "tier": 0, + "w": 1920, + "net": null + }, + { + "t": 10, + "fps": 50, + "mbps": 9.29, + "content_p50": 29.8, + "content_p95": 93.0, + "bitrate": 14860800, + "tier": 0, + "w": 1920, + "net": null + }, + { + "t": 11, + "fps": 55, + "mbps": 9.78, + "content_p50": 27.0, + "content_p95": 98.0, + "bitrate": 14860800, + "tier": 0, + "w": 1920, + "net": null + }, + { + "t": 12, + "fps": 52, + "mbps": 9.19, + "content_p50": 53.0, + "content_p95": 116.2, + "bitrate": 14860800, + "tier": 0, + "w": 1920, + "net": null + }, + { + "t": 13, + "fps": 55, + "mbps": 9.33, + "content_p50": 45.5, + "content_p95": 102.3, + "bitrate": 14860800, + "tier": 0, + "w": 1920, + "net": null + }, + { + "t": 14, + "fps": 45, + "mbps": 7.78, + "content_p50": 28.6, + "content_p95": 102.3, + "bitrate": 14860800, + "tier": 0, + "w": 1920, + "net": null + }, + { + "t": 15, + "fps": 35, + "mbps": 6.17, + "content_p50": 62.5, + "content_p95": 211.6, + "bitrate": 14860800, + "tier": 0, + "w": 1920, + "net": null + } + ], + "adapt": [], + "content_p50": 33.3, + "content_p95": 108.6, + "input_p50": null, + "input_p95": null, + "grades": { + "content_p50": "acceptable", + "content_p95": "bad", + "fps": "acceptable", + "late_pct": "bad", + "stall_max": "acceptable" + }, + "controller": { + "adapt": false, + "baseRtt": 7.791, + "ceiling": 14860800, + "fps": 60, + "inFlight": 0, + "scale": 1, + "target": 14860800, + "tier": 0 + }, + "events": [], + "source_fps": 57.4, + "cpu": { + "mac_agent_pct": 7.6, + "frame_viewer_pct": 83.9, + "frame_tailscaled_pct": 7.8, + "frame_sshd_pct": 0.9, + "frame_gamescope_pct": 26.7, + "frame_total_pct": 32.6 + }, + "viewer": "h264 software; ANGLE (Mesa, zink Vulkan 1.4(Turnip Adreno (TM) 750 (MESA_TURNIP)), OpenGL 4.6); raf 135 Hz", + "show_s": 1.66, + "panel": "valve.steam.desktopgame.2001667691", + "src": "separate:13436" + } + ], + [ + { + "scenario": "test", + "frames_sent": 943, + "frames_drawn": 943, + "frames_shown": 631, + "duration_s": 15.7, + "stages_ms": { + "capture": { + "p50": 0.0, + "p95": 0.0, + "p99": 0.0, + "n": 943 + }, + "queue": { + "p50": 0.0, + "p95": 0.1, + "p99": 0.1, + "n": 943 + }, + "encode": { + "p50": 4.2, + "p95": 4.8, + "p99": 5.1, + "n": 943 + }, + "socket": { + "p50": 0.1, + "p95": 0.2, + "p99": 0.3, + "n": 943 + }, + "network": { + "p50": 6.4, + "p95": 23.1, + "p99": 64.7, + "n": 943 + }, + "decode": { + "p50": 1.0, + "p95": 2.8, + "p99": 6.3, + "n": 943 + }, + "draw": { + "p50": 0.3, + "p95": 0.5, + "p99": 0.9, + "n": 943 + }, + "present": { + "p50": 5.2, + "p95": 15.7, + "p99": 21.4, + "n": 631 + }, + "content": { + "p50": 12.2, + "p95": 29.7, + "p99": 72.2, + "n": 943 + }, + "content_shown": { + "p50": 18.4, + "p95": 32.7, + "p99": 75.5, + "n": 631 + } + }, + "fps": 60.1, + "fps_shown": 40.2, + "late_pct": 5.73, + "stall_max": 123.4, + "stalls_over_100ms": 1, + "mbps": 0.48, + "keyframes": 1, + "size": "1280x720", + "captured": 1034, + "viewer_never_drawn": 0, + "input_ms": { + "p50": 31.4, + "p95": 78.1, + "p99": 187.4, + "n": 30 + }, + "input_shown_ms": { + "p50": 38.8, + "p95": 56.9, + "p99": 62.9, + "n": 20 + }, + "input_parts_ms": { + "uplink": { + "p50": 11.4, + "p95": 40.8, + "p99": 170.5, + "n": 30 + }, + "mac": { + "p50": 7.0, + "p95": 15.0, + "p99": 16.1, + "n": 30 + }, + "back": { + "p50": 11.6, + "p95": 18.8, + "p99": 29.4, + "n": 30 + } + }, + "inputs": { + "sent": 30, + "seen": 30 + }, + "timeline": [ + { + "t": 0, + "fps": 60, + "mbps": 0.51, + "content_p50": 9.3, + "content_p95": 53.2, + "bitrate": 5529600, + "tier": 0, + "w": 1280, + "net": null + }, + { + "t": 1, + "fps": 60, + "mbps": 0.49, + "content_p50": 9.3, + "content_p95": 51.4, + "bitrate": 5529600, + "tier": 0, + "w": 1280, + "net": null + }, + { + "t": 2, + "fps": 60, + "mbps": 0.51, + "content_p50": 22.3, + "content_p95": 86.3, + "bitrate": 5529600, + "tier": 0, + "w": 1280, + "net": null + }, + { + "t": 3, + "fps": 60, + "mbps": 0.51, + "content_p50": 16.9, + "content_p95": 65.4, + "bitrate": 5529600, + "tier": 0, + "w": 1280, + "net": null + }, + { + "t": 4, + "fps": 60, + "mbps": 0.47, + "content_p50": 11.6, + "content_p95": 37.7, + "bitrate": 5529600, + "tier": 0, + "w": 1280, + "net": null + }, + { + "t": 5, + "fps": 60, + "mbps": 0.59, + "content_p50": 12.3, + "content_p95": 16.1, + "bitrate": 5529600, + "tier": 0, + "w": 1280, + "net": null + }, + { + "t": 6, + "fps": 60, + "mbps": 0.49, + "content_p50": 12.6, + "content_p95": 16.2, + "bitrate": 5529600, + "tier": 0, + "w": 1280, + "net": null + }, + { + "t": 7, + "fps": 60, + "mbps": 0.48, + "content_p50": 10.9, + "content_p95": 15.8, + "bitrate": 5529600, + "tier": 0, + "w": 1280, + "net": null + }, + { + "t": 8, + "fps": 60, + "mbps": 0.49, + "content_p50": 11.8, + "content_p95": 17.5, + "bitrate": 5529600, + "tier": 0, + "w": 1280, + "net": null + }, + { + "t": 9, + "fps": 60, + "mbps": 0.46, + "content_p50": 11.8, + "content_p95": 19.4, + "bitrate": 5529600, + "tier": 0, + "w": 1280, + "net": null + }, + { + "t": 10, + "fps": 60, + "mbps": 0.46, + "content_p50": 12.1, + "content_p95": 15.1, + "bitrate": 5529600, + "tier": 0, + "w": 1280, + "net": null + }, + { + "t": 11, + "fps": 60, + "mbps": 0.45, + "content_p50": 12.6, + "content_p95": 18.8, + "bitrate": 5529600, + "tier": 0, + "w": 1280, + "net": null + }, + { + "t": 12, + "fps": 60, + "mbps": 0.46, + "content_p50": 12.5, + "content_p95": 17.4, + "bitrate": 5529600, + "tier": 0, + "w": 1280, + "net": null + }, + { + "t": 13, + "fps": 60, + "mbps": 0.46, + "content_p50": 13.0, + "content_p95": 18.6, + "bitrate": 5529600, + "tier": 0, + "w": 1280, + "net": null + }, + { + "t": 14, + "fps": 60, + "mbps": 0.46, + "content_p50": 14.0, + "content_p95": 22.1, + "bitrate": 5529600, + "tier": 0, + "w": 1280, + "net": null + }, + { + "t": 15, + "fps": 43, + "mbps": 0.3, + "content_p50": 13.6, + "content_p95": 22.1, + "bitrate": 5529600, + "tier": 0, + "w": 1280, + "net": null + } + ], + "adapt": [], + "content_p50": 12.2, + "content_p95": 29.7, + "input_p50": 31.4, + "input_p95": 78.1, + "grades": { + "content_p50": "local", + "content_p95": "local", + "input_p50": "local", + "input_p95": "acceptable", + "fps": "local", + "late_pct": "bad", + "stall_max": "acceptable" + }, + "controller": { + "adapt": false, + "baseRtt": 5.125, + "ceiling": 5529600, + "fps": 60, + "inFlight": 2, + "scale": 1, + "target": 5529600, + "tier": 0 + }, + "events": [], + "source_fps": 65.9, + "cpu": { + "mac_agent_pct": 15.5, + "frame_viewer_pct": 67.2, + "frame_tailscaled_pct": 22.5, + "frame_sshd_pct": 2.6, + "frame_gamescope_pct": 28.6, + "frame_total_pct": 38.9 + }, + "viewer": "h264 software; ANGLE (Mesa, zink Vulkan 1.4(Turnip Adreno (TM) 750 (MESA_TURNIP)), OpenGL 4.6); raf 132 Hz", + "show_s": 1.52, + "panel": "valve.steam.desktopgame.2001639889", + "src": "test" + }, + { + "scenario": "scroll", + "frames_sent": 624, + "frames_drawn": 622, + "frames_shown": 522, + "duration_s": 15.7, + "stages_ms": { + "capture": { + "p50": -2.0, + "p95": 13.8, + "p99": 34.2, + "n": 624 + }, + "queue": { + "p50": 0.0, + "p95": 0.0, + "p99": 0.2, + "n": 624 + }, + "encode": { + "p50": 6.5, + "p95": 8.1, + "p99": 13.7, + "n": 624 + }, + "socket": { + "p50": 0.1, + "p95": 0.2, + "p99": 0.5, + "n": 624 + }, + "network": { + "p50": 7.5, + "p95": 29.1, + "p99": 83.6, + "n": 624 + }, + "decode": { + "p50": 7.6, + "p95": 83.1, + "p99": 242.3, + "n": 622 + }, + "draw": { + "p50": 0.8, + "p95": 2.2, + "p99": 5.1, + "n": 622 + }, + "present": { + "p50": 1.5, + "p95": 19.9, + "p99": 25.1, + "n": 522 + }, + "content": { + "p50": 25.3, + "p95": 110.6, + "p99": 326.3, + "n": 622 + }, + "content_shown": { + "p50": 30.3, + "p95": 91.4, + "p99": 143.8, + "n": 522 + } + }, + "fps": 39.5, + "fps_shown": 33.2, + "late_pct": 33.66, + "stall_max": 362.0, + "stalls_over_100ms": 5, + "mbps": 8.59, + "keyframes": 2, + "size": "1920x1290", + "captured": 678, + "viewer_never_drawn": 2, + "input_ms": { + "n": 0 + }, + "input_shown_ms": { + "n": 0 + }, + "input_parts_ms": { + "uplink": { + "n": 0 + }, + "mac": { + "n": 0 + }, + "back": { + "n": 0 + } + }, + "inputs": { + "sent": 0, + "seen": 0 + }, + "timeline": [ + { + "t": 0, + "fps": 42, + "mbps": 9.07, + "content_p50": 24.3, + "content_p95": 39.5, + "bitrate": 14860800, + "tier": 0, + "w": 1920, + "net": null + }, + { + "t": 1, + "fps": 42, + "mbps": 9.11, + "content_p50": 27.3, + "content_p95": 76.0, + "bitrate": 14860800, + "tier": 0, + "w": 1920, + "net": null + }, + { + "t": 2, + "fps": 43, + "mbps": 8.81, + "content_p50": 25.6, + "content_p95": 96.7, + "bitrate": 14860800, + "tier": 0, + "w": 1920, + "net": null + }, + { + "t": 3, + "fps": 44, + "mbps": 8.11, + "content_p50": 46.5, + "content_p95": 89.5, + "bitrate": 14860800, + "tier": 0, + "w": 1920, + "net": null + }, + { + "t": 4, + "fps": 37, + "mbps": 8.52, + "content_p50": 19.4, + "content_p95": 49.0, + "bitrate": 14860800, + "tier": 0, + "w": 1920, + "net": null + }, + { + "t": 5, + "fps": 43, + "mbps": 9.51, + "content_p50": 28.1, + "content_p95": 92.8, + "bitrate": 14860800, + "tier": 0, + "w": 1920, + "net": null + }, + { + "t": 6, + "fps": 35, + "mbps": 10.84, + "content_p50": 24.8, + "content_p95": 61.1, + "bitrate": 14860800, + "tier": 0, + "w": 1920, + "net": null + }, + { + "t": 7, + "fps": 25, + "mbps": 6.13, + "content_p50": 21.8, + "content_p95": 62.2, + "bitrate": 14860800, + "tier": 0, + "w": 1920, + "net": null + }, + { + "t": 8, + "fps": 52, + "mbps": 9.53, + "content_p50": 17.0, + "content_p95": 29.7, + "bitrate": 14860800, + "tier": 0, + "w": 1920, + "net": null + }, + { + "t": 9, + "fps": 37, + "mbps": 8.18, + "content_p50": 35.9, + "content_p95": 78.9, + "bitrate": 14860800, + "tier": 0, + "w": 1920, + "net": null + }, + { + "t": 10, + "fps": 21, + "mbps": 5.48, + "content_p50": 44.5, + "content_p95": 350.9, + "bitrate": 14860800, + "tier": 0, + "w": 1920, + "net": null + }, + { + "t": 11, + "fps": 34, + "mbps": 7.4, + "content_p50": 27.0, + "content_p95": 54.6, + "bitrate": 14860800, + "tier": 0, + "w": 1920, + "net": null + }, + { + "t": 12, + "fps": 54, + "mbps": 8.87, + "content_p50": 15.4, + "content_p95": 25.2, + "bitrate": 14860800, + "tier": 0, + "w": 1920, + "net": null + }, + { + "t": 13, + "fps": 43, + "mbps": 10.59, + "content_p50": 131.1, + "content_p95": 322.6, + "bitrate": 14860800, + "tier": 0, + "w": 1920, + "net": null + }, + { + "t": 14, + "fps": 43, + "mbps": 9.22, + "content_p50": 23.9, + "content_p95": 42.8, + "bitrate": 14860800, + "tier": 0, + "w": 1920, + "net": null + }, + { + "t": 15, + "fps": 27, + "mbps": 5.81, + "content_p50": 27.6, + "content_p95": 53.2, + "bitrate": 14860800, + "tier": 0, + "w": 1920, + "net": null + } + ], + "adapt": [], + "content_p50": 25.3, + "content_p95": 110.6, + "input_p50": null, + "input_p95": null, + "grades": { + "content_p50": "acceptable", + "content_p95": "bad", + "fps": "bad", + "late_pct": "bad", + "stall_max": "bad" + }, + "controller": { + "adapt": false, + "baseRtt": 7.583, + "ceiling": 14860800, + "fps": 60, + "inFlight": 0, + "scale": 1, + "target": 14860800, + "tier": 0 + }, + "events": [], + "source_fps": 43.2, + "cpu": { + "mac_agent_pct": 5.8, + "frame_viewer_pct": 86.7, + "frame_tailscaled_pct": 9.9, + "frame_sshd_pct": 1.0, + "frame_gamescope_pct": 25.0, + "frame_total_pct": 77.7 + }, + "viewer": "h264 software; ANGLE (Mesa, zink Vulkan 1.4(Turnip Adreno (TM) 750 (MESA_TURNIP)), OpenGL 4.6); raf 141 Hz", + "show_s": 1.54, + "panel": "valve.steam.desktopgame.2001796574", + "src": "separate:13568" + } + ] + ], + "on": [ + [ + { + "scenario": "test", + "frames_sent": 843, + "frames_drawn": 843, + "frames_shown": 580, + "duration_s": 15.7, + "stages_ms": { + "capture": { + "p50": 0.0, + "p95": 0.0, + "p99": 0.0, + "n": 843 + }, + "queue": { + "p50": 0.0, + "p95": 0.1, + "p99": 12.6, + "n": 843 + }, + "encode": { + "p50": 4.2, + "p95": 4.8, + "p99": 5.1, + "n": 843 + }, + "socket": { + "p50": 0.1, + "p95": 0.2, + "p99": 0.3, + "n": 843 + }, + "network": { + "p50": 4.8, + "p95": 66.0, + "p99": 82.6, + "n": 843 + }, + "decode": { + "p50": 1.1, + "p95": 4.1, + "p99": 6.3, + "n": 843 + }, + "draw": { + "p50": 0.3, + "p95": 0.6, + "p99": 1.0, + "n": 843 + }, + "present": { + "p50": 4.0, + "p95": 17.6, + "p99": 23.5, + "n": 580 + }, + "content": { + "p50": 10.9, + "p95": 75.0, + "p99": 91.6, + "n": 843 + }, + "content_shown": { + "p50": 16.5, + "p95": 81.2, + "p99": 93.9, + "n": 580 + } + }, + "fps": 53.6, + "fps_shown": 36.9, + "late_pct": 6.06, + "stall_max": 127.2, + "stalls_over_100ms": 2, + "mbps": 0.43, + "keyframes": 1, + "size": "1280x720", + "captured": 1037, + "viewer_never_drawn": 0, + "input_ms": { + "p50": 27.2, + "p95": 95.5, + "p99": 107.8, + "n": 30 + }, + "input_shown_ms": { + "p50": 32.1, + "p95": 95.9, + "p99": 108.5, + "n": 19 + }, + "input_parts_ms": { + "uplink": { + "p50": 8.0, + "p95": 44.4, + "p99": 44.8, + "n": 30 + }, + "mac": { + "p50": 5.8, + "p95": 13.7, + "p99": 17.9, + "n": 30 + }, + "back": { + "p50": 11.2, + "p95": 84.3, + "p99": 85.8, + "n": 30 + } + }, + "inputs": { + "sent": 30, + "seen": 30 + }, + "timeline": [ + { + "t": 0, + "fps": 60, + "mbps": 0.48, + "content_p50": 10.1, + "content_p95": 13.4, + "bitrate": 5529600, + "tier": 0, + "w": 1280, + "net": null + }, + { + "t": 1, + "fps": 60, + "mbps": 0.47, + "content_p50": 10.1, + "content_p95": 11.7, + "bitrate": 5529600, + "tier": 0, + "w": 1280, + "net": null + }, + { + "t": 2, + "fps": 60, + "mbps": 0.48, + "content_p50": 9.6, + "content_p95": 12.5, + "bitrate": 5529600, + "tier": 0, + "w": 1280, + "net": null + }, + { + "t": 3, + "fps": 60, + "mbps": 0.48, + "content_p50": 10.0, + "content_p95": 12.1, + "bitrate": 5529600, + "tier": 0, + "w": 1280, + "net": null + }, + { + "t": 4, + "fps": 59, + "mbps": 0.46, + "content_p50": 9.9, + "content_p95": 35.4, + "bitrate": 5529600, + "tier": 0, + "w": 1280, + "net": null + }, + { + "t": 5, + "fps": 54, + "mbps": 0.43, + "content_p50": 9.8, + "content_p95": 51.2, + "bitrate": 5529600, + "tier": 0, + "w": 1280, + "net": null + }, + { + "t": 6, + "fps": 52, + "mbps": 0.52, + "content_p50": 10.6, + "content_p95": 68.6, + "bitrate": 5529600, + "tier": 0, + "w": 1280, + "net": null + }, + { + "t": 7, + "fps": 50, + "mbps": 0.39, + "content_p50": 10.6, + "content_p95": 73.5, + "bitrate": 5529600, + "tier": 0, + "w": 1280, + "net": null + }, + { + "t": 8, + "fps": 47, + "mbps": 0.39, + "content_p50": 11.2, + "content_p95": 80.3, + "bitrate": 5529600, + "tier": 0, + "w": 1280, + "net": null + }, + { + "t": 9, + "fps": 52, + "mbps": 0.41, + "content_p50": 11.2, + "content_p95": 79.5, + "bitrate": 5529600, + "tier": 0, + "w": 1280, + "net": null + }, + { + "t": 10, + "fps": 52, + "mbps": 0.4, + "content_p50": 10.5, + "content_p95": 75.4, + "bitrate": 5529600, + "tier": 0, + "w": 1280, + "net": null + }, + { + "t": 11, + "fps": 51, + "mbps": 0.4, + "content_p50": 13.4, + "content_p95": 75.8, + "bitrate": 5529600, + "tier": 0, + "w": 1280, + "net": null + }, + { + "t": 12, + "fps": 50, + "mbps": 0.4, + "content_p50": 14.7, + "content_p95": 77.9, + "bitrate": 5529600, + "tier": 0, + "w": 1280, + "net": null + }, + { + "t": 13, + "fps": 45, + "mbps": 0.37, + "content_p50": 15.3, + "content_p95": 102.8, + "bitrate": 5529600, + "tier": 0, + "w": 1280, + "net": null + }, + { + "t": 14, + "fps": 52, + "mbps": 0.4, + "content_p50": 15.6, + "content_p95": 80.1, + "bitrate": 5529600, + "tier": 0, + "w": 1280, + "net": null + }, + { + "t": 15, + "fps": 39, + "mbps": 0.3, + "content_p50": 14.7, + "content_p95": 80.9, + "bitrate": 5529600, + "tier": 0, + "w": 1280, + "net": null + } + ], + "adapt": [], + "content_p50": 10.9, + "content_p95": 75.0, + "input_p50": 27.2, + "input_p95": 95.5, + "grades": { + "content_p50": "local", + "content_p95": "acceptable", + "input_p50": "local", + "input_p95": "acceptable", + "fps": "acceptable", + "late_pct": "bad", + "stall_max": "acceptable" + }, + "controller": { + "adapt": true, + "baseRtt": 5.875, + "ceiling": 5529600, + "fps": 60, + "inFlight": 0, + "scale": 1, + "target": 5529600, + "tier": 0 + }, + "events": [], + "source_fps": 66.1, + "cpu": { + "mac_agent_pct": 14.9, + "frame_viewer_pct": 58.7, + "frame_tailscaled_pct": 4.9, + "frame_sshd_pct": 0.6, + "frame_gamescope_pct": 25.8, + "frame_total_pct": 28.7 + }, + "viewer": "h264 software; ANGLE (Mesa, zink Vulkan 1.4(Turnip Adreno (TM) 750 (MESA_TURNIP)), OpenGL 4.6); raf 139 Hz", + "show_s": 1.32, + "panel": "valve.steam.desktopgame.2001639889", + "src": "test" + }, + { + "scenario": "scroll", + "frames_sent": 756, + "frames_drawn": 756, + "frames_shown": 606, + "duration_s": 15.6, + "stages_ms": { + "capture": { + "p50": -7.9, + "p95": 7.1, + "p99": 14.9, + "n": 756 + }, + "queue": { + "p50": 0.0, + "p95": 0.1, + "p99": 7.8, + "n": 756 + }, + "encode": { + "p50": 6.8, + "p95": 9.0, + "p99": 12.8, + "n": 756 + }, + "socket": { + "p50": 0.1, + "p95": 0.2, + "p99": 0.2, + "n": 756 + }, + "network": { + "p50": 7.1, + "p95": 27.0, + "p99": 45.8, + "n": 756 + }, + "decode": { + "p50": 5.9, + "p95": 11.9, + "p99": 20.9, + "n": 756 + }, + "draw": { + "p50": 0.6, + "p95": 0.8, + "p99": 1.6, + "n": 756 + }, + "present": { + "p50": 3.3, + "p95": 20.5, + "p99": 25.9, + "n": 606 + }, + "content": { + "p50": 16.6, + "p95": 45.7, + "p99": 64.8, + "n": 756 + }, + "content_shown": { + "p50": 22.8, + "p95": 50.9, + "p99": 68.4, + "n": 606 + } + }, + "fps": 48.4, + "fps_shown": 38.8, + "late_pct": 21.06, + "stall_max": 88.2, + "stalls_over_100ms": 0, + "mbps": 9.16, + "keyframes": 1, + "size": "1920x1290", + "captured": 841, + "viewer_never_drawn": 0, + "input_ms": { + "n": 0 + }, + "input_shown_ms": { + "n": 0 + }, + "input_parts_ms": { + "uplink": { + "n": 0 + }, + "mac": { + "n": 0 + }, + "back": { + "n": 0 + } + }, + "inputs": { + "sent": 0, + "seen": 0 + }, + "timeline": [ + { + "t": 0, + "fps": 50, + "mbps": 8.74, + "content_p50": 14.0, + "content_p95": 30.6, + "bitrate": 14860800, + "tier": 0, + "w": 1920, + "net": null + }, + { + "t": 1, + "fps": 45, + "mbps": 8.64, + "content_p50": 22.9, + "content_p95": 49.7, + "bitrate": 14860800, + "tier": 0, + "w": 1920, + "net": null + }, + { + "t": 2, + "fps": 47, + "mbps": 8.91, + "content_p50": 20.8, + "content_p95": 45.5, + "bitrate": 14860800, + "tier": 0, + "w": 1920, + "net": null + }, + { + "t": 3, + "fps": 46, + "mbps": 9.41, + "content_p50": 18.6, + "content_p95": 53.5, + "bitrate": 14860800, + "tier": 0, + "w": 1920, + "net": null + }, + { + "t": 4, + "fps": 49, + "mbps": 8.61, + "content_p50": 13.0, + "content_p95": 25.2, + "bitrate": 14860800, + "tier": 0, + "w": 1920, + "net": null + }, + { + "t": 5, + "fps": 53, + "mbps": 11.17, + "content_p50": 11.7, + "content_p95": 51.0, + "bitrate": 14860800, + "tier": 0, + "w": 1920, + "net": null + }, + { + "t": 6, + "fps": 51, + "mbps": 9.1, + "content_p50": 12.4, + "content_p95": 27.5, + "bitrate": 14860800, + "tier": 0, + "w": 1920, + "net": null + }, + { + "t": 7, + "fps": 48, + "mbps": 9.45, + "content_p50": 19.5, + "content_p95": 56.6, + "bitrate": 14860800, + "tier": 0, + "w": 1920, + "net": null + }, + { + "t": 8, + "fps": 55, + "mbps": 9.21, + "content_p50": 11.9, + "content_p95": 30.6, + "bitrate": 14860800, + "tier": 0, + "w": 1920, + "net": null + }, + { + "t": 9, + "fps": 50, + "mbps": 8.55, + "content_p50": 23.1, + "content_p95": 63.9, + "bitrate": 14860800, + "tier": 0, + "w": 1920, + "net": null + }, + { + "t": 10, + "fps": 49, + "mbps": 8.94, + "content_p50": 19.5, + "content_p95": 36.4, + "bitrate": 14860800, + "tier": 0, + "w": 1920, + "net": null + }, + { + "t": 11, + "fps": 54, + "mbps": 9.51, + "content_p50": 16.0, + "content_p95": 31.7, + "bitrate": 14860800, + "tier": 0, + "w": 1920, + "net": null + }, + { + "t": 12, + "fps": 41, + "mbps": 8.36, + "content_p50": 21.5, + "content_p95": 45.0, + "bitrate": 14860800, + "tier": 0, + "w": 1920, + "net": null + }, + { + "t": 13, + "fps": 37, + "mbps": 8.55, + "content_p50": 22.4, + "content_p95": 51.3, + "bitrate": 14860800, + "tier": 0, + "w": 1920, + "net": null + }, + { + "t": 14, + "fps": 48, + "mbps": 10.2, + "content_p50": 19.6, + "content_p95": 34.6, + "bitrate": 14860800, + "tier": 0, + "w": 1920, + "net": null + }, + { + "t": 15, + "fps": 33, + "mbps": 5.73, + "content_p50": 10.7, + "content_p95": 54.5, + "bitrate": 14860800, + "tier": 0, + "w": 1920, + "net": null + } + ], + "adapt": [], + "content_p50": 16.6, + "content_p95": 45.7, + "input_p50": null, + "input_p95": null, + "grades": { + "content_p50": "local", + "content_p95": "acceptable", + "fps": "acceptable", + "late_pct": "bad", + "stall_max": "local" + }, + "controller": { + "adapt": true, + "baseRtt": 7.041, + "ceiling": 14860800, + "fps": 60, + "inFlight": 0, + "scale": 1, + "target": 14860800, + "tier": 0 + }, + "events": [ + { + "t": 0.19, + "e": "tier 0" + } + ], + "source_fps": 53.9, + "cpu": { + "mac_agent_pct": 7.7, + "frame_viewer_pct": 83.2, + "frame_tailscaled_pct": 9.0, + "frame_sshd_pct": 1.0, + "frame_gamescope_pct": 25.4, + "frame_total_pct": 32.3 + }, + "viewer": "h264 software; ANGLE (Mesa, zink Vulkan 1.4(Turnip Adreno (TM) 750 (MESA_TURNIP)), OpenGL 4.6); raf 142 Hz", + "show_s": 1.54, + "panel": "valve.steam.desktopgame.2001527998", + "src": "separate:13175" + } + ], + [ + { + "scenario": "test", + "frames_sent": 932, + "frames_drawn": 932, + "frames_shown": 637, + "duration_s": 15.7, + "stages_ms": { + "capture": { + "p50": 0.0, + "p95": 0.0, + "p99": 0.0, + "n": 932 + }, + "queue": { + "p50": 0.0, + "p95": 0.1, + "p99": 0.2, + "n": 932 + }, + "encode": { + "p50": 4.2, + "p95": 4.9, + "p99": 5.2, + "n": 932 + }, + "socket": { + "p50": 0.1, + "p95": 0.2, + "p99": 0.2, + "n": 932 + }, + "network": { + "p50": 4.6, + "p95": 9.1, + "p99": 12.6, + "n": 932 + }, + "decode": { + "p50": 1.1, + "p95": 1.6, + "p99": 4.1, + "n": 932 + }, + "draw": { + "p50": 0.3, + "p95": 0.5, + "p99": 0.9, + "n": 932 + }, + "present": { + "p50": 5.0, + "p95": 15.8, + "p99": 19.3, + "n": 637 + }, + "content": { + "p50": 10.5, + "p95": 15.4, + "p99": 19.0, + "n": 932 + }, + "content_shown": { + "p50": 16.1, + "p95": 28.2, + "p99": 33.7, + "n": 637 + } + }, + "fps": 59.4, + "fps_shown": 40.6, + "late_pct": 0.75, + "stall_max": 126.0, + "stalls_over_100ms": 1, + "mbps": 0.48, + "keyframes": 1, + "size": "1280x720", + "captured": 1031, + "viewer_never_drawn": 0, + "input_ms": { + "p50": 24.6, + "p95": 39.8, + "p99": 45.9, + "n": 30 + }, + "input_shown_ms": { + "p50": 34.5, + "p95": 41.8, + "p99": 58.5, + "n": 24 + }, + "input_parts_ms": { + "uplink": { + "p50": 5.1, + "p95": 19.2, + "p99": 21.0, + "n": 30 + }, + "mac": { + "p50": 5.2, + "p95": 14.8, + "p99": 16.1, + "n": 30 + }, + "back": { + "p50": 10.7, + "p95": 14.8, + "p99": 14.9, + "n": 30 + } + }, + "inputs": { + "sent": 30, + "seen": 30 + }, + "timeline": [ + { + "t": 0, + "fps": 60, + "mbps": 0.49, + "content_p50": 9.2, + "content_p95": 10.9, + "bitrate": 5529600, + "tier": 0, + "w": 1280, + "net": null + }, + { + "t": 1, + "fps": 59, + "mbps": 0.45, + "content_p50": 9.5, + "content_p95": 12.3, + "bitrate": 5529600, + "tier": 0, + "w": 1280, + "net": null + }, + { + "t": 2, + "fps": 61, + "mbps": 0.47, + "content_p50": 9.8, + "content_p95": 11.5, + "bitrate": 5529600, + "tier": 0, + "w": 1280, + "net": null + }, + { + "t": 3, + "fps": 53, + "mbps": 0.45, + "content_p50": 10.0, + "content_p95": 13.8, + "bitrate": 5529600, + "tier": 0, + "w": 1280, + "net": null + }, + { + "t": 4, + "fps": 60, + "mbps": 0.48, + "content_p50": 9.8, + "content_p95": 12.4, + "bitrate": 5529600, + "tier": 0, + "w": 1280, + "net": null + }, + { + "t": 5, + "fps": 57, + "mbps": 0.47, + "content_p50": 10.7, + "content_p95": 14.3, + "bitrate": 5529600, + "tier": 0, + "w": 1280, + "net": null + }, + { + "t": 6, + "fps": 60, + "mbps": 0.58, + "content_p50": 10.3, + "content_p95": 12.5, + "bitrate": 5529600, + "tier": 0, + "w": 1280, + "net": null + }, + { + "t": 7, + "fps": 60, + "mbps": 0.49, + "content_p50": 9.8, + "content_p95": 12.4, + "bitrate": 5529600, + "tier": 0, + "w": 1280, + "net": null + }, + { + "t": 8, + "fps": 60, + "mbps": 0.49, + "content_p50": 9.9, + "content_p95": 12.6, + "bitrate": 5529600, + "tier": 0, + "w": 1280, + "net": null + }, + { + "t": 9, + "fps": 59, + "mbps": 0.45, + "content_p50": 10.1, + "content_p95": 12.4, + "bitrate": 5529600, + "tier": 0, + "w": 1280, + "net": null + }, + { + "t": 10, + "fps": 61, + "mbps": 0.48, + "content_p50": 10.2, + "content_p95": 12.5, + "bitrate": 5529600, + "tier": 0, + "w": 1280, + "net": null + }, + { + "t": 11, + "fps": 59, + "mbps": 0.45, + "content_p50": 10.6, + "content_p95": 14.6, + "bitrate": 5529600, + "tier": 0, + "w": 1280, + "net": null + }, + { + "t": 12, + "fps": 61, + "mbps": 0.47, + "content_p50": 14.3, + "content_p95": 17.5, + "bitrate": 5529600, + "tier": 0, + "w": 1280, + "net": null + }, + { + "t": 13, + "fps": 60, + "mbps": 0.47, + "content_p50": 14.1, + "content_p95": 16.4, + "bitrate": 5529600, + "tier": 0, + "w": 1280, + "net": null + }, + { + "t": 14, + "fps": 60, + "mbps": 0.45, + "content_p50": 13.8, + "content_p95": 15.5, + "bitrate": 5529600, + "tier": 0, + "w": 1280, + "net": null + }, + { + "t": 15, + "fps": 42, + "mbps": 0.32, + "content_p50": 13.8, + "content_p95": 18.9, + "bitrate": 5529600, + "tier": 0, + "w": 1280, + "net": null + } + ], + "adapt": [], + "content_p50": 10.5, + "content_p95": 15.4, + "input_p50": 24.6, + "input_p95": 39.8, + "grades": { + "content_p50": "local", + "content_p95": "local", + "input_p50": "local", + "input_p95": "local", + "fps": "local", + "late_pct": "local", + "stall_max": "acceptable" + }, + "controller": { + "adapt": true, + "baseRtt": 5.459, + "ceiling": 5529600, + "fps": 60, + "inFlight": 2, + "scale": 1, + "target": 5529600, + "tier": 0 + }, + "events": [], + "source_fps": 65.7, + "cpu": { + "mac_agent_pct": 15.9, + "frame_viewer_pct": 66.0, + "frame_tailscaled_pct": 5.4, + "frame_sshd_pct": 0.8, + "frame_gamescope_pct": 28.8, + "frame_total_pct": 32.1 + }, + "viewer": "h264 software; ANGLE (Mesa, zink Vulkan 1.4(Turnip Adreno (TM) 750 (MESA_TURNIP)), OpenGL 4.6); raf 141 Hz", + "show_s": 1.49, + "panel": "valve.steam.desktopgame.2001639889", + "src": "test" + }, + { + "scenario": "scroll", + "frames_sent": 604, + "frames_drawn": 604, + "frames_shown": 496, + "duration_s": 15.8, + "stages_ms": { + "capture": { + "p50": -3.6, + "p95": 11.2, + "p99": 19.8, + "n": 604 + }, + "queue": { + "p50": 0.0, + "p95": 15.4, + "p99": 23.5, + "n": 604 + }, + "encode": { + "p50": 6.8, + "p95": 9.3, + "p99": 19.2, + "n": 604 + }, + "socket": { + "p50": 0.1, + "p95": 0.2, + "p99": 0.7, + "n": 604 + }, + "network": { + "p50": 7.9, + "p95": 76.6, + "p99": 94.2, + "n": 604 + }, + "decode": { + "p50": 6.3, + "p95": 19.1, + "p99": 25.5, + "n": 604 + }, + "draw": { + "p50": 0.6, + "p95": 1.0, + "p99": 1.6, + "n": 604 + }, + "present": { + "p50": 0.9, + "p95": 19.0, + "p99": 22.0, + "n": 496 + }, + "content": { + "p50": 23.4, + "p95": 100.3, + "p99": 145.3, + "n": 604 + }, + "content_shown": { + "p50": 28.9, + "p95": 104.7, + "p99": 158.2, + "n": 496 + } + }, + "fps": 38.2, + "fps_shown": 31.3, + "late_pct": 25.87, + "stall_max": 180.7, + "stalls_over_100ms": 22, + "mbps": 6.88, + "keyframes": 1, + "size": "1920x1290", + "captured": 843, + "viewer_never_drawn": 0, + "input_ms": { + "n": 0 + }, + "input_shown_ms": { + "n": 0 + }, + "input_parts_ms": { + "uplink": { + "n": 0 + }, + "mac": { + "n": 0 + }, + "back": { + "n": 0 + } + }, + "inputs": { + "sent": 0, + "seen": 0 + }, + "timeline": [ + { + "t": 0, + "fps": 28, + "mbps": 6.12, + "content_p50": 30.5, + "content_p95": 161.7, + "bitrate": 7430400, + "tier": 0, + "w": 1920, + "net": null + }, + { + "t": 1, + "fps": 24, + "mbps": 4.2, + "content_p50": 36.9, + "content_p95": 120.7, + "bitrate": 8223440, + "tier": 0, + "w": 1920, + "net": null + }, + { + "t": 2, + "fps": 41, + "mbps": 8.28, + "content_p50": 20.3, + "content_p95": 62.3, + "bitrate": 11110898, + "tier": 0, + "w": 1920, + "net": null + }, + { + "t": 3, + "fps": 42, + "mbps": 9.01, + "content_p50": 22.2, + "content_p95": 91.7, + "bitrate": 14860800, + "tier": 0, + "w": 1920, + "net": null + }, + { + "t": 4, + "fps": 47, + "mbps": 8.61, + "content_p50": 15.8, + "content_p95": 81.3, + "bitrate": 14860800, + "tier": 0, + "w": 1920, + "net": null + }, + { + "t": 5, + "fps": 43, + "mbps": 8.02, + "content_p50": 17.4, + "content_p95": 56.5, + "bitrate": 14860800, + "tier": 0, + "w": 1920, + "net": null + }, + { + "t": 6, + "fps": 40, + "mbps": 7.97, + "content_p50": 29.0, + "content_p95": 82.4, + "bitrate": 14860800, + "tier": 0, + "w": 1920, + "net": null + }, + { + "t": 7, + "fps": 36, + "mbps": 7.83, + "content_p50": 33.3, + "content_p95": 100.5, + "bitrate": 6992996, + "tier": 0, + "w": 1920, + "net": null + }, + { + "t": 8, + "fps": 40, + "mbps": 5.6, + "content_p50": 21.7, + "content_p95": 97.9, + "bitrate": 7742295, + "tier": 0, + "w": 1920, + "net": null + }, + { + "t": 9, + "fps": 43, + "mbps": 7.07, + "content_p50": 19.5, + "content_p95": 90.7, + "bitrate": 10470493, + "tier": 0, + "w": 1920, + "net": null + }, + { + "t": 10, + "fps": 44, + "mbps": 7.09, + "content_p50": 19.9, + "content_p95": 97.5, + "bitrate": 7246454, + "tier": 0, + "w": 1920, + "net": null + }, + { + "t": 11, + "fps": 35, + "mbps": 5.19, + "content_p50": 22.4, + "content_p95": 166.6, + "bitrate": 5307220, + "tier": 0, + "w": 1920, + "net": null + }, + { + "t": 12, + "fps": 39, + "mbps": 4.5, + "content_p50": 22.9, + "content_p95": 84.3, + "bitrate": 5887942, + "tier": 1, + "w": 1920, + "net": null + }, + { + "t": 13, + "fps": 36, + "mbps": 5.81, + "content_p50": 28.4, + "content_p95": 94.8, + "bitrate": 8002349, + "tier": 1, + "w": 1920, + "net": null + }, + { + "t": 14, + "fps": 36, + "mbps": 7.68, + "content_p50": 27.4, + "content_p95": 107.5, + "bitrate": 11948287, + "tier": 1, + "w": 1920, + "net": null + }, + { + "t": 15, + "fps": 30, + "mbps": 5.87, + "content_p50": 33.0, + "content_p95": 104.9, + "bitrate": 14562426, + "tier": 1, + "w": 1920, + "net": null + } + ], + "adapt": [], + "content_p50": 23.4, + "content_p95": 100.3, + "input_p50": null, + "input_p95": null, + "grades": { + "content_p50": "local", + "content_p95": "bad", + "fps": "bad", + "late_pct": "bad", + "stall_max": "acceptable" + }, + "controller": { + "adapt": true, + "baseRtt": 6.959, + "ceiling": 14860800, + "fps": 60, + "inFlight": 2, + "scale": 1, + "target": 7430400, + "tier": 0 + }, + "events": [ + { + "t": 0.87, + "e": "down to 7430 kbit/s: queue 191 ms, held 3, oldest 218 ms, base 7 ms, sent 4207 got 3329" + }, + { + "t": 7.54, + "e": "down to 8741 kbit/s: queue 52 ms, held 3, oldest 35 ms, base 7 ms, sent 10505 got 9712" + }, + { + "t": 7.84, + "e": "down to 6992 kbit/s: queue 17 ms, held 3, oldest 3 ms, base 7 ms, sent 8895 got 9452" + }, + { + "t": 10.54, + "e": "down to 7246 kbit/s: queue 19 ms, held 3, oldest 80 ms, base 7 ms, sent 8009 got 8051" + }, + { + "t": 11.74, + "e": "down to 5307 kbit/s: queue 26 ms, held 3, oldest 9 ms, base 6 ms, sent 5808 got 5896" + }, + { + "t": 12.34, + "e": "tier 1" + }, + { + "t": 16.14, + "e": "tier 0" + }, + { + "t": 17.34, + "e": "down to 7430 kbit/s: queue 94 ms, held 2, oldest 94 ms, base 6 ms, sent 7608 got 6892" + } + ], + "source_fps": 53.4, + "cpu": { + "mac_agent_pct": 6.5, + "frame_viewer_pct": 69.3, + "frame_tailscaled_pct": 6.4, + "frame_sshd_pct": 0.6, + "frame_gamescope_pct": 23.2, + "frame_total_pct": 27.8 + }, + "viewer": "h264 software; ANGLE (Mesa, zink Vulkan 1.4(Turnip Adreno (TM) 750 (MESA_TURNIP)), OpenGL 4.6); raf 139 Hz", + "show_s": 1.35, + "panel": "valve.steam.desktopgame.2001652781", + "src": "separate:13306" + } + ], + [ + { + "scenario": "test", + "frames_sent": 482, + "frames_drawn": 482, + "frames_shown": 479, + "duration_s": 15.7, + "stages_ms": { + "capture": { + "p50": 0.0, + "p95": 0.0, + "p99": 0.0, + "n": 482 + }, + "queue": { + "p50": 8.8, + "p95": 16.5, + "p99": 18.6, + "n": 482 + }, + "encode": { + "p50": 3.7, + "p95": 4.5, + "p99": 5.0, + "n": 482 + }, + "socket": { + "p50": 0.1, + "p95": 0.2, + "p99": 0.2, + "n": 482 + }, + "network": { + "p50": 6.0, + "p95": 36.8, + "p99": 84.9, + "n": 482 + }, + "decode": { + "p50": 1.0, + "p95": 2.7, + "p99": 4.8, + "n": 482 + }, + "draw": { + "p50": 0.3, + "p95": 0.7, + "p99": 0.9, + "n": 482 + }, + "present": { + "p50": 0.6, + "p95": 10.8, + "p99": 13.0, + "n": 479 + }, + "content": { + "p50": 22.9, + "p95": 54.1, + "p99": 104.8, + "n": 482 + }, + "content_shown": { + "p50": 24.9, + "p95": 54.9, + "p99": 77.6, + "n": 479 + } + }, + "fps": 30.6, + "fps_shown": 30.4, + "late_pct": 68.81, + "stall_max": 218.0, + "stalls_over_100ms": 10, + "mbps": 0.19, + "keyframes": 2, + "size": "960x540", + "captured": 1037, + "viewer_never_drawn": 0, + "input_ms": { + "p50": 53.9, + "p95": 117.8, + "p99": 222.5, + "n": 29 + }, + "input_shown_ms": { + "p50": 54.4, + "p95": 123.9, + "p99": 223.5, + "n": 29 + }, + "input_parts_ms": { + "uplink": { + "p50": 17.7, + "p95": 77.5, + "p99": 127.7, + "n": 29 + }, + "mac": { + "p50": 8.2, + "p95": 30.4, + "p99": 63.3, + "n": 29 + }, + "back": { + "p50": 19.5, + "p95": 38.3, + "p99": 38.6, + "n": 29 + } + }, + "inputs": { + "sent": 30, + "seen": 29 + }, + "timeline": [ + { + "t": 0, + "fps": 55, + "mbps": 0.46, + "content_p50": 9.9, + "content_p95": 20.9, + "bitrate": 1545640, + "tier": 0, + "w": 1280, + "net": null + }, + { + "t": 1, + "fps": 33, + "mbps": 0.28, + "content_p50": 27.7, + "content_p95": 40.2, + "bitrate": 772820, + "tier": 3, + "w": 1280, + "net": null + }, + { + "t": 2, + "fps": 32, + "mbps": 0.28, + "content_p50": 22.9, + "content_p95": 29.0, + "bitrate": 772820, + "tier": 3, + "w": 1280, + "net": null + }, + { + "t": 3, + "fps": 25, + "mbps": 0.23, + "content_p50": 26.5, + "content_p95": 106.6, + "bitrate": 386410, + "tier": 4, + "w": 960, + "net": null + }, + { + "t": 4, + "fps": 21, + "mbps": 0.14, + "content_p50": 37.0, + "content_p95": 54.1, + "bitrate": 300000, + "tier": 4, + "w": 960, + "net": null + }, + { + "t": 5, + "fps": 24, + "mbps": 0.1, + "content_p50": 32.6, + "content_p95": 96.2, + "bitrate": 300000, + "tier": 4, + "w": 960, + "net": null + }, + { + "t": 6, + "fps": 31, + "mbps": 0.12, + "content_p50": 29.6, + "content_p95": 46.7, + "bitrate": 300000, + "tier": 4, + "w": 960, + "net": null + }, + { + "t": 7, + "fps": 30, + "mbps": 0.12, + "content_p50": 25.7, + "content_p95": 80.1, + "bitrate": 380000, + "tier": 4, + "w": 960, + "net": null + }, + { + "t": 8, + "fps": 32, + "mbps": 0.2, + "content_p50": 29.0, + "content_p95": 56.4, + "bitrate": 671280, + "tier": 4, + "w": 960, + "net": null + }, + { + "t": 9, + "fps": 26, + "mbps": 0.13, + "content_p50": 31.8, + "content_p95": 47.8, + "bitrate": 458624, + "tier": 4, + "w": 960, + "net": null + }, + { + "t": 10, + "fps": 30, + "mbps": 0.14, + "content_p50": 36.1, + "content_p95": 64.2, + "bitrate": 458624, + "tier": 4, + "w": 960, + "net": null + }, + { + "t": 11, + "fps": 29, + "mbps": 0.14, + "content_p50": 28.1, + "content_p95": 56.7, + "bitrate": 458624, + "tier": 4, + "w": 960, + "net": null + }, + { + "t": 12, + "fps": 26, + "mbps": 0.11, + "content_p50": 18.7, + "content_p95": 27.8, + "bitrate": 300000, + "tier": 4, + "w": 960, + "net": null + }, + { + "t": 13, + "fps": 32, + "mbps": 0.24, + "content_p50": 20.1, + "content_p95": 24.8, + "bitrate": 468000, + "tier": 4, + "w": 960, + "net": null + }, + { + "t": 14, + "fps": 32, + "mbps": 0.18, + "content_p50": 19.4, + "content_p95": 32.8, + "bitrate": 468000, + "tier": 4, + "w": 960, + "net": null + }, + { + "t": 15, + "fps": 24, + "mbps": 0.12, + "content_p50": 21.9, + "content_p95": 35.2, + "bitrate": 671280, + "tier": 4, + "w": 960, + "net": null + } + ], + "adapt": [], + "content_p50": 22.9, + "content_p95": 54.1, + "input_p50": 53.9, + "input_p95": 117.8, + "grades": { + "content_p50": "local", + "content_p95": "acceptable", + "input_p50": "acceptable", + "input_p95": "acceptable", + "fps": "bad", + "late_pct": "bad", + "stall_max": "acceptable" + }, + "controller": { + "adapt": true, + "baseRtt": 6.417, + "ceiling": 5529600, + "fps": 30, + "inFlight": 2, + "scale": 0.5, + "target": 1386355, + "tier": 4 + }, + "events": [ + { + "t": 0.87, + "e": "down to 1545 kbit/s: queue 18 ms, held 3, oldest 11 ms, base 5 ms, sent 424 got 420" + }, + { + "t": 1.27, + "e": "down to 772 kbit/s: queue 40 ms, held 3, oldest 55 ms, base 5 ms, sent 374 got 368" + }, + { + "t": 1.48, + "e": "tier 3" + }, + { + "t": 3.37, + "e": "down to 386 kbit/s: queue 119 ms, held 5, oldest 20 ms, base 5 ms, sent 210 got 208" + }, + { + "t": 3.88, + "e": "tier 4" + }, + { + "t": 4.07, + "e": "down to 300 kbit/s: queue 55 ms, held 0, oldest 0 ms, base 5 ms, sent 254 got 254" + }, + { + "t": 4.97, + "e": "down to 300 kbit/s: queue 113 ms, held 1, oldest 91 ms, base 5 ms, sent 154 got 161" + }, + { + "t": 9.78, + "e": "down to 458 kbit/s: queue 206 ms, held 6, oldest 0 ms, base 6 ms, sent 109 got 127" + }, + { + "t": 12.17, + "e": "down to 300 kbit/s: queue 4 ms, held 6, oldest 215 ms, base 6 ms, sent 116 got 103" + } + ], + "source_fps": 66.1, + "cpu": { + "mac_agent_pct": 10.9, + "frame_viewer_pct": 42.3, + "frame_tailscaled_pct": 3.8, + "frame_sshd_pct": 0.4, + "frame_gamescope_pct": 15.4, + "frame_total_pct": 23.3 + }, + "viewer": "h264 software; ANGLE (Mesa, zink Vulkan 1.4(Turnip Adreno (TM) 750 (MESA_TURNIP)), OpenGL 4.6); raf 70 Hz", + "show_s": 1.46, + "panel": "valve.steam.desktopgame.2001639889", + "src": "test" + }, + { + "scenario": "scroll", + "frames_sent": 523, + "frames_drawn": 523, + "frames_shown": 515, + "duration_s": 15.7, + "stages_ms": { + "capture": { + "p50": -4.7, + "p95": 10.3, + "p99": 17.5, + "n": 523 + }, + "queue": { + "p50": 0.0, + "p95": 18.2, + "p99": 33.6, + "n": 523 + }, + "encode": { + "p50": 6.8, + "p95": 8.4, + "p99": 17.2, + "n": 523 + }, + "socket": { + "p50": 0.1, + "p95": 0.2, + "p99": 0.4, + "n": 523 + }, + "network": { + "p50": 7.7, + "p95": 34.2, + "p99": 205.8, + "n": 523 + }, + "decode": { + "p50": 6.2, + "p95": 15.1, + "p99": 23.5, + "n": 523 + }, + "draw": { + "p50": 0.6, + "p95": 0.8, + "p99": 1.7, + "n": 523 + }, + "present": { + "p50": 0.5, + "p95": 11.4, + "p99": 14.3, + "n": 515 + }, + "content": { + "p50": 23.9, + "p95": 65.6, + "p99": 214.3, + "n": 523 + }, + "content_shown": { + "p50": 26.4, + "p95": 66.0, + "p99": 215.2, + "n": 515 + } + }, + "fps": 33.3, + "fps_shown": 32.7, + "late_pct": 56.13, + "stall_max": 321.6, + "stalls_over_100ms": 10, + "mbps": 6.29, + "keyframes": 2, + "size": "1920x1290", + "captured": 789, + "viewer_never_drawn": 0, + "input_ms": { + "n": 0 + }, + "input_shown_ms": { + "n": 0 + }, + "input_parts_ms": { + "uplink": { + "n": 0 + }, + "mac": { + "n": 0 + }, + "back": { + "n": 0 + } + }, + "inputs": { + "sent": 0, + "seen": 0 + }, + "timeline": [ + { + "t": 0, + "fps": 29, + "mbps": 6.01, + "content_p50": 17.9, + "content_p95": 139.0, + "bitrate": 7430400, + "tier": 0, + "w": 1920, + "net": null + }, + { + "t": 1, + "fps": 26, + "mbps": 2.1, + "content_p50": 33.3, + "content_p95": 86.5, + "bitrate": 2202984, + "tier": 3, + "w": 1440, + "net": null + }, + { + "t": 2, + "fps": 30, + "mbps": 2.11, + "content_p50": 23.4, + "content_p95": 40.3, + "bitrate": 2770610, + "tier": 3, + "w": 1440, + "net": null + }, + { + "t": 3, + "fps": 30, + "mbps": 3.24, + "content_p50": 19.3, + "content_p95": 47.2, + "bitrate": 3853181, + "tier": 3, + "w": 1440, + "net": null + }, + { + "t": 4, + "fps": 26, + "mbps": 3.85, + "content_p50": 20.9, + "content_p95": 120.6, + "bitrate": 5294082, + "tier": 3, + "w": 1440, + "net": null + }, + { + "t": 5, + "fps": 26, + "mbps": 2.95, + "content_p50": 23.3, + "content_p95": 46.7, + "bitrate": 3187180, + "tier": 2, + "w": 1920, + "net": null + }, + { + "t": 6, + "fps": 29, + "mbps": 3.51, + "content_p50": 27.5, + "content_p95": 48.7, + "bitrate": 4898398, + "tier": 2, + "w": 1920, + "net": null + }, + { + "t": 7, + "fps": 28, + "mbps": 5.29, + "content_p50": 28.2, + "content_p95": 48.8, + "bitrate": 6685266, + "tier": 2, + "w": 1920, + "net": null + }, + { + "t": 8, + "fps": 29, + "mbps": 7.09, + "content_p50": 23.8, + "content_p95": 50.0, + "bitrate": 9063588, + "tier": 2, + "w": 1920, + "net": null + }, + { + "t": 9, + "fps": 35, + "mbps": 9.72, + "content_p50": 31.0, + "content_p95": 59.7, + "bitrate": 13502047, + "tier": 1, + "w": 1920, + "net": null + }, + { + "t": 10, + "fps": 42, + "mbps": 12.62, + "content_p50": 23.9, + "content_p95": 34.4, + "bitrate": 14860800, + "tier": 1, + "w": 1920, + "net": null + }, + { + "t": 11, + "fps": 47, + "mbps": 11.31, + "content_p50": 20.5, + "content_p95": 41.9, + "bitrate": 14860800, + "tier": 0, + "w": 1920, + "net": null + }, + { + "t": 12, + "fps": 35, + "mbps": 8.1, + "content_p50": 20.7, + "content_p95": 120.2, + "bitrate": 14860800, + "tier": 0, + "w": 1920, + "net": null + }, + { + "t": 13, + "fps": 35, + "mbps": 6.11, + "content_p50": 21.1, + "content_p95": 36.8, + "bitrate": 7430400, + "tier": 0, + "w": 1920, + "net": null + }, + { + "t": 14, + "fps": 42, + "mbps": 8.02, + "content_p50": 24.8, + "content_p95": 38.7, + "bitrate": 10055362, + "tier": 0, + "w": 1920, + "net": null + }, + { + "t": 15, + "fps": 34, + "mbps": 6.95, + "content_p50": 19.2, + "content_p95": 309.3, + "bitrate": 12271987, + "tier": 0, + "w": 1920, + "net": null + } + ], + "adapt": [], + "content_p50": 23.9, + "content_p95": 65.6, + "input_p50": null, + "input_p95": null, + "grades": { + "content_p50": "local", + "content_p95": "acceptable", + "fps": "bad", + "late_pct": "bad", + "stall_max": "bad" + }, + "controller": { + "adapt": true, + "baseRtt": 7.209, + "ceiling": 14860800, + "fps": 60, + "inFlight": 1, + "scale": 1, + "target": 7502051, + "tier": 0 + }, + "events": [ + { + "t": 0.78, + "e": "down to 7430 kbit/s: queue 95 ms, held 3, oldest 0 ms, base 7 ms, sent 4459 got 5191" + }, + { + "t": 1.08, + "e": "down to 3715 kbit/s: queue 130 ms, held 2, oldest 127 ms, base 7 ms, sent 2434 got 2754" + }, + { + "t": 1.48, + "e": "down to 2202 kbit/s: queue 44 ms, held 1, oldest 37 ms, base 7 ms, sent 1917 got 2447" + }, + { + "t": 1.68, + "e": "tier 3" + }, + { + "t": 4.98, + "e": "down to 3187 kbit/s: queue 102 ms, held 0, oldest 31 ms, base 7 ms, sent 3802 got 3541" + }, + { + "t": 5.18, + "e": "tier 2" + }, + { + "t": 9.38, + "e": "tier 1" + }, + { + "t": 11.48, + "e": "tier 0" + }, + { + "t": 13.28, + "e": "down to 7430 kbit/s: queue 257 ms, held 5, oldest 240 ms, base 6 ms, sent 4758 got 6534" + }, + { + "t": 15.99, + "e": "down to 6774 kbit/s: queue 1 ms, held 6, oldest 284 ms, base 7 ms, sent 5665 got 4867" + } + ], + "source_fps": 50.3, + "cpu": { + "mac_agent_pct": 5.8, + "frame_viewer_pct": 64.7, + "frame_tailscaled_pct": 5.9, + "frame_sshd_pct": 0.6, + "frame_gamescope_pct": 16.2, + "frame_total_pct": 26.5 + }, + "viewer": "h264 software; ANGLE (Mesa, zink Vulkan 1.4(Turnip Adreno (TM) 750 (MESA_TURNIP)), OpenGL 4.6); raf 71 Hz", + "show_s": 1.37, + "panel": "valve.steam.desktopgame.2001605080", + "src": "separate:13687" + } + ] + ] + }, + "table": { + "test": { + "content_p50": { + "off": [ + 11.5, + 10.5, + 12.2 + ], + "on": [ + 10.9, + 10.5, + 22.9 + ] + }, + "content_p95": { + "off": [ + 15.8, + 52.3, + 29.7 + ], + "on": [ + 75.0, + 15.4, + 54.1 + ] + }, + "input_p50": { + "off": [ + 28.8, + 26.7, + 31.4 + ], + "on": [ + 27.2, + 24.6, + 53.9 + ] + }, + "input_p95": { + "off": [ + 38.1, + 89.3, + 78.1 + ], + "on": [ + 95.5, + 39.8, + 117.8 + ] + }, + "fps": { + "off": [ + 60.1, + 60.1, + 60.1 + ], + "on": [ + 53.6, + 59.4, + 30.6 + ] + }, + "late_pct": { + "off": [ + 0.95, + 3.61, + 5.73 + ], + "on": [ + 6.06, + 0.75, + 68.81 + ] + }, + "stall_max": { + "off": [ + 68.8, + 120.1, + 123.4 + ], + "on": [ + 127.2, + 126.0, + 218.0 + ] + }, + "mbps": { + "off": [ + 0.48, + 0.47, + 0.48 + ], + "on": [ + 0.43, + 0.48, + 0.19 + ] + } + }, + "scroll": { + "content_p50": { + "off": [ + 19.5, + 33.3, + 25.3 + ], + "on": [ + 16.6, + 23.4, + 23.9 + ] + }, + "content_p95": { + "off": [ + 44.4, + 108.6, + 110.6 + ], + "on": [ + 45.7, + 100.3, + 65.6 + ] + }, + "input_p50": { + "off": [], + "on": [] + }, + "input_p95": { + "off": [], + "on": [] + }, + "fps": { + "off": [ + 47.1, + 52.6, + 39.5 + ], + "on": [ + 48.4, + 38.2, + 33.3 + ] + }, + "late_pct": { + "off": [ + 20.92, + 14.84, + 33.66 + ], + "on": [ + 21.06, + 25.87, + 56.13 + ] + }, + "stall_max": { + "off": [ + 128.0, + 232.0, + 362.0 + ], + "on": [ + 88.2, + 180.7, + 321.6 + ] + }, + "mbps": { + "off": [ + 9.15, + 9.35, + 8.59 + ], + "on": [ + 9.16, + 6.88, + 6.29 + ] + } + } + } +} \ No newline at end of file diff --git a/bench/results/2026-09-28-a3c6e5c-dirty-ab-adapt-clean2.json b/bench/results/2026-09-28-a3c6e5c-dirty-ab-adapt-clean2.json new file mode 100644 index 0000000..d88f64a --- /dev/null +++ b/bench/results/2026-09-28-a3c6e5c-dirty-ab-adapt-clean2.json @@ -0,0 +1,4150 @@ +{ + "label": "ab-adapt-clean2", + "date": "2026-09-28T20:18:23", + "commit": "a3c6e5c+dirty", + "config": { + "quality": "balanced", + "mode": "separate", + "net": "none", + "delay_ms": 0, + "buffer_ms": 250, + "host": "frame", + "ssh_opts": [], + "encoder": "", + "duration_s": 15.0, + "browser_flags": [] + }, + "frame_build": "20260925.6191901", + "mac": "26.5.2", + "headset": "8:23.135290 [Info] - 0 - leaving standby", + "scenarios": [], + "arms": [ + "off:FRAME_MAC_VIEW_ADAPT=0", + "on:" + ], + "runs": { + "off": [ + [ + { + "scenario": "test", + "frames_sent": 925, + "frames_drawn": 925, + "frames_shown": 649, + "duration_s": 15.4, + "stages_ms": { + "capture": { + "p50": 0.0, + "p95": 0.0, + "p99": 0.0, + "n": 925 + }, + "queue": { + "p50": 0.0, + "p95": 0.1, + "p99": 0.1, + "n": 925 + }, + "encode": { + "p50": 3.6, + "p95": 4.5, + "p99": 4.8, + "n": 925 + }, + "socket": { + "p50": 0.1, + "p95": 0.2, + "p99": 0.4, + "n": 925 + }, + "network": { + "p50": 4.0, + "p95": 10.6, + "p99": 57.5, + "n": 925 + }, + "decode": { + "p50": 1.0, + "p95": 2.9, + "p99": 6.5, + "n": 925 + }, + "draw": { + "p50": 0.3, + "p95": 0.8, + "p99": 1.0, + "n": 925 + }, + "present": { + "p50": 4.2, + "p95": 14.9, + "p99": 19.7, + "n": 649 + }, + "content": { + "p50": 9.5, + "p95": 16.2, + "p99": 68.6, + "n": 925 + }, + "content_shown": { + "p50": 14.8, + "p95": 26.6, + "p99": 33.5, + "n": 649 + } + }, + "fps": 59.9, + "fps_shown": 42.1, + "late_pct": 2.05, + "stall_max": 150.2, + "stalls_over_100ms": 2, + "mbps": 0.47, + "keyframes": 1, + "size": "1280x720", + "captured": 1047, + "viewer_never_drawn": 0, + "input_ms": { + "p50": 28.3, + "p95": 38.3, + "p99": 41.2, + "n": 30 + }, + "input_shown_ms": { + "p50": 34.8, + "p95": 43.5, + "p99": 47.2, + "n": 21 + }, + "input_parts_ms": { + "uplink": { + "p50": 11.3, + "p95": 19.6, + "p99": 23.2, + "n": 30 + }, + "mac": { + "p50": 5.5, + "p95": 14.1, + "p99": 14.8, + "n": 30 + }, + "back": { + "p50": 9.9, + "p95": 13.8, + "p99": 15.2, + "n": 30 + } + }, + "inputs": { + "sent": 30, + "seen": 30 + }, + "timeline": [ + { + "t": 0, + "fps": 60, + "mbps": 0.48, + "content_p50": 9.0, + "content_p95": 12.0, + "bitrate": 5529600, + "tier": 0, + "w": 1280, + "net": null + }, + { + "t": 1, + "fps": 60, + "mbps": 0.47, + "content_p50": 8.8, + "content_p95": 11.6, + "bitrate": 5529600, + "tier": 0, + "w": 1280, + "net": null + }, + { + "t": 2, + "fps": 60, + "mbps": 0.46, + "content_p50": 9.0, + "content_p95": 15.1, + "bitrate": 5529600, + "tier": 0, + "w": 1280, + "net": null + }, + { + "t": 3, + "fps": 59, + "mbps": 0.46, + "content_p50": 9.2, + "content_p95": 12.8, + "bitrate": 5529600, + "tier": 0, + "w": 1280, + "net": null + }, + { + "t": 4, + "fps": 61, + "mbps": 0.46, + "content_p50": 9.1, + "content_p95": 13.2, + "bitrate": 5529600, + "tier": 0, + "w": 1280, + "net": null + }, + { + "t": 5, + "fps": 60, + "mbps": 0.57, + "content_p50": 9.0, + "content_p95": 13.1, + "bitrate": 5529600, + "tier": 0, + "w": 1280, + "net": null + }, + { + "t": 6, + "fps": 59, + "mbps": 0.48, + "content_p50": 9.5, + "content_p95": 20.4, + "bitrate": 5529600, + "tier": 0, + "w": 1280, + "net": null + }, + { + "t": 7, + "fps": 61, + "mbps": 0.47, + "content_p50": 9.2, + "content_p95": 20.1, + "bitrate": 5529600, + "tier": 0, + "w": 1280, + "net": null + }, + { + "t": 8, + "fps": 60, + "mbps": 0.47, + "content_p50": 9.4, + "content_p95": 12.1, + "bitrate": 5529600, + "tier": 0, + "w": 1280, + "net": null + }, + { + "t": 9, + "fps": 60, + "mbps": 0.45, + "content_p50": 9.8, + "content_p95": 12.3, + "bitrate": 5529600, + "tier": 0, + "w": 1280, + "net": null + }, + { + "t": 10, + "fps": 60, + "mbps": 0.46, + "content_p50": 9.7, + "content_p95": 13.0, + "bitrate": 5529600, + "tier": 0, + "w": 1280, + "net": null + }, + { + "t": 11, + "fps": 60, + "mbps": 0.46, + "content_p50": 12.8, + "content_p95": 14.8, + "bitrate": 5529600, + "tier": 0, + "w": 1280, + "net": null + }, + { + "t": 12, + "fps": 59, + "mbps": 0.46, + "content_p50": 13.6, + "content_p95": 67.1, + "bitrate": 5529600, + "tier": 0, + "w": 1280, + "net": null + }, + { + "t": 13, + "fps": 61, + "mbps": 0.48, + "content_p50": 13.1, + "content_p95": 102.0, + "bitrate": 5529600, + "tier": 0, + "w": 1280, + "net": null + }, + { + "t": 14, + "fps": 60, + "mbps": 0.46, + "content_p50": 9.1, + "content_p95": 11.7, + "bitrate": 5529600, + "tier": 0, + "w": 1280, + "net": null + }, + { + "t": 15, + "fps": 25, + "mbps": 0.19, + "content_p50": 9.2, + "content_p95": 13.8, + "bitrate": 5529600, + "tier": 0, + "w": 1280, + "net": null + } + ], + "adapt": [], + "content_p50": 9.5, + "content_p95": 16.2, + "input_p50": 28.3, + "input_p95": 38.3, + "grades": { + "input_replies": "local", + "content_p50": "local", + "content_p95": "local", + "input_p50": "local", + "input_p95": "local", + "fps": "local", + "late_pct": "acceptable", + "stall_max": "acceptable" + }, + "controller": { + "adapt": false, + "baseRtt": 5.375, + "ceiling": 5529600, + "fps": 60, + "inFlight": 1, + "scale": 1, + "slack": 40, + "target": 5529600, + "tier": 0 + }, + "events": [], + "source_fps": 68.0, + "cpu": { + "mac_agent_pct": 11.5, + "frame_viewer_pct": 39.7, + "frame_tailscaled_pct": 4.8, + "frame_sshd_pct": 0.6, + "frame_gamescope_pct": 6.2, + "frame_total_pct": 23.9 + }, + "viewer": "h264 software; ANGLE (Mesa, zink Vulkan 1.4(Turnip Adreno (TM) 750 (MESA_TURNIP)), OpenGL 4.6); raf 69 Hz", + "show_s": 2.03, + "panel": "valve.steam.desktopgame.2001639889", + "src": "test" + }, + { + "scenario": "scroll", + "frames_sent": 835, + "frames_drawn": 835, + "frames_shown": 628, + "duration_s": 15.2, + "stages_ms": { + "capture": { + "p50": -3.6, + "p95": 1.6, + "p99": 8.2, + "n": 835 + }, + "queue": { + "p50": 0.0, + "p95": 0.0, + "p99": 0.1, + "n": 835 + }, + "encode": { + "p50": 6.4, + "p95": 8.6, + "p99": 14.2, + "n": 835 + }, + "socket": { + "p50": 0.1, + "p95": 0.2, + "p99": 0.4, + "n": 835 + }, + "network": { + "p50": 6.1, + "p95": 12.0, + "p99": 24.3, + "n": 835 + }, + "decode": { + "p50": 5.8, + "p95": 10.9, + "p99": 14.7, + "n": 835 + }, + "draw": { + "p50": 0.6, + "p95": 1.4, + "p99": 1.8, + "n": 835 + }, + "present": { + "p50": 4.2, + "p95": 17.9, + "p99": 22.4, + "n": 628 + }, + "content": { + "p50": 20.0, + "p95": 32.3, + "p99": 45.5, + "n": 835 + }, + "content_shown": { + "p50": 25.2, + "p95": 42.2, + "p99": 53.7, + "n": 628 + } + }, + "fps": 54.9, + "fps_shown": 41.3, + "late_pct": 6.59, + "stall_max": 84.3, + "stalls_over_100ms": 0, + "mbps": 9.44, + "keyframes": 1, + "size": "1920x1290", + "captured": 946, + "viewer_never_drawn": 0, + "input_ms": { + "n": 0 + }, + "input_shown_ms": { + "n": 0 + }, + "input_parts_ms": { + "uplink": { + "n": 0 + }, + "mac": { + "n": 0 + }, + "back": { + "n": 0 + } + }, + "inputs": { + "sent": 0, + "seen": 0 + }, + "timeline": [ + { + "t": 0, + "fps": 57, + "mbps": 10.21, + "content_p50": 19.2, + "content_p95": 24.1, + "bitrate": 14860800, + "tier": 0, + "w": 1920, + "net": null + }, + { + "t": 1, + "fps": 55, + "mbps": 9.18, + "content_p50": 18.6, + "content_p95": 45.5, + "bitrate": 14860800, + "tier": 0, + "w": 1920, + "net": null + }, + { + "t": 2, + "fps": 57, + "mbps": 8.93, + "content_p50": 19.1, + "content_p95": 24.4, + "bitrate": 14860800, + "tier": 0, + "w": 1920, + "net": null + }, + { + "t": 3, + "fps": 57, + "mbps": 9.42, + "content_p50": 19.5, + "content_p95": 25.1, + "bitrate": 14860800, + "tier": 0, + "w": 1920, + "net": null + }, + { + "t": 4, + "fps": 56, + "mbps": 9.88, + "content_p50": 19.9, + "content_p95": 25.7, + "bitrate": 14860800, + "tier": 0, + "w": 1920, + "net": null + }, + { + "t": 5, + "fps": 52, + "mbps": 9.25, + "content_p50": 19.7, + "content_p95": 27.4, + "bitrate": 14860800, + "tier": 0, + "w": 1920, + "net": null + }, + { + "t": 6, + "fps": 53, + "mbps": 12.28, + "content_p50": 20.6, + "content_p95": 38.4, + "bitrate": 14860800, + "tier": 0, + "w": 1920, + "net": null + }, + { + "t": 7, + "fps": 53, + "mbps": 9.14, + "content_p50": 19.2, + "content_p95": 24.2, + "bitrate": 14860800, + "tier": 0, + "w": 1920, + "net": null + }, + { + "t": 8, + "fps": 55, + "mbps": 9.31, + "content_p50": 20.4, + "content_p95": 28.1, + "bitrate": 14860800, + "tier": 0, + "w": 1920, + "net": null + }, + { + "t": 9, + "fps": 55, + "mbps": 9.22, + "content_p50": 21.8, + "content_p95": 34.5, + "bitrate": 14860800, + "tier": 0, + "w": 1920, + "net": null + }, + { + "t": 10, + "fps": 56, + "mbps": 8.46, + "content_p50": 22.7, + "content_p95": 41.5, + "bitrate": 14860800, + "tier": 0, + "w": 1920, + "net": null + }, + { + "t": 11, + "fps": 56, + "mbps": 9.18, + "content_p50": 20.0, + "content_p95": 23.5, + "bitrate": 14860800, + "tier": 0, + "w": 1920, + "net": null + }, + { + "t": 12, + "fps": 54, + "mbps": 9.08, + "content_p50": 21.4, + "content_p95": 27.2, + "bitrate": 14860800, + "tier": 0, + "w": 1920, + "net": null + }, + { + "t": 13, + "fps": 55, + "mbps": 8.78, + "content_p50": 19.6, + "content_p95": 28.1, + "bitrate": 14860800, + "tier": 0, + "w": 1920, + "net": null + }, + { + "t": 14, + "fps": 55, + "mbps": 9.45, + "content_p50": 18.8, + "content_p95": 26.9, + "bitrate": 14860800, + "tier": 0, + "w": 1920, + "net": null + }, + { + "t": 15, + "fps": 9, + "mbps": 1.68, + "content_p50": 25.8, + "content_p95": 44.2, + "bitrate": 14860800, + "tier": 0, + "w": 1920, + "net": null + } + ], + "adapt": [], + "content_p50": 20.0, + "content_p95": 32.3, + "input_p50": null, + "input_p95": null, + "grades": { + "content_p50": "local", + "content_p95": "local", + "fps": "acceptable", + "late_pct": "bad", + "stall_max": "local" + }, + "controller": { + "adapt": false, + "baseRtt": 6.875, + "ceiling": 14860800, + "fps": 60, + "inFlight": 1, + "scale": 1, + "slack": 40, + "target": 14860800, + "tier": 0 + }, + "events": [], + "source_fps": 62.2, + "cpu": { + "mac_agent_pct": 7.4, + "frame_viewer_pct": 70.3, + "frame_tailscaled_pct": 7.7, + "frame_sshd_pct": 0.8, + "frame_gamescope_pct": 6.7, + "frame_total_pct": 28.8 + }, + "viewer": "h264 software; ANGLE (Mesa, zink Vulkan 1.4(Turnip Adreno (TM) 750 (MESA_TURNIP)), OpenGL 4.6); raf 139 Hz", + "show_s": 1.27, + "panel": "valve.steam.desktopgame.2001924380", + "src": "separate:5316" + } + ], + [ + { + "scenario": "test", + "frames_sent": 912, + "frames_drawn": 912, + "frames_shown": 618, + "duration_s": 15.2, + "stages_ms": { + "capture": { + "p50": 0.0, + "p95": 0.0, + "p99": 0.0, + "n": 912 + }, + "queue": { + "p50": 0.0, + "p95": 0.1, + "p99": 0.2, + "n": 912 + }, + "encode": { + "p50": 4.2, + "p95": 4.9, + "p99": 5.2, + "n": 912 + }, + "socket": { + "p50": 0.1, + "p95": 0.2, + "p99": 0.2, + "n": 912 + }, + "network": { + "p50": 3.8, + "p95": 8.0, + "p99": 11.1, + "n": 912 + }, + "decode": { + "p50": 1.0, + "p95": 2.3, + "p99": 4.2, + "n": 912 + }, + "draw": { + "p50": 0.3, + "p95": 0.7, + "p99": 1.0, + "n": 912 + }, + "present": { + "p50": 5.1, + "p95": 16.1, + "p99": 17.8, + "n": 618 + }, + "content": { + "p50": 9.7, + "p95": 14.3, + "p99": 17.6, + "n": 912 + }, + "content_shown": { + "p50": 15.3, + "p95": 27.8, + "p99": 29.4, + "n": 618 + } + }, + "fps": 60.0, + "fps_shown": 40.7, + "late_pct": 0.33, + "stall_max": 120.5, + "stalls_over_100ms": 1, + "mbps": 0.48, + "keyframes": 1, + "size": "1280x720", + "captured": 1032, + "viewer_never_drawn": 0, + "input_ms": { + "p50": 22.6, + "p95": 32.7, + "p99": 46.2, + "n": 30 + }, + "input_shown_ms": { + "p50": 28.6, + "p95": 39.0, + "p99": 47.0, + "n": 23 + }, + "input_parts_ms": { + "uplink": { + "p50": 7.3, + "p95": 18.0, + "p99": 22.1, + "n": 30 + }, + "mac": { + "p50": 5.2, + "p95": 14.0, + "p99": 17.2, + "n": 30 + }, + "back": { + "p50": 9.9, + "p95": 13.6, + "p99": 14.3, + "n": 30 + } + }, + "inputs": { + "sent": 30, + "seen": 30 + }, + "timeline": [ + { + "t": 0, + "fps": 60, + "mbps": 0.5, + "content_p50": 8.9, + "content_p95": 71.7, + "bitrate": 5529600, + "tier": 0, + "w": 1280, + "net": null + }, + { + "t": 1, + "fps": 60, + "mbps": 0.48, + "content_p50": 8.7, + "content_p95": 10.5, + "bitrate": 5529600, + "tier": 0, + "w": 1280, + "net": null + }, + { + "t": 2, + "fps": 60, + "mbps": 0.48, + "content_p50": 8.7, + "content_p95": 10.5, + "bitrate": 5529600, + "tier": 0, + "w": 1280, + "net": null + }, + { + "t": 3, + "fps": 60, + "mbps": 0.48, + "content_p50": 9.1, + "content_p95": 10.3, + "bitrate": 5529600, + "tier": 0, + "w": 1280, + "net": null + }, + { + "t": 4, + "fps": 60, + "mbps": 0.47, + "content_p50": 8.7, + "content_p95": 10.6, + "bitrate": 5529600, + "tier": 0, + "w": 1280, + "net": null + }, + { + "t": 5, + "fps": 60, + "mbps": 0.58, + "content_p50": 8.7, + "content_p95": 11.3, + "bitrate": 5529600, + "tier": 0, + "w": 1280, + "net": null + }, + { + "t": 6, + "fps": 60, + "mbps": 0.48, + "content_p50": 8.9, + "content_p95": 11.1, + "bitrate": 5529600, + "tier": 0, + "w": 1280, + "net": null + }, + { + "t": 7, + "fps": 60, + "mbps": 0.48, + "content_p50": 8.7, + "content_p95": 10.9, + "bitrate": 5529600, + "tier": 0, + "w": 1280, + "net": null + }, + { + "t": 8, + "fps": 60, + "mbps": 0.48, + "content_p50": 10.2, + "content_p95": 13.9, + "bitrate": 5529600, + "tier": 0, + "w": 1280, + "net": null + }, + { + "t": 9, + "fps": 60, + "mbps": 0.46, + "content_p50": 9.6, + "content_p95": 11.6, + "bitrate": 5529600, + "tier": 0, + "w": 1280, + "net": null + }, + { + "t": 10, + "fps": 60, + "mbps": 0.47, + "content_p50": 10.6, + "content_p95": 14.2, + "bitrate": 5529600, + "tier": 0, + "w": 1280, + "net": null + }, + { + "t": 11, + "fps": 60, + "mbps": 0.47, + "content_p50": 12.3, + "content_p95": 15.2, + "bitrate": 5529600, + "tier": 0, + "w": 1280, + "net": null + }, + { + "t": 12, + "fps": 60, + "mbps": 0.47, + "content_p50": 12.8, + "content_p95": 15.4, + "bitrate": 5529600, + "tier": 0, + "w": 1280, + "net": null + }, + { + "t": 13, + "fps": 60, + "mbps": 0.48, + "content_p50": 12.7, + "content_p95": 14.3, + "bitrate": 5529600, + "tier": 0, + "w": 1280, + "net": null + }, + { + "t": 14, + "fps": 60, + "mbps": 0.46, + "content_p50": 12.9, + "content_p95": 17.4, + "bitrate": 5529600, + "tier": 0, + "w": 1280, + "net": null + }, + { + "t": 15, + "fps": 12, + "mbps": 0.09, + "content_p50": 12.6, + "content_p95": 14.0, + "bitrate": 5529600, + "tier": 0, + "w": 1280, + "net": null + } + ], + "adapt": [], + "content_p50": 9.7, + "content_p95": 14.3, + "input_p50": 22.6, + "input_p95": 32.7, + "grades": { + "input_replies": "local", + "content_p50": "local", + "content_p95": "local", + "input_p50": "local", + "input_p95": "local", + "fps": "local", + "late_pct": "local", + "stall_max": "acceptable" + }, + "controller": { + "adapt": false, + "baseRtt": 5.334, + "ceiling": 5529600, + "fps": 60, + "inFlight": 2, + "scale": 1, + "slack": 40, + "target": 5529600, + "tier": 0 + }, + "events": [], + "source_fps": 67.9, + "cpu": { + "mac_agent_pct": 16.1, + "frame_viewer_pct": 46.3, + "frame_tailscaled_pct": 5.1, + "frame_sshd_pct": 0.6, + "frame_gamescope_pct": 8.9, + "frame_total_pct": 28.6 + }, + "viewer": "h264 software; ANGLE (Mesa, zink Vulkan 1.4(Turnip Adreno (TM) 750 (MESA_TURNIP)), OpenGL 4.6); raf 140 Hz", + "show_s": 1.27, + "panel": "valve.steam.desktopgame.2001639889", + "src": "test" + }, + { + "scenario": "scroll", + "frames_sent": 864, + "frames_drawn": 864, + "frames_shown": 626, + "duration_s": 15.2, + "stages_ms": { + "capture": { + "p50": -4.6, + "p95": 0.4, + "p99": 0.8, + "n": 864 + }, + "queue": { + "p50": 0.0, + "p95": 0.1, + "p99": 0.1, + "n": 864 + }, + "encode": { + "p50": 6.7, + "p95": 8.5, + "p99": 11.1, + "n": 864 + }, + "socket": { + "p50": 0.1, + "p95": 0.2, + "p99": 0.3, + "n": 864 + }, + "network": { + "p50": 6.0, + "p95": 9.2, + "p99": 14.7, + "n": 864 + }, + "decode": { + "p50": 5.7, + "p95": 9.9, + "p99": 12.9, + "n": 864 + }, + "draw": { + "p50": 0.6, + "p95": 1.3, + "p99": 1.9, + "n": 864 + }, + "present": { + "p50": 4.3, + "p95": 16.8, + "p99": 21.2, + "n": 626 + }, + "content": { + "p50": 19.5, + "p95": 25.2, + "p99": 32.2, + "n": 864 + }, + "content_shown": { + "p50": 24.4, + "p95": 36.6, + "p99": 41.8, + "n": 626 + } + }, + "fps": 57.0, + "fps_shown": 41.3, + "late_pct": 3.36, + "stall_max": 105.4, + "stalls_over_100ms": 1, + "mbps": 9.44, + "keyframes": 1, + "size": "1920x1290", + "captured": 978, + "viewer_never_drawn": 0, + "input_ms": { + "n": 0 + }, + "input_shown_ms": { + "n": 0 + }, + "input_parts_ms": { + "uplink": { + "n": 0 + }, + "mac": { + "n": 0 + }, + "back": { + "n": 0 + } + }, + "inputs": { + "sent": 0, + "seen": 0 + }, + "timeline": [ + { + "t": 0, + "fps": 56, + "mbps": 9.38, + "content_p50": 19.1, + "content_p95": 24.8, + "bitrate": 14860800, + "tier": 0, + "w": 1920, + "net": null + }, + { + "t": 1, + "fps": 56, + "mbps": 9.47, + "content_p50": 19.2, + "content_p95": 24.1, + "bitrate": 14860800, + "tier": 0, + "w": 1920, + "net": null + }, + { + "t": 2, + "fps": 56, + "mbps": 8.94, + "content_p50": 19.3, + "content_p95": 25.4, + "bitrate": 14860800, + "tier": 0, + "w": 1920, + "net": null + }, + { + "t": 3, + "fps": 57, + "mbps": 9.51, + "content_p50": 19.7, + "content_p95": 26.3, + "bitrate": 14860800, + "tier": 0, + "w": 1920, + "net": null + }, + { + "t": 4, + "fps": 57, + "mbps": 9.65, + "content_p50": 18.6, + "content_p95": 22.6, + "bitrate": 14860800, + "tier": 0, + "w": 1920, + "net": null + }, + { + "t": 5, + "fps": 57, + "mbps": 9.0, + "content_p50": 18.7, + "content_p95": 24.0, + "bitrate": 14860800, + "tier": 0, + "w": 1920, + "net": null + }, + { + "t": 6, + "fps": 55, + "mbps": 11.82, + "content_p50": 20.2, + "content_p95": 33.4, + "bitrate": 14860800, + "tier": 0, + "w": 1920, + "net": null + }, + { + "t": 7, + "fps": 57, + "mbps": 9.24, + "content_p50": 18.9, + "content_p95": 21.9, + "bitrate": 14860800, + "tier": 0, + "w": 1920, + "net": null + }, + { + "t": 8, + "fps": 58, + "mbps": 9.37, + "content_p50": 19.3, + "content_p95": 25.0, + "bitrate": 14860800, + "tier": 0, + "w": 1920, + "net": null + }, + { + "t": 9, + "fps": 57, + "mbps": 9.2, + "content_p50": 20.5, + "content_p95": 27.2, + "bitrate": 14860800, + "tier": 0, + "w": 1920, + "net": null + }, + { + "t": 10, + "fps": 58, + "mbps": 9.12, + "content_p50": 20.1, + "content_p95": 25.2, + "bitrate": 14860800, + "tier": 0, + "w": 1920, + "net": null + }, + { + "t": 11, + "fps": 57, + "mbps": 9.29, + "content_p50": 19.4, + "content_p95": 25.0, + "bitrate": 14860800, + "tier": 0, + "w": 1920, + "net": null + }, + { + "t": 12, + "fps": 57, + "mbps": 9.29, + "content_p50": 19.9, + "content_p95": 23.0, + "bitrate": 14860800, + "tier": 0, + "w": 1920, + "net": null + }, + { + "t": 13, + "fps": 58, + "mbps": 8.8, + "content_p50": 19.8, + "content_p95": 23.8, + "bitrate": 14860800, + "tier": 0, + "w": 1920, + "net": null + }, + { + "t": 14, + "fps": 58, + "mbps": 9.34, + "content_p50": 20.3, + "content_p95": 28.0, + "bitrate": 14860800, + "tier": 0, + "w": 1920, + "net": null + }, + { + "t": 15, + "fps": 10, + "mbps": 1.68, + "content_p50": 19.6, + "content_p95": 22.1, + "bitrate": 14860800, + "tier": 0, + "w": 1920, + "net": null + } + ], + "adapt": [], + "content_p50": 19.5, + "content_p95": 25.2, + "input_p50": null, + "input_p95": null, + "grades": { + "content_p50": "local", + "content_p95": "local", + "fps": "acceptable", + "late_pct": "acceptable", + "stall_max": "acceptable" + }, + "controller": { + "adapt": false, + "baseRtt": 6.75, + "ceiling": 14860800, + "fps": 60, + "inFlight": 0, + "scale": 1, + "slack": 40, + "target": 14860800, + "tier": 0 + }, + "events": [], + "source_fps": 64.3, + "cpu": { + "mac_agent_pct": 8.6, + "frame_viewer_pct": 73.0, + "frame_tailscaled_pct": 8.0, + "frame_sshd_pct": 0.9, + "frame_gamescope_pct": 7.8, + "frame_total_pct": 30.0 + }, + "viewer": "h264 software; ANGLE (Mesa, zink Vulkan 1.4(Turnip Adreno (TM) 750 (MESA_TURNIP)), OpenGL 4.6); raf 142 Hz", + "show_s": 1.26, + "panel": "valve.steam.desktopgame.2001204762", + "src": "separate:5722" + } + ], + [ + { + "scenario": "test", + "frames_sent": 912, + "frames_drawn": 912, + "frames_shown": 618, + "duration_s": 15.2, + "stages_ms": { + "capture": { + "p50": 0.0, + "p95": 0.0, + "p99": 0.0, + "n": 912 + }, + "queue": { + "p50": 0.0, + "p95": 0.1, + "p99": 0.1, + "n": 912 + }, + "encode": { + "p50": 4.2, + "p95": 4.8, + "p99": 5.1, + "n": 912 + }, + "socket": { + "p50": 0.1, + "p95": 0.2, + "p99": 0.2, + "n": 912 + }, + "network": { + "p50": 4.6, + "p95": 8.9, + "p99": 13.7, + "n": 912 + }, + "decode": { + "p50": 1.2, + "p95": 2.2, + "p99": 3.9, + "n": 912 + }, + "draw": { + "p50": 0.3, + "p95": 0.7, + "p99": 1.0, + "n": 912 + }, + "present": { + "p50": 5.4, + "p95": 17.0, + "p99": 19.3, + "n": 618 + }, + "content": { + "p50": 10.6, + "p95": 15.0, + "p99": 19.9, + "n": 912 + }, + "content_shown": { + "p50": 16.0, + "p95": 27.7, + "p99": 30.8, + "n": 618 + } + }, + "fps": 60.0, + "fps_shown": 40.6, + "late_pct": 0.99, + "stall_max": 37.7, + "stalls_over_100ms": 0, + "mbps": 0.47, + "keyframes": 1, + "size": "1280x720", + "captured": 1034, + "viewer_never_drawn": 0, + "input_ms": { + "p50": 30.9, + "p95": 103.7, + "p99": 196.7, + "n": 30 + }, + "input_shown_ms": { + "p50": 36.3, + "p95": 106.8, + "p99": 200.8, + "n": 19 + }, + "input_parts_ms": { + "uplink": { + "p50": 13.9, + "p95": 74.2, + "p99": 183.2, + "n": 30 + }, + "mac": { + "p50": 5.5, + "p95": 16.4, + "p99": 18.7, + "n": 30 + }, + "back": { + "p50": 11.2, + "p95": 15.5, + "p99": 20.2, + "n": 30 + } + }, + "inputs": { + "sent": 30, + "seen": 30 + }, + "timeline": [ + { + "t": 0, + "fps": 60, + "mbps": 0.49, + "content_p50": 9.4, + "content_p95": 13.9, + "bitrate": 5529600, + "tier": 0, + "w": 1280, + "net": null + }, + { + "t": 1, + "fps": 60, + "mbps": 0.47, + "content_p50": 9.5, + "content_p95": 11.5, + "bitrate": 5529600, + "tier": 0, + "w": 1280, + "net": null + }, + { + "t": 2, + "fps": 60, + "mbps": 0.47, + "content_p50": 9.4, + "content_p95": 11.5, + "bitrate": 5529600, + "tier": 0, + "w": 1280, + "net": null + }, + { + "t": 3, + "fps": 60, + "mbps": 0.46, + "content_p50": 9.6, + "content_p95": 11.9, + "bitrate": 5529600, + "tier": 0, + "w": 1280, + "net": null + }, + { + "t": 4, + "fps": 60, + "mbps": 0.47, + "content_p50": 10.1, + "content_p95": 12.8, + "bitrate": 5529600, + "tier": 0, + "w": 1280, + "net": null + }, + { + "t": 5, + "fps": 60, + "mbps": 0.58, + "content_p50": 10.5, + "content_p95": 12.8, + "bitrate": 5529600, + "tier": 0, + "w": 1280, + "net": null + }, + { + "t": 6, + "fps": 60, + "mbps": 0.47, + "content_p50": 10.3, + "content_p95": 13.7, + "bitrate": 5529600, + "tier": 0, + "w": 1280, + "net": null + }, + { + "t": 7, + "fps": 60, + "mbps": 0.47, + "content_p50": 10.3, + "content_p95": 12.4, + "bitrate": 5529600, + "tier": 0, + "w": 1280, + "net": null + }, + { + "t": 8, + "fps": 60, + "mbps": 0.46, + "content_p50": 10.1, + "content_p95": 11.8, + "bitrate": 5529600, + "tier": 0, + "w": 1280, + "net": null + }, + { + "t": 9, + "fps": 60, + "mbps": 0.45, + "content_p50": 10.9, + "content_p95": 14.1, + "bitrate": 5529600, + "tier": 0, + "w": 1280, + "net": null + }, + { + "t": 10, + "fps": 60, + "mbps": 0.46, + "content_p50": 11.4, + "content_p95": 15.7, + "bitrate": 5529600, + "tier": 0, + "w": 1280, + "net": null + }, + { + "t": 11, + "fps": 60, + "mbps": 0.48, + "content_p50": 11.5, + "content_p95": 16.1, + "bitrate": 5529600, + "tier": 0, + "w": 1280, + "net": null + }, + { + "t": 12, + "fps": 60, + "mbps": 0.48, + "content_p50": 13.3, + "content_p95": 17.8, + "bitrate": 5529600, + "tier": 0, + "w": 1280, + "net": null + }, + { + "t": 13, + "fps": 60, + "mbps": 0.46, + "content_p50": 12.1, + "content_p95": 16.8, + "bitrate": 5529600, + "tier": 0, + "w": 1280, + "net": null + }, + { + "t": 14, + "fps": 60, + "mbps": 0.45, + "content_p50": 12.5, + "content_p95": 16.7, + "bitrate": 5529600, + "tier": 0, + "w": 1280, + "net": null + }, + { + "t": 15, + "fps": 12, + "mbps": 0.09, + "content_p50": 12.9, + "content_p95": 15.3, + "bitrate": 5529600, + "tier": 0, + "w": 1280, + "net": null + } + ], + "adapt": [], + "content_p50": 10.6, + "content_p95": 15.0, + "input_p50": 30.9, + "input_p95": 103.7, + "grades": { + "input_replies": "local", + "content_p50": "local", + "content_p95": "local", + "input_p50": "local", + "input_p95": "acceptable", + "fps": "local", + "late_pct": "local", + "stall_max": "local" + }, + "controller": { + "adapt": false, + "baseRtt": 5.625, + "ceiling": 5529600, + "fps": 60, + "inFlight": 2, + "scale": 1, + "slack": 40, + "target": 5529600, + "tier": 0 + }, + "events": [], + "source_fps": 68.0, + "cpu": { + "mac_agent_pct": 15.7, + "frame_viewer_pct": 52.1, + "frame_tailscaled_pct": 8.9, + "frame_sshd_pct": 1.3, + "frame_gamescope_pct": 9.1, + "frame_total_pct": 23.1 + }, + "viewer": "h264 software; ANGLE (Mesa, zink Vulkan 1.4(Turnip Adreno (TM) 750 (MESA_TURNIP)), OpenGL 4.6); raf 139 Hz", + "show_s": 1.26, + "panel": "valve.steam.desktopgame.2001639889", + "src": "test" + }, + { + "scenario": "scroll", + "frames_sent": 870, + "frames_drawn": 870, + "frames_shown": 627, + "duration_s": 15.2, + "stages_ms": { + "capture": { + "p50": -4.4, + "p95": 0.4, + "p99": 0.8, + "n": 870 + }, + "queue": { + "p50": 0.0, + "p95": 0.1, + "p99": 0.1, + "n": 870 + }, + "encode": { + "p50": 6.7, + "p95": 8.5, + "p99": 13.9, + "n": 870 + }, + "socket": { + "p50": 0.1, + "p95": 0.2, + "p99": 0.5, + "n": 870 + }, + "network": { + "p50": 6.3, + "p95": 27.2, + "p99": 133.0, + "n": 870 + }, + "decode": { + "p50": 5.9, + "p95": 15.5, + "p99": 21.7, + "n": 870 + }, + "draw": { + "p50": 0.6, + "p95": 1.5, + "p99": 1.9, + "n": 870 + }, + "present": { + "p50": 3.6, + "p95": 16.4, + "p99": 21.1, + "n": 627 + }, + "content": { + "p50": 20.5, + "p95": 45.9, + "p99": 170.0, + "n": 870 + }, + "content_shown": { + "p50": 27.1, + "p95": 55.8, + "p99": 200.4, + "n": 627 + } + }, + "fps": 57.3, + "fps_shown": 41.3, + "late_pct": 4.6, + "stall_max": 321.6, + "stalls_over_100ms": 2, + "mbps": 9.4, + "keyframes": 1, + "size": "1920x1290", + "captured": 986, + "viewer_never_drawn": 0, + "input_ms": { + "n": 0 + }, + "input_shown_ms": { + "n": 0 + }, + "input_parts_ms": { + "uplink": { + "n": 0 + }, + "mac": { + "n": 0 + }, + "back": { + "n": 0 + } + }, + "inputs": { + "sent": 0, + "seen": 0 + }, + "timeline": [ + { + "t": 0, + "fps": 56, + "mbps": 9.16, + "content_p50": 27.2, + "content_p95": 49.4, + "bitrate": 14860800, + "tier": 0, + "w": 1920, + "net": null + }, + { + "t": 1, + "fps": 55, + "mbps": 9.46, + "content_p50": 23.6, + "content_p95": 237.3, + "bitrate": 14860800, + "tier": 0, + "w": 1920, + "net": null + }, + { + "t": 2, + "fps": 58, + "mbps": 8.98, + "content_p50": 21.5, + "content_p95": 26.1, + "bitrate": 14860800, + "tier": 0, + "w": 1920, + "net": null + }, + { + "t": 3, + "fps": 58, + "mbps": 9.81, + "content_p50": 22.4, + "content_p95": 55.1, + "bitrate": 14860800, + "tier": 0, + "w": 1920, + "net": null + }, + { + "t": 4, + "fps": 57, + "mbps": 9.66, + "content_p50": 21.1, + "content_p95": 31.9, + "bitrate": 14860800, + "tier": 0, + "w": 1920, + "net": null + }, + { + "t": 5, + "fps": 58, + "mbps": 8.89, + "content_p50": 19.9, + "content_p95": 24.9, + "bitrate": 14860800, + "tier": 0, + "w": 1920, + "net": null + }, + { + "t": 6, + "fps": 58, + "mbps": 11.75, + "content_p50": 20.5, + "content_p95": 74.5, + "bitrate": 14860800, + "tier": 0, + "w": 1920, + "net": null + }, + { + "t": 7, + "fps": 57, + "mbps": 9.0, + "content_p50": 20.1, + "content_p95": 27.2, + "bitrate": 14860800, + "tier": 0, + "w": 1920, + "net": null + }, + { + "t": 8, + "fps": 57, + "mbps": 9.35, + "content_p50": 20.5, + "content_p95": 24.1, + "bitrate": 14860800, + "tier": 0, + "w": 1920, + "net": null + }, + { + "t": 9, + "fps": 57, + "mbps": 9.17, + "content_p50": 19.8, + "content_p95": 24.9, + "bitrate": 14860800, + "tier": 0, + "w": 1920, + "net": null + }, + { + "t": 10, + "fps": 57, + "mbps": 8.89, + "content_p50": 19.3, + "content_p95": 25.7, + "bitrate": 14860800, + "tier": 0, + "w": 1920, + "net": null + }, + { + "t": 11, + "fps": 58, + "mbps": 9.09, + "content_p50": 18.9, + "content_p95": 22.3, + "bitrate": 14860800, + "tier": 0, + "w": 1920, + "net": null + }, + { + "t": 12, + "fps": 58, + "mbps": 9.74, + "content_p50": 19.7, + "content_p95": 31.6, + "bitrate": 14860800, + "tier": 0, + "w": 1920, + "net": null + }, + { + "t": 13, + "fps": 57, + "mbps": 8.62, + "content_p50": 18.5, + "content_p95": 21.9, + "bitrate": 14860800, + "tier": 0, + "w": 1920, + "net": null + }, + { + "t": 14, + "fps": 58, + "mbps": 9.36, + "content_p50": 25.9, + "content_p95": 37.3, + "bitrate": 14860800, + "tier": 0, + "w": 1920, + "net": null + }, + { + "t": 15, + "fps": 11, + "mbps": 1.84, + "content_p50": 21.5, + "content_p95": 123.7, + "bitrate": 14860800, + "tier": 0, + "w": 1920, + "net": null + } + ], + "adapt": [], + "content_p50": 20.5, + "content_p95": 45.9, + "input_p50": null, + "input_p95": null, + "grades": { + "content_p50": "local", + "content_p95": "acceptable", + "fps": "acceptable", + "late_pct": "acceptable", + "stall_max": "bad" + }, + "controller": { + "adapt": false, + "baseRtt": 7.125, + "ceiling": 14860800, + "fps": 60, + "inFlight": 1, + "scale": 1, + "slack": 40, + "target": 14860800, + "tier": 0 + }, + "events": [], + "source_fps": 64.9, + "cpu": { + "mac_agent_pct": 8.8, + "frame_viewer_pct": 84.1, + "frame_tailscaled_pct": 13.1, + "frame_sshd_pct": -0.9, + "frame_gamescope_pct": 9.9, + "frame_total_pct": 35.6 + }, + "viewer": "h264 software; ANGLE (Mesa, zink Vulkan 1.4(Turnip Adreno (TM) 750 (MESA_TURNIP)), OpenGL 4.6); raf 143 Hz", + "show_s": 1.44, + "panel": "valve.steam.desktopgame.2001042553", + "src": "separate:5856" + } + ] + ], + "on": [ + [ + { + "scenario": "test", + "frames_sent": 942, + "frames_drawn": 942, + "frames_shown": 641, + "duration_s": 15.7, + "stages_ms": { + "capture": { + "p50": 0.0, + "p95": 0.0, + "p99": 0.0, + "n": 942 + }, + "queue": { + "p50": 0.0, + "p95": 0.1, + "p99": 0.1, + "n": 942 + }, + "encode": { + "p50": 3.7, + "p95": 4.5, + "p99": 5.5, + "n": 942 + }, + "socket": { + "p50": 0.1, + "p95": 0.2, + "p99": 0.5, + "n": 942 + }, + "network": { + "p50": 4.0, + "p95": 7.1, + "p99": 14.6, + "n": 942 + }, + "decode": { + "p50": 1.0, + "p95": 2.3, + "p99": 3.7, + "n": 942 + }, + "draw": { + "p50": 0.3, + "p95": 0.7, + "p99": 1.0, + "n": 942 + }, + "present": { + "p50": 4.9, + "p95": 17.5, + "p99": 19.9, + "n": 641 + }, + "content": { + "p50": 9.5, + "p95": 13.2, + "p99": 23.3, + "n": 942 + }, + "content_shown": { + "p50": 15.0, + "p95": 27.3, + "p99": 29.9, + "n": 641 + } + }, + "fps": 60.0, + "fps_shown": 40.9, + "late_pct": 1.17, + "stall_max": 75.6, + "stalls_over_100ms": 0, + "mbps": 0.47, + "keyframes": 1, + "size": "1280x720", + "captured": 1064, + "viewer_never_drawn": 0, + "input_ms": { + "p50": 27.2, + "p95": 51.1, + "p99": 60.4, + "n": 30 + }, + "input_shown_ms": { + "p50": 33.7, + "p95": 53.0, + "p99": 72.9, + "n": 20 + }, + "input_parts_ms": { + "uplink": { + "p50": 11.8, + "p95": 39.5, + "p99": 41.9, + "n": 30 + }, + "mac": { + "p50": 4.6, + "p95": 14.7, + "p99": 19.7, + "n": 30 + }, + "back": { + "p50": 9.5, + "p95": 14.0, + "p99": 15.3, + "n": 30 + } + }, + "inputs": { + "sent": 30, + "seen": 30 + }, + "timeline": [ + { + "t": 0, + "fps": 60, + "mbps": 0.48, + "content_p50": 9.2, + "content_p95": 12.5, + "bitrate": 5529600, + "tier": 0, + "w": 1280, + "net": null + }, + { + "t": 1, + "fps": 60, + "mbps": 0.47, + "content_p50": 8.9, + "content_p95": 24.9, + "bitrate": 5529600, + "tier": 0, + "w": 1280, + "net": null + }, + { + "t": 2, + "fps": 60, + "mbps": 0.48, + "content_p50": 8.7, + "content_p95": 11.5, + "bitrate": 5529600, + "tier": 0, + "w": 1280, + "net": null + }, + { + "t": 3, + "fps": 60, + "mbps": 0.47, + "content_p50": 8.6, + "content_p95": 11.0, + "bitrate": 5529600, + "tier": 0, + "w": 1280, + "net": null + }, + { + "t": 4, + "fps": 60, + "mbps": 0.45, + "content_p50": 9.0, + "content_p95": 10.9, + "bitrate": 5529600, + "tier": 0, + "w": 1280, + "net": null + }, + { + "t": 5, + "fps": 60, + "mbps": 0.59, + "content_p50": 8.6, + "content_p95": 10.7, + "bitrate": 5529600, + "tier": 0, + "w": 1280, + "net": null + }, + { + "t": 6, + "fps": 60, + "mbps": 0.45, + "content_p50": 8.5, + "content_p95": 11.2, + "bitrate": 5529600, + "tier": 0, + "w": 1280, + "net": null + }, + { + "t": 7, + "fps": 60, + "mbps": 0.47, + "content_p50": 8.6, + "content_p95": 13.2, + "bitrate": 5529600, + "tier": 0, + "w": 1280, + "net": null + }, + { + "t": 8, + "fps": 60, + "mbps": 0.45, + "content_p50": 8.0, + "content_p95": 11.7, + "bitrate": 5529600, + "tier": 0, + "w": 1280, + "net": null + }, + { + "t": 9, + "fps": 60, + "mbps": 0.45, + "content_p50": 9.1, + "content_p95": 14.2, + "bitrate": 5529600, + "tier": 0, + "w": 1280, + "net": null + }, + { + "t": 10, + "fps": 60, + "mbps": 0.46, + "content_p50": 9.2, + "content_p95": 11.9, + "bitrate": 5529600, + "tier": 0, + "w": 1280, + "net": null + }, + { + "t": 11, + "fps": 60, + "mbps": 0.46, + "content_p50": 10.8, + "content_p95": 14.0, + "bitrate": 5529600, + "tier": 0, + "w": 1280, + "net": null + }, + { + "t": 12, + "fps": 60, + "mbps": 0.46, + "content_p50": 10.6, + "content_p95": 12.0, + "bitrate": 5529600, + "tier": 0, + "w": 1280, + "net": null + }, + { + "t": 13, + "fps": 60, + "mbps": 0.46, + "content_p50": 11.4, + "content_p95": 15.8, + "bitrate": 5529600, + "tier": 0, + "w": 1280, + "net": null + }, + { + "t": 14, + "fps": 60, + "mbps": 0.44, + "content_p50": 11.0, + "content_p95": 12.7, + "bitrate": 5529600, + "tier": 0, + "w": 1280, + "net": null + }, + { + "t": 15, + "fps": 42, + "mbps": 0.31, + "content_p50": 11.2, + "content_p95": 14.5, + "bitrate": 5529600, + "tier": 0, + "w": 1280, + "net": null + } + ], + "adapt": [], + "content_p50": 9.5, + "content_p95": 13.2, + "input_p50": 27.2, + "input_p95": 51.1, + "grades": { + "input_replies": "local", + "content_p50": "local", + "content_p95": "local", + "input_p50": "local", + "input_p95": "local", + "fps": "local", + "late_pct": "acceptable", + "stall_max": "local" + }, + "controller": { + "adapt": true, + "baseRtt": 5.541, + "ceiling": 5529600, + "fps": 60, + "inFlight": 1, + "scale": 1, + "slack": 52.292, + "target": 5529600, + "tier": 0 + }, + "events": [], + "source_fps": 67.8, + "cpu": { + "mac_agent_pct": 12.1, + "frame_viewer_pct": 45.2, + "frame_tailscaled_pct": 5.1, + "frame_sshd_pct": 0.7, + "frame_gamescope_pct": 7.9, + "frame_total_pct": 27.2 + }, + "viewer": "h264 software; ANGLE (Mesa, zink Vulkan 1.4(Turnip Adreno (TM) 750 (MESA_TURNIP)), OpenGL 4.6); raf 141 Hz", + "show_s": 1.3, + "panel": "valve.steam.desktopgame.2001639889", + "src": "test" + }, + { + "scenario": "scroll", + "frames_sent": 857, + "frames_drawn": 857, + "frames_shown": 618, + "duration_s": 15.2, + "stages_ms": { + "capture": { + "p50": -2.9, + "p95": 4.5, + "p99": 6.3, + "n": 857 + }, + "queue": { + "p50": 0.0, + "p95": 0.1, + "p99": 0.1, + "n": 857 + }, + "encode": { + "p50": 6.6, + "p95": 9.0, + "p99": 15.0, + "n": 857 + }, + "socket": { + "p50": 0.1, + "p95": 0.2, + "p99": 0.4, + "n": 857 + }, + "network": { + "p50": 5.2, + "p95": 12.8, + "p99": 25.4, + "n": 857 + }, + "decode": { + "p50": 5.8, + "p95": 10.4, + "p99": 13.5, + "n": 857 + }, + "draw": { + "p50": 0.6, + "p95": 1.4, + "p99": 1.8, + "n": 857 + }, + "present": { + "p50": 4.7, + "p95": 16.8, + "p99": 20.3, + "n": 618 + }, + "content": { + "p50": 19.5, + "p95": 31.7, + "p99": 45.5, + "n": 857 + }, + "content_shown": { + "p50": 25.7, + "p95": 38.5, + "p99": 47.8, + "n": 618 + } + }, + "fps": 56.4, + "fps_shown": 40.7, + "late_pct": 5.6, + "stall_max": 120.5, + "stalls_over_100ms": 1, + "mbps": 9.4, + "keyframes": 1, + "size": "1920x1290", + "captured": 971, + "viewer_never_drawn": 0, + "input_ms": { + "n": 0 + }, + "input_shown_ms": { + "n": 0 + }, + "input_parts_ms": { + "uplink": { + "n": 0 + }, + "mac": { + "n": 0 + }, + "back": { + "n": 0 + } + }, + "inputs": { + "sent": 0, + "seen": 0 + }, + "timeline": [ + { + "t": 0, + "fps": 53, + "mbps": 9.14, + "content_p50": 20.2, + "content_p95": 40.2, + "bitrate": 14860800, + "tier": 0, + "w": 1920, + "net": null + }, + { + "t": 1, + "fps": 58, + "mbps": 9.36, + "content_p50": 20.2, + "content_p95": 43.6, + "bitrate": 14860800, + "tier": 0, + "w": 1920, + "net": null + }, + { + "t": 2, + "fps": 54, + "mbps": 9.42, + "content_p50": 18.9, + "content_p95": 28.1, + "bitrate": 14860800, + "tier": 0, + "w": 1920, + "net": null + }, + { + "t": 3, + "fps": 57, + "mbps": 9.46, + "content_p50": 18.1, + "content_p95": 25.0, + "bitrate": 14860800, + "tier": 0, + "w": 1920, + "net": null + }, + { + "t": 4, + "fps": 56, + "mbps": 8.81, + "content_p50": 18.9, + "content_p95": 25.4, + "bitrate": 14860800, + "tier": 0, + "w": 1920, + "net": null + }, + { + "t": 5, + "fps": 57, + "mbps": 11.11, + "content_p50": 18.6, + "content_p95": 34.1, + "bitrate": 14860800, + "tier": 0, + "w": 1920, + "net": null + }, + { + "t": 6, + "fps": 57, + "mbps": 9.96, + "content_p50": 18.1, + "content_p95": 24.0, + "bitrate": 14860800, + "tier": 0, + "w": 1920, + "net": null + }, + { + "t": 7, + "fps": 57, + "mbps": 8.79, + "content_p50": 18.4, + "content_p95": 27.4, + "bitrate": 14860800, + "tier": 0, + "w": 1920, + "net": null + }, + { + "t": 8, + "fps": 58, + "mbps": 9.1, + "content_p50": 20.3, + "content_p95": 27.6, + "bitrate": 14860800, + "tier": 0, + "w": 1920, + "net": null + }, + { + "t": 9, + "fps": 56, + "mbps": 9.65, + "content_p50": 19.3, + "content_p95": 28.0, + "bitrate": 14860800, + "tier": 0, + "w": 1920, + "net": null + }, + { + "t": 10, + "fps": 56, + "mbps": 9.15, + "content_p50": 20.4, + "content_p95": 34.6, + "bitrate": 14860800, + "tier": 0, + "w": 1920, + "net": null + }, + { + "t": 11, + "fps": 57, + "mbps": 9.46, + "content_p50": 20.4, + "content_p95": 31.2, + "bitrate": 14860800, + "tier": 0, + "w": 1920, + "net": null + }, + { + "t": 12, + "fps": 57, + "mbps": 9.53, + "content_p50": 20.4, + "content_p95": 31.2, + "bitrate": 14860800, + "tier": 0, + "w": 1920, + "net": null + }, + { + "t": 13, + "fps": 57, + "mbps": 8.94, + "content_p50": 20.2, + "content_p95": 25.9, + "bitrate": 14860800, + "tier": 0, + "w": 1920, + "net": null + }, + { + "t": 14, + "fps": 57, + "mbps": 9.2, + "content_p50": 19.4, + "content_p95": 27.1, + "bitrate": 14860800, + "tier": 0, + "w": 1920, + "net": null + }, + { + "t": 15, + "fps": 10, + "mbps": 1.69, + "content_p50": 18.1, + "content_p95": 23.7, + "bitrate": 14860800, + "tier": 0, + "w": 1920, + "net": null + } + ], + "adapt": [], + "content_p50": 19.5, + "content_p95": 31.7, + "input_p50": null, + "input_p95": null, + "grades": { + "content_p50": "local", + "content_p95": "local", + "fps": "acceptable", + "late_pct": "bad", + "stall_max": "acceptable" + }, + "controller": { + "adapt": true, + "baseRtt": 6.666, + "ceiling": 14860800, + "fps": 60, + "inFlight": 1, + "scale": 1, + "slack": 47.293, + "target": 14860800, + "tier": 0 + }, + "events": [], + "source_fps": 63.9, + "cpu": { + "mac_agent_pct": 8.5, + "frame_viewer_pct": 72.5, + "frame_tailscaled_pct": 8.3, + "frame_sshd_pct": 0.9, + "frame_gamescope_pct": 7.1, + "frame_total_pct": 30.1 + }, + "viewer": "h264 software; ANGLE (Mesa, zink Vulkan 1.4(Turnip Adreno (TM) 750 (MESA_TURNIP)), OpenGL 4.6); raf 139 Hz", + "show_s": 1.27, + "panel": "valve.steam.desktopgame.2001321860", + "src": "separate:5452" + } + ], + [ + { + "scenario": "test", + "frames_sent": 740, + "frames_drawn": 740, + "frames_shown": 520, + "duration_s": 15.2, + "stages_ms": { + "capture": { + "p50": 0.0, + "p95": 0.0, + "p99": 0.0, + "n": 740 + }, + "queue": { + "p50": 0.0, + "p95": 13.2, + "p99": 19.4, + "n": 740 + }, + "encode": { + "p50": 4.1, + "p95": 4.8, + "p99": 5.2, + "n": 740 + }, + "socket": { + "p50": 0.1, + "p95": 0.2, + "p99": 0.2, + "n": 740 + }, + "network": { + "p50": 3.6, + "p95": 125.3, + "p99": 165.0, + "n": 740 + }, + "decode": { + "p50": 1.0, + "p95": 6.1, + "p99": 10.2, + "n": 740 + }, + "draw": { + "p50": 0.3, + "p95": 0.6, + "p99": 1.1, + "n": 740 + }, + "present": { + "p50": 0.9, + "p95": 15.9, + "p99": 20.1, + "n": 520 + }, + "content": { + "p50": 9.5, + "p95": 137.4, + "p99": 173.0, + "n": 740 + }, + "content_shown": { + "p50": 14.9, + "p95": 66.7, + "p99": 174.2, + "n": 520 + } + }, + "fps": 48.7, + "fps_shown": 34.2, + "late_pct": 16.35, + "stall_max": 267.4, + "stalls_over_100ms": 16, + "mbps": 0.36, + "keyframes": 2, + "size": "960x540", + "captured": 1032, + "viewer_never_drawn": 0, + "input_ms": { + "p50": 32.1, + "p95": 63.7, + "p99": 188.2, + "n": 29 + }, + "input_shown_ms": { + "p50": 36.2, + "p95": 64.1, + "p99": 188.9, + "n": 20 + }, + "input_parts_ms": { + "uplink": { + "p50": 10.5, + "p95": 31.9, + "p99": 47.7, + "n": 29 + }, + "mac": { + "p50": 5.4, + "p95": 19.2, + "p99": 30.2, + "n": 29 + }, + "back": { + "p50": 9.7, + "p95": 29.3, + "p99": 168.5, + "n": 29 + } + }, + "inputs": { + "sent": 30, + "seen": 29 + }, + "timeline": [ + { + "t": 0, + "fps": 60, + "mbps": 0.47, + "content_p50": 8.6, + "content_p95": 10.4, + "bitrate": 5529600, + "tier": 0, + "w": 1280, + "net": null + }, + { + "t": 1, + "fps": 60, + "mbps": 0.47, + "content_p50": 8.8, + "content_p95": 11.2, + "bitrate": 5529600, + "tier": 0, + "w": 1280, + "net": null + }, + { + "t": 2, + "fps": 60, + "mbps": 0.47, + "content_p50": 8.6, + "content_p95": 10.3, + "bitrate": 5529600, + "tier": 0, + "w": 1280, + "net": null + }, + { + "t": 3, + "fps": 60, + "mbps": 0.47, + "content_p50": 9.3, + "content_p95": 12.3, + "bitrate": 5529600, + "tier": 0, + "w": 1280, + "net": null + }, + { + "t": 4, + "fps": 60, + "mbps": 0.47, + "content_p50": 8.6, + "content_p95": 10.6, + "bitrate": 5529600, + "tier": 0, + "w": 1280, + "net": null + }, + { + "t": 5, + "fps": 60, + "mbps": 0.56, + "content_p50": 9.1, + "content_p95": 11.8, + "bitrate": 5529600, + "tier": 0, + "w": 1280, + "net": null + }, + { + "t": 6, + "fps": 59, + "mbps": 0.45, + "content_p50": 9.1, + "content_p95": 25.5, + "bitrate": 5529600, + "tier": 0, + "w": 1280, + "net": null + }, + { + "t": 7, + "fps": 60, + "mbps": 0.46, + "content_p50": 12.2, + "content_p95": 57.8, + "bitrate": 5529600, + "tier": 0, + "w": 1280, + "net": null + }, + { + "t": 8, + "fps": 52, + "mbps": 0.4, + "content_p50": 22.0, + "content_p95": 159.3, + "bitrate": 5529600, + "tier": 0, + "w": 1280, + "net": null + }, + { + "t": 9, + "fps": 47, + "mbps": 0.35, + "content_p50": 90.3, + "content_p95": 164.7, + "bitrate": 2764800, + "tier": 0, + "w": 1280, + "net": null + }, + { + "t": 10, + "fps": 45, + "mbps": 0.34, + "content_p50": 93.8, + "content_p95": 166.0, + "bitrate": 345600, + "tier": 0, + "w": 1280, + "net": null + }, + { + "t": 11, + "fps": 21, + "mbps": 0.18, + "content_p50": 81.0, + "content_p95": 177.2, + "bitrate": 300000, + "tier": 4, + "w": 960, + "net": null + }, + { + "t": 12, + "fps": 27, + "mbps": 0.13, + "content_p50": 29.0, + "content_p95": 176.3, + "bitrate": 300000, + "tier": 4, + "w": 960, + "net": null + }, + { + "t": 13, + "fps": 31, + "mbps": 0.11, + "content_p50": 21.7, + "content_p95": 29.4, + "bitrate": 300000, + "tier": 4, + "w": 960, + "net": null + }, + { + "t": 14, + "fps": 31, + "mbps": 0.11, + "content_p50": 19.6, + "content_p95": 29.3, + "bitrate": 300000, + "tier": 4, + "w": 960, + "net": null + }, + { + "t": 15, + "fps": 7, + "mbps": 0.02, + "content_p50": 21.9, + "content_p95": 29.3, + "bitrate": 300000, + "tier": 4, + "w": 960, + "net": null + } + ], + "adapt": [], + "content_p50": 9.5, + "content_p95": 137.4, + "input_p50": 32.1, + "input_p95": 63.7, + "grades": { + "input_replies": "local", + "content_p50": "local", + "content_p95": "bad", + "input_p50": "local", + "input_p95": "local", + "fps": "acceptable", + "late_pct": "bad", + "stall_max": "bad" + }, + "controller": { + "adapt": true, + "baseRtt": 5.625, + "ceiling": 5529600, + "fps": 30, + "inFlight": 3, + "scale": 0.5, + "slack": 86.958, + "target": 917248, + "tier": 4 + }, + "events": [ + { + "t": 9.22, + "e": "down to 2764 kbit/s: queue 25 ms, held 4, oldest 0 ms, base 5 ms, sent 354 got 379" + }, + { + "t": 10.02, + "e": "down to 1382 kbit/s: queue 99 ms, held 5, oldest 0 ms, base 5 ms, sent 346 got 346" + }, + { + "t": 10.32, + "e": "down to 691 kbit/s: queue 109 ms, held 4, oldest 15 ms, base 5 ms, sent 316 got 309" + }, + { + "t": 10.82, + "e": "down to 345 kbit/s: queue 105 ms, held 5, oldest 177 ms, base 5 ms, sent 304 got 243" + }, + { + "t": 11.22, + "e": "down to 300 kbit/s: queue 118 ms, held 0, oldest 42 ms, base 5 ms, sent 302 got 332" + }, + { + "t": 11.42, + "e": "tier 4" + }, + { + "t": 11.62, + "e": "down to 300 kbit/s: queue 140 ms, held 3, oldest 0 ms, base 5 ms, sent 291 got 291" + }, + { + "t": 12.22, + "e": "down to 300 kbit/s: queue 61 ms, held 2, oldest 1 ms, base 5 ms, sent 152 got 137" + }, + { + "t": 12.52, + "e": "down to 300 kbit/s: queue 102 ms, held 0, oldest 4 ms, base 5 ms, sent 156 got 146" + } + ], + "source_fps": 67.9, + "cpu": { + "mac_agent_pct": 13.4, + "frame_viewer_pct": 35.6, + "frame_tailscaled_pct": 4.1, + "frame_sshd_pct": 0.5, + "frame_gamescope_pct": 7.0, + "frame_total_pct": 24.6 + }, + "viewer": "h264 software; ANGLE (Mesa, zink Vulkan 1.4(Turnip Adreno (TM) 750 (MESA_TURNIP)), OpenGL 4.6); raf 138 Hz", + "show_s": 1.29, + "panel": "valve.steam.desktopgame.2001639889", + "src": "test" + }, + { + "scenario": "scroll", + "frames_sent": 852, + "frames_drawn": 852, + "frames_shown": 607, + "duration_s": 15.2, + "stages_ms": { + "capture": { + "p50": -4.5, + "p95": 0.5, + "p99": 6.7, + "n": 852 + }, + "queue": { + "p50": 0.0, + "p95": 0.1, + "p99": 0.5, + "n": 852 + }, + "encode": { + "p50": 6.6, + "p95": 9.3, + "p99": 16.5, + "n": 852 + }, + "socket": { + "p50": 0.1, + "p95": 0.2, + "p99": 0.4, + "n": 852 + }, + "network": { + "p50": 5.9, + "p95": 15.8, + "p99": 58.8, + "n": 852 + }, + "decode": { + "p50": 5.8, + "p95": 11.6, + "p99": 23.2, + "n": 852 + }, + "draw": { + "p50": 0.6, + "p95": 1.3, + "p99": 1.8, + "n": 852 + }, + "present": { + "p50": 4.2, + "p95": 16.4, + "p99": 20.1, + "n": 607 + }, + "content": { + "p50": 19.6, + "p95": 37.9, + "p99": 106.2, + "n": 852 + }, + "content_shown": { + "p50": 25.7, + "p95": 45.1, + "p99": 110.7, + "n": 607 + } + }, + "fps": 56.2, + "fps_shown": 40.0, + "late_pct": 5.52, + "stall_max": 147.0, + "stalls_over_100ms": 3, + "mbps": 9.36, + "keyframes": 1, + "size": "1920x1290", + "captured": 982, + "viewer_never_drawn": 0, + "input_ms": { + "n": 0 + }, + "input_shown_ms": { + "n": 0 + }, + "input_parts_ms": { + "uplink": { + "n": 0 + }, + "mac": { + "n": 0 + }, + "back": { + "n": 0 + } + }, + "inputs": { + "sent": 0, + "seen": 0 + }, + "timeline": [ + { + "t": 0, + "fps": 44, + "mbps": 8.61, + "content_p50": 29.3, + "content_p95": 126.2, + "bitrate": 14860800, + "tier": 0, + "w": 1920, + "net": null + }, + { + "t": 1, + "fps": 55, + "mbps": 9.63, + "content_p50": 19.5, + "content_p95": 29.8, + "bitrate": 14860800, + "tier": 0, + "w": 1920, + "net": null + }, + { + "t": 2, + "fps": 57, + "mbps": 9.2, + "content_p50": 20.4, + "content_p95": 71.6, + "bitrate": 14860800, + "tier": 0, + "w": 1920, + "net": null + }, + { + "t": 3, + "fps": 53, + "mbps": 9.04, + "content_p50": 19.5, + "content_p95": 36.7, + "bitrate": 14860800, + "tier": 0, + "w": 1920, + "net": null + }, + { + "t": 4, + "fps": 58, + "mbps": 9.08, + "content_p50": 18.9, + "content_p95": 22.3, + "bitrate": 14860800, + "tier": 0, + "w": 1920, + "net": null + }, + { + "t": 5, + "fps": 57, + "mbps": 9.22, + "content_p50": 19.3, + "content_p95": 25.2, + "bitrate": 14860800, + "tier": 0, + "w": 1920, + "net": null + }, + { + "t": 6, + "fps": 57, + "mbps": 11.78, + "content_p50": 20.5, + "content_p95": 37.4, + "bitrate": 14860800, + "tier": 0, + "w": 1920, + "net": null + }, + { + "t": 7, + "fps": 57, + "mbps": 8.73, + "content_p50": 19.2, + "content_p95": 24.2, + "bitrate": 14860800, + "tier": 0, + "w": 1920, + "net": null + }, + { + "t": 8, + "fps": 58, + "mbps": 9.29, + "content_p50": 19.1, + "content_p95": 23.3, + "bitrate": 14860800, + "tier": 0, + "w": 1920, + "net": null + }, + { + "t": 9, + "fps": 58, + "mbps": 9.5, + "content_p50": 18.9, + "content_p95": 24.6, + "bitrate": 14860800, + "tier": 0, + "w": 1920, + "net": null + }, + { + "t": 10, + "fps": 58, + "mbps": 8.58, + "content_p50": 19.2, + "content_p95": 23.7, + "bitrate": 14860800, + "tier": 0, + "w": 1920, + "net": null + }, + { + "t": 11, + "fps": 57, + "mbps": 9.44, + "content_p50": 20.2, + "content_p95": 28.5, + "bitrate": 14860800, + "tier": 0, + "w": 1920, + "net": null + }, + { + "t": 12, + "fps": 58, + "mbps": 9.7, + "content_p50": 20.1, + "content_p95": 37.9, + "bitrate": 14860800, + "tier": 0, + "w": 1920, + "net": null + }, + { + "t": 13, + "fps": 58, + "mbps": 9.15, + "content_p50": 20.8, + "content_p95": 41.4, + "bitrate": 14860800, + "tier": 0, + "w": 1920, + "net": null + }, + { + "t": 14, + "fps": 58, + "mbps": 9.29, + "content_p50": 19.7, + "content_p95": 23.3, + "bitrate": 14860800, + "tier": 0, + "w": 1920, + "net": null + }, + { + "t": 15, + "fps": 9, + "mbps": 1.64, + "content_p50": 20.9, + "content_p95": 38.1, + "bitrate": 14860800, + "tier": 0, + "w": 1920, + "net": null + } + ], + "adapt": [], + "content_p50": 19.6, + "content_p95": 37.9, + "input_p50": null, + "input_p95": null, + "grades": { + "content_p50": "local", + "content_p95": "local", + "fps": "acceptable", + "late_pct": "bad", + "stall_max": "acceptable" + }, + "controller": { + "adapt": true, + "baseRtt": 6.625, + "ceiling": 14860800, + "fps": 60, + "inFlight": 1, + "scale": 1, + "slack": 48.604, + "target": 14860800, + "tier": 0 + }, + "events": [], + "source_fps": 64.6, + "cpu": { + "mac_agent_pct": 8.3, + "frame_viewer_pct": 71.7, + "frame_tailscaled_pct": 8.0, + "frame_sshd_pct": 0.9, + "frame_gamescope_pct": 7.2, + "frame_total_pct": 29.1 + }, + "viewer": "h264 software; ANGLE (Mesa, zink Vulkan 1.4(Turnip Adreno (TM) 750 (MESA_TURNIP)), OpenGL 4.6); raf 139 Hz", + "show_s": 1.27, + "panel": "valve.steam.desktopgame.2001299121", + "src": "separate:5587" + } + ], + [ + { + "scenario": "test", + "frames_sent": 908, + "frames_drawn": 908, + "frames_shown": 382, + "duration_s": 15.2, + "stages_ms": { + "capture": { + "p50": 0.0, + "p95": 0.0, + "p99": 0.0, + "n": 908 + }, + "queue": { + "p50": 0.0, + "p95": 0.1, + "p99": 0.2, + "n": 908 + }, + "encode": { + "p50": 4.2, + "p95": 4.8, + "p99": 5.1, + "n": 908 + }, + "socket": { + "p50": 0.1, + "p95": 0.2, + "p99": 0.2, + "n": 908 + }, + "network": { + "p50": 4.2, + "p95": 7.5, + "p99": 10.1, + "n": 908 + }, + "decode": { + "p50": 1.1, + "p95": 4.0, + "p99": 4.6, + "n": 908 + }, + "draw": { + "p50": 0.4, + "p95": 1.1, + "p99": 1.3, + "n": 908 + }, + "present": { + "p50": 6.2, + "p95": 17.0, + "p99": 18.3, + "n": 382 + }, + "content": { + "p50": 10.5, + "p95": 14.2, + "p99": 16.6, + "n": 908 + }, + "content_shown": { + "p50": 17.1, + "p95": 27.2, + "p99": 29.4, + "n": 382 + } + }, + "fps": 59.7, + "fps_shown": 25.1, + "late_pct": 0.33, + "stall_max": 122.8, + "stalls_over_100ms": 1, + "mbps": 0.47, + "keyframes": 1, + "size": "1280x720", + "captured": 1033, + "viewer_never_drawn": 0, + "input_ms": { + "p50": 25.2, + "p95": 33.5, + "p99": 34.1, + "n": 30 + }, + "input_shown_ms": { + "p50": 32.4, + "p95": 43.4, + "p99": 43.4, + "n": 9 + }, + "input_parts_ms": { + "uplink": { + "p50": 5.9, + "p95": 17.6, + "p99": 18.3, + "n": 30 + }, + "mac": { + "p50": 6.2, + "p95": 14.5, + "p99": 20.8, + "n": 30 + }, + "back": { + "p50": 10.7, + "p95": 13.5, + "p99": 14.8, + "n": 30 + } + }, + "inputs": { + "sent": 30, + "seen": 30 + }, + "timeline": [ + { + "t": 0, + "fps": 60, + "mbps": 0.48, + "content_p50": 10.7, + "content_p95": 15.1, + "bitrate": 5529600, + "tier": 0, + "w": 1280, + "net": null + }, + { + "t": 1, + "fps": 60, + "mbps": 0.47, + "content_p50": 12.1, + "content_p95": 14.8, + "bitrate": 5529600, + "tier": 0, + "w": 1280, + "net": null + }, + { + "t": 2, + "fps": 60, + "mbps": 0.47, + "content_p50": 11.0, + "content_p95": 14.8, + "bitrate": 5529600, + "tier": 0, + "w": 1280, + "net": null + }, + { + "t": 3, + "fps": 60, + "mbps": 0.47, + "content_p50": 9.9, + "content_p95": 12.8, + "bitrate": 5529600, + "tier": 0, + "w": 1280, + "net": null + }, + { + "t": 4, + "fps": 60, + "mbps": 0.46, + "content_p50": 10.3, + "content_p95": 13.7, + "bitrate": 5529600, + "tier": 0, + "w": 1280, + "net": null + }, + { + "t": 5, + "fps": 60, + "mbps": 0.56, + "content_p50": 10.3, + "content_p95": 13.4, + "bitrate": 5529600, + "tier": 0, + "w": 1280, + "net": null + }, + { + "t": 6, + "fps": 60, + "mbps": 0.45, + "content_p50": 9.3, + "content_p95": 11.8, + "bitrate": 5529600, + "tier": 0, + "w": 1280, + "net": null + }, + { + "t": 7, + "fps": 56, + "mbps": 0.44, + "content_p50": 8.9, + "content_p95": 10.9, + "bitrate": 5529600, + "tier": 0, + "w": 1280, + "net": null + }, + { + "t": 8, + "fps": 60, + "mbps": 0.47, + "content_p50": 9.4, + "content_p95": 11.5, + "bitrate": 5529600, + "tier": 0, + "w": 1280, + "net": null + }, + { + "t": 9, + "fps": 60, + "mbps": 0.46, + "content_p50": 9.6, + "content_p95": 11.0, + "bitrate": 5529600, + "tier": 0, + "w": 1280, + "net": null + }, + { + "t": 10, + "fps": 60, + "mbps": 0.44, + "content_p50": 9.1, + "content_p95": 11.4, + "bitrate": 5529600, + "tier": 0, + "w": 1280, + "net": null + }, + { + "t": 11, + "fps": 60, + "mbps": 0.46, + "content_p50": 11.1, + "content_p95": 13.5, + "bitrate": 5529600, + "tier": 0, + "w": 1280, + "net": null + }, + { + "t": 12, + "fps": 60, + "mbps": 0.45, + "content_p50": 12.3, + "content_p95": 14.0, + "bitrate": 5529600, + "tier": 0, + "w": 1280, + "net": null + }, + { + "t": 13, + "fps": 60, + "mbps": 0.44, + "content_p50": 12.3, + "content_p95": 14.6, + "bitrate": 5529600, + "tier": 0, + "w": 1280, + "net": null + }, + { + "t": 14, + "fps": 60, + "mbps": 0.45, + "content_p50": 12.4, + "content_p95": 14.8, + "bitrate": 5529600, + "tier": 0, + "w": 1280, + "net": null + }, + { + "t": 15, + "fps": 12, + "mbps": 0.09, + "content_p50": 12.5, + "content_p95": 13.0, + "bitrate": 5529600, + "tier": 0, + "w": 1280, + "net": null + } + ], + "adapt": [], + "content_p50": 10.5, + "content_p95": 14.2, + "input_p50": 25.2, + "input_p95": 33.5, + "grades": { + "input_replies": "local", + "content_p50": "local", + "content_p95": "local", + "input_p50": "local", + "input_p95": "local", + "fps": "local", + "late_pct": "local", + "stall_max": "acceptable" + }, + "controller": { + "adapt": true, + "baseRtt": 5.167, + "ceiling": 5529600, + "fps": 60, + "inFlight": 0, + "scale": 1, + "slack": 49.102, + "target": 5529600, + "tier": 0 + }, + "events": [], + "source_fps": 68.0, + "cpu": { + "mac_agent_pct": 15.5, + "frame_viewer_pct": 51.6, + "frame_tailscaled_pct": 5.2, + "frame_sshd_pct": 0.8, + "frame_gamescope_pct": 9.5, + "frame_total_pct": 33.4 + }, + "viewer": "h264 software; ANGLE (Mesa, zink Vulkan 1.4(Turnip Adreno (TM) 750 (MESA_TURNIP)), OpenGL 4.6); raf 135 Hz", + "show_s": 1.37, + "panel": "valve.steam.desktopgame.2001639889", + "src": "test" + }, + { + "scenario": "scroll", + "frames_sent": 843, + "frames_drawn": 843, + "frames_shown": 414, + "duration_s": 15.2, + "stages_ms": { + "capture": { + "p50": -4.7, + "p95": 0.5, + "p99": 1.3, + "n": 843 + }, + "queue": { + "p50": 0.0, + "p95": 0.1, + "p99": 0.1, + "n": 843 + }, + "encode": { + "p50": 6.6, + "p95": 9.2, + "p99": 17.1, + "n": 843 + }, + "socket": { + "p50": 0.1, + "p95": 0.2, + "p99": 0.4, + "n": 843 + }, + "network": { + "p50": 6.4, + "p95": 14.7, + "p99": 68.7, + "n": 843 + }, + "decode": { + "p50": 6.0, + "p95": 11.7, + "p99": 16.1, + "n": 843 + }, + "draw": { + "p50": 0.7, + "p95": 1.4, + "p99": 1.7, + "n": 843 + }, + "present": { + "p50": 4.0, + "p95": 18.1, + "p99": 25.9, + "n": 414 + }, + "content": { + "p50": 20.5, + "p95": 33.6, + "p99": 103.0, + "n": 843 + }, + "content_shown": { + "p50": 26.1, + "p95": 41.0, + "p99": 122.7, + "n": 414 + } + }, + "fps": 55.6, + "fps_shown": 27.3, + "late_pct": 6.29, + "stall_max": 153.6, + "stalls_over_100ms": 3, + "mbps": 9.25, + "keyframes": 1, + "size": "1920x1290", + "captured": 970, + "viewer_never_drawn": 0, + "input_ms": { + "n": 0 + }, + "input_shown_ms": { + "n": 0 + }, + "input_parts_ms": { + "uplink": { + "n": 0 + }, + "mac": { + "n": 0 + }, + "back": { + "n": 0 + } + }, + "inputs": { + "sent": 0, + "seen": 0 + }, + "timeline": [ + { + "t": 0, + "fps": 53, + "mbps": 9.13, + "content_p50": 22.1, + "content_p95": 110.8, + "bitrate": 14860800, + "tier": 0, + "w": 1920, + "net": null + }, + { + "t": 1, + "fps": 53, + "mbps": 9.46, + "content_p50": 20.7, + "content_p95": 27.4, + "bitrate": 14860800, + "tier": 0, + "w": 1920, + "net": null + }, + { + "t": 2, + "fps": 56, + "mbps": 9.19, + "content_p50": 20.2, + "content_p95": 26.9, + "bitrate": 14860800, + "tier": 0, + "w": 1920, + "net": null + }, + { + "t": 3, + "fps": 57, + "mbps": 9.36, + "content_p50": 20.1, + "content_p95": 27.4, + "bitrate": 14860800, + "tier": 0, + "w": 1920, + "net": null + }, + { + "t": 4, + "fps": 57, + "mbps": 9.66, + "content_p50": 19.9, + "content_p95": 24.7, + "bitrate": 14860800, + "tier": 0, + "w": 1920, + "net": null + }, + { + "t": 5, + "fps": 57, + "mbps": 8.68, + "content_p50": 20.5, + "content_p95": 25.1, + "bitrate": 14860800, + "tier": 0, + "w": 1920, + "net": null + }, + { + "t": 6, + "fps": 46, + "mbps": 10.48, + "content_p50": 25.4, + "content_p95": 126.0, + "bitrate": 14860800, + "tier": 0, + "w": 1920, + "net": null + }, + { + "t": 7, + "fps": 56, + "mbps": 9.16, + "content_p50": 20.1, + "content_p95": 35.2, + "bitrate": 14860800, + "tier": 0, + "w": 1920, + "net": null + }, + { + "t": 8, + "fps": 57, + "mbps": 8.76, + "content_p50": 21.1, + "content_p95": 28.3, + "bitrate": 14860800, + "tier": 0, + "w": 1920, + "net": null + }, + { + "t": 9, + "fps": 57, + "mbps": 9.29, + "content_p50": 20.5, + "content_p95": 24.2, + "bitrate": 14860800, + "tier": 0, + "w": 1920, + "net": null + }, + { + "t": 10, + "fps": 57, + "mbps": 8.87, + "content_p50": 20.4, + "content_p95": 40.3, + "bitrate": 14860800, + "tier": 0, + "w": 1920, + "net": null + }, + { + "t": 11, + "fps": 58, + "mbps": 9.17, + "content_p50": 20.3, + "content_p95": 23.9, + "bitrate": 14860800, + "tier": 0, + "w": 1920, + "net": null + }, + { + "t": 12, + "fps": 56, + "mbps": 9.05, + "content_p50": 19.5, + "content_p95": 23.9, + "bitrate": 14860800, + "tier": 0, + "w": 1920, + "net": null + }, + { + "t": 13, + "fps": 56, + "mbps": 8.85, + "content_p50": 20.8, + "content_p95": 31.9, + "bitrate": 14860800, + "tier": 0, + "w": 1920, + "net": null + }, + { + "t": 14, + "fps": 57, + "mbps": 9.48, + "content_p50": 20.6, + "content_p95": 34.2, + "bitrate": 14860800, + "tier": 0, + "w": 1920, + "net": null + }, + { + "t": 15, + "fps": 10, + "mbps": 1.65, + "content_p50": 24.8, + "content_p95": 39.9, + "bitrate": 14860800, + "tier": 0, + "w": 1920, + "net": null + } + ], + "adapt": [], + "content_p50": 20.5, + "content_p95": 33.6, + "input_p50": null, + "input_p95": null, + "grades": { + "content_p50": "local", + "content_p95": "local", + "fps": "acceptable", + "late_pct": "bad", + "stall_max": "acceptable" + }, + "controller": { + "adapt": true, + "baseRtt": 7.167, + "ceiling": 14860800, + "fps": 60, + "inFlight": 1, + "scale": 1, + "slack": 48.229, + "target": 14860800, + "tier": 0 + }, + "events": [], + "source_fps": 63.8, + "cpu": { + "mac_agent_pct": 8.5, + "frame_viewer_pct": 78.1, + "frame_tailscaled_pct": 8.2, + "frame_sshd_pct": 0.9, + "frame_gamescope_pct": 9.0, + "frame_total_pct": 29.8 + }, + "viewer": "h264 software; ANGLE (Mesa, zink Vulkan 1.4(Turnip Adreno (TM) 750 (MESA_TURNIP)), OpenGL 4.6); raf 71 Hz", + "show_s": 1.26, + "panel": "valve.steam.desktopgame.2001733678", + "src": "separate:5994" + } + ] + ] + }, + "table": { + "test": { + "content_p50": { + "off": [ + 9.5, + 9.7, + 10.6 + ], + "on": [ + 9.5, + 9.5, + 10.5 + ] + }, + "content_p95": { + "off": [ + 16.2, + 14.3, + 15.0 + ], + "on": [ + 13.2, + 137.4, + 14.2 + ] + }, + "input_p50": { + "off": [ + 28.3, + 22.6, + 30.9 + ], + "on": [ + 27.2, + 32.1, + 25.2 + ] + }, + "input_p95": { + "off": [ + 38.3, + 32.7, + 103.7 + ], + "on": [ + 51.1, + 63.7, + 33.5 + ] + }, + "fps": { + "off": [ + 59.9, + 60.0, + 60.0 + ], + "on": [ + 60.0, + 48.7, + 59.7 + ] + }, + "late_pct": { + "off": [ + 2.05, + 0.33, + 0.99 + ], + "on": [ + 1.17, + 16.35, + 0.33 + ] + }, + "stall_max": { + "off": [ + 150.2, + 120.5, + 37.7 + ], + "on": [ + 75.6, + 267.4, + 122.8 + ] + }, + "mbps": { + "off": [ + 0.47, + 0.48, + 0.47 + ], + "on": [ + 0.47, + 0.36, + 0.47 + ] + } + }, + "scroll": { + "content_p50": { + "off": [ + 20.0, + 19.5, + 20.5 + ], + "on": [ + 19.5, + 19.6, + 20.5 + ] + }, + "content_p95": { + "off": [ + 32.3, + 25.2, + 45.9 + ], + "on": [ + 31.7, + 37.9, + 33.6 + ] + }, + "input_p50": { + "off": [], + "on": [] + }, + "input_p95": { + "off": [], + "on": [] + }, + "fps": { + "off": [ + 54.9, + 57.0, + 57.3 + ], + "on": [ + 56.4, + 56.2, + 55.6 + ] + }, + "late_pct": { + "off": [ + 6.59, + 3.36, + 4.6 + ], + "on": [ + 5.6, + 5.52, + 6.29 + ] + }, + "stall_max": { + "off": [ + 84.3, + 105.4, + 321.6 + ], + "on": [ + 120.5, + 147.0, + 153.6 + ] + }, + "mbps": { + "off": [ + 9.44, + 9.44, + 9.4 + ], + "on": [ + 9.4, + 9.36, + 9.25 + ] + } + } + } +} \ No newline at end of file diff --git a/bench/results/2026-09-28-a3c6e5c-dirty-ab-adapt-step3.json b/bench/results/2026-09-28-a3c6e5c-dirty-ab-adapt-step3.json new file mode 100644 index 0000000..332db76 --- /dev/null +++ b/bench/results/2026-09-28-a3c6e5c-dirty-ab-adapt-step3.json @@ -0,0 +1,3743 @@ +{ + "label": "ab-adapt-step3", + "date": "2026-09-28T20:24:10", + "commit": "a3c6e5c+dirty", + "config": { + "quality": "balanced", + "mode": "separate", + "net": "50@0,3@8,50@16", + "delay_ms": 0, + "buffer_ms": 250, + "host": "frame", + "ssh_opts": [], + "encoder": "", + "duration_s": 24.0, + "browser_flags": [] + }, + "frame_build": "20260925.6191901", + "mac": "26.5.2", + "headset": "8:23.135290 [Info] - 0 - leaving standby", + "scenarios": [], + "arms": [ + "off:FRAME_MAC_VIEW_ADAPT=0", + "on:" + ], + "runs": { + "off": [ + [ + { + "scenario": "scroll", + "frames_sent": 1179, + "frames_drawn": 1110, + "frames_shown": 576, + "duration_s": 24.2, + "stages_ms": { + "capture": { + "p50": -4.7, + "p95": 0.5, + "p99": 4.3, + "n": 1179 + }, + "queue": { + "p50": 0.0, + "p95": 0.1, + "p99": 0.3, + "n": 1179 + }, + "encode": { + "p50": 6.6, + "p95": 8.7, + "p99": 13.8, + "n": 1179 + }, + "socket": { + "p50": 0.1, + "p95": 1690.5, + "p99": 2066.6, + "n": 1179 + }, + "network": { + "p50": 13.6, + "p95": 4872.0, + "p99": 5491.7, + "n": 1179 + }, + "decode": { + "p50": 6.0, + "p95": 46.0, + "p99": 75.8, + "n": 1110 + }, + "draw": { + "p50": 0.7, + "p95": 1.3, + "p99": 2.0, + "n": 1110 + }, + "present": { + "p50": 5.1, + "p95": 34.3, + "p99": 44.3, + "n": 576 + }, + "content": { + "p50": 27.5, + "p95": 4986.4, + "p99": 5514.6, + "n": 1110 + }, + "content_shown": { + "p50": 36.0, + "p95": 4759.3, + "p99": 5454.2, + "n": 576 + } + }, + "fps": 45.8, + "fps_shown": 23.8, + "late_pct": 19.19, + "stall_max": 232.1, + "stalls_over_100ms": 5, + "mbps": 8.62, + "keyframes": 3, + "size": "1920x1290", + "captured": 1500, + "viewer_never_drawn": 69, + "input_ms": { + "n": 0 + }, + "input_shown_ms": { + "n": 0 + }, + "input_parts_ms": { + "uplink": { + "n": 0 + }, + "mac": { + "n": 0 + }, + "back": { + "n": 0 + } + }, + "inputs": { + "sent": 0, + "seen": 0 + }, + "timeline": [ + { + "t": 0, + "fps": 55, + "mbps": 9.44, + "content_p50": 22.8, + "content_p95": 36.7, + "bitrate": 14860800, + "tier": 0, + "w": 1920, + "net": 50.0 + }, + { + "t": 1, + "fps": 57, + "mbps": 9.75, + "content_p50": 25.3, + "content_p95": 139.3, + "bitrate": 14860800, + "tier": 0, + "w": 1920, + "net": 50.0 + }, + { + "t": 2, + "fps": 58, + "mbps": 9.8, + "content_p50": 24.2, + "content_p95": 110.3, + "bitrate": 14860800, + "tier": 0, + "w": 1920, + "net": 50.0 + }, + { + "t": 3, + "fps": 58, + "mbps": 9.52, + "content_p50": 22.5, + "content_p95": 37.1, + "bitrate": 14860800, + "tier": 0, + "w": 1920, + "net": 50.0 + }, + { + "t": 4, + "fps": 56, + "mbps": 8.91, + "content_p50": 23.4, + "content_p95": 30.9, + "bitrate": 14860800, + "tier": 0, + "w": 1920, + "net": 50.0 + }, + { + "t": 5, + "fps": 53, + "mbps": 8.91, + "content_p50": 23.4, + "content_p95": 77.6, + "bitrate": 14860800, + "tier": 0, + "w": 1920, + "net": 50.0 + }, + { + "t": 6, + "fps": 58, + "mbps": 12.0, + "content_p50": 22.9, + "content_p95": 54.1, + "bitrate": 14860800, + "tier": 0, + "w": 1920, + "net": 50.0 + }, + { + "t": 7, + "fps": 58, + "mbps": 8.82, + "content_p50": 21.8, + "content_p95": 28.6, + "bitrate": 14860800, + "tier": 0, + "w": 1920, + "net": 50.0 + }, + { + "t": 8, + "fps": 58, + "mbps": 9.48, + "content_p50": 1079.9, + "content_p95": 2016.7, + "bitrate": 14860800, + "tier": 0, + "w": 1920, + "net": 3.0 + }, + { + "t": 9, + "fps": 57, + "mbps": 9.19, + "content_p50": 3208.0, + "content_p95": 4125.6, + "bitrate": 14860800, + "tier": 0, + "w": 1920, + "net": 3.0 + }, + { + "t": 10, + "fps": 58, + "mbps": 8.91, + "content_p50": 5139.1, + "content_p95": 5585.2, + "bitrate": 14860800, + "tier": 0, + "w": 1920, + "net": 3.0 + }, + { + "t": 11, + "fps": 29, + "mbps": 6.33, + "content_p50": 5245.6, + "content_p95": 5430.8, + "bitrate": 14860800, + "tier": 0, + "w": 1920, + "net": 3.0 + }, + { + "t": 12, + "fps": 10, + "mbps": 2.92, + "content_p50": 4133.7, + "content_p95": 4182.4, + "bitrate": 14860800, + "tier": 0, + "w": 1920, + "net": 3.0 + }, + { + "t": 13, + "fps": 9, + "mbps": 4.39, + "content_p50": 3552.8, + "content_p95": 3589.4, + "bitrate": 14860800, + "tier": 0, + "w": 1920, + "net": 3.0 + }, + { + "t": 14, + "fps": 25, + "mbps": 5.77, + "content_p50": 2820.8, + "content_p95": 2926.6, + "bitrate": 14860800, + "tier": 0, + "w": 1920, + "net": 3.0 + }, + { + "t": 15, + "fps": 10, + "mbps": 2.52, + "content_p50": 1747.5, + "content_p95": 1791.7, + "bitrate": 14860800, + "tier": 0, + "w": 1920, + "net": 3.0 + }, + { + "t": 16, + "fps": 13, + "mbps": 10.51, + "content_p50": 1139.0, + "content_p95": 1179.4, + "bitrate": 14860800, + "tier": 0, + "w": 1920, + "net": 50.0 + }, + { + "t": 17, + "fps": 31, + "mbps": 13.74, + "content_p50": 164.3, + "content_p95": 295.2, + "bitrate": 14860800, + "tier": 0, + "w": 1920, + "net": 50.0 + }, + { + "t": 18, + "fps": 57, + "mbps": 9.05, + "content_p50": 24.4, + "content_p95": 30.8, + "bitrate": 14860800, + "tier": 0, + "w": 1920, + "net": 50.0 + }, + { + "t": 19, + "fps": 57, + "mbps": 9.45, + "content_p50": 29.5, + "content_p95": 43.6, + "bitrate": 14860800, + "tier": 0, + "w": 1920, + "net": 50.0 + }, + { + "t": 20, + "fps": 58, + "mbps": 9.16, + "content_p50": 27.3, + "content_p95": 63.6, + "bitrate": 14860800, + "tier": 0, + "w": 1920, + "net": 50.0 + }, + { + "t": 21, + "fps": 58, + "mbps": 9.75, + "content_p50": 26.9, + "content_p95": 40.2, + "bitrate": 14860800, + "tier": 0, + "w": 1920, + "net": 50.0 + }, + { + "t": 22, + "fps": 57, + "mbps": 9.45, + "content_p50": 28.5, + "content_p95": 34.9, + "bitrate": 14860800, + "tier": 0, + "w": 1920, + "net": 50.0 + }, + { + "t": 23, + "fps": 58, + "mbps": 9.21, + "content_p50": 25.9, + "content_p95": 30.7, + "bitrate": 14860800, + "tier": 0, + "w": 1920, + "net": 50.0 + }, + { + "t": 24, + "fps": 12, + "mbps": 1.9, + "content_p50": 25.9, + "content_p95": 28.3, + "bitrate": 14860800, + "tier": 0, + "w": 1920, + "net": 50.0 + } + ], + "adapt": [ + { + "at": 8.0, + "to_mbit": 3.0, + "p95_bound": 63.8, + "worst_p95": 5585.2, + "settled_s": 10.0 + } + ], + "content_p50": 27.5, + "content_p95": 4986.4, + "input_p50": null, + "input_p95": null, + "grades": { + "content_p50": "acceptable", + "content_p95": "bad", + "fps": "acceptable", + "late_pct": "bad", + "stall_max": "acceptable", + "adapt@8s": "bad" + }, + "controller": { + "adapt": false, + "baseRtt": 10.625, + "ceiling": 14860800, + "fps": 60, + "inFlight": 1, + "scale": 1, + "slack": 40, + "target": 14860800, + "tier": 0 + }, + "events": [], + "source_fps": 62.0, + "cpu": { + "mac_agent_pct": 7.7, + "frame_viewer_pct": 62.6, + "frame_tailscaled_pct": 20.6, + "frame_sshd_pct": 2.4, + "frame_gamescope_pct": 9.7, + "frame_total_pct": 44.8 + }, + "viewer": "h264 software; ANGLE (Mesa, zink Vulkan 1.4(Turnip Adreno (TM) 750 (MESA_TURNIP)), OpenGL 4.6); raf 71 Hz", + "show_s": 1.28, + "panel": "valve.steam.desktopgame.2001525774", + "src": "separate:6129" + }, + { + "scenario": "test", + "frames_sent": 1464, + "frames_drawn": 1464, + "frames_shown": 1198, + "duration_s": 24.4, + "stages_ms": { + "capture": { + "p50": 0.0, + "p95": 0.0, + "p99": 0.0, + "n": 1464 + }, + "queue": { + "p50": 0.0, + "p95": 0.1, + "p99": 0.1, + "n": 1464 + }, + "encode": { + "p50": 4.2, + "p95": 4.9, + "p99": 5.2, + "n": 1464 + }, + "socket": { + "p50": 0.1, + "p95": 0.2, + "p99": 0.3, + "n": 1464 + }, + "network": { + "p50": 6.8, + "p95": 102.3, + "p99": 162.7, + "n": 1464 + }, + "decode": { + "p50": 1.1, + "p95": 10.7, + "p99": 16.6, + "n": 1464 + }, + "draw": { + "p50": 0.3, + "p95": 0.8, + "p99": 1.2, + "n": 1464 + }, + "present": { + "p50": 0.6, + "p95": 12.6, + "p99": 15.1, + "n": 1198 + }, + "content": { + "p50": 12.8, + "p95": 116.8, + "p99": 168.7, + "n": 1464 + }, + "content_shown": { + "p50": 14.7, + "p95": 30.1, + "p99": 173.8, + "n": 1198 + } + }, + "fps": 60.0, + "fps_shown": 49.1, + "late_pct": 3.69, + "stall_max": 185.4, + "stalls_over_100ms": 16, + "mbps": 0.49, + "keyframes": 2, + "size": "1280x720", + "captured": 1584, + "viewer_never_drawn": 0, + "input_ms": { + "p50": 34.4, + "p95": 86.0, + "p99": 207.9, + "n": 48 + }, + "input_shown_ms": { + "p50": 34.9, + "p95": 86.7, + "p99": 208.5, + "n": 46 + }, + "input_parts_ms": { + "uplink": { + "p50": 13.9, + "p95": 29.5, + "p99": 55.9, + "n": 48 + }, + "mac": { + "p50": 6.5, + "p95": 16.2, + "p99": 18.2, + "n": 48 + }, + "back": { + "p50": 12.8, + "p95": 48.6, + "p99": 178.9, + "n": 48 + } + }, + "inputs": { + "sent": 48, + "seen": 48 + }, + "timeline": [ + { + "t": 0, + "fps": 60, + "mbps": 0.52, + "content_p50": 11.7, + "content_p95": 15.9, + "bitrate": 5529600, + "tier": 0, + "w": 1280, + "net": 50.0 + }, + { + "t": 1, + "fps": 60, + "mbps": 0.48, + "content_p50": 11.8, + "content_p95": 16.9, + "bitrate": 5529600, + "tier": 0, + "w": 1280, + "net": 50.0 + }, + { + "t": 2, + "fps": 60, + "mbps": 0.48, + "content_p50": 11.2, + "content_p95": 16.2, + "bitrate": 5529600, + "tier": 0, + "w": 1280, + "net": 50.0 + }, + { + "t": 3, + "fps": 60, + "mbps": 0.47, + "content_p50": 10.3, + "content_p95": 14.4, + "bitrate": 5529600, + "tier": 0, + "w": 1280, + "net": 50.0 + }, + { + "t": 4, + "fps": 60, + "mbps": 0.48, + "content_p50": 11.1, + "content_p95": 15.1, + "bitrate": 5529600, + "tier": 0, + "w": 1280, + "net": 50.0 + }, + { + "t": 5, + "fps": 60, + "mbps": 0.5, + "content_p50": 10.7, + "content_p95": 13.3, + "bitrate": 5529600, + "tier": 0, + "w": 1280, + "net": 50.0 + }, + { + "t": 6, + "fps": 60, + "mbps": 0.59, + "content_p50": 11.6, + "content_p95": 15.3, + "bitrate": 5529600, + "tier": 0, + "w": 1280, + "net": 50.0 + }, + { + "t": 7, + "fps": 60, + "mbps": 0.5, + "content_p50": 11.9, + "content_p95": 14.7, + "bitrate": 5529600, + "tier": 0, + "w": 1280, + "net": 50.0 + }, + { + "t": 8, + "fps": 60, + "mbps": 0.49, + "content_p50": 15.7, + "content_p95": 19.4, + "bitrate": 5529600, + "tier": 0, + "w": 1280, + "net": 3.0 + }, + { + "t": 9, + "fps": 60, + "mbps": 0.47, + "content_p50": 15.3, + "content_p95": 19.7, + "bitrate": 5529600, + "tier": 0, + "w": 1280, + "net": 3.0 + }, + { + "t": 10, + "fps": 60, + "mbps": 0.47, + "content_p50": 16.1, + "content_p95": 55.0, + "bitrate": 5529600, + "tier": 0, + "w": 1280, + "net": 3.0 + }, + { + "t": 11, + "fps": 60, + "mbps": 0.48, + "content_p50": 23.0, + "content_p95": 71.3, + "bitrate": 5529600, + "tier": 0, + "w": 1280, + "net": 3.0 + }, + { + "t": 12, + "fps": 60, + "mbps": 0.49, + "content_p50": 72.3, + "content_p95": 174.5, + "bitrate": 5529600, + "tier": 0, + "w": 1280, + "net": 3.0 + }, + { + "t": 13, + "fps": 60, + "mbps": 0.5, + "content_p50": 79.0, + "content_p95": 173.3, + "bitrate": 5529600, + "tier": 0, + "w": 1280, + "net": 3.0 + }, + { + "t": 14, + "fps": 60, + "mbps": 0.48, + "content_p50": 48.3, + "content_p95": 163.5, + "bitrate": 5529600, + "tier": 0, + "w": 1280, + "net": 3.0 + }, + { + "t": 15, + "fps": 60, + "mbps": 0.48, + "content_p50": 68.1, + "content_p95": 168.7, + "bitrate": 5529600, + "tier": 0, + "w": 1280, + "net": 3.0 + }, + { + "t": 16, + "fps": 60, + "mbps": 0.57, + "content_p50": 13.8, + "content_p95": 125.8, + "bitrate": 5529600, + "tier": 0, + "w": 1280, + "net": 50.0 + }, + { + "t": 17, + "fps": 60, + "mbps": 0.48, + "content_p50": 13.7, + "content_p95": 19.1, + "bitrate": 5529600, + "tier": 0, + "w": 1280, + "net": 50.0 + }, + { + "t": 18, + "fps": 60, + "mbps": 0.46, + "content_p50": 11.6, + "content_p95": 14.8, + "bitrate": 5529600, + "tier": 0, + "w": 1280, + "net": 50.0 + }, + { + "t": 19, + "fps": 60, + "mbps": 0.48, + "content_p50": 12.1, + "content_p95": 16.0, + "bitrate": 5529600, + "tier": 0, + "w": 1280, + "net": 50.0 + }, + { + "t": 20, + "fps": 60, + "mbps": 0.47, + "content_p50": 12.1, + "content_p95": 21.7, + "bitrate": 5529600, + "tier": 0, + "w": 1280, + "net": 50.0 + }, + { + "t": 21, + "fps": 60, + "mbps": 0.47, + "content_p50": 10.0, + "content_p95": 14.4, + "bitrate": 5529600, + "tier": 0, + "w": 1280, + "net": 50.0 + }, + { + "t": 22, + "fps": 60, + "mbps": 0.47, + "content_p50": 12.5, + "content_p95": 15.4, + "bitrate": 5529600, + "tier": 0, + "w": 1280, + "net": 50.0 + }, + { + "t": 23, + "fps": 60, + "mbps": 0.47, + "content_p50": 9.8, + "content_p95": 13.6, + "bitrate": 5529600, + "tier": 0, + "w": 1280, + "net": 50.0 + }, + { + "t": 24, + "fps": 24, + "mbps": 0.17, + "content_p50": 10.2, + "content_p95": 14.9, + "bitrate": 5529600, + "tier": 0, + "w": 1280, + "net": 50.0 + } + ], + "adapt": [ + { + "at": 8.0, + "to_mbit": 3.0, + "p95_bound": 40.0, + "worst_p95": 174.5, + "settled_s": 9.0 + } + ], + "content_p50": 12.8, + "content_p95": 116.8, + "input_p50": 34.4, + "input_p95": 86.0, + "grades": { + "input_replies": "local", + "content_p50": "local", + "content_p95": "bad", + "input_p50": "local", + "input_p95": "acceptable", + "fps": "local", + "late_pct": "acceptable", + "stall_max": "acceptable", + "adapt@8s": "bad" + }, + "controller": { + "adapt": false, + "baseRtt": 6.042, + "ceiling": 5529600, + "fps": 60, + "inFlight": 2, + "scale": 1, + "slack": 40, + "target": 5529600, + "tier": 0 + }, + "events": [], + "source_fps": 64.9, + "cpu": { + "mac_agent_pct": 14.9, + "frame_viewer_pct": 43.7, + "frame_tailscaled_pct": 21.3, + "frame_sshd_pct": -1.7, + "frame_gamescope_pct": 9.8, + "frame_total_pct": 42.4 + }, + "viewer": "h264 software; ANGLE (Mesa, zink Vulkan 1.4(Turnip Adreno (TM) 750 (MESA_TURNIP)), OpenGL 4.6); raf 72 Hz", + "show_s": 1.42, + "panel": "valve.steam.desktopgame.2001639889", + "src": "test" + } + ], + [ + { + "scenario": "scroll", + "frames_sent": 1168, + "frames_drawn": 1081, + "frames_shown": 565, + "duration_s": 24.3, + "stages_ms": { + "capture": { + "p50": -7.8, + "p95": 0.4, + "p99": 3.8, + "n": 1168 + }, + "queue": { + "p50": 0.0, + "p95": 0.1, + "p99": 0.1, + "n": 1168 + }, + "encode": { + "p50": 6.7, + "p95": 9.3, + "p99": 15.8, + "n": 1168 + }, + "socket": { + "p50": 0.1, + "p95": 1496.6, + "p99": 2773.0, + "n": 1168 + }, + "network": { + "p50": 9.8, + "p95": 4895.9, + "p99": 5418.1, + "n": 1168 + }, + "decode": { + "p50": 5.9, + "p95": 17.7, + "p99": 65.2, + "n": 1081 + }, + "draw": { + "p50": 0.6, + "p95": 1.3, + "p99": 1.8, + "n": 1081 + }, + "present": { + "p50": 5.3, + "p95": 30.8, + "p99": 41.9, + "n": 565 + }, + "content": { + "p50": 23.8, + "p95": 4355.1, + "p99": 5463.9, + "n": 1081 + }, + "content_shown": { + "p50": 32.9, + "p95": 4606.2, + "p99": 5408.3, + "n": 565 + } + }, + "fps": 44.5, + "fps_shown": 23.3, + "late_pct": 17.67, + "stall_max": 398.2, + "stalls_over_100ms": 2, + "mbps": 8.39, + "keyframes": 3, + "size": "1920x1290", + "captured": 1509, + "viewer_never_drawn": 87, + "input_ms": { + "n": 0 + }, + "input_shown_ms": { + "n": 0 + }, + "input_parts_ms": { + "uplink": { + "n": 0 + }, + "mac": { + "n": 0 + }, + "back": { + "n": 0 + } + }, + "inputs": { + "sent": 0, + "seen": 0 + }, + "timeline": [ + { + "t": 0, + "fps": 55, + "mbps": 9.32, + "content_p50": 23.8, + "content_p95": 73.6, + "bitrate": 14860800, + "tier": 0, + "w": 1920, + "net": 50.0 + }, + { + "t": 1, + "fps": 58, + "mbps": 9.52, + "content_p50": 22.8, + "content_p95": 28.9, + "bitrate": 14860800, + "tier": 0, + "w": 1920, + "net": 50.0 + }, + { + "t": 2, + "fps": 58, + "mbps": 9.4, + "content_p50": 22.9, + "content_p95": 26.6, + "bitrate": 14860800, + "tier": 0, + "w": 1920, + "net": 50.0 + }, + { + "t": 3, + "fps": 57, + "mbps": 9.62, + "content_p50": 23.6, + "content_p95": 33.6, + "bitrate": 14860800, + "tier": 0, + "w": 1920, + "net": 50.0 + }, + { + "t": 4, + "fps": 58, + "mbps": 8.86, + "content_p50": 22.4, + "content_p95": 25.6, + "bitrate": 14860800, + "tier": 0, + "w": 1920, + "net": 50.0 + }, + { + "t": 5, + "fps": 57, + "mbps": 9.67, + "content_p50": 23.2, + "content_p95": 29.8, + "bitrate": 14860800, + "tier": 0, + "w": 1920, + "net": 50.0 + }, + { + "t": 6, + "fps": 58, + "mbps": 12.04, + "content_p50": 23.7, + "content_p95": 46.7, + "bitrate": 14860800, + "tier": 0, + "w": 1920, + "net": 50.0 + }, + { + "t": 7, + "fps": 58, + "mbps": 8.85, + "content_p50": 22.5, + "content_p95": 27.1, + "bitrate": 14860800, + "tier": 0, + "w": 1920, + "net": 50.0 + }, + { + "t": 8, + "fps": 57, + "mbps": 9.27, + "content_p50": 979.8, + "content_p95": 1991.8, + "bitrate": 14860800, + "tier": 0, + "w": 1920, + "net": 3.0 + }, + { + "t": 9, + "fps": 58, + "mbps": 8.89, + "content_p50": 3131.5, + "content_p95": 3947.3, + "bitrate": 14860800, + "tier": 0, + "w": 1920, + "net": 3.0 + }, + { + "t": 10, + "fps": 58, + "mbps": 9.25, + "content_p50": 5057.4, + "content_p95": 5532.6, + "bitrate": 14860800, + "tier": 0, + "w": 1920, + "net": 3.0 + }, + { + "t": 11, + "fps": 5, + "mbps": 6.6, + "content_p50": 5369.2, + "content_p95": 5392.3, + "bitrate": 14860800, + "tier": 0, + "w": 1920, + "net": 3.0 + }, + { + "t": 12, + "fps": 0, + "mbps": 3.01, + "content_p50": null, + "content_p95": null, + "bitrate": 14860800, + "tier": 0, + "w": 1920, + "net": 3.0 + }, + { + "t": 13, + "fps": 0, + "mbps": 5.04, + "content_p50": null, + "content_p95": null, + "bitrate": 14860800, + "tier": 0, + "w": 1920, + "net": 3.0 + }, + { + "t": 14, + "fps": 0, + "mbps": 1.64, + "content_p50": null, + "content_p95": null, + "bitrate": 14860800, + "tier": 0, + "w": 1920, + "net": 3.0 + }, + { + "t": 15, + "fps": 0, + "mbps": 2.19, + "content_p50": null, + "content_p95": null, + "bitrate": 14860800, + "tier": 0, + "w": 1920, + "net": 3.0 + }, + { + "t": 16, + "fps": 27, + "mbps": 13.34, + "content_p50": 332.4, + "content_p95": 451.9, + "bitrate": 14860800, + "tier": 0, + "w": 1920, + "net": 50.0 + }, + { + "t": 17, + "fps": 57, + "mbps": 9.49, + "content_p50": 24.1, + "content_p95": 32.9, + "bitrate": 14860800, + "tier": 0, + "w": 1920, + "net": 50.0 + }, + { + "t": 18, + "fps": 58, + "mbps": 9.06, + "content_p50": 23.0, + "content_p95": 28.9, + "bitrate": 14860800, + "tier": 0, + "w": 1920, + "net": 50.0 + }, + { + "t": 19, + "fps": 58, + "mbps": 9.39, + "content_p50": 23.3, + "content_p95": 26.9, + "bitrate": 14860800, + "tier": 0, + "w": 1920, + "net": 50.0 + }, + { + "t": 20, + "fps": 57, + "mbps": 8.89, + "content_p50": 23.4, + "content_p95": 32.0, + "bitrate": 14860800, + "tier": 0, + "w": 1920, + "net": 50.0 + }, + { + "t": 21, + "fps": 58, + "mbps": 9.87, + "content_p50": 23.7, + "content_p95": 28.8, + "bitrate": 14860800, + "tier": 0, + "w": 1920, + "net": 50.0 + }, + { + "t": 22, + "fps": 57, + "mbps": 9.49, + "content_p50": 22.2, + "content_p95": 29.1, + "bitrate": 14860800, + "tier": 0, + "w": 1920, + "net": 50.0 + }, + { + "t": 23, + "fps": 57, + "mbps": 8.75, + "content_p50": 22.3, + "content_p95": 27.7, + "bitrate": 14860800, + "tier": 0, + "w": 1920, + "net": 50.0 + }, + { + "t": 24, + "fps": 15, + "mbps": 2.32, + "content_p50": 22.0, + "content_p95": 25.0, + "bitrate": 14860800, + "tier": 0, + "w": 1920, + "net": 50.0 + } + ], + "adapt": [ + { + "at": 8.0, + "to_mbit": 3.0, + "p95_bound": 42.7, + "worst_p95": 5532.6, + "settled_s": 9.0 + } + ], + "content_p50": 23.8, + "content_p95": 4355.1, + "input_p50": null, + "input_p95": null, + "grades": { + "content_p50": "local", + "content_p95": "bad", + "fps": "bad", + "late_pct": "bad", + "stall_max": "bad", + "adapt@8s": "bad" + }, + "controller": { + "adapt": false, + "baseRtt": 10.292, + "ceiling": 14860800, + "fps": 60, + "inFlight": 1, + "scale": 1, + "slack": 40, + "target": 14860800, + "tier": 0 + }, + "events": [], + "source_fps": 62.1, + "cpu": { + "mac_agent_pct": 7.4, + "frame_viewer_pct": 65.4, + "frame_tailscaled_pct": 8.1, + "frame_sshd_pct": 0.9, + "frame_gamescope_pct": 11.5, + "frame_total_pct": 38.7 + }, + "viewer": "h264 software; ANGLE (Mesa, zink Vulkan 1.4(Turnip Adreno (TM) 750 (MESA_TURNIP)), OpenGL 4.6); raf 71 Hz", + "show_s": 1.29, + "panel": "valve.steam.desktopgame.2001170343", + "src": "separate:6551" + }, + { + "scenario": "test", + "frames_sent": 1459, + "frames_drawn": 1459, + "frames_shown": 572, + "duration_s": 24.3, + "stages_ms": { + "capture": { + "p50": 0.0, + "p95": 0.0, + "p99": 0.0, + "n": 1459 + }, + "queue": { + "p50": 0.0, + "p95": 0.1, + "p99": 0.1, + "n": 1459 + }, + "encode": { + "p50": 4.1, + "p95": 4.8, + "p99": 5.1, + "n": 1459 + }, + "socket": { + "p50": 0.1, + "p95": 0.2, + "p99": 0.3, + "n": 1459 + }, + "network": { + "p50": 4.6, + "p95": 9.0, + "p99": 17.9, + "n": 1459 + }, + "decode": { + "p50": 1.1, + "p95": 2.6, + "p99": 4.2, + "n": 1459 + }, + "draw": { + "p50": 0.4, + "p95": 0.8, + "p99": 1.2, + "n": 1459 + }, + "present": { + "p50": 5.1, + "p95": 15.6, + "p99": 18.8, + "n": 572 + }, + "content": { + "p50": 10.7, + "p95": 15.6, + "p99": 24.6, + "n": 1459 + }, + "content_shown": { + "p50": 16.1, + "p95": 27.1, + "p99": 31.8, + "n": 572 + } + }, + "fps": 60.0, + "fps_shown": 23.5, + "late_pct": 1.92, + "stall_max": 157.3, + "stalls_over_100ms": 1, + "mbps": 0.46, + "keyframes": 2, + "size": "1280x720", + "captured": 1580, + "viewer_never_drawn": 0, + "input_ms": { + "p50": 29.6, + "p95": 50.1, + "p99": 163.0, + "n": 48 + }, + "input_shown_ms": { + "p50": 36.5, + "p95": 52.4, + "p99": 163.6, + "n": 21 + }, + "input_parts_ms": { + "uplink": { + "p50": 12.0, + "p95": 21.1, + "p99": 34.4, + "n": 48 + }, + "mac": { + "p50": 5.5, + "p95": 15.1, + "p99": 16.3, + "n": 48 + }, + "back": { + "p50": 11.0, + "p95": 15.7, + "p99": 150.9, + "n": 48 + } + }, + "inputs": { + "sent": 48, + "seen": 48 + }, + "timeline": [ + { + "t": 0, + "fps": 60, + "mbps": 0.47, + "content_p50": 10.3, + "content_p95": 14.3, + "bitrate": 5529600, + "tier": 0, + "w": 1280, + "net": 50.0 + }, + { + "t": 1, + "fps": 60, + "mbps": 0.45, + "content_p50": 9.8, + "content_p95": 11.7, + "bitrate": 5529600, + "tier": 0, + "w": 1280, + "net": 50.0 + }, + { + "t": 2, + "fps": 60, + "mbps": 0.45, + "content_p50": 10.1, + "content_p95": 12.8, + "bitrate": 5529600, + "tier": 0, + "w": 1280, + "net": 50.0 + }, + { + "t": 3, + "fps": 60, + "mbps": 0.46, + "content_p50": 10.0, + "content_p95": 12.9, + "bitrate": 5529600, + "tier": 0, + "w": 1280, + "net": 50.0 + }, + { + "t": 4, + "fps": 60, + "mbps": 0.45, + "content_p50": 10.6, + "content_p95": 13.1, + "bitrate": 5529600, + "tier": 0, + "w": 1280, + "net": 50.0 + }, + { + "t": 5, + "fps": 60, + "mbps": 0.45, + "content_p50": 9.9, + "content_p95": 11.9, + "bitrate": 5529600, + "tier": 0, + "w": 1280, + "net": 50.0 + }, + { + "t": 6, + "fps": 60, + "mbps": 0.56, + "content_p50": 10.1, + "content_p95": 13.9, + "bitrate": 5529600, + "tier": 0, + "w": 1280, + "net": 50.0 + }, + { + "t": 7, + "fps": 60, + "mbps": 0.44, + "content_p50": 9.8, + "content_p95": 13.1, + "bitrate": 5529600, + "tier": 0, + "w": 1280, + "net": 50.0 + }, + { + "t": 8, + "fps": 60, + "mbps": 0.45, + "content_p50": 12.8, + "content_p95": 16.0, + "bitrate": 5529600, + "tier": 0, + "w": 1280, + "net": 3.0 + }, + { + "t": 9, + "fps": 60, + "mbps": 0.45, + "content_p50": 12.4, + "content_p95": 14.6, + "bitrate": 5529600, + "tier": 0, + "w": 1280, + "net": 3.0 + }, + { + "t": 10, + "fps": 60, + "mbps": 0.45, + "content_p50": 12.8, + "content_p95": 14.7, + "bitrate": 5529600, + "tier": 0, + "w": 1280, + "net": 3.0 + }, + { + "t": 11, + "fps": 60, + "mbps": 0.45, + "content_p50": 12.7, + "content_p95": 15.4, + "bitrate": 5529600, + "tier": 0, + "w": 1280, + "net": 3.0 + }, + { + "t": 12, + "fps": 60, + "mbps": 0.45, + "content_p50": 12.9, + "content_p95": 17.1, + "bitrate": 5529600, + "tier": 0, + "w": 1280, + "net": 3.0 + }, + { + "t": 13, + "fps": 60, + "mbps": 0.44, + "content_p50": 13.3, + "content_p95": 16.2, + "bitrate": 5529600, + "tier": 0, + "w": 1280, + "net": 3.0 + }, + { + "t": 14, + "fps": 60, + "mbps": 0.44, + "content_p50": 13.4, + "content_p95": 107.3, + "bitrate": 5529600, + "tier": 0, + "w": 1280, + "net": 3.0 + }, + { + "t": 15, + "fps": 60, + "mbps": 0.44, + "content_p50": 13.4, + "content_p95": 18.8, + "bitrate": 5529600, + "tier": 0, + "w": 1280, + "net": 3.0 + }, + { + "t": 16, + "fps": 60, + "mbps": 0.55, + "content_p50": 9.5, + "content_p95": 13.5, + "bitrate": 5529600, + "tier": 0, + "w": 1280, + "net": 50.0 + }, + { + "t": 17, + "fps": 60, + "mbps": 0.43, + "content_p50": 9.3, + "content_p95": 12.8, + "bitrate": 5529600, + "tier": 0, + "w": 1280, + "net": 50.0 + }, + { + "t": 18, + "fps": 60, + "mbps": 0.44, + "content_p50": 9.8, + "content_p95": 13.8, + "bitrate": 5529600, + "tier": 0, + "w": 1280, + "net": 50.0 + }, + { + "t": 19, + "fps": 60, + "mbps": 0.46, + "content_p50": 9.5, + "content_p95": 13.2, + "bitrate": 5529600, + "tier": 0, + "w": 1280, + "net": 50.0 + }, + { + "t": 20, + "fps": 60, + "mbps": 0.44, + "content_p50": 9.7, + "content_p95": 13.1, + "bitrate": 5529600, + "tier": 0, + "w": 1280, + "net": 50.0 + }, + { + "t": 21, + "fps": 60, + "mbps": 0.44, + "content_p50": 9.3, + "content_p95": 13.8, + "bitrate": 5529600, + "tier": 0, + "w": 1280, + "net": 50.0 + }, + { + "t": 22, + "fps": 60, + "mbps": 0.46, + "content_p50": 9.7, + "content_p95": 12.4, + "bitrate": 5529600, + "tier": 0, + "w": 1280, + "net": 50.0 + }, + { + "t": 23, + "fps": 60, + "mbps": 0.45, + "content_p50": 9.5, + "content_p95": 16.1, + "bitrate": 5529600, + "tier": 0, + "w": 1280, + "net": 50.0 + }, + { + "t": 24, + "fps": 19, + "mbps": 0.13, + "content_p50": 10.2, + "content_p95": 13.0, + "bitrate": 5529600, + "tier": 0, + "w": 1280, + "net": 50.0 + } + ], + "adapt": [ + { + "at": 8.0, + "to_mbit": 3.0, + "p95_bound": 40.0, + "worst_p95": 107.3, + "settled_s": 0.0 + } + ], + "content_p50": 10.7, + "content_p95": 15.6, + "input_p50": 29.6, + "input_p95": 50.1, + "grades": { + "input_replies": "local", + "content_p50": "local", + "content_p95": "local", + "input_p50": "local", + "input_p95": "local", + "fps": "local", + "late_pct": "acceptable", + "stall_max": "acceptable", + "adapt@8s": "local" + }, + "controller": { + "adapt": false, + "baseRtt": 5.916, + "ceiling": 5529600, + "fps": 60, + "inFlight": 1, + "scale": 1, + "slack": 40, + "target": 5529600, + "tier": 0 + }, + "events": [], + "source_fps": 65.0, + "cpu": { + "mac_agent_pct": 14.7, + "frame_viewer_pct": 54.2, + "frame_tailscaled_pct": 6.0, + "frame_sshd_pct": 0.8, + "frame_gamescope_pct": 14.5, + "frame_total_pct": 39.3 + }, + "viewer": "h264 software; ANGLE (Mesa, zink Vulkan 1.4(Turnip Adreno (TM) 750 (MESA_TURNIP)), OpenGL 4.6); raf 70 Hz", + "show_s": 1.37, + "panel": "valve.steam.desktopgame.2001639889", + "src": "test" + } + ] + ], + "on": [ + [ + { + "scenario": "scroll", + "frames_sent": 1012, + "frames_drawn": 1012, + "frames_shown": 975, + "duration_s": 24.2, + "stages_ms": { + "capture": { + "p50": -4.2, + "p95": 3.0, + "p99": 4.5, + "n": 1012 + }, + "queue": { + "p50": 0.0, + "p95": 15.9, + "p99": 17.4, + "n": 1012 + }, + "encode": { + "p50": 6.4, + "p95": 7.5, + "p99": 8.5, + "n": 1012 + }, + "socket": { + "p50": 0.1, + "p95": 0.2, + "p99": 0.4, + "n": 1012 + }, + "network": { + "p50": 9.9, + "p95": 51.0, + "p99": 167.2, + "n": 1012 + }, + "decode": { + "p50": 5.2, + "p95": 8.7, + "p99": 13.2, + "n": 1012 + }, + "draw": { + "p50": 0.6, + "p95": 1.4, + "p99": 1.7, + "n": 1012 + }, + "present": { + "p50": 0.6, + "p95": 11.6, + "p99": 14.3, + "n": 975 + }, + "content": { + "p50": 26.6, + "p95": 69.2, + "p99": 189.9, + "n": 1012 + }, + "content_shown": { + "p50": 31.6, + "p95": 71.1, + "p99": 190.4, + "n": 975 + } + }, + "fps": 41.8, + "fps_shown": 40.3, + "late_pct": 31.82, + "stall_max": 245.3, + "stalls_over_100ms": 5, + "mbps": 6.13, + "keyframes": 3, + "size": "1920x1290", + "captured": 1507, + "viewer_never_drawn": 0, + "input_ms": { + "n": 0 + }, + "input_shown_ms": { + "n": 0 + }, + "input_parts_ms": { + "uplink": { + "n": 0 + }, + "mac": { + "n": 0 + }, + "back": { + "n": 0 + } + }, + "inputs": { + "sent": 0, + "seen": 0 + }, + "timeline": [ + { + "t": 0, + "fps": 56, + "mbps": 9.54, + "content_p50": 21.9, + "content_p95": 42.9, + "bitrate": 14860800, + "tier": 0, + "w": 1920, + "net": 50.0 + }, + { + "t": 1, + "fps": 58, + "mbps": 9.38, + "content_p50": 21.4, + "content_p95": 26.7, + "bitrate": 14860800, + "tier": 0, + "w": 1920, + "net": 50.0 + }, + { + "t": 2, + "fps": 57, + "mbps": 9.41, + "content_p50": 22.3, + "content_p95": 27.7, + "bitrate": 14860800, + "tier": 0, + "w": 1920, + "net": 50.0 + }, + { + "t": 3, + "fps": 58, + "mbps": 9.67, + "content_p50": 23.0, + "content_p95": 25.8, + "bitrate": 14860800, + "tier": 0, + "w": 1920, + "net": 50.0 + }, + { + "t": 4, + "fps": 57, + "mbps": 8.99, + "content_p50": 22.9, + "content_p95": 28.2, + "bitrate": 14860800, + "tier": 0, + "w": 1920, + "net": 50.0 + }, + { + "t": 5, + "fps": 58, + "mbps": 9.25, + "content_p50": 23.3, + "content_p95": 32.0, + "bitrate": 14860800, + "tier": 0, + "w": 1920, + "net": 50.0 + }, + { + "t": 6, + "fps": 57, + "mbps": 11.74, + "content_p50": 22.2, + "content_p95": 46.7, + "bitrate": 14860800, + "tier": 0, + "w": 1920, + "net": 50.0 + }, + { + "t": 7, + "fps": 58, + "mbps": 8.89, + "content_p50": 21.1, + "content_p95": 25.2, + "bitrate": 14860800, + "tier": 0, + "w": 1920, + "net": 50.0 + }, + { + "t": 8, + "fps": 25, + "mbps": 3.02, + "content_p50": 75.9, + "content_p95": 218.9, + "bitrate": 3715200, + "tier": 0, + "w": 1920, + "net": 3.0 + }, + { + "t": 9, + "fps": 50, + "mbps": 3.15, + "content_p50": 56.5, + "content_p95": 84.0, + "bitrate": 2112376, + "tier": 3, + "w": 1440, + "net": 3.0 + }, + { + "t": 10, + "fps": 24, + "mbps": 0.94, + "content_p50": 37.9, + "content_p95": 54.8, + "bitrate": 1689900, + "tier": 3, + "w": 1440, + "net": 3.0 + }, + { + "t": 11, + "fps": 30, + "mbps": 1.93, + "content_p50": 48.0, + "content_p95": 57.0, + "bitrate": 2414756, + "tier": 3, + "w": 1440, + "net": 3.0 + }, + { + "t": 12, + "fps": 30, + "mbps": 2.74, + "content_p50": 58.5, + "content_p95": 92.4, + "bitrate": 2611641, + "tier": 3, + "w": 1440, + "net": 3.0 + }, + { + "t": 13, + "fps": 30, + "mbps": 2.12, + "content_p50": 45.3, + "content_p95": 79.0, + "bitrate": 2089312, + "tier": 3, + "w": 1440, + "net": 3.0 + }, + { + "t": 14, + "fps": 30, + "mbps": 2.24, + "content_p50": 52.0, + "content_p95": 71.4, + "bitrate": 2633067, + "tier": 3, + "w": 1440, + "net": 3.0 + }, + { + "t": 15, + "fps": 30, + "mbps": 2.47, + "content_p50": 53.7, + "content_p95": 93.6, + "bitrate": 2357098, + "tier": 3, + "w": 1440, + "net": 3.0 + }, + { + "t": 16, + "fps": 30, + "mbps": 2.61, + "content_p50": 24.7, + "content_p95": 39.8, + "bitrate": 2957087, + "tier": 3, + "w": 1440, + "net": 50.0 + }, + { + "t": 17, + "fps": 30, + "mbps": 3.74, + "content_p50": 29.5, + "content_p95": 38.0, + "bitrate": 4561519, + "tier": 3, + "w": 1440, + "net": 50.0 + }, + { + "t": 18, + "fps": 30, + "mbps": 5.32, + "content_p50": 29.2, + "content_p95": 41.6, + "bitrate": 6236880, + "tier": 3, + "w": 1440, + "net": 50.0 + }, + { + "t": 19, + "fps": 30, + "mbps": 6.62, + "content_p50": 35.0, + "content_p95": 68.5, + "bitrate": 8466786, + "tier": 2, + "w": 1920, + "net": 50.0 + }, + { + "t": 20, + "fps": 30, + "mbps": 7.48, + "content_p50": 36.1, + "content_p95": 41.1, + "bitrate": 12628270, + "tier": 2, + "w": 1920, + "net": 50.0 + }, + { + "t": 21, + "fps": 42, + "mbps": 7.71, + "content_p50": 31.7, + "content_p95": 39.0, + "bitrate": 14860800, + "tier": 1, + "w": 1920, + "net": 50.0 + }, + { + "t": 22, + "fps": 46, + "mbps": 8.79, + "content_p50": 33.6, + "content_p95": 40.6, + "bitrate": 14860800, + "tier": 1, + "w": 1920, + "net": 50.0 + }, + { + "t": 23, + "fps": 53, + "mbps": 8.78, + "content_p50": 28.4, + "content_p95": 42.0, + "bitrate": 14860800, + "tier": 0, + "w": 1920, + "net": 50.0 + }, + { + "t": 24, + "fps": 13, + "mbps": 1.89, + "content_p50": 24.7, + "content_p95": 28.4, + "bitrate": 14860800, + "tier": 0, + "w": 1920, + "net": 50.0 + } + ], + "adapt": [ + { + "at": 8.0, + "to_mbit": 3.0, + "p95_bound": 45.2, + "worst_p95": 218.9, + "settled_s": 8.0 + } + ], + "content_p50": 26.6, + "content_p95": 69.2, + "input_p50": null, + "input_p95": null, + "grades": { + "content_p50": "acceptable", + "content_p95": "acceptable", + "fps": "bad", + "late_pct": "bad", + "stall_max": "acceptable", + "adapt@8s": "bad" + }, + "controller": { + "adapt": true, + "baseRtt": 6.333, + "ceiling": 14860800, + "fps": 60, + "inFlight": 1, + "scale": 1, + "slack": 51.355, + "target": 14860800, + "tier": 0 + }, + "events": [ + { + "t": 8.31, + "e": "down to 7430 kbit/s: queue 100 ms, held 6, oldest 197 ms, base 10 ms, sent 5528 got 5268 wants 8906" + }, + { + "t": 8.71, + "e": "down to 3715 kbit/s: queue 209 ms, held 4, oldest 115 ms, base 10 ms, sent 2861 got 2421 wants 10373" + }, + { + "t": 9.41, + "e": "down to 2640 kbit/s: queue 48 ms, held 0, oldest 59 ms, base 10 ms, sent 3222 got 2933 wants 3166" + }, + { + "t": 9.71, + "e": "down to 2112 kbit/s: queue 48 ms, held 0, oldest 31 ms, base 10 ms, sent 2907 got 3032 wants 2906" + }, + { + "t": 9.81, + "e": "tier 3" + }, + { + "t": 10.21, + "e": "down to 1689 kbit/s: queue 186 ms, held 4, oldest 0 ms, base 10 ms, sent 2091 got 2288 wants 3137" + }, + { + "t": 12.91, + "e": "down to 2611 kbit/s: queue 44 ms, held 0, oldest 27 ms, base 10 ms, sent 3243 got 2901 wants 3243" + }, + { + "t": 13.31, + "e": "down to 2089 kbit/s: queue 41 ms, held 0, oldest 60 ms, base 10 ms, sent 2775 got 2764 wants 2775" + }, + { + "t": 15.31, + "e": "down to 2357 kbit/s: queue 44 ms, held 0, oldest 28 ms, base 10 ms, sent 2539 got 2729 wants 2539" + }, + { + "t": 19.11, + "e": "tier 2" + }, + { + "t": 21.31, + "e": "tier 1" + }, + { + "t": 23.51, + "e": "tier 0" + } + ], + "source_fps": 62.3, + "cpu": { + "mac_agent_pct": 7.3, + "frame_viewer_pct": 57.5, + "frame_tailscaled_pct": 7.4, + "frame_sshd_pct": 0.8, + "frame_gamescope_pct": 10.6, + "frame_total_pct": 47.8 + }, + "viewer": "h264 software; ANGLE (Mesa, zink Vulkan 1.4(Turnip Adreno (TM) 750 (MESA_TURNIP)), OpenGL 4.6); raf 71 Hz", + "show_s": 1.27, + "panel": "valve.steam.desktopgame.2001853011", + "src": "separate:6269" + }, + { + "scenario": "test", + "frames_sent": 1457, + "frames_drawn": 1457, + "frames_shown": 578, + "duration_s": 24.3, + "stages_ms": { + "capture": { + "p50": 0.0, + "p95": 0.0, + "p99": 0.0, + "n": 1457 + }, + "queue": { + "p50": 0.0, + "p95": 0.1, + "p99": 0.1, + "n": 1457 + }, + "encode": { + "p50": 4.2, + "p95": 4.9, + "p99": 5.2, + "n": 1457 + }, + "socket": { + "p50": 0.1, + "p95": 0.2, + "p99": 0.2, + "n": 1457 + }, + "network": { + "p50": 5.0, + "p95": 10.1, + "p99": 13.0, + "n": 1457 + }, + "decode": { + "p50": 1.0, + "p95": 2.2, + "p99": 3.6, + "n": 1457 + }, + "draw": { + "p50": 0.3, + "p95": 0.7, + "p99": 1.1, + "n": 1457 + }, + "present": { + "p50": 5.6, + "p95": 16.1, + "p99": 18.0, + "n": 578 + }, + "content": { + "p50": 11.1, + "p95": 16.2, + "p99": 19.2, + "n": 1457 + }, + "content_shown": { + "p50": 18.9, + "p95": 27.0, + "p99": 31.0, + "n": 578 + } + }, + "fps": 60.0, + "fps_shown": 23.8, + "late_pct": 0.82, + "stall_max": 32.9, + "stalls_over_100ms": 0, + "mbps": 0.47, + "keyframes": 2, + "size": "1280x720", + "captured": 1578, + "viewer_never_drawn": 0, + "input_ms": { + "p50": 30.0, + "p95": 47.7, + "p99": 76.0, + "n": 48 + }, + "input_shown_ms": { + "p50": 33.7, + "p95": 47.5, + "p99": 81.8, + "n": 17 + }, + "input_parts_ms": { + "uplink": { + "p50": 10.2, + "p95": 27.4, + "p99": 49.5, + "n": 48 + }, + "mac": { + "p50": 5.3, + "p95": 15.1, + "p99": 16.3, + "n": 48 + }, + "back": { + "p50": 12.5, + "p95": 18.7, + "p99": 19.2, + "n": 48 + } + }, + "inputs": { + "sent": 48, + "seen": 48 + }, + "timeline": [ + { + "t": 0, + "fps": 60, + "mbps": 0.49, + "content_p50": 10.0, + "content_p95": 11.8, + "bitrate": 5529600, + "tier": 0, + "w": 1280, + "net": 50.0 + }, + { + "t": 1, + "fps": 60, + "mbps": 0.46, + "content_p50": 10.5, + "content_p95": 15.2, + "bitrate": 5529600, + "tier": 0, + "w": 1280, + "net": 50.0 + }, + { + "t": 2, + "fps": 60, + "mbps": 0.48, + "content_p50": 10.1, + "content_p95": 12.1, + "bitrate": 5529600, + "tier": 0, + "w": 1280, + "net": 50.0 + }, + { + "t": 3, + "fps": 60, + "mbps": 0.46, + "content_p50": 10.6, + "content_p95": 13.6, + "bitrate": 5529600, + "tier": 0, + "w": 1280, + "net": 50.0 + }, + { + "t": 4, + "fps": 60, + "mbps": 0.47, + "content_p50": 10.7, + "content_p95": 13.2, + "bitrate": 5529600, + "tier": 0, + "w": 1280, + "net": 50.0 + }, + { + "t": 5, + "fps": 60, + "mbps": 0.46, + "content_p50": 10.8, + "content_p95": 12.6, + "bitrate": 5529600, + "tier": 0, + "w": 1280, + "net": 50.0 + }, + { + "t": 6, + "fps": 60, + "mbps": 0.56, + "content_p50": 10.8, + "content_p95": 13.7, + "bitrate": 5529600, + "tier": 0, + "w": 1280, + "net": 50.0 + }, + { + "t": 7, + "fps": 60, + "mbps": 0.46, + "content_p50": 10.9, + "content_p95": 12.5, + "bitrate": 5529600, + "tier": 0, + "w": 1280, + "net": 50.0 + }, + { + "t": 8, + "fps": 60, + "mbps": 0.45, + "content_p50": 13.4, + "content_p95": 15.7, + "bitrate": 5529600, + "tier": 0, + "w": 1280, + "net": 3.0 + }, + { + "t": 9, + "fps": 60, + "mbps": 0.46, + "content_p50": 13.8, + "content_p95": 16.3, + "bitrate": 5529600, + "tier": 0, + "w": 1280, + "net": 3.0 + }, + { + "t": 10, + "fps": 60, + "mbps": 0.45, + "content_p50": 14.1, + "content_p95": 16.3, + "bitrate": 5529600, + "tier": 0, + "w": 1280, + "net": 3.0 + }, + { + "t": 11, + "fps": 60, + "mbps": 0.45, + "content_p50": 13.8, + "content_p95": 22.7, + "bitrate": 5529600, + "tier": 0, + "w": 1280, + "net": 3.0 + }, + { + "t": 12, + "fps": 60, + "mbps": 0.45, + "content_p50": 14.3, + "content_p95": 18.0, + "bitrate": 5529600, + "tier": 0, + "w": 1280, + "net": 3.0 + }, + { + "t": 13, + "fps": 60, + "mbps": 0.45, + "content_p50": 14.2, + "content_p95": 18.1, + "bitrate": 5529600, + "tier": 0, + "w": 1280, + "net": 3.0 + }, + { + "t": 14, + "fps": 60, + "mbps": 0.45, + "content_p50": 14.1, + "content_p95": 18.3, + "bitrate": 5529600, + "tier": 0, + "w": 1280, + "net": 3.0 + }, + { + "t": 15, + "fps": 60, + "mbps": 0.47, + "content_p50": 14.2, + "content_p95": 17.1, + "bitrate": 5529600, + "tier": 0, + "w": 1280, + "net": 3.0 + }, + { + "t": 16, + "fps": 60, + "mbps": 0.57, + "content_p50": 9.9, + "content_p95": 18.1, + "bitrate": 5529600, + "tier": 0, + "w": 1280, + "net": 50.0 + }, + { + "t": 17, + "fps": 60, + "mbps": 0.45, + "content_p50": 9.9, + "content_p95": 11.6, + "bitrate": 5529600, + "tier": 0, + "w": 1280, + "net": 50.0 + }, + { + "t": 18, + "fps": 60, + "mbps": 0.45, + "content_p50": 10.0, + "content_p95": 12.0, + "bitrate": 5529600, + "tier": 0, + "w": 1280, + "net": 50.0 + }, + { + "t": 19, + "fps": 60, + "mbps": 0.45, + "content_p50": 10.0, + "content_p95": 11.4, + "bitrate": 5529600, + "tier": 0, + "w": 1280, + "net": 50.0 + }, + { + "t": 20, + "fps": 60, + "mbps": 0.46, + "content_p50": 9.7, + "content_p95": 11.4, + "bitrate": 5529600, + "tier": 0, + "w": 1280, + "net": 50.0 + }, + { + "t": 21, + "fps": 60, + "mbps": 0.45, + "content_p50": 9.8, + "content_p95": 11.8, + "bitrate": 5529600, + "tier": 0, + "w": 1280, + "net": 50.0 + }, + { + "t": 22, + "fps": 60, + "mbps": 0.46, + "content_p50": 9.9, + "content_p95": 12.5, + "bitrate": 5529600, + "tier": 0, + "w": 1280, + "net": 50.0 + }, + { + "t": 23, + "fps": 60, + "mbps": 0.46, + "content_p50": 10.9, + "content_p95": 12.6, + "bitrate": 5529600, + "tier": 0, + "w": 1280, + "net": 50.0 + }, + { + "t": 24, + "fps": 17, + "mbps": 0.11, + "content_p50": 10.9, + "content_p95": 12.1, + "bitrate": 5529600, + "tier": 0, + "w": 1280, + "net": 50.0 + } + ], + "adapt": [ + { + "at": 8.0, + "to_mbit": 3.0, + "p95_bound": 40.0, + "worst_p95": 22.7, + "settled_s": 0.0 + } + ], + "content_p50": 11.1, + "content_p95": 16.2, + "input_p50": 30.0, + "input_p95": 47.7, + "grades": { + "input_replies": "local", + "content_p50": "local", + "content_p95": "local", + "input_p50": "local", + "input_p95": "local", + "fps": "local", + "late_pct": "local", + "stall_max": "local", + "adapt@8s": "local" + }, + "controller": { + "adapt": true, + "baseRtt": 6.083, + "ceiling": 5529600, + "fps": 60, + "inFlight": 1, + "scale": 1, + "slack": 47.104, + "target": 5529600, + "tier": 0 + }, + "events": [], + "source_fps": 64.9, + "cpu": { + "mac_agent_pct": 15.6, + "frame_viewer_pct": 49.6, + "frame_tailscaled_pct": 5.8, + "frame_sshd_pct": 0.7, + "frame_gamescope_pct": 11.3, + "frame_total_pct": 37.4 + }, + "viewer": "h264 software; ANGLE (Mesa, zink Vulkan 1.4(Turnip Adreno (TM) 750 (MESA_TURNIP)), OpenGL 4.6); raf 70 Hz", + "show_s": 1.29, + "panel": "valve.steam.desktopgame.2001639889", + "src": "test" + } + ], + [ + { + "scenario": "scroll", + "frames_sent": 1044, + "frames_drawn": 1044, + "frames_shown": 786, + "duration_s": 24.3, + "stages_ms": { + "capture": { + "p50": -4.6, + "p95": 0.4, + "p99": 1.8, + "n": 1044 + }, + "queue": { + "p50": 0.0, + "p95": 14.9, + "p99": 17.0, + "n": 1044 + }, + "encode": { + "p50": 6.5, + "p95": 8.8, + "p99": 17.0, + "n": 1044 + }, + "socket": { + "p50": 0.1, + "p95": 0.2, + "p99": 0.5, + "n": 1044 + }, + "network": { + "p50": 10.1, + "p95": 52.0, + "p99": 225.2, + "n": 1044 + }, + "decode": { + "p50": 5.4, + "p95": 9.5, + "p99": 17.6, + "n": 1044 + }, + "draw": { + "p50": 0.6, + "p95": 1.3, + "p99": 1.7, + "n": 1044 + }, + "present": { + "p50": 0.7, + "p95": 14.4, + "p99": 22.3, + "n": 786 + }, + "content": { + "p50": 25.5, + "p95": 74.6, + "p99": 236.2, + "n": 1044 + }, + "content_shown": { + "p50": 33.0, + "p95": 74.9, + "p99": 234.6, + "n": 786 + } + }, + "fps": 43.0, + "fps_shown": 32.4, + "late_pct": 27.59, + "stall_max": 430.7, + "stalls_over_100ms": 7, + "mbps": 6.22, + "keyframes": 3, + "size": "1920x1290", + "captured": 1499, + "viewer_never_drawn": 0, + "input_ms": { + "n": 0 + }, + "input_shown_ms": { + "n": 0 + }, + "input_parts_ms": { + "uplink": { + "n": 0 + }, + "mac": { + "n": 0 + }, + "back": { + "n": 0 + } + }, + "inputs": { + "sent": 0, + "seen": 0 + }, + "timeline": [ + { + "t": 0, + "fps": 54, + "mbps": 9.98, + "content_p50": 23.9, + "content_p95": 33.5, + "bitrate": 14860800, + "tier": 0, + "w": 1920, + "net": 50.0 + }, + { + "t": 1, + "fps": 57, + "mbps": 9.24, + "content_p50": 23.4, + "content_p95": 32.7, + "bitrate": 14860800, + "tier": 0, + "w": 1920, + "net": 50.0 + }, + { + "t": 2, + "fps": 57, + "mbps": 9.09, + "content_p50": 23.0, + "content_p95": 32.2, + "bitrate": 14860800, + "tier": 0, + "w": 1920, + "net": 50.0 + }, + { + "t": 3, + "fps": 54, + "mbps": 9.77, + "content_p50": 24.1, + "content_p95": 36.2, + "bitrate": 14860800, + "tier": 0, + "w": 1920, + "net": 50.0 + }, + { + "t": 4, + "fps": 58, + "mbps": 9.09, + "content_p50": 23.2, + "content_p95": 27.7, + "bitrate": 14860800, + "tier": 0, + "w": 1920, + "net": 50.0 + }, + { + "t": 5, + "fps": 52, + "mbps": 8.72, + "content_p50": 24.5, + "content_p95": 63.4, + "bitrate": 14860800, + "tier": 0, + "w": 1920, + "net": 50.0 + }, + { + "t": 6, + "fps": 58, + "mbps": 11.69, + "content_p50": 23.1, + "content_p95": 50.6, + "bitrate": 14860800, + "tier": 0, + "w": 1920, + "net": 50.0 + }, + { + "t": 7, + "fps": 57, + "mbps": 8.99, + "content_p50": 22.4, + "content_p95": 32.9, + "bitrate": 14860800, + "tier": 0, + "w": 1920, + "net": 50.0 + }, + { + "t": 8, + "fps": 20, + "mbps": 3.23, + "content_p50": 205.5, + "content_p95": 270.8, + "bitrate": 7430400, + "tier": 0, + "w": 1920, + "net": 3.0 + }, + { + "t": 9, + "fps": 34, + "mbps": 1.66, + "content_p50": 18.4, + "content_p95": 428.1, + "bitrate": 1765116, + "tier": 0, + "w": 1920, + "net": 3.0 + }, + { + "t": 10, + "fps": 57, + "mbps": 1.27, + "content_p50": 23.3, + "content_p95": 101.0, + "bitrate": 2240789, + "tier": 0, + "w": 1920, + "net": 3.0 + }, + { + "t": 11, + "fps": 35, + "mbps": 1.73, + "content_p50": 31.8, + "content_p95": 148.1, + "bitrate": 1405577, + "tier": 3, + "w": 1440, + "net": 3.0 + }, + { + "t": 12, + "fps": 30, + "mbps": 1.26, + "content_p50": 38.8, + "content_p95": 64.3, + "bitrate": 1596134, + "tier": 3, + "w": 1440, + "net": 3.0 + }, + { + "t": 13, + "fps": 31, + "mbps": 1.84, + "content_p50": 43.3, + "content_p95": 59.6, + "bitrate": 2289953, + "tier": 3, + "w": 1440, + "net": 3.0 + }, + { + "t": 14, + "fps": 30, + "mbps": 2.61, + "content_p50": 59.7, + "content_p95": 85.4, + "bitrate": 2373537, + "tier": 3, + "w": 1440, + "net": 3.0 + }, + { + "t": 15, + "fps": 30, + "mbps": 2.39, + "content_p50": 53.7, + "content_p95": 87.6, + "bitrate": 2660890, + "tier": 3, + "w": 1440, + "net": 3.0 + }, + { + "t": 16, + "fps": 30, + "mbps": 3.04, + "content_p50": 25.4, + "content_p95": 37.6, + "bitrate": 3707143, + "tier": 3, + "w": 1440, + "net": 50.0 + }, + { + "t": 17, + "fps": 30, + "mbps": 4.45, + "content_p50": 31.8, + "content_p95": 41.7, + "bitrate": 5099706, + "tier": 3, + "w": 1440, + "net": 50.0 + }, + { + "t": 18, + "fps": 28, + "mbps": 5.76, + "content_p50": 34.2, + "content_p95": 51.9, + "bitrate": 7698527, + "tier": 2, + "w": 1920, + "net": 50.0 + }, + { + "t": 19, + "fps": 30, + "mbps": 7.38, + "content_p50": 37.7, + "content_p95": 45.2, + "bitrate": 10412237, + "tier": 2, + "w": 1920, + "net": 50.0 + }, + { + "t": 20, + "fps": 41, + "mbps": 8.63, + "content_p50": 34.5, + "content_p95": 64.1, + "bitrate": 14024186, + "tier": 1, + "w": 1920, + "net": 50.0 + }, + { + "t": 21, + "fps": 46, + "mbps": 7.87, + "content_p50": 35.1, + "content_p95": 45.4, + "bitrate": 14860800, + "tier": 1, + "w": 1920, + "net": 50.0 + }, + { + "t": 22, + "fps": 53, + "mbps": 9.21, + "content_p50": 24.4, + "content_p95": 37.0, + "bitrate": 14860800, + "tier": 0, + "w": 1920, + "net": 50.0 + }, + { + "t": 23, + "fps": 57, + "mbps": 9.68, + "content_p50": 23.2, + "content_p95": 31.6, + "bitrate": 14860800, + "tier": 0, + "w": 1920, + "net": 50.0 + }, + { + "t": 24, + "fps": 15, + "mbps": 2.34, + "content_p50": 25.1, + "content_p95": 34.8, + "bitrate": 14860800, + "tier": 0, + "w": 1920, + "net": 50.0 + } + ], + "adapt": [ + { + "at": 8.0, + "to_mbit": 3.0, + "p95_bound": 62.6, + "worst_p95": 428.1, + "settled_s": 8.0 + } + ], + "content_p50": 25.5, + "content_p95": 74.6, + "input_p50": null, + "input_p95": null, + "grades": { + "content_p50": "acceptable", + "content_p95": "acceptable", + "fps": "bad", + "late_pct": "bad", + "stall_max": "bad", + "adapt@8s": "bad" + }, + "controller": { + "adapt": true, + "baseRtt": 7.875, + "ceiling": 14860800, + "fps": 60, + "inFlight": 4, + "scale": 1, + "slack": 48.916, + "target": 14860800, + "tier": 0 + }, + "events": [ + { + "t": 8.32, + "e": "down to 7430 kbit/s: queue 98 ms, held 6, oldest 191 ms, base 9 ms, sent 6068 got 6112 wants 9608" + }, + { + "t": 8.92, + "e": "down to 3715 kbit/s: queue 197 ms, held 5, oldest 239 ms, base 9 ms, sent 2451 got 2882 wants 8733" + }, + { + "t": 9.22, + "e": "down to 2206 kbit/s: queue 237 ms, held 4, oldest 161 ms, base 9 ms, sent 3261 got 2451 wants 10510" + }, + { + "t": 9.52, + "e": "down to 1765 kbit/s: queue 392 ms, held 6, oldest 456 ms, base 9 ms, sent 2553 got 2705 wants 10396" + }, + { + "t": 11.22, + "e": "down to 1756 kbit/s: queue 48 ms, held 0, oldest 3 ms, base 8 ms, sent 1996 got 1952 wants 2107" + }, + { + "t": 11.52, + "e": "tier 3" + }, + { + "t": 11.92, + "e": "down to 1405 kbit/s: queue 158 ms, held 2, oldest 0 ms, base 8 ms, sent 1907 got 1907 wants 2384" + }, + { + "t": 14.92, + "e": "down to 2373 kbit/s: queue 47 ms, held 0, oldest 58 ms, base 8 ms, sent 2973 got 2637 wants 2972" + }, + { + "t": 18.22, + "e": "tier 2" + }, + { + "t": 20.32, + "e": "tier 1" + }, + { + "t": 22.42, + "e": "tier 0" + } + ], + "source_fps": 61.7, + "cpu": { + "mac_agent_pct": 7.1, + "frame_viewer_pct": 59.9, + "frame_tailscaled_pct": 7.4, + "frame_sshd_pct": 0.7, + "frame_gamescope_pct": 9.8, + "frame_total_pct": 37.2 + }, + "viewer": "h264 software; ANGLE (Mesa, zink Vulkan 1.4(Turnip Adreno (TM) 750 (MESA_TURNIP)), OpenGL 4.6); raf 70 Hz", + "show_s": 1.32, + "panel": "valve.steam.desktopgame.2001220345", + "src": "separate:6403" + }, + { + "scenario": "test", + "frames_sent": 1455, + "frames_drawn": 1455, + "frames_shown": 569, + "duration_s": 24.3, + "stages_ms": { + "capture": { + "p50": 0.0, + "p95": 0.0, + "p99": 0.0, + "n": 1455 + }, + "queue": { + "p50": 0.0, + "p95": 0.1, + "p99": 0.1, + "n": 1455 + }, + "encode": { + "p50": 4.0, + "p95": 4.7, + "p99": 5.0, + "n": 1455 + }, + "socket": { + "p50": 0.1, + "p95": 0.2, + "p99": 0.2, + "n": 1455 + }, + "network": { + "p50": 5.7, + "p95": 9.8, + "p99": 13.3, + "n": 1455 + }, + "decode": { + "p50": 1.1, + "p95": 2.6, + "p99": 3.9, + "n": 1455 + }, + "draw": { + "p50": 0.4, + "p95": 0.8, + "p99": 1.2, + "n": 1455 + }, + "present": { + "p50": 5.7, + "p95": 17.2, + "p99": 19.5, + "n": 569 + }, + "content": { + "p50": 11.5, + "p95": 15.9, + "p99": 19.4, + "n": 1455 + }, + "content_shown": { + "p50": 17.6, + "p95": 29.4, + "p99": 31.2, + "n": 569 + } + }, + "fps": 59.8, + "fps_shown": 23.4, + "late_pct": 1.1, + "stall_max": 115.1, + "stalls_over_100ms": 1, + "mbps": 0.47, + "keyframes": 2, + "size": "1280x720", + "captured": 1580, + "viewer_never_drawn": 0, + "input_ms": { + "p50": 29.1, + "p95": 50.1, + "p99": 55.5, + "n": 48 + }, + "input_shown_ms": { + "p50": 44.2, + "p95": 51.9, + "p99": 55.9, + "n": 15 + }, + "input_parts_ms": { + "uplink": { + "p50": 10.1, + "p95": 23.2, + "p99": 27.8, + "n": 48 + }, + "mac": { + "p50": 6.0, + "p95": 17.1, + "p99": 20.1, + "n": 48 + }, + "back": { + "p50": 11.6, + "p95": 17.2, + "p99": 18.3, + "n": 48 + } + }, + "inputs": { + "sent": 48, + "seen": 48 + }, + "timeline": [ + { + "t": 0, + "fps": 60, + "mbps": 0.48, + "content_p50": 10.9, + "content_p95": 13.7, + "bitrate": 5529600, + "tier": 0, + "w": 1280, + "net": 50.0 + }, + { + "t": 1, + "fps": 60, + "mbps": 0.47, + "content_p50": 11.0, + "content_p95": 13.6, + "bitrate": 5529600, + "tier": 0, + "w": 1280, + "net": 50.0 + }, + { + "t": 2, + "fps": 60, + "mbps": 0.47, + "content_p50": 11.0, + "content_p95": 14.1, + "bitrate": 5529600, + "tier": 0, + "w": 1280, + "net": 50.0 + }, + { + "t": 3, + "fps": 60, + "mbps": 0.48, + "content_p50": 10.9, + "content_p95": 15.3, + "bitrate": 5529600, + "tier": 0, + "w": 1280, + "net": 50.0 + }, + { + "t": 4, + "fps": 61, + "mbps": 0.48, + "content_p50": 11.4, + "content_p95": 18.4, + "bitrate": 5529600, + "tier": 0, + "w": 1280, + "net": 50.0 + }, + { + "t": 5, + "fps": 59, + "mbps": 0.47, + "content_p50": 10.8, + "content_p95": 13.6, + "bitrate": 5529600, + "tier": 0, + "w": 1280, + "net": 50.0 + }, + { + "t": 6, + "fps": 61, + "mbps": 0.58, + "content_p50": 11.3, + "content_p95": 25.5, + "bitrate": 5529600, + "tier": 0, + "w": 1280, + "net": 50.0 + }, + { + "t": 7, + "fps": 59, + "mbps": 0.45, + "content_p50": 11.0, + "content_p95": 13.1, + "bitrate": 5529600, + "tier": 0, + "w": 1280, + "net": 50.0 + }, + { + "t": 8, + "fps": 61, + "mbps": 0.48, + "content_p50": 13.9, + "content_p95": 17.2, + "bitrate": 5529600, + "tier": 0, + "w": 1280, + "net": 3.0 + }, + { + "t": 9, + "fps": 59, + "mbps": 0.45, + "content_p50": 13.8, + "content_p95": 18.3, + "bitrate": 5529600, + "tier": 0, + "w": 1280, + "net": 3.0 + }, + { + "t": 10, + "fps": 61, + "mbps": 0.45, + "content_p50": 13.9, + "content_p95": 16.1, + "bitrate": 5529600, + "tier": 0, + "w": 1280, + "net": 3.0 + }, + { + "t": 11, + "fps": 59, + "mbps": 0.45, + "content_p50": 11.8, + "content_p95": 15.3, + "bitrate": 5529600, + "tier": 0, + "w": 1280, + "net": 3.0 + }, + { + "t": 12, + "fps": 61, + "mbps": 0.46, + "content_p50": 13.4, + "content_p95": 16.1, + "bitrate": 5529600, + "tier": 0, + "w": 1280, + "net": 3.0 + }, + { + "t": 13, + "fps": 59, + "mbps": 0.45, + "content_p50": 13.4, + "content_p95": 16.2, + "bitrate": 5529600, + "tier": 0, + "w": 1280, + "net": 3.0 + }, + { + "t": 14, + "fps": 57, + "mbps": 0.43, + "content_p50": 13.2, + "content_p95": 18.3, + "bitrate": 5529600, + "tier": 0, + "w": 1280, + "net": 3.0 + }, + { + "t": 15, + "fps": 59, + "mbps": 0.45, + "content_p50": 13.4, + "content_p95": 16.7, + "bitrate": 5529600, + "tier": 0, + "w": 1280, + "net": 3.0 + }, + { + "t": 16, + "fps": 61, + "mbps": 0.56, + "content_p50": 10.5, + "content_p95": 15.0, + "bitrate": 5529600, + "tier": 0, + "w": 1280, + "net": 50.0 + }, + { + "t": 17, + "fps": 59, + "mbps": 0.43, + "content_p50": 10.8, + "content_p95": 14.3, + "bitrate": 5529600, + "tier": 0, + "w": 1280, + "net": 50.0 + }, + { + "t": 18, + "fps": 61, + "mbps": 0.46, + "content_p50": 10.7, + "content_p95": 13.8, + "bitrate": 5529600, + "tier": 0, + "w": 1280, + "net": 50.0 + }, + { + "t": 19, + "fps": 59, + "mbps": 0.45, + "content_p50": 10.7, + "content_p95": 13.0, + "bitrate": 5529600, + "tier": 0, + "w": 1280, + "net": 50.0 + }, + { + "t": 20, + "fps": 61, + "mbps": 0.46, + "content_p50": 10.5, + "content_p95": 15.1, + "bitrate": 5529600, + "tier": 0, + "w": 1280, + "net": 50.0 + }, + { + "t": 21, + "fps": 59, + "mbps": 0.44, + "content_p50": 10.7, + "content_p95": 13.1, + "bitrate": 5529600, + "tier": 0, + "w": 1280, + "net": 50.0 + }, + { + "t": 22, + "fps": 60, + "mbps": 0.45, + "content_p50": 10.8, + "content_p95": 12.8, + "bitrate": 5529600, + "tier": 0, + "w": 1280, + "net": 50.0 + }, + { + "t": 23, + "fps": 60, + "mbps": 0.45, + "content_p50": 10.6, + "content_p95": 12.3, + "bitrate": 5529600, + "tier": 0, + "w": 1280, + "net": 50.0 + }, + { + "t": 24, + "fps": 19, + "mbps": 0.13, + "content_p50": 10.6, + "content_p95": 16.1, + "bitrate": 5529600, + "tier": 0, + "w": 1280, + "net": 50.0 + } + ], + "adapt": [ + { + "at": 8.0, + "to_mbit": 3.0, + "p95_bound": 40.0, + "worst_p95": 18.3, + "settled_s": 0.0 + } + ], + "content_p50": 11.5, + "content_p95": 15.9, + "input_p50": 29.1, + "input_p95": 50.1, + "grades": { + "input_replies": "local", + "content_p50": "local", + "content_p95": "local", + "input_p50": "local", + "input_p95": "local", + "fps": "local", + "late_pct": "acceptable", + "stall_max": "acceptable", + "adapt@8s": "local" + }, + "controller": { + "adapt": true, + "baseRtt": 6, + "ceiling": 5529600, + "fps": 60, + "inFlight": 2, + "scale": 1, + "slack": 49.792, + "target": 5529600, + "tier": 0 + }, + "events": [], + "source_fps": 65.0, + "cpu": { + "mac_agent_pct": 14.2, + "frame_viewer_pct": 52.2, + "frame_tailscaled_pct": 5.8, + "frame_sshd_pct": 0.8, + "frame_gamescope_pct": 12.2, + "frame_total_pct": 38.8 + }, + "viewer": "h264 software; ANGLE (Mesa, zink Vulkan 1.4(Turnip Adreno (TM) 750 (MESA_TURNIP)), OpenGL 4.6); raf 72 Hz", + "show_s": 1.38, + "panel": "valve.steam.desktopgame.2001639889", + "src": "test" + } + ] + ] + }, + "table": { + "scroll": { + "content_p50": { + "off": [ + 27.5, + 23.8 + ], + "on": [ + 26.6, + 25.5 + ] + }, + "content_p95": { + "off": [ + 4986.4, + 4355.1 + ], + "on": [ + 69.2, + 74.6 + ] + }, + "input_p50": { + "off": [], + "on": [] + }, + "input_p95": { + "off": [], + "on": [] + }, + "fps": { + "off": [ + 45.8, + 44.5 + ], + "on": [ + 41.8, + 43.0 + ] + }, + "late_pct": { + "off": [ + 19.19, + 17.67 + ], + "on": [ + 31.82, + 27.59 + ] + }, + "stall_max": { + "off": [ + 232.1, + 398.2 + ], + "on": [ + 245.3, + 430.7 + ] + }, + "mbps": { + "off": [ + 8.62, + 8.39 + ], + "on": [ + 6.13, + 6.22 + ] + } + }, + "test": { + "content_p50": { + "off": [ + 12.8, + 10.7 + ], + "on": [ + 11.1, + 11.5 + ] + }, + "content_p95": { + "off": [ + 116.8, + 15.6 + ], + "on": [ + 16.2, + 15.9 + ] + }, + "input_p50": { + "off": [ + 34.4, + 29.6 + ], + "on": [ + 30.0, + 29.1 + ] + }, + "input_p95": { + "off": [ + 86.0, + 50.1 + ], + "on": [ + 47.7, + 50.1 + ] + }, + "fps": { + "off": [ + 60.0, + 60.0 + ], + "on": [ + 60.0, + 59.8 + ] + }, + "late_pct": { + "off": [ + 3.69, + 1.92 + ], + "on": [ + 0.82, + 1.1 + ] + }, + "stall_max": { + "off": [ + 185.4, + 157.3 + ], + "on": [ + 32.9, + 115.1 + ] + }, + "mbps": { + "off": [ + 0.49, + 0.46 + ], + "on": [ + 0.47, + 0.47 + ] + } + } + } +} \ No newline at end of file diff --git a/bench/results/2026-09-28-a3c6e5c-dirty-ab-keepwarm.json b/bench/results/2026-09-28-a3c6e5c-dirty-ab-keepwarm.json new file mode 100644 index 0000000..21c9e37 --- /dev/null +++ b/bench/results/2026-09-28-a3c6e5c-dirty-ab-keepwarm.json @@ -0,0 +1,2172 @@ +{ + "label": "ab-keepwarm", + "date": "2026-09-28T20:28:57", + "commit": "a3c6e5c+dirty", + "config": { + "quality": "balanced", + "mode": "separate", + "net": "none", + "delay_ms": 0, + "buffer_ms": 250, + "host": "frame", + "ssh_opts": [], + "encoder": "", + "duration_s": 20.0, + "browser_flags": [] + }, + "frame_build": "20260925.6191901", + "mac": "26.5.2", + "headset": "8:23.135290 [Info] - 0 - leaving standby", + "scenarios": [], + "arms": [ + "cold:FRAME_MAC_VIEW_WARM=0", + "warm:FRAME_MAC_VIEW_WARM=40" + ], + "runs": { + "cold": [ + [ + { + "scenario": "type", + "frames_sent": 145, + "frames_drawn": 145, + "frames_shown": 142, + "duration_s": 21.1, + "stages_ms": { + "capture": { + "p50": -2.5, + "p95": 2.7, + "p99": 19.4, + "n": 145 + }, + "queue": { + "p50": 0.0, + "p95": 0.0, + "p99": 0.3, + "n": 145 + }, + "encode": { + "p50": 6.5, + "p95": 9.6, + "p99": 18.2, + "n": 145 + }, + "socket": { + "p50": 0.1, + "p95": 0.2, + "p99": 1.0, + "n": 145 + }, + "network": { + "p50": 3.7, + "p95": 7.5, + "p99": 22.8, + "n": 145 + }, + "decode": { + "p50": 2.1, + "p95": 4.2, + "p99": 5.1, + "n": 145 + }, + "draw": { + "p50": 0.6, + "p95": 1.3, + "p99": 2.0, + "n": 145 + }, + "present": { + "p50": 0.5, + "p95": 9.3, + "p99": 12.6, + "n": 142 + }, + "content": { + "p50": 13.9, + "p95": 25.6, + "p99": 38.0, + "n": 145 + }, + "content_shown": { + "p50": 14.9, + "p95": 26.0, + "p99": 36.9, + "n": 142 + } + }, + "fps": 6.9, + "fps_shown": 6.7, + "late_pct": 51.37, + "stall_max": 1007.5, + "stalls_over_100ms": 66, + "mbps": 0.03, + "keyframes": 0, + "size": "1920x1290", + "captured": 145, + "viewer_never_drawn": 0, + "input_ms": { + "p50": 44.5, + "p95": 68.2, + "p99": 72.7, + "n": 66 + }, + "input_shown_ms": { + "p50": 44.9, + "p95": 68.9, + "p99": 73.1, + "n": 66 + }, + "input_parts_ms": { + "uplink": { + "p50": 4.2, + "p95": 17.4, + "p99": 41.0, + "n": 66 + }, + "mac": { + "p50": 22.8, + "p95": 36.8, + "p99": 42.9, + "n": 66 + }, + "back": { + "p50": 14.5, + "p95": 20.7, + "p99": 25.4, + "n": 66 + } + }, + "inputs": { + "asked": 65, + "sent": 66, + "seen": 66 + }, + "timeline": [ + { + "t": 0, + "fps": 37, + "mbps": 0.26, + "content_p50": 14.9, + "content_p95": 36.5, + "bitrate": 14860800, + "tier": 0, + "w": 1920, + "net": null + }, + { + "t": 1, + "fps": 42, + "mbps": 0.15, + "content_p50": 12.7, + "content_p95": 15.8, + "bitrate": 14860800, + "tier": 0, + "w": 1920, + "net": null + }, + { + "t": 2, + "fps": 6, + "mbps": 0.02, + "content_p50": 15.1, + "content_p95": 20.8, + "bitrate": 14860800, + "tier": 0, + "w": 1920, + "net": null + }, + { + "t": 3, + "fps": 5, + "mbps": 0.02, + "content_p50": 13.6, + "content_p95": 14.0, + "bitrate": 14860800, + "tier": 0, + "w": 1920, + "net": null + }, + { + "t": 4, + "fps": 5, + "mbps": 0.02, + "content_p50": 16.5, + "content_p95": 18.5, + "bitrate": 14860800, + "tier": 0, + "w": 1920, + "net": null + }, + { + "t": 5, + "fps": 5, + "mbps": 0.02, + "content_p50": 14.0, + "content_p95": 20.7, + "bitrate": 14860800, + "tier": 0, + "w": 1920, + "net": null + }, + { + "t": 6, + "fps": 5, + "mbps": 0.02, + "content_p50": 14.5, + "content_p95": 15.6, + "bitrate": 14860800, + "tier": 0, + "w": 1920, + "net": null + }, + { + "t": 7, + "fps": 5, + "mbps": 0.02, + "content_p50": 15.5, + "content_p95": 18.3, + "bitrate": 14860800, + "tier": 0, + "w": 1920, + "net": null + }, + { + "t": 8, + "fps": 5, + "mbps": 0.02, + "content_p50": 13.4, + "content_p95": 16.2, + "bitrate": 14860800, + "tier": 0, + "w": 1920, + "net": null + }, + { + "t": 9, + "fps": 5, + "mbps": 0.02, + "content_p50": 14.3, + "content_p95": 16.2, + "bitrate": 14860800, + "tier": 0, + "w": 1920, + "net": null + }, + { + "t": 10, + "fps": 5, + "mbps": 0.02, + "content_p50": 14.9, + "content_p95": 16.4, + "bitrate": 14860800, + "tier": 0, + "w": 1920, + "net": null + }, + { + "t": 11, + "fps": 5, + "mbps": 0.02, + "content_p50": 14.0, + "content_p95": 18.6, + "bitrate": 14860800, + "tier": 0, + "w": 1920, + "net": null + }, + { + "t": 12, + "fps": 2, + "mbps": 0.01, + "content_p50": 13.2, + "content_p95": 17.8, + "bitrate": 14860800, + "tier": 0, + "w": 1920, + "net": null + }, + { + "t": 13, + "fps": 3, + "mbps": 0.01, + "content_p50": 12.9, + "content_p95": 13.3, + "bitrate": 14860800, + "tier": 0, + "w": 1920, + "net": null + }, + { + "t": 14, + "fps": 3, + "mbps": 0.01, + "content_p50": 14.2, + "content_p95": 25.7, + "bitrate": 14860800, + "tier": 0, + "w": 1920, + "net": null + }, + { + "t": 15, + "fps": 1, + "mbps": 0.0, + "content_p50": 13.9, + "content_p95": 13.9, + "bitrate": 14860800, + "tier": 0, + "w": 1920, + "net": null + }, + { + "t": 16, + "fps": 1, + "mbps": 0.0, + "content_p50": 15.8, + "content_p95": 15.8, + "bitrate": 14860800, + "tier": 0, + "w": 1920, + "net": null + }, + { + "t": 17, + "fps": 2, + "mbps": 0.01, + "content_p50": 13.6, + "content_p95": 25.4, + "bitrate": 14860800, + "tier": 0, + "w": 1920, + "net": null + }, + { + "t": 18, + "fps": 1, + "mbps": 0.0, + "content_p50": 15.7, + "content_p95": 15.7, + "bitrate": 14860800, + "tier": 0, + "w": 1920, + "net": null + }, + { + "t": 19, + "fps": 1, + "mbps": 0.0, + "content_p50": 17.6, + "content_p95": 17.6, + "bitrate": 14860800, + "tier": 0, + "w": 1920, + "net": null + }, + { + "t": 20, + "fps": 1, + "mbps": 0.0, + "content_p50": 16.0, + "content_p95": 16.0, + "bitrate": 14860800, + "tier": 0, + "w": 1920, + "net": null + } + ], + "adapt": [], + "content_p50": 13.9, + "content_p95": 25.6, + "input_p50": 44.5, + "input_p95": 68.2, + "grades": { + "input_replies": "local", + "content_p50": "local", + "content_p95": "local", + "input_p50": "local", + "input_p95": "local" + }, + "controller": { + "adapt": true, + "baseRtt": 5.75, + "ceiling": 14860800, + "fps": 60, + "inFlight": 0, + "scale": 1, + "slack": 41.666, + "target": 14860800, + "tier": 0 + }, + "events": [], + "source_fps": 6.9, + "cpu": { + "mac_agent_pct": 1.7, + "frame_viewer_pct": 10.2, + "frame_tailscaled_pct": 1.6, + "frame_sshd_pct": 0.2, + "frame_gamescope_pct": 5.4, + "frame_total_pct": 32.0 + }, + "viewer": "h264 software; ANGLE (Mesa, zink Vulkan 1.4(Turnip Adreno (TM) 750 (MESA_TURNIP)), OpenGL 4.6); raf 71 Hz", + "show_s": 1.57, + "panel": "valve.steam.desktopgame.2001615880", + "src": "separate:6692" + } + ], + [ + { + "scenario": "type", + "frames_sent": 190, + "frames_drawn": 190, + "frames_shown": 190, + "duration_s": 21.1, + "stages_ms": { + "capture": { + "p50": -4.7, + "p95": 4.9, + "p99": 7.4, + "n": 190 + }, + "queue": { + "p50": 0.0, + "p95": 0.1, + "p99": 0.1, + "n": 190 + }, + "encode": { + "p50": 6.4, + "p95": 9.0, + "p99": 12.6, + "n": 190 + }, + "socket": { + "p50": 0.1, + "p95": 0.2, + "p99": 0.3, + "n": 190 + }, + "network": { + "p50": 2.8, + "p95": 5.1, + "p99": 7.8, + "n": 190 + }, + "decode": { + "p50": 2.0, + "p95": 4.0, + "p99": 5.9, + "n": 190 + }, + "draw": { + "p50": 0.6, + "p95": 1.5, + "p99": 2.0, + "n": 190 + }, + "present": { + "p50": 0.6, + "p95": 8.5, + "p99": 13.4, + "n": 190 + }, + "content": { + "p50": 12.8, + "p95": 19.4, + "p99": 21.3, + "n": 190 + }, + "content_shown": { + "p50": 13.8, + "p95": 22.9, + "p99": 25.0, + "n": 190 + } + }, + "fps": 9.0, + "fps_shown": 9.0, + "late_pct": 41.88, + "stall_max": 2314.7, + "stalls_over_100ms": 67, + "mbps": 0.03, + "keyframes": 0, + "size": "1920x1290", + "captured": 190, + "viewer_never_drawn": 0, + "input_ms": { + "p50": 35.9, + "p95": 91.9, + "p99": 180.6, + "n": 65 + }, + "input_shown_ms": { + "p50": 36.3, + "p95": 92.4, + "p99": 181.0, + "n": 65 + }, + "input_parts_ms": { + "uplink": { + "p50": 5.3, + "p95": 19.9, + "p99": 57.7, + "n": 65 + }, + "mac": { + "p50": 17.6, + "p95": 38.0, + "p99": 89.2, + "n": 65 + }, + "back": { + "p50": 13.2, + "p95": 20.9, + "p99": 21.3, + "n": 65 + } + }, + "inputs": { + "asked": 65, + "sent": 66, + "seen": 65 + }, + "timeline": [ + { + "t": 0, + "fps": 14, + "mbps": 0.03, + "content_p50": 12.3, + "content_p95": 17.3, + "bitrate": 14860800, + "tier": 0, + "w": 1920, + "net": null + }, + { + "t": 1, + "fps": 6, + "mbps": 0.02, + "content_p50": 12.0, + "content_p95": 20.9, + "bitrate": 14860800, + "tier": 0, + "w": 1920, + "net": null + }, + { + "t": 2, + "fps": 5, + "mbps": 0.02, + "content_p50": 15.5, + "content_p95": 19.7, + "bitrate": 14860800, + "tier": 0, + "w": 1920, + "net": null + }, + { + "t": 3, + "fps": 5, + "mbps": 0.02, + "content_p50": 12.5, + "content_p95": 18.0, + "bitrate": 14860800, + "tier": 0, + "w": 1920, + "net": null + }, + { + "t": 4, + "fps": 11, + "mbps": 0.03, + "content_p50": 13.2, + "content_p95": 19.4, + "bitrate": 14860800, + "tier": 0, + "w": 1920, + "net": null + }, + { + "t": 5, + "fps": 12, + "mbps": 0.03, + "content_p50": 14.7, + "content_p95": 18.2, + "bitrate": 14860800, + "tier": 0, + "w": 1920, + "net": null + }, + { + "t": 6, + "fps": 6, + "mbps": 0.02, + "content_p50": 12.6, + "content_p95": 14.4, + "bitrate": 14860800, + "tier": 0, + "w": 1920, + "net": null + }, + { + "t": 7, + "fps": 13, + "mbps": 0.03, + "content_p50": 13.5, + "content_p95": 22.6, + "bitrate": 14860800, + "tier": 0, + "w": 1920, + "net": null + }, + { + "t": 8, + "fps": 19, + "mbps": 0.05, + "content_p50": 12.4, + "content_p95": 16.6, + "bitrate": 14860800, + "tier": 0, + "w": 1920, + "net": null + }, + { + "t": 9, + "fps": 5, + "mbps": 0.02, + "content_p50": 13.0, + "content_p95": 14.0, + "bitrate": 14860800, + "tier": 0, + "w": 1920, + "net": null + }, + { + "t": 10, + "fps": 5, + "mbps": 0.02, + "content_p50": 12.9, + "content_p95": 13.8, + "bitrate": 14860800, + "tier": 0, + "w": 1920, + "net": null + }, + { + "t": 11, + "fps": 5, + "mbps": 0.02, + "content_p50": 10.9, + "content_p95": 21.3, + "bitrate": 14860800, + "tier": 0, + "w": 1920, + "net": null + }, + { + "t": 12, + "fps": 3, + "mbps": 0.01, + "content_p50": 14.2, + "content_p95": 14.7, + "bitrate": 14860800, + "tier": 0, + "w": 1920, + "net": null + }, + { + "t": 13, + "fps": 1, + "mbps": 0.0, + "content_p50": 13.7, + "content_p95": 13.7, + "bitrate": 14860800, + "tier": 0, + "w": 1920, + "net": null + }, + { + "t": 14, + "fps": 2, + "mbps": 0.01, + "content_p50": 12.7, + "content_p95": 15.4, + "bitrate": 14860800, + "tier": 0, + "w": 1920, + "net": null + }, + { + "t": 15, + "fps": 42, + "mbps": 0.14, + "content_p50": 12.4, + "content_p95": 16.9, + "bitrate": 14860800, + "tier": 0, + "w": 1920, + "net": null + }, + { + "t": 16, + "fps": 25, + "mbps": 0.1, + "content_p50": 12.2, + "content_p95": 14.1, + "bitrate": 14860800, + "tier": 0, + "w": 1920, + "net": null + }, + { + "t": 17, + "fps": 7, + "mbps": 0.11, + "content_p50": 15.2, + "content_p95": 20.8, + "bitrate": 14860800, + "tier": 0, + "w": 1920, + "net": null + }, + { + "t": 18, + "fps": 4, + "mbps": 0.01, + "content_p50": 14.2, + "content_p95": 14.8, + "bitrate": 14860800, + "tier": 0, + "w": 1920, + "net": null + } + ], + "adapt": [], + "content_p50": 12.8, + "content_p95": 19.4, + "input_p50": 35.9, + "input_p95": 91.9, + "grades": { + "input_replies": "local", + "content_p50": "local", + "content_p95": "local", + "input_p50": "local", + "input_p95": "acceptable" + }, + "controller": { + "adapt": true, + "baseRtt": 5.709, + "ceiling": 14860800, + "fps": 60, + "inFlight": 0, + "scale": 1, + "slack": 41.666, + "target": 14860800, + "tier": 0 + }, + "events": [], + "source_fps": 9.0, + "cpu": { + "mac_agent_pct": 2.0, + "frame_viewer_pct": 12.8, + "frame_tailscaled_pct": 2.0, + "frame_sshd_pct": 0.2, + "frame_gamescope_pct": 6.0, + "frame_total_pct": 26.5 + }, + "viewer": "h264 software; ANGLE (Mesa, zink Vulkan 1.4(Turnip Adreno (TM) 750 (MESA_TURNIP)), OpenGL 4.6); raf 71 Hz", + "show_s": 1.29, + "panel": "valve.steam.desktopgame.2001147903", + "src": "separate:7108" + } + ], + [ + { + "scenario": "type", + "frames_sent": 83, + "frames_drawn": 83, + "frames_shown": 83, + "duration_s": 21.1, + "stages_ms": { + "capture": { + "p50": 0.2, + "p95": 19.9, + "p99": 50.0, + "n": 83 + }, + "queue": { + "p50": 0.0, + "p95": 0.1, + "p99": 21.0, + "n": 83 + }, + "encode": { + "p50": 6.6, + "p95": 8.9, + "p99": 19.9, + "n": 83 + }, + "socket": { + "p50": 0.1, + "p95": 0.3, + "p99": 9.8, + "n": 83 + }, + "network": { + "p50": 3.4, + "p95": 8.8, + "p99": 43.6, + "n": 83 + }, + "decode": { + "p50": 2.6, + "p95": 8.7, + "p99": 11.1, + "n": 83 + }, + "draw": { + "p50": 0.7, + "p95": 1.1, + "p99": 1.7, + "n": 83 + }, + "present": { + "p50": 0.6, + "p95": 5.7, + "p99": 11.5, + "n": 83 + }, + "content": { + "p50": 14.6, + "p95": 60.4, + "p99": 124.2, + "n": 83 + }, + "content_shown": { + "p50": 15.9, + "p95": 61.1, + "p99": 124.8, + "n": 83 + } + }, + "fps": 3.9, + "fps_shown": 3.9, + "late_pct": 61.45, + "stall_max": 9230.5, + "stalls_over_100ms": 39, + "mbps": 0.15, + "keyframes": 0, + "size": "1920x1290", + "captured": 114, + "viewer_never_drawn": 0, + "input_ms": { + "p50": 44.3, + "p95": 236.4, + "p99": 1853.7, + "n": 39 + }, + "input_shown_ms": { + "p50": 45.2, + "p95": 236.9, + "p99": 1854.2, + "n": 39 + }, + "input_parts_ms": { + "uplink": { + "p50": 5.3, + "p95": 18.0, + "p99": 45.1, + "n": 39 + }, + "mac": { + "p50": 21.2, + "p95": 150.9, + "p99": 1809.2, + "n": 39 + }, + "back": { + "p50": 13.9, + "p95": 23.3, + "p99": 179.5, + "n": 39 + } + }, + "inputs": { + "asked": 65, + "sent": 66, + "seen": 39 + }, + "timeline": [ + { + "t": 0, + "fps": 7, + "mbps": 0.04, + "content_p50": 16.2, + "content_p95": 179.5, + "bitrate": 469728, + "tier": 0, + "w": 1920, + "net": null + }, + { + "t": 1, + "fps": 10, + "mbps": 0.04, + "content_p50": 16.5, + "content_p95": 30.9, + "bitrate": 469728, + "tier": 0, + "w": 1920, + "net": null + }, + { + "t": 2, + "fps": 5, + "mbps": 0.02, + "content_p50": 13.8, + "content_p95": 14.6, + "bitrate": 469728, + "tier": 0, + "w": 1920, + "net": null + }, + { + "t": 3, + "fps": 6, + "mbps": 0.02, + "content_p50": 13.5, + "content_p95": 18.5, + "bitrate": 673370, + "tier": 0, + "w": 1920, + "net": null + }, + { + "t": 4, + "fps": 7, + "mbps": 0.02, + "content_p50": 12.7, + "content_p95": 13.4, + "bitrate": 1217929, + "tier": 0, + "w": 1920, + "net": null + }, + { + "t": 5, + "fps": 15, + "mbps": 0.06, + "content_p50": 13.3, + "content_p95": 19.4, + "bitrate": 1786562, + "tier": 0, + "w": 1920, + "net": null + }, + { + "t": 6, + "fps": 6, + "mbps": 0.02, + "content_p50": 13.9, + "content_p95": 20.1, + "bitrate": 2543412, + "tier": 0, + "w": 1920, + "net": null + }, + { + "t": 7, + "fps": 5, + "mbps": 0.11, + "content_p50": 14.2, + "content_p95": 23.2, + "bitrate": 3182528, + "tier": 0, + "w": 1920, + "net": null + }, + { + "t": 8, + "fps": 3, + "mbps": 0.01, + "content_p50": 13.5, + "content_p95": 13.5, + "bitrate": 4891587, + "tier": 0, + "w": 1920, + "net": null + }, + { + "t": 17, + "fps": 5, + "mbps": 0.97, + "content_p50": 41.2, + "content_p95": 89.1, + "bitrate": 14860800, + "tier": 0, + "w": 1920, + "net": null + }, + { + "t": 18, + "fps": 5, + "mbps": 0.65, + "content_p50": 36.5, + "content_p95": 44.4, + "bitrate": 14860800, + "tier": 0, + "w": 1920, + "net": null + }, + { + "t": 20, + "fps": 5, + "mbps": 0.72, + "content_p50": 26.1, + "content_p95": 40.5, + "bitrate": 14860800, + "tier": 0, + "w": 1920, + "net": null + }, + { + "t": 21, + "fps": 4, + "mbps": 0.5, + "content_p50": 17.6, + "content_p95": 24.0, + "bitrate": 14860800, + "tier": 0, + "w": 1920, + "net": null + } + ], + "adapt": [], + "content_p50": 14.6, + "content_p95": 60.4, + "input_p50": 44.3, + "input_p95": 236.4, + "grades": { + "input_replies": "bad", + "content_p50": "local", + "content_p95": "acceptable", + "input_p50": "local", + "input_p95": "bad" + }, + "controller": { + "adapt": true, + "baseRtt": 6.375, + "ceiling": 14860800, + "fps": 60, + "inFlight": 0, + "scale": 1, + "slack": 44.666, + "target": 14860800, + "tier": 0 + }, + "events": [ + { + "t": 0.39, + "e": "down to 469 kbit/s: queue 165 ms, held 4, oldest 213 ms, base 5 ms, sent 44 got 28 wants 234" + } + ], + "source_fps": 5.4, + "cpu": { + "mac_agent_pct": 1.5, + "frame_viewer_pct": 8.1, + "frame_tailscaled_pct": 1.8, + "frame_sshd_pct": 0.1, + "frame_gamescope_pct": 5.5, + "frame_total_pct": 25.1 + }, + "viewer": "h264 software; ANGLE (Mesa, zink Vulkan 1.4(Turnip Adreno (TM) 750 (MESA_TURNIP)), OpenGL 4.6); raf 72 Hz", + "show_s": 1.27, + "panel": "valve.steam.desktopgame.2001547827", + "src": "separate:7247" + } + ] + ], + "warm": [ + [ + { + "scenario": "type", + "frames_sent": 114, + "frames_drawn": 114, + "frames_shown": 112, + "duration_s": 21.1, + "stages_ms": { + "capture": { + "p50": 0.2, + "p95": 5.8, + "p99": 10.8, + "n": 114 + }, + "queue": { + "p50": 0.0, + "p95": 0.1, + "p99": 0.1, + "n": 114 + }, + "encode": { + "p50": 6.6, + "p95": 12.2, + "p99": 14.3, + "n": 114 + }, + "socket": { + "p50": 0.1, + "p95": 0.4, + "p99": 2.9, + "n": 114 + }, + "network": { + "p50": 3.9, + "p95": 12.5, + "p99": 44.8, + "n": 114 + }, + "decode": { + "p50": 2.2, + "p95": 5.4, + "p99": 9.2, + "n": 114 + }, + "draw": { + "p50": 0.6, + "p95": 1.5, + "p99": 1.9, + "n": 114 + }, + "present": { + "p50": 0.5, + "p95": 0.9, + "p99": 1.2, + "n": 112 + }, + "content": { + "p50": 14.5, + "p95": 29.9, + "p99": 65.7, + "n": 114 + }, + "content_shown": { + "p50": 15.1, + "p95": 28.9, + "p99": 52.5, + "n": 112 + } + }, + "fps": 5.4, + "fps_shown": 5.3, + "late_pct": 72.17, + "stall_max": 1001.0, + "stalls_over_100ms": 67, + "mbps": 0.03, + "keyframes": 0, + "size": "1920x1290", + "captured": 162, + "viewer_never_drawn": 0, + "input_ms": { + "p50": 46.6, + "p95": 71.3, + "p99": 84.0, + "n": 66 + }, + "input_shown_ms": { + "p50": 47.1, + "p95": 71.8, + "p99": 84.7, + "n": 66 + }, + "input_parts_ms": { + "uplink": { + "p50": 4.3, + "p95": 9.7, + "p99": 34.2, + "n": 66 + }, + "mac": { + "p50": 25.8, + "p95": 42.8, + "p99": 44.3, + "n": 66 + }, + "back": { + "p50": 15.2, + "p95": 29.3, + "p99": 29.9, + "n": 66 + } + }, + "inputs": { + "asked": 65, + "sent": 66, + "seen": 66 + }, + "timeline": [ + { + "t": 0, + "fps": 29, + "mbps": 0.26, + "content_p50": 14.3, + "content_p95": 21.8, + "bitrate": 14860800, + "tier": 0, + "w": 1920, + "net": null + }, + { + "t": 1, + "fps": 7, + "mbps": 0.03, + "content_p50": 13.4, + "content_p95": 15.7, + "bitrate": 14860800, + "tier": 0, + "w": 1920, + "net": null + }, + { + "t": 2, + "fps": 5, + "mbps": 0.02, + "content_p50": 16.9, + "content_p95": 18.5, + "bitrate": 14860800, + "tier": 0, + "w": 1920, + "net": null + }, + { + "t": 3, + "fps": 9, + "mbps": 0.03, + "content_p50": 16.1, + "content_p95": 20.0, + "bitrate": 14860800, + "tier": 0, + "w": 1920, + "net": null + }, + { + "t": 4, + "fps": 5, + "mbps": 0.02, + "content_p50": 14.4, + "content_p95": 19.4, + "bitrate": 14860800, + "tier": 0, + "w": 1920, + "net": null + }, + { + "t": 5, + "fps": 10, + "mbps": 0.04, + "content_p50": 13.8, + "content_p95": 29.9, + "bitrate": 14860800, + "tier": 0, + "w": 1920, + "net": null + }, + { + "t": 6, + "fps": 6, + "mbps": 0.02, + "content_p50": 14.2, + "content_p95": 28.4, + "bitrate": 14860800, + "tier": 0, + "w": 1920, + "net": null + }, + { + "t": 7, + "fps": 4, + "mbps": 0.02, + "content_p50": 16.8, + "content_p95": 28.2, + "bitrate": 14860800, + "tier": 0, + "w": 1920, + "net": null + }, + { + "t": 8, + "fps": 6, + "mbps": 0.03, + "content_p50": 13.8, + "content_p95": 16.9, + "bitrate": 14860800, + "tier": 0, + "w": 1920, + "net": null + }, + { + "t": 9, + "fps": 5, + "mbps": 0.02, + "content_p50": 13.5, + "content_p95": 20.2, + "bitrate": 14860800, + "tier": 0, + "w": 1920, + "net": null + }, + { + "t": 10, + "fps": 9, + "mbps": 0.05, + "content_p50": 29.9, + "content_p95": 95.2, + "bitrate": 14860800, + "tier": 0, + "w": 1920, + "net": null + }, + { + "t": 11, + "fps": 7, + "mbps": 0.02, + "content_p50": 13.8, + "content_p95": 30.1, + "bitrate": 14860800, + "tier": 0, + "w": 1920, + "net": null + }, + { + "t": 12, + "fps": 2, + "mbps": 0.01, + "content_p50": 13.3, + "content_p95": 17.6, + "bitrate": 14860800, + "tier": 0, + "w": 1920, + "net": null + }, + { + "t": 13, + "fps": 1, + "mbps": 0.0, + "content_p50": 16.6, + "content_p95": 16.6, + "bitrate": 14860800, + "tier": 0, + "w": 1920, + "net": null + }, + { + "t": 14, + "fps": 2, + "mbps": 0.01, + "content_p50": 15.2, + "content_p95": 17.3, + "bitrate": 14860800, + "tier": 0, + "w": 1920, + "net": null + }, + { + "t": 15, + "fps": 1, + "mbps": 0.0, + "content_p50": 14.2, + "content_p95": 14.2, + "bitrate": 14860800, + "tier": 0, + "w": 1920, + "net": null + }, + { + "t": 16, + "fps": 1, + "mbps": 0.0, + "content_p50": 19.1, + "content_p95": 19.1, + "bitrate": 14860800, + "tier": 0, + "w": 1920, + "net": null + }, + { + "t": 17, + "fps": 2, + "mbps": 0.01, + "content_p50": 14.2, + "content_p95": 14.5, + "bitrate": 14860800, + "tier": 0, + "w": 1920, + "net": null + }, + { + "t": 18, + "fps": 1, + "mbps": 0.0, + "content_p50": 13.9, + "content_p95": 13.9, + "bitrate": 14860800, + "tier": 0, + "w": 1920, + "net": null + }, + { + "t": 19, + "fps": 1, + "mbps": 0.0, + "content_p50": 14.4, + "content_p95": 14.4, + "bitrate": 14860800, + "tier": 0, + "w": 1920, + "net": null + }, + { + "t": 20, + "fps": 1, + "mbps": 0.0, + "content_p50": 15.1, + "content_p95": 15.1, + "bitrate": 14860800, + "tier": 0, + "w": 1920, + "net": null + } + ], + "adapt": [], + "content_p50": 14.5, + "content_p95": 29.9, + "input_p50": 46.6, + "input_p95": 71.3, + "grades": { + "input_replies": "local", + "content_p50": "local", + "content_p95": "local", + "input_p50": "local", + "input_p95": "acceptable" + }, + "controller": { + "adapt": true, + "baseRtt": 5.541, + "ceiling": 14860800, + "fps": 60, + "inFlight": 1, + "scale": 1, + "slack": 48.292, + "target": 14860800, + "tier": 0 + }, + "events": [], + "source_fps": 7.7, + "cpu": { + "mac_agent_pct": 2.0, + "frame_viewer_pct": 10.9, + "frame_tailscaled_pct": 2.8, + "frame_sshd_pct": 0.4, + "frame_gamescope_pct": 5.4, + "frame_total_pct": 36.0 + }, + "viewer": "h264 software; ANGLE (Mesa, zink Vulkan 1.4(Turnip Adreno (TM) 750 (MESA_TURNIP)), OpenGL 4.6); raf 70 Hz", + "show_s": 1.28, + "panel": "valve.steam.desktopgame.2001621121", + "src": "separate:6829" + } + ], + [ + { + "scenario": "type", + "frames_sent": 220, + "frames_drawn": 220, + "frames_shown": 217, + "duration_s": 21.1, + "stages_ms": { + "capture": { + "p50": -5.5, + "p95": 3.8, + "p99": 14.3, + "n": 220 + }, + "queue": { + "p50": 0.0, + "p95": 0.1, + "p99": 0.3, + "n": 220 + }, + "encode": { + "p50": 6.5, + "p95": 9.0, + "p99": 18.8, + "n": 220 + }, + "socket": { + "p50": 0.1, + "p95": 0.2, + "p99": 1.7, + "n": 220 + }, + "network": { + "p50": 3.1, + "p95": 8.9, + "p99": 46.7, + "n": 220 + }, + "decode": { + "p50": 2.0, + "p95": 4.1, + "p99": 7.6, + "n": 220 + }, + "draw": { + "p50": 0.7, + "p95": 1.4, + "p99": 1.8, + "n": 220 + }, + "present": { + "p50": 0.6, + "p95": 10.4, + "p99": 13.9, + "n": 217 + }, + "content": { + "p50": 13.0, + "p95": 25.6, + "p99": 122.5, + "n": 220 + }, + "content_shown": { + "p50": 14.1, + "p95": 27.2, + "p99": 122.9, + "n": 217 + } + }, + "fps": 10.4, + "fps_shown": 10.3, + "late_pct": 38.46, + "stall_max": 4500.7, + "stalls_over_100ms": 64, + "mbps": 0.05, + "keyframes": 0, + "size": "1920x1290", + "captured": 220, + "viewer_never_drawn": 0, + "input_ms": { + "p50": 51.4, + "p95": 63.8, + "p99": 80.7, + "n": 64 + }, + "input_shown_ms": { + "p50": 51.8, + "p95": 64.3, + "p99": 81.3, + "n": 64 + }, + "input_parts_ms": { + "uplink": { + "p50": 4.1, + "p95": 17.8, + "p99": 29.2, + "n": 64 + }, + "mac": { + "p50": 31.3, + "p95": 35.3, + "p99": 39.4, + "n": 64 + }, + "back": { + "p50": 13.6, + "p95": 19.9, + "p99": 26.1, + "n": 64 + } + }, + "inputs": { + "asked": 65, + "sent": 66, + "seen": 64 + }, + "timeline": [ + { + "t": 0, + "fps": 28, + "mbps": 0.27, + "content_p50": 16.7, + "content_p95": 61.5, + "bitrate": 14860800, + "tier": 0, + "w": 1920, + "net": null + }, + { + "t": 1, + "fps": 8, + "mbps": 0.03, + "content_p50": 13.7, + "content_p95": 19.3, + "bitrate": 14860800, + "tier": 0, + "w": 1920, + "net": null + }, + { + "t": 2, + "fps": 5, + "mbps": 0.02, + "content_p50": 13.3, + "content_p95": 14.8, + "bitrate": 14860800, + "tier": 0, + "w": 1920, + "net": null + }, + { + "t": 3, + "fps": 5, + "mbps": 0.02, + "content_p50": 13.2, + "content_p95": 13.9, + "bitrate": 14860800, + "tier": 0, + "w": 1920, + "net": null + }, + { + "t": 4, + "fps": 5, + "mbps": 0.02, + "content_p50": 12.9, + "content_p95": 14.3, + "bitrate": 14860800, + "tier": 0, + "w": 1920, + "net": null + }, + { + "t": 5, + "fps": 5, + "mbps": 0.02, + "content_p50": 16.9, + "content_p95": 24.9, + "bitrate": 14860800, + "tier": 0, + "w": 1920, + "net": null + }, + { + "t": 6, + "fps": 5, + "mbps": 0.02, + "content_p50": 13.6, + "content_p95": 17.0, + "bitrate": 14860800, + "tier": 0, + "w": 1920, + "net": null + }, + { + "t": 7, + "fps": 5, + "mbps": 0.02, + "content_p50": 13.1, + "content_p95": 15.2, + "bitrate": 14860800, + "tier": 0, + "w": 1920, + "net": null + }, + { + "t": 8, + "fps": 6, + "mbps": 0.02, + "content_p50": 13.8, + "content_p95": 15.3, + "bitrate": 14860800, + "tier": 0, + "w": 1920, + "net": null + }, + { + "t": 9, + "fps": 6, + "mbps": 0.02, + "content_p50": 14.5, + "content_p95": 16.3, + "bitrate": 14860800, + "tier": 0, + "w": 1920, + "net": null + }, + { + "t": 10, + "fps": 6, + "mbps": 0.02, + "content_p50": 12.6, + "content_p95": 19.9, + "bitrate": 14860800, + "tier": 0, + "w": 1920, + "net": null + }, + { + "t": 11, + "fps": 48, + "mbps": 0.15, + "content_p50": 12.8, + "content_p95": 16.7, + "bitrate": 14860800, + "tier": 0, + "w": 1920, + "net": null + }, + { + "t": 12, + "fps": 47, + "mbps": 0.15, + "content_p50": 12.6, + "content_p95": 16.6, + "bitrate": 14860800, + "tier": 0, + "w": 1920, + "net": null + }, + { + "t": 13, + "fps": 30, + "mbps": 0.09, + "content_p50": 12.8, + "content_p95": 15.7, + "bitrate": 14860800, + "tier": 0, + "w": 1920, + "net": null + }, + { + "t": 14, + "fps": 2, + "mbps": 0.01, + "content_p50": 11.6, + "content_p95": 13.3, + "bitrate": 14860800, + "tier": 0, + "w": 1920, + "net": null + }, + { + "t": 15, + "fps": 6, + "mbps": 0.11, + "content_p50": 42.9, + "content_p95": 143.4, + "bitrate": 14860800, + "tier": 0, + "w": 1920, + "net": null + }, + { + "t": 16, + "fps": 3, + "mbps": 0.01, + "content_p50": 12.8, + "content_p95": 13.7, + "bitrate": 14860800, + "tier": 0, + "w": 1920, + "net": null + } + ], + "adapt": [], + "content_p50": 13.0, + "content_p95": 25.6, + "input_p50": 51.4, + "input_p95": 63.8, + "grades": { + "input_replies": "local", + "content_p50": "local", + "content_p95": "local", + "input_p50": "acceptable", + "input_p95": "local" + }, + "controller": { + "adapt": true, + "baseRtt": 5.792, + "ceiling": 14860800, + "fps": 60, + "inFlight": 0, + "scale": 1, + "slack": 41.666, + "target": 14860800, + "tier": 0 + }, + "events": [], + "source_fps": 10.4, + "cpu": { + "mac_agent_pct": 2.5, + "frame_viewer_pct": 14.7, + "frame_tailscaled_pct": 2.9, + "frame_sshd_pct": 0.4, + "frame_gamescope_pct": 6.1, + "frame_total_pct": 33.5 + }, + "viewer": "h264 software; ANGLE (Mesa, zink Vulkan 1.4(Turnip Adreno (TM) 750 (MESA_TURNIP)), OpenGL 4.6); raf 71 Hz", + "show_s": 1.27, + "panel": "valve.steam.desktopgame.2001606834", + "src": "separate:6969" + } + ], + [ + { + "scenario": "type", + "frames_sent": 128, + "frames_drawn": 128, + "frames_shown": 126, + "duration_s": 21.1, + "stages_ms": { + "capture": { + "p50": -3.5, + "p95": 1.4, + "p99": 26.9, + "n": 128 + }, + "queue": { + "p50": 0.0, + "p95": 0.1, + "p99": 0.7, + "n": 128 + }, + "encode": { + "p50": 6.7, + "p95": 9.9, + "p99": 23.0, + "n": 128 + }, + "socket": { + "p50": 0.1, + "p95": 0.3, + "p99": 2.8, + "n": 128 + }, + "network": { + "p50": 3.3, + "p95": 5.1, + "p99": 205.9, + "n": 128 + }, + "decode": { + "p50": 2.1, + "p95": 4.2, + "p99": 6.4, + "n": 128 + }, + "draw": { + "p50": 0.7, + "p95": 1.7, + "p99": 1.9, + "n": 128 + }, + "present": { + "p50": 0.6, + "p95": 9.2, + "p99": 13.7, + "n": 126 + }, + "content": { + "p50": 13.4, + "p95": 21.6, + "p99": 264.8, + "n": 128 + }, + "content_shown": { + "p50": 14.5, + "p95": 26.1, + "p99": 265.4, + "n": 126 + } + }, + "fps": 6.1, + "fps_shown": 6.0, + "late_pct": 17.83, + "stall_max": 9246.3, + "stalls_over_100ms": 17, + "mbps": 0.02, + "keyframes": 0, + "size": "1920x1290", + "captured": 129, + "viewer_never_drawn": 0, + "input_ms": { + "p50": 42.5, + "p95": 194.0, + "p99": 404.5, + "n": 25 + }, + "input_shown_ms": { + "p50": 43.2, + "p95": 194.6, + "p99": 405.1, + "n": 25 + }, + "input_parts_ms": { + "uplink": { + "p50": 9.4, + "p95": 26.2, + "p99": 35.0, + "n": 25 + }, + "mac": { + "p50": 23.3, + "p95": 135.9, + "p99": 176.2, + "n": 25 + }, + "back": { + "p50": 13.8, + "p95": 21.6, + "p99": 264.8, + "n": 25 + } + }, + "inputs": { + "asked": 65, + "sent": 66, + "seen": 25 + }, + "timeline": [ + { + "t": 0, + "fps": 24, + "mbps": 0.06, + "content_p50": 13.0, + "content_p95": 14.4, + "bitrate": 14860800, + "tier": 0, + "w": 1920, + "net": null + }, + { + "t": 1, + "fps": 58, + "mbps": 0.19, + "content_p50": 13.6, + "content_p95": 18.1, + "bitrate": 14860800, + "tier": 0, + "w": 1920, + "net": null + }, + { + "t": 2, + "fps": 26, + "mbps": 0.08, + "content_p50": 12.9, + "content_p95": 15.3, + "bitrate": 14860800, + "tier": 0, + "w": 1920, + "net": null + }, + { + "t": 3, + "fps": 6, + "mbps": 0.08, + "content_p50": 13.5, + "content_p95": 17.2, + "bitrate": 14860800, + "tier": 0, + "w": 1920, + "net": null + }, + { + "t": 4, + "fps": 4, + "mbps": 0.05, + "content_p50": 18.8, + "content_p95": 25.6, + "bitrate": 14860800, + "tier": 0, + "w": 1920, + "net": null + }, + { + "t": 5, + "fps": 3, + "mbps": 0.01, + "content_p50": 13.3, + "content_p95": 13.8, + "bitrate": 14860800, + "tier": 0, + "w": 1920, + "net": null + }, + { + "t": 10, + "fps": 4, + "mbps": 0.03, + "content_p50": 264.8, + "content_p95": 354.5, + "bitrate": 300000, + "tier": 0, + "w": 1920, + "net": null + }, + { + "t": 11, + "fps": 3, + "mbps": 0.01, + "content_p50": 13.8, + "content_p95": 15.1, + "bitrate": 300000, + "tier": 0, + "w": 1920, + "net": null + } + ], + "adapt": [], + "content_p50": 13.4, + "content_p95": 21.6, + "input_p50": 42.5, + "input_p95": 194.0, + "grades": { + "input_replies": "bad", + "content_p50": "local", + "content_p95": "local", + "input_p50": "local", + "input_p95": "bad" + }, + "controller": { + "adapt": true, + "baseRtt": 0, + "ceiling": 14860800, + "fps": 60, + "inFlight": 0, + "scale": 1, + "slack": 41.666, + "target": 14855423, + "tier": 0 + }, + "events": [ + { + "t": 10.93, + "e": "down to 300 kbit/s: queue 0 ms, held 0, oldest 201 ms, base 5 ms, sent 61 got 0 wants 51" + } + ], + "source_fps": 6.1, + "cpu": { + "mac_agent_pct": 2.1, + "frame_viewer_pct": 11.1, + "frame_tailscaled_pct": 2.6, + "frame_sshd_pct": 0.4, + "frame_gamescope_pct": 6.0, + "frame_total_pct": 25.6 + }, + "viewer": "h264 software; ANGLE (Mesa, zink Vulkan 1.4(Turnip Adreno (TM) 750 (MESA_TURNIP)), OpenGL 4.6); raf 72 Hz", + "show_s": 1.32, + "panel": "valve.steam.desktopgame.2001763888", + "src": "separate:7401" + } + ] + ] + }, + "table": { + "type": { + "content_p50": { + "cold": [ + 13.9, + 12.8, + 14.6 + ], + "warm": [ + 14.5, + 13.0, + 13.4 + ] + }, + "content_p95": { + "cold": [ + 25.6, + 19.4, + 60.4 + ], + "warm": [ + 29.9, + 25.6, + 21.6 + ] + }, + "input_p50": { + "cold": [ + 44.5, + 35.9, + 44.3 + ], + "warm": [ + 46.6, + 51.4, + 42.5 + ] + }, + "input_p95": { + "cold": [ + 68.2, + 91.9, + 236.4 + ], + "warm": [ + 71.3, + 63.8, + 194.0 + ] + }, + "fps": { + "cold": [ + 6.9, + 9.0, + 3.9 + ], + "warm": [ + 5.4, + 10.4, + 6.1 + ] + }, + "late_pct": { + "cold": [ + 51.37, + 41.88, + 61.45 + ], + "warm": [ + 72.17, + 38.46, + 17.83 + ] + }, + "stall_max": { + "cold": [ + 1007.5, + 2314.7, + 9230.5 + ], + "warm": [ + 1001.0, + 4500.7, + 9246.3 + ] + }, + "mbps": { + "cold": [ + 0.03, + 0.03, + 0.15 + ], + "warm": [ + 0.03, + 0.05, + 0.02 + ] + } + } + } +} \ No newline at end of file diff --git a/bench/results/2026-09-28-a3c6e5c-dirty-adapt-clean.json b/bench/results/2026-09-28-a3c6e5c-dirty-adapt-clean.json new file mode 100644 index 0000000..7f449e1 --- /dev/null +++ b/bench/results/2026-09-28-a3c6e5c-dirty-adapt-clean.json @@ -0,0 +1,984 @@ +{ + "label": "adapt-clean", + "date": "2026-09-28T17:13:59", + "commit": "a3c6e5c+dirty", + "config": { + "quality": "balanced", + "mode": "separate", + "net": "none", + "delay_ms": 0, + "buffer_ms": 250, + "host": "frame", + "ssh_opts": [], + "encoder": "", + "duration_s": 20.0, + "browser_flags": [] + }, + "frame_build": "20260925.6191901", + "mac": "26.5.2", + "headset": ":39.639829 [Info] - 0 - entering standby", + "scenarios": [ + { + "scenario": "test", + "frames_sent": 653, + "frames_drawn": 653, + "frames_shown": 649, + "duration_s": 20.7, + "stages_ms": { + "capture": { + "p50": 0.0, + "p95": 0.0, + "p99": 0.0, + "n": 653 + }, + "queue": { + "p50": 11.2, + "p95": 16.1, + "p99": 17.1, + "n": 653 + }, + "encode": { + "p50": 3.5, + "p95": 4.2, + "p99": 4.4, + "n": 653 + }, + "socket": { + "p50": 0.1, + "p95": 0.2, + "p99": 0.2, + "n": 653 + }, + "network": { + "p50": 2.9, + "p95": 7.0, + "p99": 12.0, + "n": 653 + }, + "decode": { + "p50": 1.0, + "p95": 2.4, + "p99": 2.8, + "n": 653 + }, + "draw": { + "p50": 0.3, + "p95": 0.6, + "p99": 0.9, + "n": 653 + }, + "present": { + "p50": 0.5, + "p95": 0.9, + "p99": 5.9, + "n": 649 + }, + "content": { + "p50": 19.8, + "p95": 26.2, + "p99": 30.1, + "n": 653 + }, + "content_shown": { + "p50": 20.3, + "p95": 26.9, + "p99": 31.1, + "n": 649 + } + }, + "fps": 31.5, + "fps_shown": 31.3, + "late_pct": 98.01, + "stall_max": 144.0, + "stalls_over_100ms": 2, + "mbps": 0.13, + "keyframes": 2, + "size": "960x540", + "captured": 1336, + "viewer_never_drawn": 0, + "input_ms": { + "p50": 43.5, + "p95": 61.8, + "p99": 63.4, + "n": 40 + }, + "input_shown_ms": { + "p50": 44.3, + "p95": 62.3, + "p99": 63.9, + "n": 40 + }, + "input_parts_ms": { + "uplink": { + "p50": 11.1, + "p95": 29.2, + "p99": 36.1, + "n": 40 + }, + "mac": { + "p50": 10.4, + "p95": 28.2, + "p99": 32.4, + "n": 40 + }, + "back": { + "p50": 17.5, + "p95": 27.9, + "p99": 28.8, + "n": 40 + } + }, + "inputs": { + "sent": 40, + "seen": 40 + }, + "timeline": [ + { + "t": 0, + "fps": 31, + "mbps": 0.13, + "content_p50": 21.5, + "content_p95": 27.1, + "bitrate": 300000, + "tier": 4, + "w": 960, + "net": null + }, + { + "t": 1, + "fps": 31, + "mbps": 0.12, + "content_p50": 22.4, + "content_p95": 26.3, + "bitrate": 300000, + "tier": 4, + "w": 960, + "net": null + }, + { + "t": 2, + "fps": 32, + "mbps": 0.13, + "content_p50": 18.9, + "content_p95": 24.8, + "bitrate": 300000, + "tier": 4, + "w": 960, + "net": null + }, + { + "t": 3, + "fps": 31, + "mbps": 0.12, + "content_p50": 18.2, + "content_p95": 24.6, + "bitrate": 300000, + "tier": 4, + "w": 960, + "net": null + }, + { + "t": 4, + "fps": 32, + "mbps": 0.13, + "content_p50": 21.0, + "content_p95": 25.6, + "bitrate": 300000, + "tier": 4, + "w": 960, + "net": null + }, + { + "t": 5, + "fps": 32, + "mbps": 0.12, + "content_p50": 19.5, + "content_p95": 24.3, + "bitrate": 300000, + "tier": 4, + "w": 960, + "net": null + }, + { + "t": 6, + "fps": 31, + "mbps": 0.12, + "content_p50": 22.2, + "content_p95": 25.6, + "bitrate": 300000, + "tier": 4, + "w": 960, + "net": null + }, + { + "t": 7, + "fps": 32, + "mbps": 0.13, + "content_p50": 19.9, + "content_p95": 24.0, + "bitrate": 300000, + "tier": 4, + "w": 960, + "net": null + }, + { + "t": 8, + "fps": 31, + "mbps": 0.21, + "content_p50": 22.7, + "content_p95": 26.9, + "bitrate": 300000, + "tier": 4, + "w": 960, + "net": null + }, + { + "t": 9, + "fps": 31, + "mbps": 0.12, + "content_p50": 20.2, + "content_p95": 26.1, + "bitrate": 300000, + "tier": 4, + "w": 960, + "net": null + }, + { + "t": 10, + "fps": 32, + "mbps": 0.12, + "content_p50": 18.2, + "content_p95": 23.2, + "bitrate": 300000, + "tier": 4, + "w": 960, + "net": null + }, + { + "t": 11, + "fps": 31, + "mbps": 0.12, + "content_p50": 19.8, + "content_p95": 24.2, + "bitrate": 300000, + "tier": 4, + "w": 960, + "net": null + }, + { + "t": 12, + "fps": 32, + "mbps": 0.13, + "content_p50": 19.2, + "content_p95": 24.8, + "bitrate": 300000, + "tier": 4, + "w": 960, + "net": null + }, + { + "t": 13, + "fps": 32, + "mbps": 0.12, + "content_p50": 21.0, + "content_p95": 24.3, + "bitrate": 300000, + "tier": 4, + "w": 960, + "net": null + }, + { + "t": 14, + "fps": 30, + "mbps": 0.13, + "content_p50": 20.4, + "content_p95": 96.7, + "bitrate": 300000, + "tier": 4, + "w": 960, + "net": null + }, + { + "t": 15, + "fps": 32, + "mbps": 0.13, + "content_p50": 18.2, + "content_p95": 24.4, + "bitrate": 300000, + "tier": 4, + "w": 960, + "net": null + }, + { + "t": 16, + "fps": 31, + "mbps": 0.12, + "content_p50": 18.4, + "content_p95": 25.1, + "bitrate": 300000, + "tier": 4, + "w": 960, + "net": null + }, + { + "t": 17, + "fps": 32, + "mbps": 0.13, + "content_p50": 17.2, + "content_p95": 23.5, + "bitrate": 300000, + "tier": 4, + "w": 960, + "net": null + }, + { + "t": 18, + "fps": 32, + "mbps": 0.19, + "content_p50": 19.4, + "content_p95": 25.2, + "bitrate": 300000, + "tier": 4, + "w": 960, + "net": null + }, + { + "t": 19, + "fps": 31, + "mbps": 0.14, + "content_p50": 21.1, + "content_p95": 84.3, + "bitrate": 300000, + "tier": 4, + "w": 960, + "net": null + }, + { + "t": 20, + "fps": 24, + "mbps": 0.08, + "content_p50": 20.8, + "content_p95": 25.1, + "bitrate": 300000, + "tier": 4, + "w": 960, + "net": null + } + ], + "adapt": [], + "content_p50": 19.8, + "content_p95": 26.2, + "input_p50": 43.5, + "input_p95": 61.8, + "grades": { + "content_p50": "local", + "content_p95": "local", + "input_p50": "local", + "input_p95": "local", + "fps": "bad", + "late_pct": "bad", + "stall_max": "acceptable" + }, + "source_fps": 64.5, + "cpu": { + "mac_agent_pct": 11.3, + "frame_viewer_pct": 35.9, + "frame_tailscaled_pct": 3.5, + "frame_sshd_pct": 0.6, + "frame_gamescope_pct": 7.5, + "frame_total_pct": 16.1 + }, + "viewer": "h264 software; ANGLE (Mesa, zink Vulkan 1.4(Turnip Adreno (TM) 750 (MESA_TURNIP)), OpenGL 4.6); raf 141 Hz", + "show_s": 4.68, + "panel": "valve.steam.desktopgame.2001639889", + "src": "test" + }, + { + "scenario": "scroll", + "frames_sent": 937, + "frames_drawn": 937, + "frames_shown": 720, + "duration_s": 20.7, + "stages_ms": { + "capture": { + "p50": -3.9, + "p95": 0.9, + "p99": 8.2, + "n": 937 + }, + "queue": { + "p50": 0.0, + "p95": 16.3, + "p99": 20.1, + "n": 937 + }, + "encode": { + "p50": 6.4, + "p95": 7.2, + "p99": 9.3, + "n": 937 + }, + "socket": { + "p50": 0.1, + "p95": 0.2, + "p99": 0.2, + "n": 937 + }, + "network": { + "p50": 7.3, + "p95": 13.0, + "p99": 22.8, + "n": 937 + }, + "decode": { + "p50": 6.2, + "p95": 12.7, + "p99": 18.6, + "n": 937 + }, + "draw": { + "p50": 0.6, + "p95": 1.1, + "p99": 1.9, + "n": 937 + }, + "present": { + "p50": 2.9, + "p95": 18.5, + "p99": 24.5, + "n": 720 + }, + "content": { + "p50": 19.9, + "p95": 37.2, + "p99": 50.2, + "n": 937 + }, + "content_shown": { + "p50": 27.0, + "p95": 45.7, + "p99": 55.0, + "n": 720 + } + }, + "fps": 45.3, + "fps_shown": 34.8, + "late_pct": 28.63, + "stall_max": 99.3, + "stalls_over_100ms": 0, + "mbps": 7.59, + "keyframes": 2, + "size": "1920x1290", + "captured": 1215, + "viewer_never_drawn": 0, + "input_ms": { + "n": 0 + }, + "input_shown_ms": { + "n": 0 + }, + "input_parts_ms": { + "uplink": { + "n": 0 + }, + "mac": { + "n": 0 + }, + "back": { + "n": 0 + } + }, + "inputs": { + "sent": 0, + "seen": 0 + }, + "timeline": [ + { + "t": 0, + "fps": 30, + "mbps": 4.01, + "content_p50": 31.9, + "content_p95": 52.3, + "bitrate": 4867140, + "tier": 2, + "w": 1920, + "net": null + }, + { + "t": 1, + "fps": 30, + "mbps": 4.12, + "content_p50": 29.9, + "content_p95": 45.3, + "bitrate": 3807054, + "tier": 2, + "w": 1920, + "net": null + }, + { + "t": 2, + "fps": 30, + "mbps": 3.26, + "content_p50": 31.8, + "content_p95": 52.5, + "bitrate": 3235995, + "tier": 2, + "w": 1920, + "net": null + }, + { + "t": 3, + "fps": 30, + "mbps": 3.72, + "content_p50": 24.5, + "content_p95": 37.7, + "bitrate": 4238740, + "tier": 2, + "w": 1920, + "net": null + }, + { + "t": 4, + "fps": 30, + "mbps": 5.09, + "content_p50": 25.2, + "content_p95": 39.6, + "bitrate": 5992063, + "tier": 2, + "w": 1920, + "net": null + }, + { + "t": 5, + "fps": 31, + "mbps": 7.29, + "content_p50": 29.1, + "content_p95": 53.5, + "bitrate": 5526067, + "tier": 2, + "w": 1920, + "net": null + }, + { + "t": 6, + "fps": 35, + "mbps": 4.58, + "content_p50": 25.3, + "content_p95": 32.4, + "bitrate": 6018152, + "tier": 1, + "w": 1920, + "net": null + }, + { + "t": 7, + "fps": 46, + "mbps": 7.12, + "content_p50": 25.1, + "content_p95": 34.3, + "bitrate": 8412933, + "tier": 1, + "w": 1920, + "net": null + }, + { + "t": 8, + "fps": 46, + "mbps": 8.25, + "content_p50": 27.1, + "content_p95": 40.3, + "bitrate": 10760191, + "tier": 1, + "w": 1920, + "net": null + }, + { + "t": 9, + "fps": 47, + "mbps": 9.3, + "content_p50": 27.8, + "content_p95": 41.2, + "bitrate": 13717060, + "tier": 0, + "w": 1920, + "net": null + }, + { + "t": 10, + "fps": 55, + "mbps": 8.98, + "content_p50": 16.5, + "content_p95": 21.7, + "bitrate": 14860800, + "tier": 0, + "w": 1920, + "net": null + }, + { + "t": 11, + "fps": 51, + "mbps": 9.32, + "content_p50": 18.6, + "content_p95": 35.4, + "bitrate": 14860800, + "tier": 0, + "w": 1920, + "net": null + }, + { + "t": 12, + "fps": 56, + "mbps": 9.53, + "content_p50": 15.4, + "content_p95": 26.2, + "bitrate": 14860800, + "tier": 0, + "w": 1920, + "net": null + }, + { + "t": 13, + "fps": 55, + "mbps": 8.46, + "content_p50": 18.6, + "content_p95": 23.2, + "bitrate": 14860800, + "tier": 0, + "w": 1920, + "net": null + }, + { + "t": 14, + "fps": 54, + "mbps": 9.82, + "content_p50": 15.9, + "content_p95": 28.4, + "bitrate": 14860800, + "tier": 0, + "w": 1920, + "net": null + }, + { + "t": 15, + "fps": 54, + "mbps": 11.11, + "content_p50": 15.5, + "content_p95": 26.1, + "bitrate": 14860800, + "tier": 0, + "w": 1920, + "net": null + }, + { + "t": 16, + "fps": 54, + "mbps": 9.79, + "content_p50": 17.4, + "content_p95": 25.3, + "bitrate": 14860800, + "tier": 0, + "w": 1920, + "net": null + }, + { + "t": 17, + "fps": 57, + "mbps": 9.3, + "content_p50": 16.3, + "content_p95": 23.5, + "bitrate": 14860800, + "tier": 0, + "w": 1920, + "net": null + }, + { + "t": 18, + "fps": 55, + "mbps": 8.3, + "content_p50": 19.5, + "content_p95": 31.0, + "bitrate": 7984791, + "tier": 0, + "w": 1920, + "net": null + }, + { + "t": 19, + "fps": 51, + "mbps": 8.56, + "content_p50": 16.4, + "content_p95": 29.1, + "bitrate": 10220855, + "tier": 0, + "w": 1920, + "net": null + }, + { + "t": 20, + "fps": 40, + "mbps": 7.13, + "content_p50": 18.3, + "content_p95": 23.9, + "bitrate": 12025604, + "tier": 0, + "w": 1920, + "net": null + } + ], + "adapt": [], + "content_p50": 19.9, + "content_p95": 37.2, + "input_p50": null, + "input_p95": null, + "grades": { + "content_p50": "local", + "content_p95": "local", + "fps": "acceptable", + "late_pct": "bad", + "stall_max": "local" + }, + "source_fps": 58.7, + "cpu": { + "mac_agent_pct": 6.6, + "frame_viewer_pct": 72.4, + "frame_tailscaled_pct": 8.1, + "frame_sshd_pct": 0.9, + "frame_gamescope_pct": 10.0, + "frame_total_pct": 24.2 + }, + "viewer": "h264 software; ANGLE (Mesa, zink Vulkan 1.4(Turnip Adreno (TM) 750 (MESA_TURNIP)), OpenGL 4.6); raf 141 Hz", + "show_s": 6.43, + "panel": "valve.steam.desktopgame.2001414593", + "src": "separate:9384" + }, + { + "scenario": "type", + "frames_sent": 25, + "frames_drawn": 25, + "frames_shown": 25, + "duration_s": 14.7, + "stages_ms": { + "capture": { + "p50": -0.3, + "p95": 0.9, + "p99": 1.1, + "n": 25 + }, + "queue": { + "p50": 0.0, + "p95": 0.0, + "p99": 0.0, + "n": 25 + }, + "encode": { + "p50": 5.0, + "p95": 33.4, + "p99": 33.6, + "n": 25 + }, + "socket": { + "p50": 0.1, + "p95": 0.1, + "p99": 0.2, + "n": 25 + }, + "network": { + "p50": 6.1, + "p95": 14.9, + "p99": 24.4, + "n": 25 + }, + "decode": { + "p50": 3.0, + "p95": 10.5, + "p99": 11.4, + "n": 25 + }, + "draw": { + "p50": 0.6, + "p95": 1.0, + "p99": 1.1, + "n": 25 + }, + "present": { + "p50": 0.8, + "p95": 1.4, + "p99": 1.7, + "n": 25 + }, + "content": { + "p50": 12.6, + "p95": 41.0, + "p99": 46.3, + "n": 25 + }, + "content_shown": { + "p50": 13.9, + "p95": 41.8, + "p99": 46.6, + "n": 25 + } + }, + "fps": 1.7, + "fps_shown": 1.7, + "late_pct": 100.0, + "stall_max": 3099.2, + "stalls_over_100ms": 21, + "mbps": 0.04, + "keyframes": 4, + "size": "960x646", + "captured": 79, + "viewer_never_drawn": 0, + "input_ms": { + "p50": 41.3, + "p95": 60.3, + "p99": 68.6, + "n": 18 + }, + "input_shown_ms": { + "p50": 43.0, + "p95": 61.1, + "p99": 69.6, + "n": 18 + }, + "input_parts_ms": { + "uplink": { + "p50": 5.3, + "p95": 11.6, + "p99": 14.2, + "n": 18 + }, + "mac": { + "p50": 23.1, + "p95": 35.0, + "p99": 42.6, + "n": 18 + }, + "back": { + "p50": 11.8, + "p95": 19.2, + "p99": 22.7, + "n": 18 + } + }, + "inputs": { + "sent": 66, + "seen": 18 + }, + "timeline": [ + { + "t": 3, + "fps": 1, + "mbps": 0.01, + "content_p50": 11.8, + "content_p95": 11.8, + "bitrate": 1224075, + "tier": 4, + "w": 960, + "net": null + }, + { + "t": 4, + "fps": 1, + "mbps": 0.02, + "content_p50": 14.7, + "content_p95": 14.7, + "bitrate": 2091896, + "tier": 4, + "w": 960, + "net": null + }, + { + "t": 5, + "fps": 4, + "mbps": 0.1, + "content_p50": 18.6, + "content_p95": 37.4, + "bitrate": 3071304, + "tier": 3, + "w": 1440, + "net": null + }, + { + "t": 6, + "fps": 5, + "mbps": 0.13, + "content_p50": 4.2, + "content_p95": 19.2, + "bitrate": 4031277, + "tier": 3, + "w": 1440, + "net": null + }, + { + "t": 7, + "fps": 6, + "mbps": 0.04, + "content_p50": 12.0, + "content_p95": 46.3, + "bitrate": 300000, + "tier": 4, + "w": 960, + "net": null + }, + { + "t": 10, + "fps": 1, + "mbps": 0.01, + "content_p50": 12.2, + "content_p95": 12.2, + "bitrate": 300000, + "tier": 4, + "w": 960, + "net": null + }, + { + "t": 12, + "fps": 1, + "mbps": 0.02, + "content_p50": -1.2, + "content_p95": -1.2, + "bitrate": 842857, + "tier": 4, + "w": 960, + "net": null + }, + { + "t": 14, + "fps": 1, + "mbps": 0.02, + "content_p50": 14.4, + "content_p95": 14.4, + "bitrate": 2091896, + "tier": 4, + "w": 960, + "net": null + } + ], + "adapt": [], + "content_p50": 12.6, + "content_p95": 41.0, + "input_p50": 41.3, + "input_p95": 60.3, + "grades": { + "content_p50": "local", + "content_p95": "acceptable", + "input_p50": "local", + "input_p95": "local" + }, + "source_fps": 5.4, + "cpu": { + "mac_agent_pct": 1.2, + "frame_viewer_pct": 5.0, + "frame_tailscaled_pct": 1.5, + "frame_sshd_pct": 0.2, + "frame_gamescope_pct": 4.7, + "frame_total_pct": 8.5 + }, + "viewer": "h264 software; ANGLE (Mesa, zink Vulkan 1.4(Turnip Adreno (TM) 750 (MESA_TURNIP)), OpenGL 4.6); raf 140 Hz", + "show_s": 5.12, + "panel": "valve.steam.desktopgame.2001910179", + "src": "separate:9510" + } + ] +} \ No newline at end of file diff --git a/bench/results/2026-09-28-a3c6e5c-dirty-adapt-clean2.json b/bench/results/2026-09-28-a3c6e5c-dirty-adapt-clean2.json new file mode 100644 index 0000000..79fd46c --- /dev/null +++ b/bench/results/2026-09-28-a3c6e5c-dirty-adapt-clean2.json @@ -0,0 +1,1116 @@ +{ + "label": "adapt-clean2", + "date": "2026-09-28T17:16:27", + "commit": "a3c6e5c+dirty", + "config": { + "quality": "balanced", + "mode": "separate", + "net": "none", + "delay_ms": 0, + "buffer_ms": 250, + "host": "frame", + "ssh_opts": [], + "encoder": "", + "duration_s": 20.0, + "browser_flags": [] + }, + "frame_build": "20260925.6191901", + "mac": "26.5.2", + "headset": ":39.639829 [Info] - 0 - entering standby", + "scenarios": [ + { + "scenario": "test", + "frames_sent": 1229, + "frames_drawn": 1229, + "frames_shown": 814, + "duration_s": 20.7, + "stages_ms": { + "capture": { + "p50": 0.0, + "p95": 0.0, + "p99": 0.0, + "n": 1229 + }, + "queue": { + "p50": 0.0, + "p95": 0.1, + "p99": 0.1, + "n": 1229 + }, + "encode": { + "p50": 4.2, + "p95": 4.8, + "p99": 5.0, + "n": 1229 + }, + "socket": { + "p50": 0.1, + "p95": 0.2, + "p99": 0.2, + "n": 1229 + }, + "network": { + "p50": 6.1, + "p95": 10.9, + "p99": 28.8, + "n": 1229 + }, + "decode": { + "p50": 1.2, + "p95": 3.4, + "p99": 4.4, + "n": 1229 + }, + "draw": { + "p50": 0.3, + "p95": 0.7, + "p99": 1.1, + "n": 1229 + }, + "present": { + "p50": 5.5, + "p95": 16.5, + "p99": 19.2, + "n": 814 + }, + "content": { + "p50": 12.2, + "p95": 17.6, + "p99": 34.3, + "n": 1229 + }, + "content_shown": { + "p50": 18.0, + "p95": 29.6, + "p99": 38.7, + "n": 814 + } + }, + "fps": 59.3, + "fps_shown": 39.3, + "late_pct": 1.55, + "stall_max": 168.0, + "stalls_over_100ms": 2, + "mbps": 0.47, + "keyframes": 2, + "size": "1280x720", + "captured": 1337, + "viewer_never_drawn": 0, + "input_ms": { + "p50": 27.8, + "p95": 41.1, + "p99": 46.2, + "n": 40 + }, + "input_shown_ms": { + "p50": 32.3, + "p95": 47.0, + "p99": 53.4, + "n": 25 + }, + "input_parts_ms": { + "uplink": { + "p50": 8.0, + "p95": 19.4, + "p99": 31.7, + "n": 40 + }, + "mac": { + "p50": 5.3, + "p95": 14.2, + "p99": 18.3, + "n": 40 + }, + "back": { + "p50": 12.7, + "p95": 16.6, + "p99": 17.7, + "n": 40 + } + }, + "inputs": { + "sent": 40, + "seen": 40 + }, + "timeline": [ + { + "t": 0, + "fps": 60, + "mbps": 0.48, + "content_p50": 10.2, + "content_p95": 13.3, + "bitrate": 5529600, + "tier": 0, + "w": 1280, + "net": null + }, + { + "t": 1, + "fps": 60, + "mbps": 0.48, + "content_p50": 10.0, + "content_p95": 13.2, + "bitrate": 5529600, + "tier": 0, + "w": 1280, + "net": null + }, + { + "t": 2, + "fps": 60, + "mbps": 0.47, + "content_p50": 10.6, + "content_p95": 17.6, + "bitrate": 5529600, + "tier": 0, + "w": 1280, + "net": null + }, + { + "t": 3, + "fps": 60, + "mbps": 0.48, + "content_p50": 10.9, + "content_p95": 15.2, + "bitrate": 5529600, + "tier": 0, + "w": 1280, + "net": null + }, + { + "t": 4, + "fps": 60, + "mbps": 0.49, + "content_p50": 11.0, + "content_p95": 17.3, + "bitrate": 5529600, + "tier": 0, + "w": 1280, + "net": null + }, + { + "t": 5, + "fps": 60, + "mbps": 0.49, + "content_p50": 10.6, + "content_p95": 13.7, + "bitrate": 5529600, + "tier": 0, + "w": 1280, + "net": null + }, + { + "t": 6, + "fps": 60, + "mbps": 0.59, + "content_p50": 10.4, + "content_p95": 15.0, + "bitrate": 5529600, + "tier": 0, + "w": 1280, + "net": null + }, + { + "t": 7, + "fps": 60, + "mbps": 0.49, + "content_p50": 10.3, + "content_p95": 15.5, + "bitrate": 5529600, + "tier": 0, + "w": 1280, + "net": null + }, + { + "t": 8, + "fps": 60, + "mbps": 0.48, + "content_p50": 11.8, + "content_p95": 15.7, + "bitrate": 5529600, + "tier": 0, + "w": 1280, + "net": null + }, + { + "t": 9, + "fps": 60, + "mbps": 0.47, + "content_p50": 11.9, + "content_p95": 14.7, + "bitrate": 5529600, + "tier": 0, + "w": 1280, + "net": null + }, + { + "t": 10, + "fps": 60, + "mbps": 0.45, + "content_p50": 12.3, + "content_p95": 23.8, + "bitrate": 5529600, + "tier": 0, + "w": 1280, + "net": null + }, + { + "t": 11, + "fps": 58, + "mbps": 0.44, + "content_p50": 12.5, + "content_p95": 17.5, + "bitrate": 5529600, + "tier": 0, + "w": 1280, + "net": null + }, + { + "t": 12, + "fps": 60, + "mbps": 0.46, + "content_p50": 14.2, + "content_p95": 17.3, + "bitrate": 5529600, + "tier": 0, + "w": 1280, + "net": null + }, + { + "t": 13, + "fps": 58, + "mbps": 0.44, + "content_p50": 14.2, + "content_p95": 27.4, + "bitrate": 5529600, + "tier": 0, + "w": 1280, + "net": null + }, + { + "t": 14, + "fps": 60, + "mbps": 0.47, + "content_p50": 14.3, + "content_p95": 17.5, + "bitrate": 5529600, + "tier": 0, + "w": 1280, + "net": null + }, + { + "t": 15, + "fps": 60, + "mbps": 0.46, + "content_p50": 13.3, + "content_p95": 17.4, + "bitrate": 5529600, + "tier": 0, + "w": 1280, + "net": null + }, + { + "t": 16, + "fps": 60, + "mbps": 0.57, + "content_p50": 11.6, + "content_p95": 14.7, + "bitrate": 5529600, + "tier": 0, + "w": 1280, + "net": null + }, + { + "t": 17, + "fps": 60, + "mbps": 0.46, + "content_p50": 12.3, + "content_p95": 18.0, + "bitrate": 5529600, + "tier": 0, + "w": 1280, + "net": null + }, + { + "t": 18, + "fps": 60, + "mbps": 0.44, + "content_p50": 12.4, + "content_p95": 14.9, + "bitrate": 5529600, + "tier": 0, + "w": 1280, + "net": null + }, + { + "t": 19, + "fps": 60, + "mbps": 0.46, + "content_p50": 13.7, + "content_p95": 16.9, + "bitrate": 5529600, + "tier": 0, + "w": 1280, + "net": null + }, + { + "t": 20, + "fps": 33, + "mbps": 0.24, + "content_p50": 13.3, + "content_p95": 135.0, + "bitrate": 5529600, + "tier": 0, + "w": 1280, + "net": null + } + ], + "adapt": [], + "content_p50": 12.2, + "content_p95": 17.6, + "input_p50": 27.8, + "input_p95": 41.1, + "grades": { + "content_p50": "local", + "content_p95": "local", + "input_p50": "local", + "input_p95": "local", + "fps": "local", + "late_pct": "acceptable", + "stall_max": "acceptable" + }, + "source_fps": 64.6, + "cpu": { + "mac_agent_pct": 15.4, + "frame_viewer_pct": 57.6, + "frame_tailscaled_pct": 5.8, + "frame_sshd_pct": 0.8, + "frame_gamescope_pct": 11.1, + "frame_total_pct": 22.2 + }, + "viewer": "h264 software; ANGLE (Mesa, zink Vulkan 1.4(Turnip Adreno (TM) 750 (MESA_TURNIP)), OpenGL 4.6); raf 139 Hz", + "show_s": 5.83, + "panel": "valve.steam.desktopgame.2001639889", + "src": "test" + }, + { + "scenario": "scroll", + "frames_sent": 734, + "frames_drawn": 734, + "frames_shown": 707, + "duration_s": 20.6, + "stages_ms": { + "capture": { + "p50": -4.8, + "p95": 6.5, + "p99": 13.1, + "n": 734 + }, + "queue": { + "p50": 8.4, + "p95": 19.8, + "p99": 28.9, + "n": 734 + }, + "encode": { + "p50": 6.3, + "p95": 7.1, + "p99": 10.1, + "n": 734 + }, + "socket": { + "p50": 0.1, + "p95": 0.2, + "p99": 0.2, + "n": 734 + }, + "network": { + "p50": 7.4, + "p95": 20.9, + "p99": 48.9, + "n": 734 + }, + "decode": { + "p50": 5.4, + "p95": 13.5, + "p99": 17.2, + "n": 734 + }, + "draw": { + "p50": 0.6, + "p95": 1.2, + "p99": 1.8, + "n": 734 + }, + "present": { + "p50": 0.5, + "p95": 13.6, + "p99": 21.3, + "n": 707 + }, + "content": { + "p50": 24.8, + "p95": 48.1, + "p99": 69.4, + "n": 734 + }, + "content_shown": { + "p50": 26.9, + "p95": 50.5, + "p99": 68.5, + "n": 707 + } + }, + "fps": 35.6, + "fps_shown": 34.3, + "late_pct": 58.12, + "stall_max": 168.7, + "stalls_over_100ms": 2, + "mbps": 4.09, + "keyframes": 3, + "size": "960x646", + "captured": 1122, + "viewer_never_drawn": 0, + "input_ms": { + "n": 0 + }, + "input_shown_ms": { + "n": 0 + }, + "input_parts_ms": { + "uplink": { + "n": 0 + }, + "mac": { + "n": 0 + }, + "back": { + "n": 0 + } + }, + "inputs": { + "sent": 0, + "seen": 0 + }, + "timeline": [ + { + "t": 0, + "fps": 45, + "mbps": 7.92, + "content_p50": 23.2, + "content_p95": 38.8, + "bitrate": 8869129, + "tier": 1, + "w": 1920, + "net": null + }, + { + "t": 1, + "fps": 46, + "mbps": 8.52, + "content_p50": 31.8, + "content_p95": 45.2, + "bitrate": 11334867, + "tier": 1, + "w": 1920, + "net": null + }, + { + "t": 2, + "fps": 45, + "mbps": 8.17, + "content_p50": 29.2, + "content_p95": 65.7, + "bitrate": 6587726, + "tier": 1, + "w": 1920, + "net": null + }, + { + "t": 3, + "fps": 45, + "mbps": 6.56, + "content_p50": 26.5, + "content_p95": 43.5, + "bitrate": 7164744, + "tier": 1, + "w": 1920, + "net": null + }, + { + "t": 4, + "fps": 46, + "mbps": 6.64, + "content_p50": 21.5, + "content_p95": 30.9, + "bitrate": 6256828, + "tier": 1, + "w": 1920, + "net": null + }, + { + "t": 5, + "fps": 44, + "mbps": 7.24, + "content_p50": 22.0, + "content_p95": 47.5, + "bitrate": 6291668, + "tier": 1, + "w": 1920, + "net": null + }, + { + "t": 6, + "fps": 44, + "mbps": 5.19, + "content_p50": 28.2, + "content_p95": 50.0, + "bitrate": 5347917, + "tier": 1, + "w": 1920, + "net": null + }, + { + "t": 7, + "fps": 44, + "mbps": 4.54, + "content_p50": 23.7, + "content_p95": 43.0, + "bitrate": 3863869, + "tier": 1, + "w": 1920, + "net": null + }, + { + "t": 8, + "fps": 35, + "mbps": 3.83, + "content_p50": 28.2, + "content_p95": 41.2, + "bitrate": 4222978, + "tier": 2, + "w": 1920, + "net": null + }, + { + "t": 9, + "fps": 29, + "mbps": 4.65, + "content_p50": 30.0, + "content_p95": 53.8, + "bitrate": 5482055, + "tier": 2, + "w": 1920, + "net": null + }, + { + "t": 10, + "fps": 28, + "mbps": 4.05, + "content_p50": 26.4, + "content_p95": 121.7, + "bitrate": 3981384, + "tier": 2, + "w": 1920, + "net": null + }, + { + "t": 11, + "fps": 30, + "mbps": 3.12, + "content_p50": 24.5, + "content_p95": 42.4, + "bitrate": 2876549, + "tier": 2, + "w": 1920, + "net": null + }, + { + "t": 12, + "fps": 31, + "mbps": 2.72, + "content_p50": 22.6, + "content_p95": 36.5, + "bitrate": 2445066, + "tier": 2, + "w": 1920, + "net": null + }, + { + "t": 13, + "fps": 29, + "mbps": 2.4, + "content_p50": 26.4, + "content_p95": 46.1, + "bitrate": 2690671, + "tier": 2, + "w": 1920, + "net": null + }, + { + "t": 14, + "fps": 26, + "mbps": 2.21, + "content_p50": 24.8, + "content_p95": 55.1, + "bitrate": 2168791, + "tier": 3, + "w": 1440, + "net": null + }, + { + "t": 15, + "fps": 31, + "mbps": 1.65, + "content_p50": 24.1, + "content_p95": 33.2, + "bitrate": 1566951, + "tier": 3, + "w": 1440, + "net": null + }, + { + "t": 16, + "fps": 30, + "mbps": 1.43, + "content_p50": 19.8, + "content_p95": 38.0, + "bitrate": 1317132, + "tier": 3, + "w": 1440, + "net": null + }, + { + "t": 17, + "fps": 31, + "mbps": 1.33, + "content_p50": 23.2, + "content_p95": 41.1, + "bitrate": 1190325, + "tier": 3, + "w": 1440, + "net": null + }, + { + "t": 18, + "fps": 25, + "mbps": 1.11, + "content_p50": 23.6, + "content_p95": 99.7, + "bitrate": 860009, + "tier": 4, + "w": 960, + "net": null + }, + { + "t": 19, + "fps": 29, + "mbps": 0.64, + "content_p50": 22.1, + "content_p95": 41.5, + "bitrate": 731007, + "tier": 4, + "w": 960, + "net": null + }, + { + "t": 20, + "fps": 21, + "mbps": 0.47, + "content_p50": 26.1, + "content_p95": 31.1, + "bitrate": 619308, + "tier": 4, + "w": 960, + "net": null + } + ], + "adapt": [], + "content_p50": 24.8, + "content_p95": 48.1, + "input_p50": null, + "input_p95": null, + "grades": { + "content_p50": "local", + "content_p95": "acceptable", + "fps": "bad", + "late_pct": "bad", + "stall_max": "acceptable" + }, + "source_fps": 54.5, + "cpu": { + "mac_agent_pct": 5.6, + "frame_viewer_pct": 57.2, + "frame_tailscaled_pct": 5.3, + "frame_sshd_pct": 0.7, + "frame_gamescope_pct": 8.9, + "frame_total_pct": 21.0 + }, + "viewer": "h264 software; ANGLE (Mesa, zink Vulkan 1.4(Turnip Adreno (TM) 750 (MESA_TURNIP)), OpenGL 4.6); raf 142 Hz", + "show_s": 6.59, + "panel": "valve.steam.desktopgame.2001551415", + "src": "separate:9635" + }, + { + "scenario": "type", + "frames_sent": 75, + "frames_drawn": 75, + "frames_shown": 75, + "duration_s": 20.0, + "stages_ms": { + "capture": { + "p50": 0.3, + "p95": 4.2, + "p99": 5.1, + "n": 75 + }, + "queue": { + "p50": 0.0, + "p95": 0.1, + "p99": 0.1, + "n": 75 + }, + "encode": { + "p50": 6.8, + "p95": 9.4, + "p99": 11.7, + "n": 75 + }, + "socket": { + "p50": 0.1, + "p95": 0.2, + "p99": 0.2, + "n": 75 + }, + "network": { + "p50": 4.0, + "p95": 12.4, + "p99": 26.6, + "n": 75 + }, + "decode": { + "p50": 2.3, + "p95": 7.2, + "p99": 14.4, + "n": 75 + }, + "draw": { + "p50": 0.7, + "p95": 1.5, + "p99": 1.6, + "n": 75 + }, + "present": { + "p50": 0.5, + "p95": 1.1, + "p99": 1.2, + "n": 75 + }, + "content": { + "p50": 14.4, + "p95": 25.1, + "p99": 37.7, + "n": 75 + }, + "content_shown": { + "p50": 14.9, + "p95": 25.6, + "p99": 38.9, + "n": 75 + } + }, + "fps": 3.8, + "fps_shown": 3.8, + "late_pct": 97.3, + "stall_max": 1109.7, + "stalls_over_100ms": 70, + "mbps": 0.03, + "keyframes": 2, + "size": "1920x1290", + "captured": 75, + "viewer_never_drawn": 0, + "input_ms": { + "p50": 45.2, + "p95": 77.2, + "p99": 83.1, + "n": 66 + }, + "input_shown_ms": { + "p50": 45.9, + "p95": 77.9, + "p99": 84.3, + "n": 66 + }, + "input_parts_ms": { + "uplink": { + "p50": 5.8, + "p95": 16.5, + "p99": 29.9, + "n": 66 + }, + "mac": { + "p50": 24.4, + "p95": 41.2, + "p99": 41.6, + "n": 66 + }, + "back": { + "p50": 14.5, + "p95": 25.1, + "p99": 31.6, + "n": 66 + } + }, + "inputs": { + "sent": 66, + "seen": 66 + }, + "timeline": [ + { + "t": 0, + "fps": 4, + "mbps": 0.01, + "content_p50": 2.0, + "content_p95": 4.3, + "bitrate": 14860800, + "tier": 0, + "w": 1920, + "net": null + }, + { + "t": 1, + "fps": 5, + "mbps": 0.02, + "content_p50": 15.7, + "content_p95": 37.7, + "bitrate": 14860800, + "tier": 0, + "w": 1920, + "net": null + }, + { + "t": 2, + "fps": 5, + "mbps": 0.02, + "content_p50": 17.1, + "content_p95": 18.7, + "bitrate": 14860800, + "tier": 0, + "w": 1920, + "net": null + }, + { + "t": 3, + "fps": 5, + "mbps": 0.02, + "content_p50": 15.7, + "content_p95": 26.3, + "bitrate": 14860800, + "tier": 0, + "w": 1920, + "net": null + }, + { + "t": 4, + "fps": 5, + "mbps": 0.02, + "content_p50": 15.9, + "content_p95": 19.5, + "bitrate": 14860800, + "tier": 0, + "w": 1920, + "net": null + }, + { + "t": 5, + "fps": 5, + "mbps": 0.02, + "content_p50": 17.8, + "content_p95": 21.0, + "bitrate": 14860800, + "tier": 0, + "w": 1920, + "net": null + }, + { + "t": 6, + "fps": 5, + "mbps": 0.22, + "content_p50": 18.7, + "content_p95": 31.6, + "bitrate": 14860800, + "tier": 0, + "w": 1920, + "net": null + }, + { + "t": 7, + "fps": 5, + "mbps": 0.02, + "content_p50": 18.1, + "content_p95": 25.1, + "bitrate": 14860800, + "tier": 0, + "w": 1920, + "net": null + }, + { + "t": 8, + "fps": 5, + "mbps": 0.02, + "content_p50": 12.5, + "content_p95": 13.9, + "bitrate": 14860800, + "tier": 0, + "w": 1920, + "net": null + }, + { + "t": 9, + "fps": 6, + "mbps": 0.02, + "content_p50": 6.4, + "content_p95": 16.4, + "bitrate": 14860800, + "tier": 0, + "w": 1920, + "net": null + }, + { + "t": 10, + "fps": 6, + "mbps": 0.02, + "content_p50": 14.4, + "content_p95": 18.4, + "bitrate": 14860800, + "tier": 0, + "w": 1920, + "net": null + }, + { + "t": 11, + "fps": 5, + "mbps": 0.02, + "content_p50": 11.9, + "content_p95": 14.0, + "bitrate": 14860800, + "tier": 0, + "w": 1920, + "net": null + }, + { + "t": 12, + "fps": 3, + "mbps": 0.01, + "content_p50": 12.9, + "content_p95": 22.8, + "bitrate": 14860800, + "tier": 0, + "w": 1920, + "net": null + }, + { + "t": 13, + "fps": 1, + "mbps": 0.0, + "content_p50": 13.5, + "content_p95": 13.5, + "bitrate": 14860800, + "tier": 0, + "w": 1920, + "net": null + }, + { + "t": 14, + "fps": 3, + "mbps": 0.01, + "content_p50": 2.2, + "content_p95": 2.7, + "bitrate": 14860800, + "tier": 0, + "w": 1920, + "net": null + }, + { + "t": 15, + "fps": 1, + "mbps": 0.0, + "content_p50": 110.2, + "content_p95": 110.2, + "bitrate": 14860800, + "tier": 0, + "w": 1920, + "net": null + }, + { + "t": 16, + "fps": 1, + "mbps": 0.0, + "content_p50": 14.4, + "content_p95": 14.4, + "bitrate": 14860800, + "tier": 0, + "w": 1920, + "net": null + }, + { + "t": 17, + "fps": 2, + "mbps": 0.25, + "content_p50": -0.0, + "content_p95": 17.6, + "bitrate": 14860800, + "tier": 0, + "w": 1920, + "net": null + }, + { + "t": 18, + "fps": 1, + "mbps": 0.0, + "content_p50": 14.1, + "content_p95": 14.1, + "bitrate": 14860800, + "tier": 0, + "w": 1920, + "net": null + }, + { + "t": 19, + "fps": 1, + "mbps": 0.0, + "content_p50": 17.5, + "content_p95": 17.5, + "bitrate": 14860800, + "tier": 0, + "w": 1920, + "net": null + } + ], + "adapt": [], + "content_p50": 14.4, + "content_p95": 25.1, + "input_p50": 45.2, + "input_p95": 77.2, + "grades": { + "content_p50": "local", + "content_p95": "local", + "input_p50": "local", + "input_p95": "acceptable" + }, + "source_fps": 3.8, + "cpu": { + "mac_agent_pct": 1.2, + "frame_viewer_pct": 7.1, + "frame_tailscaled_pct": 2.2, + "frame_sshd_pct": 0.3, + "frame_gamescope_pct": 4.7, + "frame_total_pct": 15.3 + }, + "viewer": "h264 software; ANGLE (Mesa, zink Vulkan 1.4(Turnip Adreno (TM) 750 (MESA_TURNIP)), OpenGL 4.6); raf 141 Hz", + "show_s": 6.64, + "panel": "valve.steam.desktopgame.2001684656", + "src": "separate:9763" + } + ] +} \ No newline at end of file diff --git a/bench/results/2026-09-28-a3c6e5c-dirty-baseline-fixed.json b/bench/results/2026-09-28-a3c6e5c-dirty-baseline-fixed.json new file mode 100644 index 0000000..d12e58c --- /dev/null +++ b/bench/results/2026-09-28-a3c6e5c-dirty-baseline-fixed.json @@ -0,0 +1,1124 @@ +{ + "label": "baseline-fixed", + "date": "2026-09-28T17:02:53", + "commit": "a3c6e5c+dirty", + "config": { + "quality": "balanced", + "mode": "separate", + "net": "none", + "delay_ms": 0, + "buffer_ms": 250, + "host": "frame", + "ssh_opts": [], + "encoder": "", + "duration_s": 20.0, + "browser_flags": [] + }, + "frame_build": "20260925.6191901", + "mac": "26.5.2", + "headset": ":51.824645 [Info] - 0 - entering standby", + "scenarios": [ + { + "scenario": "test", + "frames_sent": 1246, + "frames_drawn": 1223, + "frames_shown": 804, + "duration_s": 20.7, + "stages_ms": { + "capture": { + "p50": 0.0, + "p95": 0.0, + "p99": 0.0, + "n": 1246 + }, + "queue": { + "p50": 0.0, + "p95": 0.1, + "p99": 0.1, + "n": 1246 + }, + "encode": { + "p50": 4.0, + "p95": 4.7, + "p99": 4.9, + "n": 1246 + }, + "socket": { + "p50": 0.1, + "p95": 0.2, + "p99": 0.2, + "n": 1246 + }, + "network": { + "p50": 4.0, + "p95": 6.8, + "p99": 221.1, + "n": 1246 + }, + "decode": { + "p50": 1.3, + "p95": 2.5, + "p99": 4.2, + "n": 1223 + }, + "draw": { + "p50": 0.4, + "p95": 0.5, + "p99": 0.9, + "n": 1223 + }, + "present": { + "p50": 6.2, + "p95": 15.6, + "p99": 16.9, + "n": 804 + }, + "content": { + "p50": 9.9, + "p95": 12.9, + "p99": 16.4, + "n": 1223 + }, + "content_shown": { + "p50": 16.1, + "p95": 25.5, + "p99": 27.9, + "n": 804 + } + }, + "fps": 59.0, + "fps_shown": 38.8, + "late_pct": 0.33, + "stall_max": 433.3, + "stalls_over_100ms": 1, + "mbps": 0.48, + "keyframes": 2, + "size": "1280x720", + "captured": 1598, + "viewer_never_drawn": 23, + "input_ms": { + "p50": 28.8, + "p95": 39.0, + "p99": 45.2, + "n": 40 + }, + "input_shown_ms": { + "p50": 33.7, + "p95": 55.8, + "p99": 58.6, + "n": 29 + }, + "input_parts_ms": { + "uplink": { + "p50": 9.8, + "p95": 21.7, + "p99": 22.5, + "n": 40 + }, + "mac": { + "p50": 4.5, + "p95": 15.7, + "p99": 18.4, + "n": 40 + }, + "back": { + "p50": 10.6, + "p95": 13.2, + "p99": 15.7, + "n": 40 + } + }, + "inputs": { + "sent": 40, + "seen": 40 + }, + "timeline": [ + { + "t": 0, + "fps": 59, + "mbps": 0.49, + "content_p50": 9.3, + "content_p95": 11.4, + "bitrate": 5529600, + "tier": 0, + "w": 1280, + "net": null + }, + { + "t": 1, + "fps": 60, + "mbps": 0.46, + "content_p50": 9.6, + "content_p95": 12.7, + "bitrate": 5529600, + "tier": 0, + "w": 1280, + "net": null + }, + { + "t": 2, + "fps": 60, + "mbps": 0.48, + "content_p50": 9.2, + "content_p95": 11.3, + "bitrate": 5529600, + "tier": 0, + "w": 1280, + "net": null + }, + { + "t": 3, + "fps": 60, + "mbps": 0.48, + "content_p50": 9.8, + "content_p95": 11.7, + "bitrate": 5529600, + "tier": 0, + "w": 1280, + "net": null + }, + { + "t": 4, + "fps": 38, + "mbps": 0.58, + "content_p50": 9.3, + "content_p95": 395.8, + "bitrate": 5529600, + "tier": 0, + "w": 1280, + "net": null + }, + { + "t": 5, + "fps": 60, + "mbps": 0.48, + "content_p50": 9.3, + "content_p95": 11.3, + "bitrate": 5529600, + "tier": 0, + "w": 1280, + "net": null + }, + { + "t": 6, + "fps": 60, + "mbps": 0.47, + "content_p50": 9.4, + "content_p95": 12.6, + "bitrate": 5529600, + "tier": 0, + "w": 1280, + "net": null + }, + { + "t": 7, + "fps": 60, + "mbps": 0.46, + "content_p50": 9.5, + "content_p95": 10.8, + "bitrate": 5529600, + "tier": 0, + "w": 1280, + "net": null + }, + { + "t": 8, + "fps": 60, + "mbps": 0.46, + "content_p50": 8.9, + "content_p95": 11.4, + "bitrate": 5529600, + "tier": 0, + "w": 1280, + "net": null + }, + { + "t": 9, + "fps": 60, + "mbps": 0.45, + "content_p50": 8.8, + "content_p95": 12.4, + "bitrate": 5529600, + "tier": 0, + "w": 1280, + "net": null + }, + { + "t": 10, + "fps": 60, + "mbps": 0.45, + "content_p50": 11.5, + "content_p95": 14.8, + "bitrate": 5529600, + "tier": 0, + "w": 1280, + "net": null + }, + { + "t": 11, + "fps": 60, + "mbps": 0.46, + "content_p50": 11.2, + "content_p95": 14.1, + "bitrate": 5529600, + "tier": 0, + "w": 1280, + "net": null + }, + { + "t": 12, + "fps": 61, + "mbps": 0.47, + "content_p50": 10.7, + "content_p95": 12.8, + "bitrate": 5529600, + "tier": 0, + "w": 1280, + "net": null + }, + { + "t": 13, + "fps": 59, + "mbps": 0.44, + "content_p50": 10.3, + "content_p95": 13.0, + "bitrate": 5529600, + "tier": 0, + "w": 1280, + "net": null + }, + { + "t": 14, + "fps": 61, + "mbps": 0.57, + "content_p50": 10.1, + "content_p95": 14.5, + "bitrate": 5529600, + "tier": 0, + "w": 1280, + "net": null + }, + { + "t": 15, + "fps": 59, + "mbps": 0.45, + "content_p50": 10.2, + "content_p95": 12.3, + "bitrate": 5529600, + "tier": 0, + "w": 1280, + "net": null + }, + { + "t": 16, + "fps": 60, + "mbps": 0.48, + "content_p50": 10.1, + "content_p95": 11.5, + "bitrate": 5529600, + "tier": 0, + "w": 1280, + "net": null + }, + { + "t": 17, + "fps": 60, + "mbps": 0.47, + "content_p50": 10.0, + "content_p95": 11.9, + "bitrate": 5529600, + "tier": 0, + "w": 1280, + "net": null + }, + { + "t": 18, + "fps": 60, + "mbps": 0.48, + "content_p50": 9.9, + "content_p95": 11.1, + "bitrate": 5529600, + "tier": 0, + "w": 1280, + "net": null + }, + { + "t": 19, + "fps": 60, + "mbps": 0.47, + "content_p50": 9.5, + "content_p95": 13.1, + "bitrate": 5529600, + "tier": 0, + "w": 1280, + "net": null + }, + { + "t": 20, + "fps": 46, + "mbps": 0.34, + "content_p50": 9.2, + "content_p95": 13.0, + "bitrate": 5529600, + "tier": 0, + "w": 1280, + "net": null + } + ], + "adapt": [], + "content_p50": 9.9, + "content_p95": 12.9, + "input_p50": 28.8, + "input_p95": 39.0, + "grades": { + "content_p50": "local", + "content_p95": "local", + "input_p50": "local", + "input_p95": "local", + "fps": "local", + "late_pct": "local", + "stall_max": "bad" + }, + "cpu": { + "mac_agent_pct": 14.3, + "frame_viewer_pct": 49.7, + "frame_tailscaled_pct": 5.7, + "frame_sshd_pct": 0.7, + "frame_gamescope_pct": 6.7, + "frame_total_pct": 16.5 + }, + "viewer": "h264 software; ANGLE (Mesa, zink Vulkan 1.4(Turnip Adreno (TM) 750 (MESA_TURNIP)), OpenGL 4.6); raf 142 Hz", + "show_s": 3.62, + "panel": "valve.steam.desktopgame.2001639889", + "src": "test" + }, + { + "scenario": "scroll", + "frames_sent": 1047, + "frames_drawn": 1042, + "frames_shown": 798, + "duration_s": 20.7, + "stages_ms": { + "capture": { + "p50": -5.5, + "p95": 5.8, + "p99": 14.2, + "n": 1047 + }, + "queue": { + "p50": 0.0, + "p95": 0.0, + "p99": 0.1, + "n": 1047 + }, + "encode": { + "p50": 6.7, + "p95": 9.0, + "p99": 14.1, + "n": 1047 + }, + "socket": { + "p50": 0.1, + "p95": 0.2, + "p99": 0.3, + "n": 1047 + }, + "network": { + "p50": 4.9, + "p95": 9.3, + "p99": 47.3, + "n": 1047 + }, + "decode": { + "p50": 6.4, + "p95": 15.2, + "p99": 22.6, + "n": 1042 + }, + "draw": { + "p50": 0.6, + "p95": 0.8, + "p99": 1.6, + "n": 1042 + }, + "present": { + "p50": 4.7, + "p95": 19.6, + "p99": 24.9, + "n": 798 + }, + "content": { + "p50": 14.7, + "p95": 32.2, + "p99": 73.2, + "n": 1042 + }, + "content_shown": { + "p50": 21.1, + "p95": 41.7, + "p99": 66.3, + "n": 798 + } + }, + "fps": 50.4, + "fps_shown": 38.6, + "late_pct": 16.04, + "stall_max": 152.4, + "stalls_over_100ms": 3, + "mbps": 9.37, + "keyframes": 3, + "size": "1920x1290", + "captured": 1312, + "viewer_never_drawn": 5, + "input_ms": { + "n": 0 + }, + "input_shown_ms": { + "n": 0 + }, + "input_parts_ms": { + "uplink": { + "n": 0 + }, + "mac": { + "n": 0 + }, + "back": { + "n": 0 + } + }, + "inputs": { + "sent": 0, + "seen": 0 + }, + "timeline": [ + { + "t": 0, + "fps": 51, + "mbps": 8.99, + "content_p50": 14.9, + "content_p95": 32.2, + "bitrate": 14860800, + "tier": 0, + "w": 1920, + "net": null + }, + { + "t": 1, + "fps": 55, + "mbps": 10.09, + "content_p50": 17.4, + "content_p95": 26.8, + "bitrate": 14860800, + "tier": 0, + "w": 1920, + "net": null + }, + { + "t": 2, + "fps": 51, + "mbps": 8.51, + "content_p50": 15.1, + "content_p95": 25.1, + "bitrate": 14860800, + "tier": 0, + "w": 1920, + "net": null + }, + { + "t": 3, + "fps": 44, + "mbps": 7.9, + "content_p50": 16.7, + "content_p95": 73.2, + "bitrate": 14860800, + "tier": 0, + "w": 1920, + "net": null + }, + { + "t": 4, + "fps": 46, + "mbps": 11.34, + "content_p50": 17.4, + "content_p95": 120.3, + "bitrate": 14860800, + "tier": 0, + "w": 1920, + "net": null + }, + { + "t": 5, + "fps": 45, + "mbps": 8.55, + "content_p50": 15.1, + "content_p95": 25.5, + "bitrate": 14860800, + "tier": 0, + "w": 1920, + "net": null + }, + { + "t": 6, + "fps": 51, + "mbps": 9.61, + "content_p50": 17.4, + "content_p95": 24.8, + "bitrate": 14860800, + "tier": 0, + "w": 1920, + "net": null + }, + { + "t": 7, + "fps": 54, + "mbps": 9.52, + "content_p50": 16.9, + "content_p95": 27.6, + "bitrate": 14860800, + "tier": 0, + "w": 1920, + "net": null + }, + { + "t": 8, + "fps": 50, + "mbps": 8.51, + "content_p50": 15.8, + "content_p95": 33.0, + "bitrate": 14860800, + "tier": 0, + "w": 1920, + "net": null + }, + { + "t": 9, + "fps": 54, + "mbps": 9.22, + "content_p50": 12.4, + "content_p95": 27.3, + "bitrate": 14860800, + "tier": 0, + "w": 1920, + "net": null + }, + { + "t": 10, + "fps": 51, + "mbps": 9.96, + "content_p50": 9.9, + "content_p95": 28.4, + "bitrate": 14860800, + "tier": 0, + "w": 1920, + "net": null + }, + { + "t": 11, + "fps": 51, + "mbps": 9.27, + "content_p50": 14.1, + "content_p95": 22.2, + "bitrate": 14860800, + "tier": 0, + "w": 1920, + "net": null + }, + { + "t": 12, + "fps": 52, + "mbps": 9.58, + "content_p50": 14.4, + "content_p95": 25.2, + "bitrate": 14860800, + "tier": 0, + "w": 1920, + "net": null + }, + { + "t": 13, + "fps": 54, + "mbps": 8.61, + "content_p50": 7.8, + "content_p95": 22.0, + "bitrate": 14860800, + "tier": 0, + "w": 1920, + "net": null + }, + { + "t": 14, + "fps": 43, + "mbps": 10.54, + "content_p50": 19.0, + "content_p95": 37.5, + "bitrate": 14860800, + "tier": 0, + "w": 1920, + "net": null + }, + { + "t": 15, + "fps": 49, + "mbps": 8.51, + "content_p50": 16.1, + "content_p95": 27.7, + "bitrate": 14860800, + "tier": 0, + "w": 1920, + "net": null + }, + { + "t": 16, + "fps": 51, + "mbps": 11.23, + "content_p50": 11.1, + "content_p95": 110.7, + "bitrate": 14860800, + "tier": 0, + "w": 1920, + "net": null + }, + { + "t": 17, + "fps": 52, + "mbps": 8.99, + "content_p50": 13.9, + "content_p95": 26.5, + "bitrate": 14860800, + "tier": 0, + "w": 1920, + "net": null + }, + { + "t": 18, + "fps": 52, + "mbps": 9.05, + "content_p50": 11.6, + "content_p95": 26.2, + "bitrate": 14860800, + "tier": 0, + "w": 1920, + "net": null + }, + { + "t": 19, + "fps": 49, + "mbps": 9.3, + "content_p50": 12.4, + "content_p95": 28.8, + "bitrate": 14860800, + "tier": 0, + "w": 1920, + "net": null + }, + { + "t": 20, + "fps": 37, + "mbps": 6.58, + "content_p50": 15.7, + "content_p95": 31.0, + "bitrate": 14860800, + "tier": 0, + "w": 1920, + "net": null + } + ], + "adapt": [], + "content_p50": 14.7, + "content_p95": 32.2, + "input_p50": null, + "input_p95": null, + "grades": { + "content_p50": "local", + "content_p95": "local", + "fps": "acceptable", + "late_pct": "bad", + "stall_max": "acceptable" + }, + "cpu": { + "mac_agent_pct": 7.6, + "frame_viewer_pct": 73.9, + "frame_tailscaled_pct": 8.0, + "frame_sshd_pct": 0.9, + "frame_gamescope_pct": 6.5, + "frame_total_pct": 19.4 + }, + "viewer": "h264 software; ANGLE (Mesa, zink Vulkan 1.4(Turnip Adreno (TM) 750 (MESA_TURNIP)), OpenGL 4.6); raf 138 Hz", + "show_s": 3.38, + "panel": "valve.steam.desktopgame.2001739297", + "src": "separate:8529" + }, + { + "scenario": "type", + "frames_sent": 77, + "frames_drawn": 77, + "frames_shown": 77, + "duration_s": 20.0, + "stages_ms": { + "capture": { + "p50": 0.2, + "p95": 4.7, + "p99": 4.8, + "n": 77 + }, + "queue": { + "p50": 0.0, + "p95": 0.0, + "p99": 0.1, + "n": 77 + }, + "encode": { + "p50": 6.8, + "p95": 11.7, + "p99": 14.7, + "n": 77 + }, + "socket": { + "p50": 0.1, + "p95": 0.2, + "p99": 0.2, + "n": 77 + }, + "network": { + "p50": 4.9, + "p95": 8.7, + "p99": 75.8, + "n": 77 + }, + "decode": { + "p50": 4.2, + "p95": 9.9, + "p99": 14.5, + "n": 77 + }, + "draw": { + "p50": 1.0, + "p95": 1.6, + "p99": 2.1, + "n": 77 + }, + "present": { + "p50": 0.9, + "p95": 1.3, + "p99": 1.7, + "n": 77 + }, + "content": { + "p50": 16.7, + "p95": 34.2, + "p99": 88.1, + "n": 77 + }, + "content_shown": { + "p50": 17.9, + "p95": 34.6, + "p99": 88.9, + "n": 77 + } + }, + "fps": 3.8, + "fps_shown": 3.8, + "late_pct": 94.74, + "stall_max": 1156.0, + "stalls_over_100ms": 71, + "mbps": 0.03, + "keyframes": 2, + "size": "1920x1290", + "captured": 151, + "viewer_never_drawn": 0, + "input_ms": { + "p50": 51.2, + "p95": 73.2, + "p99": 79.9, + "n": 66 + }, + "input_shown_ms": { + "p50": 52.1, + "p95": 73.9, + "p99": 80.5, + "n": 66 + }, + "input_parts_ms": { + "uplink": { + "p50": 5.6, + "p95": 13.2, + "p99": 17.5, + "n": 66 + }, + "mac": { + "p50": 34.1, + "p95": 43.6, + "p99": 48.7, + "n": 66 + }, + "back": { + "p50": 16.4, + "p95": 26.5, + "p99": 26.8, + "n": 66 + } + }, + "inputs": { + "sent": 66, + "seen": 66 + }, + "timeline": [ + { + "t": 0, + "fps": 5, + "mbps": 0.01, + "content_p50": 7.7, + "content_p95": 15.3, + "bitrate": 14860800, + "tier": 0, + "w": 1920, + "net": null + }, + { + "t": 1, + "fps": 5, + "mbps": 0.02, + "content_p50": 7.4, + "content_p95": 16.7, + "bitrate": 14860800, + "tier": 0, + "w": 1920, + "net": null + }, + { + "t": 2, + "fps": 5, + "mbps": 0.02, + "content_p50": 16.2, + "content_p95": 21.3, + "bitrate": 14860800, + "tier": 0, + "w": 1920, + "net": null + }, + { + "t": 3, + "fps": 6, + "mbps": 0.02, + "content_p50": 19.1, + "content_p95": 26.5, + "bitrate": 14860800, + "tier": 0, + "w": 1920, + "net": null + }, + { + "t": 4, + "fps": 5, + "mbps": 0.02, + "content_p50": 18.9, + "content_p95": 20.5, + "bitrate": 14860800, + "tier": 0, + "w": 1920, + "net": null + }, + { + "t": 5, + "fps": 5, + "mbps": 0.21, + "content_p50": 13.7, + "content_p95": 43.6, + "bitrate": 14860800, + "tier": 0, + "w": 1920, + "net": null + }, + { + "t": 6, + "fps": 5, + "mbps": 0.02, + "content_p50": 20.2, + "content_p95": 24.5, + "bitrate": 14860800, + "tier": 0, + "w": 1920, + "net": null + }, + { + "t": 7, + "fps": 4, + "mbps": 0.01, + "content_p50": 16.4, + "content_p95": 16.6, + "bitrate": 14860800, + "tier": 0, + "w": 1920, + "net": null + }, + { + "t": 8, + "fps": 5, + "mbps": 0.02, + "content_p50": 15.2, + "content_p95": 24.6, + "bitrate": 14860800, + "tier": 0, + "w": 1920, + "net": null + }, + { + "t": 9, + "fps": 5, + "mbps": 0.02, + "content_p50": 7.7, + "content_p95": 17.2, + "bitrate": 14860800, + "tier": 0, + "w": 1920, + "net": null + }, + { + "t": 10, + "fps": 5, + "mbps": 0.02, + "content_p50": 6.0, + "content_p95": 26.8, + "bitrate": 14860800, + "tier": 0, + "w": 1920, + "net": null + }, + { + "t": 11, + "fps": 7, + "mbps": 0.02, + "content_p50": 19.2, + "content_p95": 46.3, + "bitrate": 14860800, + "tier": 0, + "w": 1920, + "net": null + }, + { + "t": 12, + "fps": 4, + "mbps": 0.01, + "content_p50": 21.7, + "content_p95": 22.3, + "bitrate": 14860800, + "tier": 0, + "w": 1920, + "net": null + }, + { + "t": 13, + "fps": 1, + "mbps": 0.0, + "content_p50": 13.4, + "content_p95": 13.4, + "bitrate": 14860800, + "tier": 0, + "w": 1920, + "net": null + }, + { + "t": 14, + "fps": 3, + "mbps": 0.01, + "content_p50": 19.0, + "content_p95": 20.1, + "bitrate": 14860800, + "tier": 0, + "w": 1920, + "net": null + }, + { + "t": 15, + "fps": 1, + "mbps": 0.0, + "content_p50": 88.1, + "content_p95": 88.1, + "bitrate": 14860800, + "tier": 0, + "w": 1920, + "net": null + }, + { + "t": 16, + "fps": 1, + "mbps": 0.25, + "content_p50": 26.8, + "content_p95": 26.8, + "bitrate": 14860800, + "tier": 0, + "w": 1920, + "net": null + }, + { + "t": 17, + "fps": 2, + "mbps": 0.01, + "content_p50": 19.1, + "content_p95": 19.2, + "bitrate": 14860800, + "tier": 0, + "w": 1920, + "net": null + }, + { + "t": 18, + "fps": 1, + "mbps": 0.0, + "content_p50": 175.1, + "content_p95": 175.1, + "bitrate": 14860800, + "tier": 0, + "w": 1920, + "net": null + }, + { + "t": 19, + "fps": 1, + "mbps": 0.0, + "content_p50": 16.9, + "content_p95": 16.9, + "bitrate": 14860800, + "tier": 0, + "w": 1920, + "net": null + }, + { + "t": 20, + "fps": 1, + "mbps": 0.0, + "content_p50": 14.8, + "content_p95": 14.8, + "bitrate": 14860800, + "tier": 0, + "w": 1920, + "net": null + } + ], + "adapt": [], + "content_p50": 16.7, + "content_p95": 34.2, + "input_p50": 51.2, + "input_p95": 73.2, + "grades": { + "content_p50": "local", + "content_p95": "local", + "input_p50": "acceptable", + "input_p95": "acceptable" + }, + "cpu": { + "mac_agent_pct": 1.1, + "frame_viewer_pct": 8.0, + "frame_tailscaled_pct": 1.8, + "frame_sshd_pct": 0.5, + "frame_gamescope_pct": 3.7, + "frame_total_pct": 9.1 + }, + "viewer": "h264 software; ANGLE (Mesa, zink Vulkan 1.4(Turnip Adreno (TM) 750 (MESA_TURNIP)), OpenGL 4.6); raf 143 Hz", + "show_s": 3.79, + "panel": "valve.steam.desktopgame.2001132791", + "src": "separate:8652" + } + ] +} \ No newline at end of file diff --git a/bench/results/2026-09-28-a3c6e5c-dirty-baseline.json b/bench/results/2026-09-28-a3c6e5c-dirty-baseline.json new file mode 100644 index 0000000..25b9f92 --- /dev/null +++ b/bench/results/2026-09-28-a3c6e5c-dirty-baseline.json @@ -0,0 +1,1124 @@ +{ + "label": "baseline", + "date": "2026-09-28T16:53:43", + "commit": "a3c6e5c+dirty", + "config": { + "quality": "balanced", + "mode": "separate", + "net": "none", + "delay_ms": 0, + "buffer_ms": 250, + "host": "frame", + "ssh_opts": [], + "encoder": "", + "duration_s": 20.0, + "browser_flags": [] + }, + "frame_build": "20260925.6191901", + "mac": "26.5.2", + "headset": ":51.824645 [Info] - 0 - entering standby", + "scenarios": [ + { + "scenario": "test", + "frames_sent": 1248, + "frames_drawn": 1245, + "frames_shown": 809, + "duration_s": 20.8, + "stages_ms": { + "capture": { + "p50": 0.0, + "p95": 0.0, + "p99": 0.0, + "n": 1248 + }, + "queue": { + "p50": 0.0, + "p95": 0.1, + "p99": 0.1, + "n": 1248 + }, + "encode": { + "p50": 4.2, + "p95": 4.8, + "p99": 5.1, + "n": 1248 + }, + "socket": { + "p50": 0.1, + "p95": 0.2, + "p99": 0.2, + "n": 1248 + }, + "network": { + "p50": 4.2, + "p95": 6.9, + "p99": 13.9, + "n": 1248 + }, + "decode": { + "p50": 1.3, + "p95": 2.5, + "p99": 4.6, + "n": 1245 + }, + "draw": { + "p50": 0.4, + "p95": 0.6, + "p99": 1.0, + "n": 1245 + }, + "present": { + "p50": 6.9, + "p95": 15.4, + "p99": 19.5, + "n": 809 + }, + "content": { + "p50": 10.3, + "p95": 13.5, + "p99": 19.6, + "n": 1245 + }, + "content_shown": { + "p50": 17.4, + "p95": 25.6, + "p99": 30.7, + "n": 809 + } + }, + "fps": 60.0, + "fps_shown": 39.0, + "late_pct": 0.96, + "stall_max": 110.3, + "stalls_over_100ms": 1, + "mbps": 0.47, + "keyframes": 2, + "size": "1280x720", + "captured": 1588, + "viewer_never_drawn": 3, + "input_ms": { + "p50": 28.0, + "p95": 34.4, + "p99": 37.6, + "n": 40 + }, + "input_shown_ms": { + "p50": 35.1, + "p95": 49.5, + "p99": 50.5, + "n": 27 + }, + "input_parts_ms": { + "uplink": { + "p50": 11.5, + "p95": 19.7, + "p99": 22.1, + "n": 40 + }, + "mac": { + "p50": 4.7, + "p95": 12.3, + "p99": 16.1, + "n": 40 + }, + "back": { + "p50": 11.2, + "p95": 12.9, + "p99": 16.5, + "n": 40 + } + }, + "inputs": { + "sent": 40, + "seen": 40 + }, + "timeline": [ + { + "t": 0, + "fps": 60, + "mbps": 0.49, + "content_p50": 10.2, + "content_p95": 13.0, + "bitrate": 5529600, + "tier": 0, + "w": 1280, + "net": null + }, + { + "t": 1, + "fps": 60, + "mbps": 0.46, + "content_p50": 10.4, + "content_p95": 12.3, + "bitrate": 5529600, + "tier": 0, + "w": 1280, + "net": null + }, + { + "t": 2, + "fps": 60, + "mbps": 0.46, + "content_p50": 10.5, + "content_p95": 12.0, + "bitrate": 5529600, + "tier": 0, + "w": 1280, + "net": null + }, + { + "t": 3, + "fps": 60, + "mbps": 0.48, + "content_p50": 10.7, + "content_p95": 12.5, + "bitrate": 5529600, + "tier": 0, + "w": 1280, + "net": null + }, + { + "t": 4, + "fps": 60, + "mbps": 0.47, + "content_p50": 10.6, + "content_p95": 13.3, + "bitrate": 5529600, + "tier": 0, + "w": 1280, + "net": null + }, + { + "t": 5, + "fps": 60, + "mbps": 0.58, + "content_p50": 10.6, + "content_p95": 12.6, + "bitrate": 5529600, + "tier": 0, + "w": 1280, + "net": null + }, + { + "t": 6, + "fps": 60, + "mbps": 0.45, + "content_p50": 10.8, + "content_p95": 13.3, + "bitrate": 5529600, + "tier": 0, + "w": 1280, + "net": null + }, + { + "t": 7, + "fps": 60, + "mbps": 0.47, + "content_p50": 10.5, + "content_p95": 13.0, + "bitrate": 5529600, + "tier": 0, + "w": 1280, + "net": null + }, + { + "t": 8, + "fps": 60, + "mbps": 0.47, + "content_p50": 10.5, + "content_p95": 12.9, + "bitrate": 5529600, + "tier": 0, + "w": 1280, + "net": null + }, + { + "t": 9, + "fps": 60, + "mbps": 0.46, + "content_p50": 10.3, + "content_p95": 13.6, + "bitrate": 5529600, + "tier": 0, + "w": 1280, + "net": null + }, + { + "t": 10, + "fps": 60, + "mbps": 0.46, + "content_p50": 10.8, + "content_p95": 14.3, + "bitrate": 5529600, + "tier": 0, + "w": 1280, + "net": null + }, + { + "t": 11, + "fps": 58, + "mbps": 0.56, + "content_p50": 10.4, + "content_p95": 61.7, + "bitrate": 5529600, + "tier": 0, + "w": 1280, + "net": null + }, + { + "t": 12, + "fps": 60, + "mbps": 0.45, + "content_p50": 10.8, + "content_p95": 12.7, + "bitrate": 5529600, + "tier": 0, + "w": 1280, + "net": null + }, + { + "t": 13, + "fps": 60, + "mbps": 0.46, + "content_p50": 12.4, + "content_p95": 16.1, + "bitrate": 5529600, + "tier": 0, + "w": 1280, + "net": null + }, + { + "t": 14, + "fps": 60, + "mbps": 0.46, + "content_p50": 9.8, + "content_p95": 12.2, + "bitrate": 5529600, + "tier": 0, + "w": 1280, + "net": null + }, + { + "t": 15, + "fps": 60, + "mbps": 0.47, + "content_p50": 9.7, + "content_p95": 12.3, + "bitrate": 5529600, + "tier": 0, + "w": 1280, + "net": null + }, + { + "t": 16, + "fps": 60, + "mbps": 0.45, + "content_p50": 9.7, + "content_p95": 12.5, + "bitrate": 5529600, + "tier": 0, + "w": 1280, + "net": null + }, + { + "t": 17, + "fps": 60, + "mbps": 0.46, + "content_p50": 9.7, + "content_p95": 10.9, + "bitrate": 5529600, + "tier": 0, + "w": 1280, + "net": null + }, + { + "t": 18, + "fps": 60, + "mbps": 0.46, + "content_p50": 9.7, + "content_p95": 11.4, + "bitrate": 5529600, + "tier": 0, + "w": 1280, + "net": null + }, + { + "t": 19, + "fps": 60, + "mbps": 0.46, + "content_p50": 9.9, + "content_p95": 18.8, + "bitrate": 5529600, + "tier": 0, + "w": 1280, + "net": null + }, + { + "t": 20, + "fps": 47, + "mbps": 0.36, + "content_p50": 9.9, + "content_p95": 11.8, + "bitrate": 5529600, + "tier": 0, + "w": 1280, + "net": null + } + ], + "adapt": [], + "content_p50": 10.3, + "content_p95": 13.5, + "input_p50": 28.0, + "input_p95": 34.4, + "grades": { + "content_p50": "local", + "content_p95": "local", + "input_p50": "local", + "input_p95": "local", + "fps": "local", + "late_pct": "local", + "stall_max": "acceptable" + }, + "cpu": { + "mac_agent_pct": 15.4, + "frame_viewer_pct": 51.1, + "frame_tailscaled_pct": 5.3, + "frame_sshd_pct": 0.8, + "frame_gamescope_pct": 5.7, + "frame_total_pct": 15.3 + }, + "viewer": "h264 software; ANGLE (Mesa, zink Vulkan 1.4(Turnip Adreno (TM) 750 (MESA_TURNIP)), OpenGL 4.6); raf 140 Hz", + "show_s": 1.87, + "panel": "valve.steam.desktopgame.2001639889", + "src": "test" + }, + { + "scenario": "scroll", + "frames_sent": 690, + "frames_drawn": 683, + "frames_shown": 645, + "duration_s": 20.7, + "stages_ms": { + "capture": { + "p50": -1.2, + "p95": 16.9, + "p99": 24.5, + "n": 690 + }, + "queue": { + "p50": 0.0, + "p95": 0.0, + "p99": 0.1, + "n": 690 + }, + "encode": { + "p50": 4.1, + "p95": 7.0, + "p99": 13.2, + "n": 690 + }, + "socket": { + "p50": 0.1, + "p95": 0.2, + "p99": 0.3, + "n": 690 + }, + "network": { + "p50": 6.2, + "p95": 14.6, + "p99": 119.2, + "n": 690 + }, + "decode": { + "p50": 3.7, + "p95": 9.4, + "p99": 23.3, + "n": 683 + }, + "draw": { + "p50": 0.4, + "p95": 0.8, + "p99": 1.2, + "n": 683 + }, + "present": { + "p50": 0.8, + "p95": 18.6, + "p99": 23.6, + "n": 645 + }, + "content": { + "p50": 15.0, + "p95": 40.3, + "p99": 112.7, + "n": 683 + }, + "content_shown": { + "p50": 20.2, + "p95": 42.7, + "p99": 106.9, + "n": 645 + } + }, + "fps": 33.0, + "fps_shown": 31.1, + "late_pct": 42.82, + "stall_max": 492.6, + "stalls_over_100ms": 6, + "mbps": 3.11, + "keyframes": 3, + "size": "1280x860", + "captured": 905, + "viewer_never_drawn": 7, + "input_ms": { + "n": 0 + }, + "input_shown_ms": { + "n": 0 + }, + "input_parts_ms": { + "uplink": { + "n": 0 + }, + "mac": { + "n": 0 + }, + "back": { + "n": 0 + } + }, + "inputs": { + "sent": 0, + "seen": 0 + }, + "timeline": [ + { + "t": 0, + "fps": 36, + "mbps": 3.42, + "content_p50": 17.7, + "content_p95": 34.3, + "bitrate": 6604800, + "tier": 0, + "w": 1280, + "net": null + }, + { + "t": 1, + "fps": 35, + "mbps": 2.8, + "content_p50": 13.6, + "content_p95": 27.7, + "bitrate": 6604800, + "tier": 0, + "w": 1280, + "net": null + }, + { + "t": 2, + "fps": 31, + "mbps": 2.15, + "content_p50": 12.1, + "content_p95": 34.1, + "bitrate": 6604800, + "tier": 0, + "w": 1280, + "net": null + }, + { + "t": 3, + "fps": 37, + "mbps": 2.29, + "content_p50": 14.6, + "content_p95": 28.5, + "bitrate": 6604800, + "tier": 0, + "w": 1280, + "net": null + }, + { + "t": 4, + "fps": 35, + "mbps": 2.11, + "content_p50": 16.1, + "content_p95": 29.3, + "bitrate": 6604800, + "tier": 0, + "w": 1280, + "net": null + }, + { + "t": 5, + "fps": 33, + "mbps": 2.05, + "content_p50": 10.9, + "content_p95": 27.9, + "bitrate": 6604800, + "tier": 0, + "w": 1280, + "net": null + }, + { + "t": 6, + "fps": 33, + "mbps": 5.71, + "content_p50": 17.1, + "content_p95": 41.7, + "bitrate": 6604800, + "tier": 0, + "w": 1280, + "net": null + }, + { + "t": 7, + "fps": 31, + "mbps": 3.3, + "content_p50": 12.1, + "content_p95": 31.3, + "bitrate": 6604800, + "tier": 0, + "w": 1280, + "net": null + }, + { + "t": 8, + "fps": 24, + "mbps": 4.37, + "content_p50": 26.6, + "content_p95": 236.8, + "bitrate": 6604800, + "tier": 0, + "w": 1280, + "net": null + }, + { + "t": 9, + "fps": 36, + "mbps": 3.19, + "content_p50": 11.6, + "content_p95": 26.5, + "bitrate": 6604800, + "tier": 0, + "w": 1280, + "net": null + }, + { + "t": 10, + "fps": 36, + "mbps": 3.53, + "content_p50": 15.2, + "content_p95": 29.6, + "bitrate": 6604800, + "tier": 0, + "w": 1280, + "net": null + }, + { + "t": 11, + "fps": 29, + "mbps": 3.56, + "content_p50": 11.5, + "content_p95": 36.8, + "bitrate": 6604800, + "tier": 0, + "w": 1280, + "net": null + }, + { + "t": 12, + "fps": 29, + "mbps": 1.99, + "content_p50": 13.2, + "content_p95": 41.2, + "bitrate": 6604800, + "tier": 0, + "w": 1280, + "net": null + }, + { + "t": 13, + "fps": 31, + "mbps": 3.4, + "content_p50": 23.9, + "content_p95": 44.5, + "bitrate": 6604800, + "tier": 0, + "w": 1280, + "net": null + }, + { + "t": 14, + "fps": 32, + "mbps": 2.85, + "content_p50": 14.3, + "content_p95": 37.6, + "bitrate": 6604800, + "tier": 0, + "w": 1280, + "net": null + }, + { + "t": 15, + "fps": 31, + "mbps": 3.39, + "content_p50": 19.8, + "content_p95": 35.9, + "bitrate": 6604800, + "tier": 0, + "w": 1280, + "net": null + }, + { + "t": 16, + "fps": 22, + "mbps": 2.74, + "content_p50": 22.5, + "content_p95": 112.7, + "bitrate": 6604800, + "tier": 0, + "w": 1280, + "net": null + }, + { + "t": 17, + "fps": 44, + "mbps": 3.2, + "content_p50": 14.0, + "content_p95": 31.0, + "bitrate": 6604800, + "tier": 0, + "w": 1280, + "net": null + }, + { + "t": 18, + "fps": 35, + "mbps": 4.12, + "content_p50": 16.8, + "content_p95": 32.9, + "bitrate": 6604800, + "tier": 0, + "w": 1280, + "net": null + }, + { + "t": 19, + "fps": 36, + "mbps": 2.63, + "content_p50": 13.9, + "content_p95": 25.2, + "bitrate": 6604800, + "tier": 0, + "w": 1280, + "net": null + }, + { + "t": 20, + "fps": 27, + "mbps": 1.71, + "content_p50": 17.2, + "content_p95": 40.3, + "bitrate": 6604800, + "tier": 0, + "w": 1280, + "net": null + } + ], + "adapt": [], + "content_p50": 15.0, + "content_p95": 40.3, + "input_p50": null, + "input_p95": null, + "grades": { + "content_p50": "local", + "content_p95": "acceptable", + "fps": "bad", + "late_pct": "bad", + "stall_max": "bad" + }, + "cpu": { + "mac_agent_pct": 5.1, + "frame_viewer_pct": 44.2, + "frame_tailscaled_pct": 4.8, + "frame_sshd_pct": 0.6, + "frame_gamescope_pct": 4.2, + "frame_total_pct": 13.7 + }, + "viewer": "h264 software; ANGLE (Mesa, zink Vulkan 1.4(Turnip Adreno (TM) 750 (MESA_TURNIP)), OpenGL 4.6); raf 139 Hz", + "show_s": 1.82, + "panel": "valve.steam.desktopgame.2001631563", + "src": "separate:6889" + }, + { + "scenario": "type", + "frames_sent": 76, + "frames_drawn": 76, + "frames_shown": 76, + "duration_s": 20.2, + "stages_ms": { + "capture": { + "p50": 0.5, + "p95": 7.2, + "p99": 10.1, + "n": 76 + }, + "queue": { + "p50": 0.0, + "p95": 0.0, + "p99": 0.1, + "n": 76 + }, + "encode": { + "p50": 4.4, + "p95": 9.7, + "p99": 16.7, + "n": 76 + }, + "socket": { + "p50": 0.1, + "p95": 0.2, + "p99": 0.2, + "n": 76 + }, + "network": { + "p50": 5.2, + "p95": 43.2, + "p99": 263.5, + "n": 76 + }, + "decode": { + "p50": 2.1, + "p95": 4.8, + "p99": 13.4, + "n": 76 + }, + "draw": { + "p50": 0.7, + "p95": 1.0, + "p99": 1.1, + "n": 76 + }, + "present": { + "p50": 0.9, + "p95": 1.5, + "p99": 1.8, + "n": 76 + }, + "content": { + "p50": 12.9, + "p95": 54.2, + "p99": 264.6, + "n": 76 + }, + "content_shown": { + "p50": 14.1, + "p95": 55.3, + "p99": 265.9, + "n": 76 + } + }, + "fps": 3.8, + "fps_shown": 3.8, + "late_pct": 96.0, + "stall_max": 1327.9, + "stalls_over_100ms": 68, + "mbps": 0.02, + "keyframes": 2, + "size": "1280x860", + "captured": 125, + "viewer_never_drawn": 0, + "input_ms": { + "p50": 50.1, + "p95": 110.6, + "p99": 165.7, + "n": 65 + }, + "input_shown_ms": { + "p50": 50.8, + "p95": 111.5, + "p99": 166.2, + "n": 65 + }, + "input_parts_ms": { + "uplink": { + "p50": 7.6, + "p95": 18.3, + "p99": 23.2, + "n": 65 + }, + "mac": { + "p50": 30.6, + "p95": 72.4, + "p99": 119.2, + "n": 65 + }, + "back": { + "p50": 12.3, + "p95": 28.1, + "p99": 33.9, + "n": 65 + } + }, + "inputs": { + "sent": 66, + "seen": 65 + }, + "timeline": [ + { + "t": 0, + "fps": 5, + "mbps": 0.01, + "content_p50": 12.3, + "content_p95": 28.1, + "bitrate": 6604800, + "tier": 0, + "w": 1280, + "net": null + }, + { + "t": 1, + "fps": 4, + "mbps": 0.01, + "content_p50": 16.8, + "content_p95": 33.9, + "bitrate": 6604800, + "tier": 0, + "w": 1280, + "net": null + }, + { + "t": 2, + "fps": 6, + "mbps": 0.01, + "content_p50": 9.0, + "content_p95": 22.2, + "bitrate": 6604800, + "tier": 0, + "w": 1280, + "net": null + }, + { + "t": 3, + "fps": 5, + "mbps": 0.01, + "content_p50": 11.5, + "content_p95": 20.6, + "bitrate": 6604800, + "tier": 0, + "w": 1280, + "net": null + }, + { + "t": 4, + "fps": 5, + "mbps": 0.01, + "content_p50": 9.2, + "content_p95": 13.1, + "bitrate": 6604800, + "tier": 0, + "w": 1280, + "net": null + }, + { + "t": 5, + "fps": 5, + "mbps": 0.01, + "content_p50": 3.0, + "content_p95": 15.1, + "bitrate": 6604800, + "tier": 0, + "w": 1280, + "net": null + }, + { + "t": 6, + "fps": 5, + "mbps": 0.14, + "content_p50": 14.0, + "content_p95": 21.1, + "bitrate": 6604800, + "tier": 0, + "w": 1280, + "net": null + }, + { + "t": 7, + "fps": 5, + "mbps": 0.01, + "content_p50": 9.5, + "content_p95": 16.2, + "bitrate": 6604800, + "tier": 0, + "w": 1280, + "net": null + }, + { + "t": 8, + "fps": 5, + "mbps": 0.01, + "content_p50": 13.8, + "content_p95": 16.2, + "bitrate": 6604800, + "tier": 0, + "w": 1280, + "net": null + }, + { + "t": 9, + "fps": 5, + "mbps": 0.01, + "content_p50": 14.0, + "content_p95": 28.1, + "bitrate": 6604800, + "tier": 0, + "w": 1280, + "net": null + }, + { + "t": 10, + "fps": 5, + "mbps": 0.01, + "content_p50": 12.8, + "content_p95": 31.7, + "bitrate": 6604800, + "tier": 0, + "w": 1280, + "net": null + }, + { + "t": 11, + "fps": 6, + "mbps": 0.01, + "content_p50": 12.3, + "content_p95": 14.4, + "bitrate": 6604800, + "tier": 0, + "w": 1280, + "net": null + }, + { + "t": 12, + "fps": 4, + "mbps": 0.01, + "content_p50": 15.2, + "content_p95": 17.2, + "bitrate": 6604800, + "tier": 0, + "w": 1280, + "net": null + }, + { + "t": 13, + "fps": 1, + "mbps": 0.0, + "content_p50": 18.9, + "content_p95": 18.9, + "bitrate": 6604800, + "tier": 0, + "w": 1280, + "net": null + }, + { + "t": 14, + "fps": 2, + "mbps": 0.0, + "content_p50": 203.5, + "content_p95": 215.0, + "bitrate": 6604800, + "tier": 0, + "w": 1280, + "net": null + }, + { + "t": 15, + "fps": 1, + "mbps": 0.0, + "content_p50": 16.1, + "content_p95": 16.1, + "bitrate": 6604800, + "tier": 0, + "w": 1280, + "net": null + }, + { + "t": 16, + "fps": 2, + "mbps": 0.16, + "content_p50": 15.5, + "content_p95": 35.1, + "bitrate": 6604800, + "tier": 0, + "w": 1280, + "net": null + }, + { + "t": 17, + "fps": 1, + "mbps": 0.0, + "content_p50": 264.6, + "content_p95": 264.6, + "bitrate": 6604800, + "tier": 0, + "w": 1280, + "net": null + }, + { + "t": 18, + "fps": 1, + "mbps": 0.0, + "content_p50": 12.9, + "content_p95": 12.9, + "bitrate": 6604800, + "tier": 0, + "w": 1280, + "net": null + }, + { + "t": 19, + "fps": 2, + "mbps": 0.0, + "content_p50": 11.7, + "content_p95": 54.2, + "bitrate": 6604800, + "tier": 0, + "w": 1280, + "net": null + }, + { + "t": 20, + "fps": 1, + "mbps": 0.0, + "content_p50": 339.6, + "content_p95": 339.6, + "bitrate": 6604800, + "tier": 0, + "w": 1280, + "net": null + } + ], + "adapt": [], + "content_p50": 12.9, + "content_p95": 54.2, + "input_p50": 50.1, + "input_p95": 110.6, + "grades": { + "content_p50": "local", + "content_p95": "acceptable", + "input_p50": "acceptable", + "input_p95": "acceptable" + }, + "cpu": { + "mac_agent_pct": 1.2, + "frame_viewer_pct": 6.5, + "frame_tailscaled_pct": 1.6, + "frame_sshd_pct": 0.3, + "frame_gamescope_pct": 2.4, + "frame_total_pct": 8.0 + }, + "viewer": "h264 software; ANGLE (Mesa, zink Vulkan 1.4(Turnip Adreno (TM) 750 (MESA_TURNIP)), OpenGL 4.6); raf 141 Hz", + "show_s": 1.43, + "panel": "valve.steam.desktopgame.2001427053", + "src": "separate:7011" + } + ] +} \ No newline at end of file diff --git a/compat-db/README.md b/compat-db/README.md index 5c81211..d851728 100644 --- a/compat-db/README.md +++ b/compat-db/README.md @@ -1,9 +1,32 @@ # compat-db: Frame Control's compatibility database A private [Lakebed](https://docs.lakebed.dev/) capsule holding compatibility -reports for Android apps on the Steam Frame. For now only the maintainer's -copy of Frame Control has the key to read or write it. Everyone else's reports -stay on their own Mac (see `shared()` in `ui/frame_compat_db.py`). +reports for Android apps on the Steam Frame. Only the maintainer's copy of +Frame Control has the key to read or write it (see `shared()` in +`ui/frame_compat_db.py`). Everyone else's reports stay on their computer +unless they turn on **Share compatibility results**. Then the reports also go +to PostHog as `compat_report` events, and the maintainer syncs them in (below). + +## Community reports + +```sh +python3 ui/frame_compat_db.py sync --dry-run # what would be added +python3 ui/frame_compat_db.py sync # add them +``` + +`sync` reads `compat_report` events through PostHog's query API and adds +them with `via` set to `community`, `community-probe` or `community-install`. +It skips invalid reports and anything over 30 per reporter per day. Each run +re-reads the last 30 days, because an offline copy sends its reports late, +with the time they were made. `posthog-sync.json`, next to the outbox, +remembers which reports it has handled and each reporter's daily count, so +nothing is added twice and the cap holds across runs. + +It needs: + +- the PostHog project id: `"project"` in `ui/telemetry.json` +- a personal API key with `query:read`: `POSTHOG_PERSONAL_API_KEY`, or in the + Keychain (service `frame-control-posthog`, account `personal-api-key`) - Live: `https://frame-compat.lakebed.app` (deploy `dep_dDmcsosVSiFirpW6`, claimed, so it doesn't expire). The browser page only says it's private. diff --git a/docs/agents.md b/docs/agents.md new file mode 100644 index 0000000..e77633c --- /dev/null +++ b/docs/agents.md @@ -0,0 +1,185 @@ +# Frame Control for AI agents + +**Documented interface:** Frame Control's own stdlib Python MCP adapter wraps +its loopback HTTP API. No API key, hosted service, model SDK or third-party +helper app is needed. The assistant is our HTML/Python implementation hosted +in the platform Chromium browser. Its optional LLM endpoint is user configuration. +Installing other apps is an optional management action, never a prerequisite. + +## Connect an MCP client + +The default MCP command starts a private HTTP backend on a free loopback port, +with a fresh local access key. It stops that backend when the MCP client closes +stdin or sends SIGTERM. It uses its own SSH control socket, so closing it does +not close the desktop app's connection. No manually started server is needed. + +Add this stdio server to your MCP client (use absolute paths): + +```json +{ + "mcpServers": { + "frame-control": { + "command": "python3", + "args": ["/absolute/path/frame-control/ui/frame_mcp.py"] + } + } +} +``` + +For Codex, the equivalent registration is: + +```sh +codex mcp add frame-control -- python3 /absolute/path/frame-control/ui/frame_mcp.py +``` + +New agent sessions load the entry. An already running session may need its MCP +connections reloaded; registration does not retroactively add tools to its +initial tool inventory. Keep the checkout at that path while it is registered. +Use `codex mcp remove frame-control` to remove only this registration. + +To reuse a running server instead, pass `--url http://127.0.0.1:47810`. +The desktop app uses a random port; use that port with `--url`, or run the +checkout server above. If the HTTP server uses `FRAME_UI_KEY`, pass the same +value in the MCP process environment. This is local access control, not an LLM +API key. The adapter only accepts loopback HTTP servers, refuses redirects and +ignores environment proxies. Stdout contains newline-delimited JSON-RPC only. +It supports MCP initialization, ping, tool listing and tool calls; no sampling, +resources, prompts or streaming transport. + +| Tool | Arguments | Effect | +|---|---|---| +| `computer_state` | none | Read-only gamescope window IDs/focus and bounded AT-SPI tree; reports incomplete observations | +| `status` | none | Battery, services, installed games and Flatpaks | +| `screenshot` | `view`: `headset` (default) or `desktop` | Returns PNG image content to the MCP client | +| `job` | `id` | Background install status; poll until `done`, inspect `error` | +| `launch` | `appid` | Launch an installed Steam app | +| `install` / `uninstall` | `id` | Install from Flathub / remove a user Flatpak | +| `send_text` | `text` | Frame desktop clipboard; desktop must be open | +| `send_file` | `path` | File on the HTTP server computer, up to 16 MiB, copied to Frame `~/Downloads` | +| `panel` | `id` | Launch an installed Flatpak as a panel using the existing launcher | +| `power` | `action`: `suspend`, `reboot`, `poweroff` | Open a terminal for the user to enter the sudo password | +| `keep_awake` | `action`: `on`, `off`, `status` | Optional keep-awake script interface | + +Only install free software with its developer's consent. There is no purchase, +entitlement bypass or arbitrary shell tool. `install` returns a background job +ID; it does not claim the installation has finished. APK and sideloaded title +installs remain in the main UI for now. + +### Approval is a separate human action + +Every mutation first returns an `approvalUrl`, exact action and `confirmation` +token. Ask the user to open that URL and choose **Approve this action** or +**Reject**. Then repeat the same tool and arguments with the token in +`confirmation`. The server refuses execution before approval, changed arguments, +expired tokens and reuse. A file approval binds the content hash as well as the +path. Approvals last five minutes and disappear when the HTTP server restarts. +A failed execution also consumes the approval; review a fresh request to retry. +The panel does not execute an action merely because it was approved. + +MCP has no approval tool. This is protection against accidental model tool +calls, not a sandbox against a client with independent shell/HTTP access to your +computer. Grant the MCP client only the access you intend. Status, captures and computer-state observations +are returned directly to that client, which may forward them to its configured +model. The assistant's separate opt-in does not govern an external MCP client. + +Power still requires the existing password prompt in a local terminal. MCP +never receives passwords. Power via `FRAME_LOCAL=1` is unsupported: use the main +UI. The panel launcher and keep-awake adapter require zsh on the computer. + +[PR #16](https://github.com/saphid/frame-control/pull/16) owns +`scripts/keep-awake.sh on|off|status`. This branch does not copy or change it. +Until that script is present, the tool reports it unavailable. Keep-awake is +never automatic: `on` changes the shared idle timers; explicitly approve `off` +to restore them after work. It is not a per-agent lease; coordinate with other +users. No changes are made to the analytics/update interfaces in +[PR #17](https://github.com/saphid/frame-control/pull/17). Prompts, keys, model +replies, screenshots and approval payloads are not sent to analytics. + +## Assistant panel + +Open **Tools → Open assistant**, or `http://127.0.0.1:47810/assistant`. +To put the same page in the headset, with the HTTP server still running: + +```sh +python3 scripts/assistant-on-frame.py --port 47810 +``` + +This starts an SSH reverse forward bound to Frame loopback (port 47812 by +default), then a dedicated Chromium profile tagged as a SteamVR panel. Keep the +command running. Ctrl-C closes this browser profile and the tunnel; it leaves +other Chromium windows and the existing HTTP server alone. A failed cleanup +prints the temporary profile path so it can be removed when the Frame returns. +Use `--frame-port` if the default is busy. Chromium must already be available as +`org.chromium.Chromium`; the launcher never installs anything automatically. +Place the panel with SteamVR's normal docking controls. + +Enter your full **chat-completions endpoint**, model name and optional key. +An OpenAI-compatible local server works without a key; no OpenAI account is +required. HTTP is allowed only on loopback; other endpoints require HTTPS. +Loopback refers to the computer running the HTTP server, even in the headset. +Endpoints with embedded credentials, query strings or redirects are refused. + +Check the message consent box and press **Send message**. Screenshot context is +a separate unchecked box and sends one fresh capture with that request. Both +boxes reset after sending, and changing endpoint/model revokes consent. Nothing +is sent when opening the page or entering configuration. There is no model +list fetch, saved history, automatic screenshot capture or assistant telemetry. +Each send is independent: previous messages and replies are not included. + +Configuration, credentials and chat remain in page memory; close/reload the page +or choose **Clear everything** to clear them. A request already sent cannot be +recalled. Only the chosen endpoint gets the request; proxy environment variables +and redirects are disabled. Its privacy and retention policy still applies. +Replies are plain text and cannot call tools or operate the Frame. A model must +support image inputs to accept screenshot context. + +## Evidence and limits + +**Verified 2026-09-28, SteamOS 0.4.1, BUILD_ID 20260925.6191901:** loopback HTTP +status through an SSH reverse tunnel; platform Chromium created a separate +SteamVR panel (confirmed in `GAMESCOPE_FOCUSABLE_APPS`); headset capture returned +a PNG. These checks preceded the UI implementation. No power or global settings +were changed. + +**Inferred:** visual comfort and controller keyboard usability while wearing +the headset; panel creation in gamescope alone does not establish these. +Windows/Linux launcher support, live third-party model endpoints, installs, +uninstalls, power and keep-awake changes are not covered by that feasibility +check. See the PR for the final unit and end-to-end results. + +**Verified end to end on the same Frame/build (2026-09-28):** a stdio MCP client +initialized, read status, retrieved a headset PNG, and transferred a test file +only after approval through the Chromium page. Remote file bytes matched; +reusing the confirmation was rejected. The actual headset Chromium page sent +text and then separately opted-in image context to a local test endpoint and +displayed its replies. Without consent there were zero endpoint requests. +The test endpoint returned canned replies: model inference and a live external +provider remain **unverified**. The launcher’s Ctrl-C cleanup was checked; +profiles, SSH tunnels and the test file were removed. No installs, removals, +launches of user games, power operations or keep-awake changes were performed. + +**Verified locally:** unit coverage includes the stdio subprocess, approval +binding/expiry/replay/concurrency, file-change rejection, and a real local HTTP +endpoint for opt-in, text/image payloads and redirect refusal. Fake-Frame +regressions are in `tests/e2e/test_agents.py`; local Docker execution was blocked +because the Docker daemon was unavailable. The ARM64 fake-Frame CI job passed +on this branch (run 36421345682). + +**Verified on the same Frame/build:** both Ctrl-C and SIGTERM close the dedicated +browser profile and SSH tunnel and remove the profile and panel log. + +![Assistant in Frame Chromium, after an opted-in request to the local test endpoint](img/assistant-panel.png) + +## Computer-use coverage + +MCP is the tool transport, not a limit on what an agent can do. A screenshot, +accessibility snapshot, click or keystroke can all be MCP tools when we have a +reliable underlying implementation. See [the investigation](computer-use.md) +for the verified boundaries. `computer_state` adds observation, not an input +channel: it cannot click an approval button or send keyboard/mouse events. + +**Verified 2026-09-29, SteamOS 0.4.1, BUILD_ID 20260925.6191901:** the command saved +by `codex mcp add` launched without a prestarted server, negotiated MCP, listed +12 tools, read live Frame status and returned X11 window state plus AT-SPI +observations. It exited 0 at EOF. Steam's accessibility tree had inaccessible +children, reported as `incomplete: true`; this is not a complete actionable UI. diff --git a/docs/announcements.md b/docs/announcements.md new file mode 100644 index 0000000..a62c0ab --- /dev/null +++ b/docs/announcements.md @@ -0,0 +1,144 @@ +# Announcing changes + +How we tell people about Frame Control features and fixes as they merge. The +same few sentences feed the X post, the release notes and the website, so they +are written once, in the pull request, while the change is fresh. + +## What gets announced + +| Kind | Announce? | Example | +|---|---|---| +| **New** — something you can now do | Yes, its own post | Stream Mac windows into the Frame as panels | +| **Better** — something existing got noticeably easier, faster or wider | Yes, its own post or a roundup | APKs install without the Android SDK | +| **Fixed** — something broken that users hit | Yes if people reported it or it blocked a flow; otherwise the next roundup | Mac mirror showed a zoomed-in corner | +| **Release** — a tagged build | Always, one post linking the release | Frame Control 0.3.1 | +| Tests, refactors, CI, docs-only, website polish | No | Fake Frame tests, screenshot crop | + +If a change isn't worth a sentence to someone who owns a Frame, it isn't +announced. + +## The voice + +Write it the way the README and release notes already read. + +- **Lead with what the person can now do**, in their words: "Install older + versions of an app when the newest won't run on the Frame", not "Add APK + version fallback resolver". +- **Plain and specific.** Name the thing, give the number: "about 30 fps", + "4,500 apps", "up to 8 older versions". No "blazing", "game-changing", + "excited to announce", "huge", or exclamation marks. +- **Say where it works.** Platforms and what it was tested on, briefly: + "Tested on a real Frame from macOS 27." Don't claim what wasn't tested. +- **Say the catch.** If it needs a setup step, an unsigned build, or only works + on one OS, say so in the same post. +- **Sentence case**, full sentences, British spelling to match the docs. + Contractions are fine. +- **No emoji in the text.** One image, GIF or short clip carries the tone + instead. The only symbol is the kind label below. +- **Unofficial, always.** Never imply Valve made or endorses it. Say "Steam + Frame" for the headset and "Frame Control" for the app. +- **Credit people.** If a user reported the bug or suggested the feature and is + happy to be named, thank them by handle. + +## The formats + +Every announceable PR ends with an `## Announcement` section holding these. +The reviewer checks it like code. + +### 1. The post (X, and any other social account) + +``` +: + + + + +``` + +- `` is `New`, `Better` or `Fixed`. +- 280 characters maximum including the link (X counts any link as 23). +- One link: the release if it has shipped, otherwise the PR. +- One visual when the change is visible: a screenshot from the app, a GIF, or a + short clip from the headset. Alt text describes what it shows. +- No hashtags, except `#SteamFrame` on releases and on posts about something + new, because people search for it. + +### 2. The release-note line + +One bullet under **New in x.y.z**, same as the current release notes: the +first half of the post's first sentence, no kind label, no link. + +### 3. Release post + +``` +Frame Control : + +. Also: . + +Windows, macOS and Linux: +#SteamFrame +``` + +The release title on GitHub uses the same `Frame Control : ` +line, as 0.3.0 and 0.3.1 already do. + +### Roundups + +Small fixes that don't earn their own post wait for a roundup, posted with the +next release or when three or more have piled up: + +``` +Fixed in Frame Control this week: +- +- +- + + +``` + +## Examples from what has already merged + +**#11, older APK versions** + +``` +New: when an Android app is too new for the Frame, Frame Control now offers +older versions that will install. + +It checks F-Droid, its archive and IzzyOnDroid, and verifies each download +before it goes on the headset. + +https://github.com/saphid/steam-frame/pull/11 +``` + +**#8, Mac mirror fixes** + +``` +Fixed: mirroring your Mac into the Steam Frame now fits the whole desktop in +the panel, asks for the right password, and shows the cursor. + +Tested end to end on a real Frame from macOS 27. + +https://github.com/saphid/steam-frame/pull/8 +``` + +**v0.3.1** + +``` +Frame Control 0.3.1: install APKs without the Android SDK + +Frame Control now reads APK files itself, so there's nothing extra to install. +Also: Linux and Windows game sideloading, and one-click install links. + +Windows, macOS and Linux: https://github.com/saphid/steam-frame/releases/tag/v0.3.1 +#SteamFrame +``` + +## Posting + +Nothing is posted without a person approving it. The flow is: + +1. The PR carries its `## Announcement` section. +2. On merge, the post is drafted from that section (manually for now). +3. Alex approves or edits it, then it's posted from the project account. +4. Replies and questions that turn out to be bugs become GitHub issues labelled + `feedback`, same as the website form. diff --git a/docs/apks.md b/docs/apks.md index 8bca60a..56b8c25 100644 --- a/docs/apks.md +++ b/docs/apks.md @@ -5,6 +5,12 @@ in **Lepton**, Valve's Waydroid-based container. Lepton is built for games, not general Android use ([GamingOnLinux](https://www.gamingonlinux.com/2026/09/lepton-from-valve-to-run-android-games-on-linux-is-now-open-source/)). +**VR streaming clients:** WiVRn 26.9 and ALVR 20.14.1 install, but both fail +OpenXR instance creation on the checked Frame because its Android runtime lacks +`XR_KHR_convert_timespec_time` (**verified** 2026-09-28, SteamOS 0.4.1, +BUILD_ID 20260925.6191901). They are not Frame Control dependencies. See +[the feasibility results and options](linux-vr-streaming.md). + ## Install from the Mac: one app, one Lepton instance (verified 2026-09-25) Use Frame Control's **Android apps** section (search, Install, Test, Report), drop diff --git a/docs/computer-use.md b/docs/computer-use.md new file mode 100644 index 0000000..afaf88f --- /dev/null +++ b/docs/computer-use.md @@ -0,0 +1,67 @@ +# Computer use through Frame Control MCP + +The MCP transport can carry semantic actions or visual computer-use actions. +The limits are the Frame's underlying interfaces, permissions and whether an +action can be targeted and verified. A stereoscopic headset screenshot alone +is not a reliable coordinate system for clicking a particular app window. + +## What exists, and the right route + +| Surface | Evidence and route | Remaining work or boundary | +|---|---|---| +| Frame management | **Verified:** existing SSH/HTTP operations for status, capture and file transfer work through MCP. Typed install/launch/power tools wrap the existing API. | Extend typed operations before adding generic mouse automation. Preserve explicit approval for consequential changes. | +| App/window observation | **Verified 2026-09-29:** `computer_state` reads gamescope X11 window/app/process triples, focused app and the installed AT-SPI library. | Bounded to 96 accessible nodes and six levels. Trees may be truncated, stale, hidden or incomplete. Snapshot paths and XIDs are observations, never durable action permissions. | +| Chromium page content | **Verified previously:** the assistant rendered and could be exercised through CDP in an isolated Frame Chromium profile. | A shipped click/type surface needs exact owned browser/target binding, fresh element references, lifecycle cleanup, consent and post-action readback. Do not expose unrestricted JavaScript or attach to arbitrary existing profiles automatically. | +| Steam UI | **Verified 2026-09-29:** the AT-SPI service listed the Steam client's Chromium process and frame nodes, but child traversal was incomplete. Existing `frame_steam.py` uses Steam's loopback CDP endpoint for specific operations. | Prefer those narrow Steam interfaces. Presence of AT-SPI does not prove controls are actionable, and generic pointer injection is not proved for VR menus. | +| Other Linux apps | **Verified 2026-09-29:** Frame ships libX11, libXtst and libatspi; `/dev/uinput` is writable by the current user. | Library presence and access permissions do not prove that a game accepts input. Global virtual input can affect whichever app has focus. Do not ship a blind keyboard/mouse tool on this evidence alone. | +| Panel focus and layouts | **Documented in [#41](https://github.com/saphid/frame-control/pull/41):** `POST /api/panels` accepts `list`, `focus` and `open`. Focus was verified there. | Reuse that owned interface after integration. Its tested gamescope-owned overlay transform setters return `PermissionDenied`; no reliable saved spatial-layout interface was established. Do not duplicate its implementation here. | +| Shared keyboard/trackpad | **Documented in [#19](https://github.com/saphid/frame-control/pull/19):** `/api/input` supplies state/start and event submission, implemented with a bundled KDE Connect daemon. | This branch does not import, launch or depend on that daemon. The user's own-implementation rule remains authoritative. A first-party input implementation or permitted bundled-library route needs its own delivery evidence before MCP integration. | +| Physical/device boundaries | **Documented:** an asleep Frame may be off the network; power authorization can require the user's password; physical pairing and headset fit/comfort require the user. | MCP cannot bypass offline hardware, consent, compositor permissions or physical verification. Keep explicit human handoffs. | + +## Reusing the existing computer-use work + +**Documented:** the installed `cua-driver` skill has the right control pattern: +observe an exact window, use a semantic target if available, fall back to pixels +from that same snapshot, then read back the result. Its browser route requires +an exact process/window/target binding and session-scoped element references. +Those are useful design rules for Frame tools. + +**Verified locally 2026-09-29:** `cua-driver describe get_window_state` describes +host-local process/window IDs and macOS AX inspection. It does not establish an +SSH Frame target. The installed skill's advertised Linux companion file is +missing. A native ARM64 Frame backend, its dependencies and remote transport +have not been verified. We therefore do not claim that the existing Mac driver +can control the Frame by passing it a Frame PID or screenshot, and we do not +make the feature depend on installing that application. + +Frame Control's `computer_state` is our own Python implementation over installed +platform libraries. It sends the probe over SSH stdin, writes no helper to disk, +and exits after one observation. Missing displays/libraries return explicit +errors; a 15-second process deadline prevents a stalled accessibility call from +leaving a probe behind. Window names and accessibility text are untrusted app +content, never instructions to an agent. + +**Recommended next implementation:** an isolated Chromium session with typed +snapshot/click/type/scroll tools and exact fresh target binding, then individually +verified native app actions. Use the headset capture to judge appearance, not to +invent a screen-to-window coordinate transform. Direct tool calls must retain +approval rules; a generic computer-use tool must not become a route around the +MCP approval panel, install confirmation or power confirmation. + +## Isolated browser input proof + +**Verified 2026-09-29, SteamOS 0.4.1, BUILD_ID 20260925.6191901:** a temporary +Frame Chromium profile loaded a local test page through an SSH reverse tunnel. +CDP `Input.insertText` entered the test string in its own input. A CDP +`Input.dispatchMouseEvent` press/release on its own button copied that string +to the page's result; DOM readback matched exactly. The browser profile, +loopback forwards and panel log were removed afterward. No user app was typed +into, no global settings were changed and no third-party helper app was used. + +AT-SPI did **not** expose the test page's controls in that same probe, even with +Chromium's renderer-accessibility flag. It returned the partial Steam-client +tree instead. The reason remains **unverified**; this is an evidence gap, not +proof that Frame accessibility cannot work. For a first implementation, +Chromium's proven page-specific CDP route is stronger than assuming complete +AT-SPI coverage. This proof does not ship unrestricted click/type tools or +establish input delivery to SteamVR's menus. diff --git a/docs/evidence/linux-vr/2026-09-28.txt b/docs/evidence/linux-vr/2026-09-28.txt new file mode 100644 index 0000000..ab71697 --- /dev/null +++ b/docs/evidence/linux-vr/2026-09-28.txt @@ -0,0 +1,47 @@ +Frame client feasibility, 2026-09-28 +SteamOS VERSION_ID=0.4.1 BUILD_ID=20260925.6191901; uname -m=aarch64 +SteamVR: vrserver log reports 2.18.1; process 2256 remained alive across checks. +Base: dcf9689f6459e576d35fc507eb702ca6b2bf4dad (main). +Unmodified upstream release APKs; installed with ui/frame_android.py install APK --vr. +No Linux host attached. No pairing, streamed video, input, audio or worn-headset checks. +Selected logcat lines only; timestamps in Android logs are UTC. + +WiVRn-release.apk +https://github.com/WiVRn/WiVRn/releases/tag/v26.9 +sha256=1df6649ec77224fcc821af0ab4897222bdf3d7eb6ce6ad636461336724111331 +E/OpenXR-Loader( 1140): Error [GENERAL | xrCreateInstance | OpenXR-Loader] : LoaderInstance::CreateInstance, no support found for requested extension: XR_KHR_convert_timespec_time +I/WiVRn ( 1140): [2026-09-28 12:07:58.987] [WiVRn] [info] Failed to create OpenXR instance version 1.1.58: XR_ERROR_EXTENSION_NOT_PRESENT +E/OpenXR-Loader( 1140): Error [GENERAL | xrCreateInstance | OpenXR-Loader] : LoaderInstance::CreateInstance, no support found for requested extension: XR_KHR_convert_timespec_time +I/WiVRn ( 1140): [2026-09-28 12:07:59.034] [WiVRn] [info] Failed to create OpenXR instance version 1.0.58: XR_ERROR_EXTENSION_NOT_PRESENT +E/WiVRn ( 1140): [2026-09-28 12:07:59.035] [WiVRn] [error] Error during initialization: Failed to create OpenXR instance: XR_ERROR_EXTENSION_NOT_PRESENT + +alvr_client_android.apk +https://github.com/alvr-org/ALVR/releases/tag/v20.14.1 +sha256=be68feeb02665e3d69f1cdbcabf38ea4d15c42868a7ec6b5e698dbefee4e4e36 +E/OpenXR-Loader( 1139): Error [GENERAL | xrCreateInstance | OpenXR-Loader] : LoaderInstance::CreateInstance, no support found for requested extension: XR_KHR_convert_timespec_time +I/RustStdoutStderr( 1139): Error [GENERAL | xrCreateInstance | OpenXR-Loader] : LoaderInstance::CreateInstance, no support found for requested extension: XR_KHR_convert_timespec_time +E/[ALVR NATIVE-RUST]( 1139): ALVR panicked: What happened: +E/[ALVR NATIVE-RUST]( 1139): panicked at alvr/client_openxr/src/lib.rs:220:10: +E/[ALVR NATIVE-RUST]( 1139): called `Result::unwrap()` on an `Err` value: ERROR_EXTENSION_NOT_PRESENT + +Cleanup verified: both app directories, compatdata directories and Steam shortcuts absent. +Both test containers stopped and removed. No Steam/SteamVR restart or global setting changes. + +Valve release notes fetched from ISteamNews/GetNewsForApp/v2 (appid=250820). + +SteamVR Beta Updated - 2.18.1 +https://steamstore-a.akamaihd.net/news/externalpost/steam_community_announcements/1844751498219787 +Added tethered Quest support over USB (must be used with Steam Link Beta) + +Introducing SteamVR 2.17 +https://steamstore-a.akamaihd.net/news/externalpost/steam_community_announcements/1843481262693486 +Adds initial support for USB streaming. Note: Requires new Steam Client Beta. +Fix crash using Steam Link on Linux when games submit invalid textures. +Improve streaming recovery when using Steam Link on Linux. + +SteamVR Beta Updated - 2.17.8 +https://steamstore-a.akamaihd.net/news/externalpost/steam_community_announcements/1842212951314598 +Fix crash using Steam Link on Linux when games submit invalid textures. +Improve streaming recovery when using Steam Link on Linux. +Adds initial support for USB streaming. +USB streaming can be used without WiFi by opting into the Steam Client Beta. diff --git a/docs/evidence/mods-2026-09-28.md b/docs/evidence/mods-2026-09-28.md new file mode 100644 index 0000000..bc791f8 --- /dev/null +++ b/docs/evidence/mods-2026-09-28.md @@ -0,0 +1,128 @@ +# Mod feasibility test, 2026-09-28 + +**Verified observations**, with limits below. Device: `aarch64`, SteamOS +`VERSION_ID=0.4.1`, `BUILD_ID=20260925.6191901`; Proton version file: +`1788505046 proton-11.0-2c-arm64`; `vrcmd --stats`: SteamVR `2.18.1`. +Times below are the Frame's AEST clock. + +## Inventory and allowed content + +`ssh frame 'python3 - owned' < ui/frame_steam.py` returned 868 games before +the test. Beat Saber (620980) and Skyrim VR (611670) were absent. Half-Life 2: +VR Mod – Episode One (2177750) was installed. Hogwarts Legacy (990080), +Horizon Zero Dawn (1151640) and Horizon Forbidden West (2420110) were listed +but not installed. The full personal library is not committed. + +**Documented, owner report after these tests:** Alex has Beat Saber on a +Quest 2, which is charging. That copy was not accessed or inspected during +this test. Its version, transfer path and Frame compatibility remain unknown; +Steam ownership is still not established. + +Gravitas's public Steam metadata reported `is_free: true`, developer Galaxy +Shark Studios, Windows only. Frame Control's existing Steam helper requested +its install. Steam first returned free-license state 3, then config state 7, +then queued the download. The helper did not accept state 3; a later read +found state 7. The source of that transition was not observed. A later +`install 1067310` returned `state: installed`. No purchase occurred. + +UEVR was downloaded from the author's [1.05 release](https://github.com/praydog/UEVR/releases/tag/1.05), +not a mirror. `UEVR.zip` was 7,399,455 bytes. Its SHA-256 matched the author's +`UEVR.zip.sha256` (a UTF-16 text file): + +```text +af4f2f91306802d7ee4e8497d483a547ac8e9a3067dbafb81324100524215d3c +``` + +Microsoft's Windows x64 .NET runtime and Windows Desktop runtime 6.0.36 ZIPs +were downloaded using URLs in the official release metadata. Both SHA-512 +hashes matched that metadata. They were extracted into a test-only user +directory, not installed globally. No other mod manager was used. + +## Half-Life 2 VR: visible setup, not gameplay + +Launched the already-installed Episode One using +`steam steam://rungameid/2177750`. The existing manifest recorded build +25413453 and a shared base depot from app 658920, build 25413418. + +Selected fresh Steam / SteamVR log lines: + +```text +22:07:50 proton waitforexitandrun .../Half-Life 2 VR/ep1vr.exe +22:08:03 SetApplicationPid: Setting app steam.app.2177750 PID to 27990 +22:08:03 Successfully loaded binding file '.../hlvr/cfg/steamvr/bindings_frame.json' for app 'steam.app.2177750'. +``` + +The game's `episodicvr/console.log` reached `Creating VR hand HUD...`, +`Creating VR weapon HUD...` and `Calibrating VR base position`. It also +contained missing material/weapon warnings. SteamVR logged a missing +`frame_hmd` binding as well as the successful controller binding load; +controller input was not exercised. + +`ui/frame_vrshot.py` produced a stereo capture showing the mod's +“First time setup” and “Dominant hand” dialog. This establishes visible +startup, not a played level or comfortable performance. The capture includes +room passthrough and is deliberately not published. The test's `hl2.exe` +process was terminated; the pre-existing game installation was preserved. + +## Gravitas and UEVR: injection unverified + +The game was launched through Steam. The injector was then started in the +same `steamapps/compatdata/1067310` prefix using the shipped +`SteamLinuxRuntime_4-arm64/_v2-entry-point` and Proton 11 ARM64. The first +attempt reported: + +```text +Application: UEVRInjector.exe +Message: You must install .NET to run this application. +Architecture: x64 +App host version: 6.0.35 +.NET location: Not found +``` + +With `DOTNET_ROOT` and `DOTNET_ROOT_X64` pointing at the test-only Windows +runtime directory, Proton loaded `Microsoft.NETCore.App/6.0.36` and +`Microsoft.WindowsDesktop.App/6.0.36`. A 25-second launcher timeout was too +short to establish whether the UI worked. A longer attempt produced a +625×372 `UEVR` X11 window on display `:1`. This is window creation evidence, +not a successful injection. That launcher returned exit 0; this was not +treated as proof that a mod worked. + +A combined launch set `PROTON_REMOTE_DEBUG_CMD` to `UEVRInjector.exe` and +ran Gravitas's `Drop.exe` in the same runtime/prefix. The process +`SkyArk/Binaries/Win64/Drop-Win64-Shipping.exe` and a 1600×900 window titled +`SkyArk (64-bit, PCD3D_SM5)` appeared. The launcher exited **1** before an +injection or stereo game scene could be verified. Output included: + +```text +Proton: Error while copying to ".../windows/system32/amdxcffx64.dll": No such file or directory +Error [GENERAL | xrCreateInstance | OpenXR-Loader] : xrCreateInstance failed +X Error of failed request: BadWindow (invalid Window parameter) + Major opcode of failed request: 10 (X_UnmapWindow) +X Error of failed request: XI_BadDevice (invalid Device parameter) + Minor opcode of failed request: 28 (X_GetDeviceButtonMapping) +``` + +These errors do **not** establish an ARM64/FEX incompatibility. Other work +was launching apps on the shared Frame. SteamVR's PIDs changed during the +experiment; `ps` recorded the replacement `vrserver` and `vrcompositor` +starting at **22:13:03**, corroborated by `steamvr.service` journal startup +lines. This test did not request a Steam/SteamVR restart. The combined +attempt ran at 22:14:17–22:14:27, after that restart. A stable, coordinated +session is needed to distinguish launcher/environment problems from game or +mod incompatibility. + +## Cleanup and remaining checks + +- No game executable or OpenVR DLL was replaced. No global runtime or power + setting was changed by this test. No R.E.A.L., OpenComposite or Beat Saber + payload was installed. +- Removed the test-only UEVR/.NET directory and downloaded ZIPs from the + Frame. Final process checks found no `UEVRInjector.exe`, + `Drop-Win64-Shipping.exe`, `ep1vr.exe` or `hl2.exe`. SteamVR was running. +- Gravitas and its Steam-created prefix remain installed for a repeat test; + the pre-existing HL2 VR install remains. Steam may retain normal shader + caches, logs and prefix temporary files. +- Still unverified: UEVR injection and removal, R.E.A.L. releases and + permissions, OpenComposite, Beat Saber playback on either build, and our + own manager's end-to-end install/uninstall. No installer UI is justified + by these results. See the [support table and next checks](../mods.md). diff --git a/docs/frame-control.md b/docs/frame-control.md index 3c61fa8..2637c10 100644 --- a/docs/frame-control.md +++ b/docs/frame-control.md @@ -56,9 +56,11 @@ counts them while they run. Steam library), then launch, stop, test or remove it. **Report an APK** records whether any APK worked (F-Droid or not: pick a file, type a package, or use an installed app). Your reports are saved on your computer and change the verdicts - you see. They aren't uploaded anywhere: the shared database is maintainer-only - for now (see [compat-db/README.md](../compat-db/README.md)). Uses the app's bundled - `adb`, or yours if you have one. + you see. With **Share compatibility results** on (Privacy & updates), they also + go to the shared database ([privacy.md](privacy.md), + [compat-db/README.md](../compat-db/README.md)). A failed install records + itself when the APK was the problem, and after an install the app offers a + 20-second test. Uses the app's bundled `adb`, or yours if you have one. - **Android display**: pick a running Lepton instance (by the app in it) and set its resolution (Native 1920×1080, or Sharp 2560×1440 with density scaled to match), UI scale (Smaller / Default / Larger, or an exact dpi) and text size @@ -70,6 +72,10 @@ counts them while they run. Runtime picked from the program's header), listed under **Sideloaded titles** with Launch and Remove; see [sideloading.md](sideloading.md). Send typed text, or your computer's clipboard, to the Frame clipboard. +- **Mac in the headset** (macOS): show any Mac window, or a whole screen, as + its own panel in the headset. Place it with the SteamVR dashboard, click and + scroll with the laser, and type on the Mac. Streams hardware H.264 through + an SSH tunnel; see [mac-in-headset.md](mac-in-headset.md). - **Flatpaks**: install and remove them (quick picks: Moonlight, Firefox, VLC, Remmina). - **One-click tools**: SSH or SFTP in a terminal window, Steam Link, and remote @@ -151,5 +157,16 @@ npm run dist:win # Windows: installer and .zip npm run dist:linux # Linux: AppImage and .deb, x64 and arm64 ``` -Pushing a `v*` tag builds all three in GitHub Actions and attaches them to the -release (`.github/workflows/release.yml`). +Pushing a `v*` tag builds all three in GitHub Actions and attaches them to a +draft release (`.github/workflows/release.yml`). Running copies are offered it +once you publish it: see [releasing.md](releasing.md). + +## AI agents and assistant + +**Documented:** [the MCP adapter and assistant panel](agents.md) are Frame +Control implementations. MCP wraps this HTTP API without API keys. Changes +require a separate user approval; power also retains its password prompt. The +assistant uses a user-chosen endpoint and sends nothing until the user opts in +for a message. Screenshot context is separately opt-in. Model replies cannot +operate the headset. Tools → Open assistant opens the page; the linked guide +covers putting it in a Chromium panel on the Frame. diff --git a/docs/how-the-frame-works.md b/docs/how-the-frame-works.md index b4a35cc..8fb85a4 100644 --- a/docs/how-the-frame-works.md +++ b/docs/how-the-frame-works.md @@ -55,13 +55,17 @@ Lepton (Android 11, podman container "lepton-dev") ← its own panel, app 305600 | **T3 Code desktop runs natively.** The stock release `T3-Code-0.0.42-arm64.AppImage` in `~/Applications/T3CodeDesktop/` starts with no extra setup: glibc 2.39, `libfuse.so.2`, GTK 3, NSS and libsecret are on the image. `panel-on-frame.sh --name t3code-desktop -- '~/Applications/T3CodeDesktop/T3-Code.AppImage'` gives it its own panel (`valve.steam.desktopgame.2000281357`, `--ozone-platform=x11`). Its bundled server listens on `127.0.0.1:3773` and shows up in onboarding as the `frame` computer, with `passwordStore: gnome-libsecret`. The image has no agent CLI and no `node`. Agents run through the LAN CLIProxyAPI (`llm-proxy.lan:8317`, which resolves on the Frame). Claude Code 2.1.283 comes from `claude.ai/install.sh`, and Codex 0.157.1 from the `codex-aarch64-unknown-linux-musl` release tarball, both into `~/.local/bin`. `with-cliproxy` and a mode-600 `~/.config/cliproxyapi/secrets.env` are copied from the Mac. The wrappers `claude-cliproxy` and `codex-cliproxy` (a `-c model_provider=cliproxy`, `wire_api="responses"`, `env_key="CLIPROXY_API_KEY"`) are set as `providers.claudeAgent.binaryPath` and `providers.codex.binaryPath` in `~/.t3/userdata/settings.json`, and T3 picked that up without a restart. Through the wrappers, `claude auth status` reports `loggedIn: true` (`oauth_token`), and both CLIs answered a prompt with `kimi-k3`. `gamescopectl screenshot` captured another layer (the Lepton T3 app) rather than this panel. `DISPLAY=:0 xwd -id ` piped to `ffmpeg` captures the window itself (1920×1080). **Verified 2026-09-26**, BUILD_ID 20260922.6101926. | Running T3 Code as a host on the Frame | | Power actions need `sudo`, which asks for the Developer Mode password over SSH. | Frame Control's power buttons | | **SSH server:** OpenSSH 9.7p1. It offers `publickey,password` (keyboard-interactive is off, PAM on) and also asks `userdbctl ssh-authorized-keys` for keys. OpenSSH ≥ 8.8 rejects SHA-1 `ssh-rsa` signatures by default, so a client whose RSA support is SHA-1 only (the Swift library Citadel, for one) can't log in with the RSA key that devkit pairing installs; use ed25519 (**inferred** from OpenSSH defaults). **Verified 2026-09-27**, BUILD_ID 20260922.6101926. | [iphone.md](iphone.md), `ui/frame_connect.py` | +| **A Chromium app window on gamescope's `:0` with its own `STEAM_GAME` becomes a panel, even when started over SSH.** `chromium-xr/chrome --ozone-platform=x11 --app=URL --window-size=1280,720` got a 1920×1080 window, and tagging it produced `[Overlays] Created: valve.steam.desktopgame.` in `~/.local/share/Steam/logs/vrwebhelper_systemui.txt`. Chromium XR decoded a 1080p H.264 WebCodecs stream from the Mac at about 60 fps. XTest events sent to `:0` (libXtst through Python ctypes) did not reach the page. The Frame has `libXtst`, `xprop`, `xwininfo`, `curl` and the `C.utf8` locale. **Verified 2026-09-28**, BUILD_ID 20260925.6191901. | [mac-in-headset.md](mac-in-headset.md) | +| **Streaming video into a panel: what the Frame adds.** Chromium XR decodes H.264 in **software** (1920×1290 at about 9 Mbit/s took 4–6 ms per frame); its GL is ANGLE → zink → Turnip on the Adreno 750, and it logs `GetVSyncParametersIfAvailable() failed`. An idle page's `requestAnimationFrame` runs at about 140 Hz; when the headset is worn or woken, SteamVR picks the 4320×2160 @ 144 Hz mode. **An unworn headset throttles panel apps** whatever they draw: a local canvas page ran at 58 fps for about 6 s, then 28, then about 15 once in standby (vrserver logs `entering standby`, with `power.pauseCompositorOnStandby 1`). `vrcmd --handlewakeup` gave 137–144 fps for about 2 s, then 36. So a panel's frame rate and compositor delay can only be measured while it's worn. `tailscaled` runs with `--tun=userspace-networking` and cost about 8% of a core at 9 Mbit/s (0.5% over the LAN address). Wi-Fi power saving is on (`iw … get power_save`). **Verified 2026-09-28**, BUILD_ID 20260925.6191901. | [mac-in-headset.md](mac-in-headset.md#measuring) | +| **USB-C networking.** Plugged into a Mac, the Frame is a USB network device: macOS names the port "Steam Frame" (here `en9`, 10.86.200.234/29), and the Frame's `usb0` is 10.86.200.233. Ping is about 0.9 ms, and SSH works with the usual host key (`-o HostName=10.86.200.233 -o HostKeyAlias=`). Steam's Remote Play discovery also broadcasts over it. **Verified 2026-09-28**, BUILD_ID 20260925.6191901. | Frame Control's Mac stream uses it when present ([mac-in-headset.md](mac-in-headset.md)) | | **Tools on the image:** Python 3.12.3, `ffmpeg`, `openssl`, `curl`, `rsync`, `zip`/`unzip`, `flatpak`, `wpctl`, `podman`. **No `adb`.** `steamos` is uid 1000, in `wheel`, and sudoers has `%wheel ALL=(ALL) ALL`, so `sudo -S` takes the Developer Mode password on stdin. **Verified 2026-09-27.** | Running Frame Control's server on the Frame (`FRAME_LOCAL=1`, [iphone.md](iphone.md)) | | **Each Lepton instance is a podman container** named `lepton-steamlaunch-`, labelled with its ADB port (`podman ps --format '{{.Names}} {{.Labels.adb_port}}'`). `podman exec /system/bin/sh -c '…'` runs Android's shell inside it with no adb at all (used for `pidof` and `logcat` by the app tester). Running `wm size`/`wm density` that way is untested. **Verified 2026-09-27.** | `ui/frame_android.py`, the iPhone app's display settings | | **Asleep means off the network.** In standby the Frame stops answering on its LAN address, `frame.local` and Tailscale alike (`Host is down`, `No route to host`, timeouts), and ping fails. It was unreachable for about 2.5 hours until woken. Nothing over SSH can wake it. **Verified 2026-09-27.** | Frame Control's offline banner and retries | +| **What puts it to sleep is Steam's idle timer**, not logind. The journal shows `steamui_system: Switching to power state: [ k_ESystemPowerState_Sleep ] reason: 'ComputeNextPowerState: active: 3600 < 3600 (k_EACState_Connected)'`, then Steam suspends. SSH work doesn't count as activity. The timers are the client settings `system_idle_suspend_ac_sec` (3600) and `system_idle_suspend_battery_sec` (900); 0 means Never (Settings → Power → Sleep after inactivity). They can be written over DevTools the way the settings page does. logind refuses a `systemd-inhibit --mode=block` sleep lock from an SSH session (`Interactive authentication required`) but accepts one started with `systemd-run --user`. `scripts/keep-awake.sh on|off|status` does both and restores the old timers on `off`. **Verified 2026-09-28**, BUILD_ID 20260925.6191901. Whether Steam's suspend honours the inhibitor on its own is **inferred** (polkit gives `steamos` no `suspend-ignore-inhibit`), not tested. | Keeping the Frame awake for agent work | | **Battery at full on a charger** can read `Discharging` at about 0 W (for example 99 %, 0.0 W, USB-C PD 18 W). Treat under 0.5 W on a charger as "not charging", not "draining". **Verified 2026-09-27.** | Frame Control's battery card | | **The OS image is downloadable.** Valve's recovery images for the Frame are at `https://steamdeck-images.steamos.cloud/recovery/`. The root filesystem inside is btrfs, and it runs as an SSH test target on ARM64 Linux without the headset (`tests/frame-container/frame-image.sh`). **Verified 2026-09-27.** | [recovery-and-images.md](recovery-and-images.md) | | **Boot / recovery menu.** Hold Power ~10 s until the LED goes off, then power on while holding the **AUX button on top of the Power button** (not the volume keys) until a text menu appears. Entries: `Current` (SteamOS-A/B + build), `Previous` (the other A/B slot), `Boot from USB`, `Repair Steam Installation`, `Erase User Data` (factory reset), `ADB mode`, `Battery Ship Mode`. It auto-boots `Current` after a ~15 s countdown. **Volume Up/Down (left side) move, AUX (right side) selects.** For a boot loop, Valve says pick `Previous` (keeps user data); then `Repair Steam Installation`; `Erase User Data` wipes `~` (SSH keys, Tailscale, Flatpaks, T3 setup). Last resort is a full re-image, two ways: (1) USB: write `steamframe-oobe-repair-.img.bz2` to an 8 GB+ USB-C stick (Balena Etcher on the Mac), pick `Boot from USB`, then use "Wipe Device & Install SteamOS" / "Repair SteamOS" (keeps games and personal content) from the recovery desktop; (2) cable/EDL: `steamframe-oobe-repair-qdl-.tar.gz`, run `flash.sh` (Linux) or `flash.cmd` (Windows), then with the Frame off for 10 s hold Power + Vol Up + Vol Down for 10 s and plug it in; it reflashes and reboots. Both images: `https://steamdeck-images.steamos.cloud/recovery/` (build 20260922.5153644, 0.3.0, 3.8 GiB each, no published checksums); local copies in `~/Downloads/steam-frame-recovery/`. File names, checksums and what's inside: [recovery-and-images.md](recovery-and-images.md). Source: Valve's [SteamOS Recovery FAQ](https://help.steampowered.com/en/faqs/view/1B71-EDF2-EB6D-2BB3) and [Installation and Repair FAQ](https://help.steampowered.com/en/faqs/view/65B4-2AA3-5F37-4227), plus a menu photo in [EloiStree/HelloSteamFrame#9](https://github.com/EloiStree/HelloSteamFrame/issues/9). **Inferred** (Valve docs, 2026-09-26); not yet tried on our Frame. | Recovering from a boot loop | -| **Boot loop cause: the SteamVR health check.** `steamvr.service` runs `/usr/share/deckard/steamvr-health-check`, which appends `frog:glasses:` to `$XDG_RUNTIME_DIR/steamvr-short-session-tracker` on every failed or <10 s SteamVR run. At 3 it runs `steam-health-check --repair-now`, which **deletes all of `~/.local/share/Steam` (games, login, Developer Mode) and `~/.steam`**, keeping only `registry.vdf`. At 4 it also tries `steamos-bootconf set-mode reboot-other` (fails as the user: `bootenv: Permission denied`). SteamVR normally fails 1–2 times per boot while it waits for the Steam client (`SteamAPI_InitEx failed … Steam is probably not running`, then `fatal stalled cross-thread pipe`). Once Steam has been wiped, it has to re-download a ~210 MB client on every boot, so SteamVR keeps failing, Steam keeps getting wiped and the Frame reboots, in a loop. Also, the Steam updater can deadlock at `Installing update...` (main process blocked writing to the `-child-update-ui` process, which is stuck in `drm_syncobj_array_wait_timeout`). Killing only the `-child-update-ui` process lets the install finish (`package/*.installed` appears). **Fix without sudo:** over USB-C ADB (`adb -s frame shell` works as `steamos` while the Frame is looping; SSH is refused once Developer Mode is lost), truncate both `/run/user/1000/steam{,vr}-short-session-tracker` files and `chmod 444` them (the health check then logs `Permission denied` and does nothing; this is tmpfs, so it resets on reboot). Unstick the updater if needed, let Steam finish installing, then hold Power 10 s and start the Frame normally. `systemctl reboot` over ADB needs interactive auth. After the fix, sign in to Steam and turn Developer Mode back on. **Verified 2026-09-26**, BUILD_ID 20260922.6101926, slot B (clean boot: 0 SteamVR failures, SSH and Tailscale back). | Diagnosing a boot loop | +| **Boot loop cause: the SteamVR health check.** `steamvr.service` runs `/usr/share/deckard/steamvr-health-check`, which appends `frog:glasses:` to `$XDG_RUNTIME_DIR/steamvr-short-session-tracker` on every failed or <10 s SteamVR run. At 3 it runs `steam-health-check --repair-now`, which **deletes all of `~/.local/share/Steam` (games, login, Developer Mode) and `~/.steam`**, keeping only `registry.vdf`. At 4 it also tries `steamos-bootconf set-mode reboot-other` (fails as the user: `bootenv: Permission denied`). SteamVR normally fails 1–2 times per boot while it waits for the Steam client (`SteamAPI_InitEx failed … Steam is probably not running`, then `fatal stalled cross-thread pipe`). Once Steam has been wiped, it has to re-download a ~210 MB client on every boot, so SteamVR keeps failing, Steam keeps getting wiped and the Frame reboots, in a loop. Also, the Steam updater can deadlock at `Installing update...` (main process blocked writing to the `-child-update-ui` process, which is stuck in `drm_syncobj_array_wait_timeout`). Killing only the `-child-update-ui` process lets the install finish (`package/*.installed` appears). **Fix without sudo:** over USB-C ADB (`adb -s frame shell` works as `steamos` while the Frame is looping; SSH is refused once Developer Mode is lost), truncate both `/run/user/1000/steam{,vr}-short-session-tracker` files and `chmod 444` them (the health check then logs `Permission denied` and does nothing; this is tmpfs, so it resets on reboot). Unstick the updater if needed, let Steam finish installing, then hold Power 10 s and start the Frame normally. `systemctl reboot` over ADB needs interactive auth. After the fix, sign in to Steam and turn Developer Mode back on. **Verified 2026-09-26**, BUILD_ID 20260922.6101926, slot B (clean boot: 0 SteamVR failures, SSH and Tailscale back). **Seen again 2026-09-28** on BUILD_ID 20260925.6191901, beta client 1790377368. The Frame rebooted by itself while off the network. At 21:13 the check tried `reboot-other` (`bootenv: Permission denied`) and reset the unpacked Steam install, and the tracker had 15 entries. The tracker fix above, applied over SSH, stopped the resets (the checks then log `Permission denied`), but Steam itself kept exiting about 17 s after each start (34 restarts). Cause not found yet. | Diagnosing a boot loop | ## Debug recipes diff --git a/docs/img/assistant-panel.png b/docs/img/assistant-panel.png new file mode 100644 index 0000000..514a1d5 Binary files /dev/null and b/docs/img/assistant-panel.png differ diff --git a/docs/linux-vr-streaming.md b/docs/linux-vr-streaming.md new file mode 100644 index 0000000..af1789a --- /dev/null +++ b/docs/linux-vr-streaming.md @@ -0,0 +1,195 @@ +# PC VR streaming from Linux + +**Recommendation, 2026-09-28:** test Valve's current SteamVR/Steam Link path +on a Linux gaming PC before building another streamer. Valve now documents +Linux streaming fixes and USB support. We have no Linux host attached, so +Linux-to-Frame VR streaming remains **unverified here**. + +This is the feasibility and options report for +[#24](https://github.com/saphid/frame-control/issues/24), not a shipped streaming +feature. Frame Control's features must use our own implementation or standard +platform components. WiVRn and ALVR are research comparisons, not dependencies. +An optional install shortcut is the most we would offer for a third-party app. +Our own streamer requires Alex's choice before implementation. + +## What was checked on the Frame + +**Verified** on 2026-09-28: aarch64, SteamOS **0.4.1**, BUILD_ID +`20260925.6191901`, SteamVR **2.18.1**. Version and build are recorded separately; +earlier docs associate this build with other SteamOS version labels. + +| Client | Installation | Runtime result | +|---|---|---| +| WiVRn **26.9**, upstream `WiVRn-release.apk` | API 29, arm64-v8a; installed in its own immersive Lepton instance | OpenXR instance creation fails: missing `XR_KHR_convert_timespec_time`. Both 1.1.58 and 1.0.58 attempts return `XR_ERROR_EXTENSION_NOT_PRESENT` | +| ALVR **20.14.1**, upstream `alvr_client_android.apk` | API 26, arm64-v8a; installed in its own immersive Lepton instance | Same missing extension. Client panics at `client_openxr/src/lib.rs:220` with `ERROR_EXTENSION_NOT_PRESENT` | + +The [evidence excerpt](evidence/linux-vr/2026-09-28.txt) includes APK SHA-256s, +upstream release links, loader errors and cleanup results. These are failures +before an OpenXR session, not successful VR clients. WiVRn was launched twice; +ALVR's container remained up despite its client panic. Container liveness alone +does not establish VR compatibility. + +Both APKs already declare `MAIN` and `LAUNCHER`. They were installed unmodified +using this branch's existing `python3 ui/frame_android.py install APK --vr`, +then launched through their Steam shortcuts. Logs came from the instance's +`podman exec … /system/bin/logcat`; the user journal also retained WiVRn's errors +after its container exited. No headset was worn and no host was connected. + +All test app files, compatdata, shortcuts and containers were removed afterwards. +SteamVR's original process remained running. No global settings changed. + +### Relation to the VR APK branch + +**Documented from source:** [PR #20](https://github.com/saphid/frame-control/pull/20) +was read, not edited (branch inspected at +[`038dcd4`](https://github.com/saphid/frame-control/commit/038dcd48cd75336f6a86c63c7878bfc9c52deec9)). +Its compatibility layer handles OpenXR version negotiation, some controller +profiles and refresh-rate requests. It does **not** implement +`XR_KHR_convert_timespec_time`. Its launcher fix is unnecessary for these APKs. +This report has **no unmerged code dependency** on that PR, and neither APK was +tested with its layer injected. + +**Documented from upstream source:** WiVRn requests the extension in +[`application.cpp`](https://github.com/WiVRn/WiVRn/blob/bbc6e4cc36c355fa6180980abd231673dc15115d/client/application.cpp#L1286) +and uses it to convert `CLOCK_MONOTONIC` into `XrTime` in +[`instance::now()`](https://github.com/WiVRn/WiVRn/blob/bbc6e4cc36c355fa6180980abd231673dc15115d/client/xr/instance.cpp#L335). +ALVR also [requests it unconditionally](https://github.com/alvr-org/ALVR/blob/a9f6542fa507a841f40ab4f3fcb531427cd02550/alvr/client_openxr/src/lib.rs#L188). +Simply deleting the extension request or returning made-up timestamps would +not prove correct tracking or timing. A real fix needs a valid clock mapping +and further runtime tests. No such patch was made. + +### Native SteamOS aarch64 clients + +**Verified:** the Frame has a native OpenXR runtime manifest at +`~/.config/openxr/1/active_runtime.json`, pointing to SteamVR's +`bin/linuxarm64/vrclient.so`. + +**Documented:** WiVRn's [26.9 README](https://github.com/WiVRn/WiVRn/blob/bbc6e4cc36c355fa6180980abd231673dc15115d/README.md) +describes its Linux client as debugging-only, without audio or hardware decode. +ALVR 20.14.1's [non-Android decoder](https://github.com/alvr-org/ALVR/blob/a9f6542fa507a841f40ab4f3fcb531427cd02550/alvr/client_core/src/video_decoder/mod.rs) +returns no decoded frames. The inspected releases ship Android clients, not a +ready-to-run native Frame client. + +**Inferred:** a native port is possible research, but neither release offers a +demonstrated native alternative to the blocked APKs. Native builds, native +extension enumeration, hardware decoding and audio were **not tested**. The +Android extension failure does not establish that the native runtime lacks it. + +## (a) Valve's own path — recommended first + +**Documented**, from Valve's release notes rather than launch-window reports: + +- [SteamVR 2.17.8 beta](https://steamstore-a.akamaihd.net/news/externalpost/steam_community_announcements/1842212951314598) + says “Fix crash using Steam Link on Linux when games submit invalid textures” + and “Improve streaming recovery when using Steam Link on Linux.” It also + adds initial USB streaming, with Steam Client Beta required to use USB + without Wi-Fi. +- [SteamVR 2.17 release](https://steamstore-a.akamaihd.net/news/externalpost/steam_community_announcements/1843481262693486) + repeats Linux streaming fixes and initial USB support. USB is no longer + solely a claim about an old beta, but version/channel requirements still + need checking on the actual host. +- [SteamVR 2.18.1 beta](https://steamstore-a.akamaihd.net/news/externalpost/steam_community_announcements/1844751498219787) + adds USB-tethered **Quest** support with Steam Link Beta. That entry is not + proof of a Frame/Linux combination. +- The [Steam Link page](https://store.steampowered.com/app/353380/Steam_Link/) + lists Linux desktop clients, while its Quest VR requirements still say + Windows 10 or newer. Desktop Steam Link support is not equivalent to VR host + support, and the Quest requirements are not a Frame support matrix. + +**Inferred:** Valve has a Linux VR streaming path worth testing. The old blanket +claim “Linux cannot stream VR” is no longer justified by the evidence. These +release notes do not establish which Linux GPU/driver/Frame combinations work. +USB changes the transport; it does not by itself prove host encoder support. + +**Not verified:** Linux host discovery, pairing, wireless or USB streaming, +stereo rendering, controllers, haptics, audio, latency, or a game. Frame-only +inspection cannot establish any of these. Flat Remote Play and a desktop shown +on a panel are not substitutes for this test. + +Next test, once a Linux gaming PC is available: record distro, GPU/driver, +Steam client channel/version and SteamVR version; use the Frame's built-in +Steam connection flow, first wirelessly and then over a data-capable USB cable. +Launch a free OpenXR sample or developer-consented VR game. Verify stereo, +head/controller tracking, haptics and audio while worn; retain both ends' logs +and measure latency and recovery after a link interruption. Restore any test +channel changes. Do not change the shared headset's channel just for this report. + +If that works, Frame Control can provide our own host checks, setup guidance +and session controls around Valve's existing platform. First establish which +controls have a usable interface; no stable automated pairing API has been +verified. **Estimate (inferred):** 2–5 engineer-days for the hardware feasibility +pass; another 1–2 weeks for a small integration if those interfaces exist. + +## (b) Our own streaming — proposal only + +This is a new VR transport and device integration, not a desktop capture feature. +A plausible first target is **one Linux GPU family, one host, one Frame**, using +SteamVR on both ends. Our host driver would expose a remote HMD/controllers, +receive poses and inputs, and obtain stereo textures for hardware encoding. +Our Frame OpenXR app would decode, submit the correct eye views and render poses +at predicted display times, and return tracking/input. SteamVR/OpenXR, bundled +codec/transport libraries and platform GPU APIs fit the ownership rule; a +WiVRn/ALVR/Monado server dependency would not. + +**Inferred design risks:** Linux SteamVR texture-sharing/driver interfaces and +Frame decode-to-GPU interoperability need a spike before committing to this +architecture. Sending an already-composited desktop mirror loses the stereo, +pose and timing information we need. Late reprojection, clock conversion, +backpressure, controller bindings, audio sync and reconnects are substantial +work. A runtime shim must not assume `XrTime` equals monotonic nanoseconds. + +### Reuse from `mac-in-headset` + +**Documented from our code**, read-only at +[`1b90c64`](https://github.com/saphid/frame-control/commit/1b90c64b73bace54c63a3aae154c5d29a9448d72): + +- Reuse the ideas for low-latency encoding without B-frames, dropping work + before encoding, bounded queues, keyframe recovery, adaptive bitrate, + per-frame timing and authenticated session setup. +- Its VideoToolbox encoder and ScreenCaptureKit capture are macOS-specific. + Linux needs a new GPU encoder path (for example VA-API or NVENC via bundled + libraries) and VR texture capture, not a port of window capture. +- Its WebSocket over SSH is useful for a first controlled transport experiment + and control messages. Reliable TCP can stall behind lost packets; a VR media + path needs measured deadline behaviour, likely datagrams with loss recovery + using an ordinary bundled transport library. Do not invent cryptography. +- Its Chromium/WebCodecs panel viewer is not a VR client. That branch reports + software H.264 decoding and occasional long Wi-Fi stalls on the Frame. + Its desktop latency measurements are not motion-to-photon measurements or + evidence that a 90/120 Hz stereo stream will work. + +**Size/effort estimate (inferred, one experienced full-time engineer, hardware +available):** + +| Phase | Deliverable / stop condition | Effort | +|---|---|---| +| Feasibility | Linux driver texture access, Frame hardware decode into OpenXR, pose/clock loop; stop if any cannot meet frame deadlines | 2–4 weeks | +| First end-to-end prototype | One GPU/codec, stereo sample over a controlled LAN, head/controllers, logs and teardown | 4–8 additional weeks | +| Usable limited beta | Audio/haptics, pairing, recovery, bitrate/loss handling, installer, worn testing and latency work | 6–12 additional weeks | +| Wider support | Multiple GPU vendors/distros, USB and Wi-Fi variation, long-session stability | 2–4 additional months | + +Planning range: **12–24 engineer-weeks for a limited beta**, roughly +**10–25k lines of our code plus tests/tooling**, excluding bundled libraries. +This is a low-confidence scope estimate, not a delivery promise; an unsupported +driver or decode interface could block it entirely. Foveated streaming, +eye tracking and parity with Valve are excluded. A Linux gaming PC and repeatable +worn-headset testing are prerequisites. **Do not build this until Alex chooses.** + +## (c) Optional “install WiVRn” shortcut only + +Allowed as a clearly optional convenience, never a prerequisite for a Frame +Control feature. **Documented:** WiVRn's server Flatpak ID is +`io.github.wivrn.wivrn`; its client/server versions must match, and its Flatpak +includes xrizer/OpenComposite. Those are properties of an independently +installed third-party stack, not components of our implementation. + +**Recommendation:** defer the shortcut while the current client fails before +session creation. If offered later, label that compatibility result and let +the user choose the install; do not present “install” as “streaming works.” +**Estimate (inferred):** 1–2 engineer-days for an optional host-side shortcut +with package/version detection and honest status, excluding third-party fixes. +No shortcut, host install, pairing automation or streaming UI was built here. + +Choose **(a)** for the next hardware test. Keep **(b)** as a separately approved +project if Valve's path fails or lacks a required capability. **(c)** does not +solve the verified client blocker and should not be the product's foundation. diff --git a/docs/mac-in-headset.md b/docs/mac-in-headset.md new file mode 100644 index 0000000..590a831 --- /dev/null +++ b/docs/mac-in-headset.md @@ -0,0 +1,470 @@ +# Mac in the headset + +Frame Control can show any Mac window, or a whole Mac screen, as its own panel +in the Steam Frame. You place each panel anywhere in the room with the SteamVR +dashboard. The laser clicks and drags, the thumbstick scrolls, and you type on +the Mac's own keyboard. Find it under **Tools → Mac in the headset** (macOS +only). + +The confidence labels are the same as in [ssh.md](ssh.md). + +## Why this design + +First-party options come first, as the repo's rule asks, with the reason +each one was or wasn't chosen. The full list for every device is in +[streaming.md](streaming.md#first-party-options-and-why-they-do-or-dont-fit). +Checked 2026-09-28. + +| Goal | First-party option | Chosen? | Why | +|---|---|---|---| +| One Mac screen in the headset | **Apple Screen Sharing** (VNC) → Remmina (Remmina 1.4.43 is already installed on this Frame) | Kept as the fallback (`panel-on-frame.sh mac-screen`) | It's the closest to first-party and needs nothing new. But VNC sends compressed tiles rather than video, so moving content is slow: noticeable lag even on a good 5 GHz link (**verified** 2026-09-27, see [streaming.md](streaming.md)), and the Mac's pointer isn't in the picture without a helper. It shows only whole screens | +| One Mac screen | **Steam Remote Play**, Mac as host (Valve) | For Mac games only; see [Steam's own streaming](#steams-own-streaming) | The Mac's and the Frame's Steam clients already find each other (**verified**). But Remote Play streams a game (the whole desktop only while the game is out of focus, untested from a Mac), never single windows, and a Mac can't host the Frame's VR streaming | +| One Mac screen | **AirPlay** (Apple) | No | Apple licenses AirPlay receivers only to TV and speaker makers, and nothing official runs on Linux. UxPlay is an unofficial receiver, and it mirrors a whole screen, not single windows | +| One Mac screen | **Sidecar / Mac Virtual Display** (Apple) | No | These work only with an iPad or Apple Vision Pro | +| **Each Mac window as its own panel** | None | – | No first-party way does this: Apple's per-app streaming is only for Vision Pro, and Valve's desktop streaming needs a Windows SteamVR host. So Frame Control does it itself | +| Mac keyboard and trackpad driving the headset | **Bluetooth HID** | No | macOS can't act as a Bluetooth keyboard or mouse. A real Bluetooth keyboard paired with the Frame still works | +| Mac keyboard and trackpad | **KDE Connect** (KDE) | No | The Frame has no `kdeconnectd` and it isn't on Flathub. Its Mac app has no keyboard or mouse sharing (**inferred**), and on Wayland it can only reach the desktop panel | +| Mac keyboard and trackpad | **xrdp** (Valve, Developer Mode) | No | It runs a separate Linux session that you view on the Mac. It isn't the headset's view, and it doesn't carry input the other way | + +What that leaves is our own stream: nothing to install on the Mac or the +Frame, and whole screens or single windows. Here the Mac's own keyboard and +trackpad need no forwarding, because the windows are still on the Mac. The +laser is the only input that has to be sent back. + +Other routes that were compared: + +| Option | One screen | Each window | Speed | Verdict | +|---|---|---|---|---| +| Sunshine → Moonlight | ✓ | – | Good | Sunshine's macOS support is still experimental ([discussion #777](https://github.com/orgs/LizardByte/discussions/777)), and it captures whole screens only | +| Virtual Desktop, Immersed | – | – | – | No Frame client as of September 2026 | +| **Frame Control's own stream** | ✓ | ✓ | Hardware H.264, sending only changed frames | **Built** | + +To type into VR surfaces other than these panels (SteamVR's dashboard, +games), the Frame supports a uinput keyboard and mouse without sudo +(verified 2026-09-27: `steamos` is in `input`, and `/dev/uinput` is +`root:input 660`). That's a separate feature, not part of this one. + +## Steam's own streaming + +The Frame is built around Steam streaming, so this was checked first +(2026-09-28). It fits Mac games, not Mac windows. + +- **VR streaming from the Mac: no.** The Frame streams VR from a PC running + SteamVR ("Steam Link" with foveated streaming). SteamVR dropped macOS in + 2020, and Valve lists PCs, laptops, Steam Deck and Steam Machine as + hosts, never a Mac (**documented**: + [UploadVR](https://www.uploadvr.com/steamvr-drops-mac-support/), + [Road to VR](https://roadtovr.com/steam-frame-game-certification-specs/)). +- **Flat Remote Play from the Mac: probably, for Steam games.** + - Steam on this Mac has streaming on, and the two Steam clients already + see each other. The Frame's `remote_connections.txt` shows it + connecting directly to "Alexs-MacBook-Pro-7" at 192.168.1.211:27036, + and the Mac's shows the Frame connecting over Wi-Fi and over the USB-C + link (**verified** in both clients' logs). + - Whether a stream then starts, and how a flat game looks in the headset + (reviews describe a theater screen), is **not tested yet**. The Frame's + Steam was crash-looping during this session (below). + - Mac-hosted Remote Play has a long-standing report of the stream + closing as the game loads + ([Steam forum](https://steamcommunity.com/groups/homestream/discussions/1/574921459914429988/), + **reported**). +- **The Mac desktop through Steam: untested; single windows: no.** Valve + says Remote Play shows the host's desktop when the game loses focus + ([Steam Remote Play FAQ](https://help.steampowered.com/en/faqs/view/0689-74B8-92AC-10F2), + **documented**), so a whole Mac screen may be reachable by starting a + game, then switching away from it. Nobody has tried that from a Mac + host. It would still be one screen in one panel: Remote Play has + nothing like one panel per Mac window, so Frame Control's own stream + stays the way to see separate windows. +- **Steam has a "stream desktop" call, and it pairs with a Mac + (verified 2026-09-28).** In the Remote Play device list, the Frame's + Steam UI calls `SteamClient.RemotePlay.StartDesktopStream()` + for a connected device. Called over CDP with the Mac's client ID, it made + the Mac's Steam show "Authorize Device" and ask for a 4-digit code shown + on the Frame. Once the code was entered, the Mac logged + `k_ERemoteDeviceAuthorizationSuccess`. No stream started in that attempt, + and a second attempt, now that the device is authorized, is the next + test. If it streams the Mac's desktop, that's a whole-screen option built + into Steam: one panel, Valve's encoder and transport. It still wouldn't + give each window its own panel. +- **What Steam's work did give us: the USB-C link.** Plugged into the Mac, + the Frame appears as a network port called "Steam Frame". Steam's Remote + Play discovery uses it, and so does Frame Control's stream now (see + "USB-C, when it's plugged in" below). + +Next steps, once Steam on the Frame is healthy: + +1. Call `StartDesktopStream` again now that the Frame is authorized, and + compare its latency and sharpness with Frame Control's stream of the same + screen. +2. Stream the one Mac game installed here (Fortune Mill) from the Frame's + library, over Wi-Fi and over USB-C. +3. Record whether it starts, how it's shown, and its latency. Steam's + streaming overlay shows this; our benchmark can't measure it. +4. While streaming, switch away from the game on the Mac, and see whether + the Mac's desktop appears in the headset, and whether its keyboard and + pointer work. +5. If it works, Frame Control's Games page could offer "Stream from the + Mac" for Mac-installed games. + +## How it works + +``` +Mac Frame +ScreenCaptureKit (one window or display) + → VideoToolbox H.264 (hardware, low-latency, + no B-frames) + → frame-mac-view, 127.0.0.1 ──ssh -R──→ 127.0.0.1:479xx + → Chromium app window per stream + (WebCodecs decode), on gamescope's + X display, tagged STEAM_GAME + → its own SteamVR panel + ← CGEvent (clicks, drags, wheel, keys) ←──── pointer, wheel and key events +``` + +- **The agent** is `mac/bin/frame-mac-view`, built from `mac/frame-mac-view` + (Swift, no dependencies; `build.sh`). Frame Control's server starts it on + first use and stops it on quit. + - It captures with ScreenCaptureKit, which sends frames only when something + changes, so idle windows cost nothing. + - It encodes in hardware with VideoToolbox's low-latency rate control (plain + real-time mode where that's unavailable). + - While anyone is watching, it keeps the Mac's display awake. A sleeping + display isn't drawn, so there would be nothing to capture. +- **The link** is an `ssh -R` tunnel on its own connection. It's encrypted and + works anywhere `ssh frame` works, Tailscale included, with no firewall + changes on the Mac. If the headset sleeps or the network drops, Frame + Control reopens the tunnel on the same port, and open viewers reconnect by + themselves. +- **USB-C, when it's plugged in.** Connected to the Mac by cable, the Frame + is also a USB network device: macOS lists a network port called "Steam + Frame", and the Frame's `usb0` answers in under 1 ms. Frame Control + checks for it each time it opens the tunnel and uses it when it's there, + with the Frame's usual SSH host key. Otherwise it uses the normal path. + `FRAME_MACVIEW_USB=0` turns this off. **Verified** 2026-09-28, in two + interleaved pairs of runs: + + | | USB-C | Wi-Fi (Tailscale) | + |---|---|---| + | test: content p50 / p95 | 6.9–7.3 / 8.4–8.8 ms | 9.8–10.1 / 12.1–12.3 ms | + | test: click to drawn p50 | 16.6–16.9 ms | 26.4–27.8 ms | + | scroll: content p95 | 23.0–23.5 ms | 31.4–36.9 ms | + | scroll: late frames | 3.2–3.3% | 4.7–7.0% | + + (`bench/results/2026-09-28-*-usb1.json`, `-usb2`, `-wifi1`, `-wifi2`.) +- **Access.** + - Frame Control's own key never leaves the Mac. + - Each viewer is opened with a **single-use ticket**. It's tied to one + window or display and expires after a minute. It's spent as soon as the + viewer confirms it has received its reconnect key. Until then, a retry + gets the same key, so a connection lost at that moment doesn't strand + the viewer. Stop revokes tickets that haven't been used yet. + - After that, the viewer holds a reconnect key for that one source, in + memory only. **Stop** revokes it. + - Remaining risk: a program running as `steamos` on the Frame could read a + ticket from Chromium's command line in the first second or so and use it + first. That gets it the one source being opened, not the Mac, and the + real viewer would then fail to connect. Android apps in Lepton run in + their own podman container, so they shouldn't see the Frame's process + list (inferred, not checked). +- **The viewer** is `ui/mac-view.html`, served by the agent. It opens on the + Frame as a Chromium app window, preferring Chromium XR (`~/chromium-xr`, + built with H.264) over Flathub Chromium. + - The page puts `[fcNNNNN]` in its title. The launcher finds the window by + that tag and sets `STEAM_GAME` to a stable id per source, which gives it + its own panel (see [panels.md](panels.md)). The same Mac window gets the + same panel id each time. + - It decodes with WebCodecs. If it falls behind, it skips to the next + keyframe instead of showing old frames late. + - It falls back to JPEG stills (**Compatible** quality) where H.264 isn't + available. +- **Flow control.** The agent never lets frames queue up anywhere on the + way. It skips capture frames *before* encoding, so no reference frame goes + missing, and it lowers the bitrate, then the frame rate, then the size, to + fit the link (see [Adapting to the network](#adapting-to-the-network)). +- **Input.** + - A click on a window's panel brings that Mac window to the front + (Accessibility API), then clicks at the same point. Double clicks, right + clicks, drags and the wheel work too. + - Keys typed into the panel are sent as Mac key codes. Any keys or buttons + still held down are released if the viewer loses focus or disconnects, or + when the stream stops. Characters the key + table doesn't know, such as those from other keyboard layouts, are typed + as text. + - The Mac's own keyboard and trackpad keep working as normal. Click a panel + with the laser, then type on the Mac. + +## Permissions (Mac) + +- **Screen Recording**, to see windows. Without it, the card asks for it. +- **Accessibility**, so input from the headset reaches the Mac. Without it the + stream still works, and the viewer says clicks won't go through. + +Both are granted to Frame Control. After granting, press **Refresh**, which +restarts the helper so it picks them up. The app is ad-hoc signed, so macOS +may ask again after an update. + +## Quality settings + +| Setting | Long side | fps | Codec | Use | +|---|---|---|---|---| +| Sharp | 2560 | 60 | H.264, ~0.14 bits/pixel | Text-heavy windows on a strong link | +| Balanced (default) | 1920 | 60 | H.264, ~0.1 bits/pixel | Most things | +| Light | 1280 | 30 | H.264 | Weak Wi-Fi or Tailscale off the LAN | +| Compatible | 1280 | 20 | JPEG | A Frame browser without H.264 | + +## Measuring + +Every frame carries a sequence number, and the agent records its journey on +the Mac's clock (`Sources/Stats.swift`): + +| Stage | From → to | +|---|---| +| capture | the Mac composited it (ScreenCaptureKit's display time) → the agent got it | +| queue, encode | → encoding started → the encoder finished | +| network | → the viewer received it | +| decode, draw | → WebCodecs decoded it → it was drawn on the page's canvas | +| present | → the page's next animation frame | + +- **Clock sync.** The viewer syncs its clock to the Mac's the way NTP does: + it pings over the stream's own WebSocket and keeps the sample with the + shortest round trip. It then reports, in Mac time, when each frame arrived + (right away, so the agent can pace itself) and when it was decoded and + drawn (in batches every 250 ms). +- **Input.** The first frame captured after a click or key carries that + event's id. So input latency is the viewer's event → injected on the Mac → + the first frame after it → drawn in the headset. +- **Where to see it.** + - `GET /stats` (key required) returns every frame and input record. + - `/status` includes a two-second summary, which Frame Control's card + shows next to each live stream. + - In the headset, add `?stats=1` to the viewer or press + Ctrl+Alt+Shift+S for an overlay. +- **The benchmark.** `scripts/macview-bench.py` runs fixed scenarios on the + real Frame, from the Mac, with nobody wearing the headset: + - **test** is the moving test pattern. + - **scroll** is a Chrome page on its own display scrolling at 240 pt/s, + which gives about 9 Mbit/s of real 1920×1290 video. + - **type** types into a Chrome text box, first fast and then with pauses. + + It writes `bench/results/--