diff --git a/system/public/aesthetic.computer/bios.mjs b/system/public/aesthetic.computer/bios.mjs index 386630bef5..cf6ad0d54a 100644 --- a/system/public/aesthetic.computer/bios.mjs +++ b/system/public/aesthetic.computer/bios.mjs @@ -46,7 +46,6 @@ import { initGPU, switchBackend } from "./lib/gpu/index.mjs"; // 🎨 New backen import { createWebGLBlitter } from "./lib/webgl-blit.mjs"; import { chooseCompactVideoMime, - getCompactVideoSize, measureCaptureAVSync, shouldResumeCaptureRecorder, } from "./lib/capture-session.mjs"; @@ -925,8 +924,6 @@ async function boot(parsed, bpm = 60, resolution, debug) { let recorderGeneration = 0; let compactVideoRecording = false; let compactRecorderStream = null; - let compactRecorderCanvas = null; - let compactRecorderFrameTimer = null; let recordedVideoBlob = null; let recordedVideoMime = ""; let compactPlaybackUrl = null; @@ -957,13 +954,10 @@ async function boot(parsed, bpm = 60, resolution, debug) { } function clearCompactRecorderStream() { - if (compactRecorderFrameTimer) clearInterval(compactRecorderFrameTimer); - compactRecorderFrameTimer = null; compactRecorderStream?.getTracks?.().forEach((track) => { try { track.stop(); } catch {} }); compactRecorderStream = null; - compactRecorderCanvas = null; compactVideoRecording = false; } @@ -15311,41 +15305,7 @@ async function boot(parsed, bpm = 60, resolution, debug) { if (compactMime) { try { - const compactSize = getCompactVideoSize( - canvas.width, - canvas.height, - window.devicePixelRatio, - ); - compactRecorderCanvas = document.createElement("canvas"); - compactRecorderCanvas.width = compactSize.width; - compactRecorderCanvas.height = compactSize.height; - const compactContext = compactRecorderCanvas.getContext("2d", { - alpha: false, - desynchronized: true, - }); - if (!compactContext) throw new Error("compact recorder canvas unavailable"); - - const drawCompactFrame = () => { - compactContext.imageSmoothingEnabled = false; - compactContext.fillStyle = "black"; - compactContext.fillRect( - 0, - 0, - compactRecorderCanvas.width, - compactRecorderCanvas.height, - ); - compactContext.drawImage( - canvas, - 0, - 0, - compactRecorderCanvas.width, - compactRecorderCanvas.height, - ); - }; - drawCompactFrame(); - compactRecorderFrameTimer = setInterval(drawCompactFrame, 1000 / 30); - - const canvasStream = compactRecorderCanvas.captureStream(30); + const canvasStream = canvas.captureStream(30); compactRecorderStream = new MediaStream(); canvasStream.getVideoTracks().forEach((track) => compactRecorderStream.addTrack(track), @@ -15354,8 +15314,7 @@ async function boot(parsed, bpm = 60, resolution, debug) { compactRecorderStream.addTrack(track.clone()), ); - const pixelsPerSecond = - compactRecorderCanvas.width * compactRecorderCanvas.height * 30; + const pixelsPerSecond = canvas.width * canvas.height * 30; const videoBitsPerSecond = Math.min( 8_000_000, Math.max(1_500_000, Math.round(pixelsPerSecond * 0.12)), @@ -15372,10 +15331,8 @@ async function boot(parsed, bpm = 60, resolution, debug) { phase: "ready", mime: compactMime, videoBitsPerSecond, - width: compactRecorderCanvas.width, - height: compactRecorderCanvas.height, - sourceWidth: canvas.width, - sourceHeight: canvas.height, + width: canvas.width, + height: canvas.height, fps: 30, }, }); diff --git a/system/public/aesthetic.computer/lib/capture-session.mjs b/system/public/aesthetic.computer/lib/capture-session.mjs index d2b35cf7b7..4f230b0a28 100644 --- a/system/public/aesthetic.computer/lib/capture-session.mjs +++ b/system/public/aesthetic.computer/lib/capture-session.mjs @@ -13,21 +13,6 @@ export function chooseCompactVideoMime(isTypeSupported) { return COMPACT_VIDEO_MIMES.find((mime) => isTypeSupported(mime)) || null; } -export function getCompactVideoSize( - sourceWidth, - sourceHeight, - pixelRatio = 1, - maxDimension = 1440, -) { - const width = Math.max(2, Number(sourceWidth) || 2); - const height = Math.max(2, Number(sourceHeight) || 2); - const ratio = Math.max(1, Number(pixelRatio) || 1); - const limit = Math.max(2, Number(maxDimension) || 1440); - const scale = Math.min(ratio, limit / Math.max(width, height)); - const even = (value) => Math.max(2, Math.round(value / 2) * 2); - return { width: even(width * scale), height: even(height * scale) }; -} - export function measureCaptureAVSync(videoStartMs, audioStartMs, toleranceMs = 80) { if (!Number.isFinite(videoStartMs) || !Number.isFinite(audioStartMs)) { return null; diff --git a/tests/capture-session.test.mjs b/tests/capture-session.test.mjs index bf424a4d80..cbd2935956 100644 --- a/tests/capture-session.test.mjs +++ b/tests/capture-session.test.mjs @@ -2,7 +2,6 @@ import test from "node:test"; import assert from "node:assert/strict"; import { chooseCompactVideoMime, - getCompactVideoSize, measureCaptureAVSync, shouldResumeCaptureRecorder, } from "../system/public/aesthetic.computer/lib/capture-session.mjs"; @@ -39,14 +38,3 @@ test("compact camera capture prefers explicit H264 and AAC", () => { "video/mp4;codecs=avc1.42E01E,mp4a.40.2", ); }); - -test("compact camera capture scales logical pixels to an even device-sized frame", () => { - assert.deepEqual(getCompactVideoSize(203, 395, 3), { - width: 610, - height: 1186, - }); - assert.deepEqual(getCompactVideoSize(1080, 1920, 3), { - width: 810, - height: 1440, - }); -});