From 8d6b168f1bf68961761ddfd27e7c50c433fd9ae2 Mon Sep 17 00:00:00 2001 From: Siavash Sameni Date: Mon, 25 May 2026 20:49:32 +0400 Subject: [PATCH] fix(video): normalize camera frames before encoding --- desktop/src/main.ts | 30 +++++++++++++++++++++++++----- 1 file changed, 25 insertions(+), 5 deletions(-) diff --git a/desktop/src/main.ts b/desktop/src/main.ts index 7479cad..1cbe615 100644 --- a/desktop/src/main.ts +++ b/desktop/src/main.ts @@ -492,9 +492,27 @@ vdSpkBtn.addEventListener("click", async () => { // ── Camera (Blocker 4 + 5) ──────────────────────────────────────── const camCaptureCanvas = document.createElement("canvas"); const camCaptureCtx = camCaptureCanvas.getContext("2d")!; +const CAMERA_SEND_WIDTH = 1280; +const CAMERA_SEND_HEIGHT = 720; let cameraCaptureFrameNo = 0; let cameraPushFailures = 0; +function drawCameraFrameForSend() { + const vw = vdLocalVideo.videoWidth || camCaptureCanvas.width; + const vh = vdLocalVideo.videoHeight || camCaptureCanvas.height; + if (!vw || !vh) return; + + const scale = Math.max(CAMERA_SEND_WIDTH / vw, CAMERA_SEND_HEIGHT / vh); + const dw = vw * scale; + const dh = vh * scale; + const dx = (CAMERA_SEND_WIDTH - dw) / 2; + const dy = (CAMERA_SEND_HEIGHT - dh) / 2; + + camCaptureCtx.fillStyle = "#000"; + camCaptureCtx.fillRect(0, 0, CAMERA_SEND_WIDTH, CAMERA_SEND_HEIGHT); + camCaptureCtx.drawImage(vdLocalVideo, dx, dy, dw, dh); +} + async function startCamera() { if (cameraActive) return; const constraints = { @@ -509,11 +527,13 @@ async function startCamera() { const track = cameraStream.getVideoTracks()[0]; const settings = track.getSettings(); - camCaptureCanvas.width = settings.width ?? 640; - camCaptureCanvas.height = settings.height ?? 360; + camCaptureCanvas.width = CAMERA_SEND_WIDTH; + camCaptureCanvas.height = CAMERA_SEND_HEIGHT; debugLog("camera:get_user_media_ok", { - width: camCaptureCanvas.width, - height: camCaptureCanvas.height, + width: settings.width ?? null, + height: settings.height ?? null, + send_width: camCaptureCanvas.width, + send_height: camCaptureCanvas.height, frameRate: settings.frameRate ?? null, deviceId: settings.deviceId ? "present" : null, facingMode: settings.facingMode ?? null, @@ -530,7 +550,7 @@ async function startCamera() { if (!cameraActive) return; cameraCaptureFrameNo++; try { - camCaptureCtx.drawImage(vdLocalVideo, 0, 0, camCaptureCanvas.width, camCaptureCanvas.height); + drawCameraFrameForSend(); const dataUrl = camCaptureCanvas.toDataURL("image/jpeg", 0.75); const b64 = dataUrl.slice(dataUrl.indexOf(",") + 1); if (cameraCaptureFrameNo === 1 || cameraCaptureFrameNo % 150 === 0) {