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.
+
+
+
+## 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/--