From e53d3bcb98c81898212178ed436a52c42e2e8e6a Mon Sep 17 00:00:00 2001
From: Jannis Braun <151788261+TheZwiss@users.noreply.github.com>
Date: Tue, 24 Mar 2026 01:14:47 +0100
Subject: [PATCH] fix: switch backup codec to VP8@30fps, dim H.264 pill with
warning
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
- Backup codec changed from H.264 (OpenH264, slow) to VP8 (libvpx,
fast) — same encoder family as VP9, lower dual-encode overhead
- Backup capped at 30fps with proportional bitrate to keep CPU
overhead low during SIMULCAST dual-encoding
- H.264 pill visually dimmed with amber warning when selected
---
.../voice/ScreenShareSettingsPopover.tsx | 8 ++++++--
packages/web/src/utils/screenShare.ts | 18 +++++++++++-------
2 files changed, 17 insertions(+), 9 deletions(-)
diff --git a/packages/web/src/components/voice/ScreenShareSettingsPopover.tsx b/packages/web/src/components/voice/ScreenShareSettingsPopover.tsx
index c514a3a3..d5690065 100644
--- a/packages/web/src/components/voice/ScreenShareSettingsPopover.tsx
+++ b/packages/web/src/components/voice/ScreenShareSettingsPopover.tsx
@@ -193,7 +193,11 @@ export function ScreenShareSettingsPopover({ open, onClose, anchorRef }: ScreenS
@@ -201,7 +205,7 @@ export function ScreenShareSettingsPopover({ open, onClose, anchorRef }: ScreenS
{config.codec !== 'vp9' && (
- VP9 is recommended for most setups
+ Not recommended — uses slower software encoder
)}
diff --git a/packages/web/src/utils/screenShare.ts b/packages/web/src/utils/screenShare.ts
index e75d6f3d..170f936e 100644
--- a/packages/web/src/utils/screenShare.ts
+++ b/packages/web/src/utils/screenShare.ts
@@ -27,7 +27,7 @@ export interface ScreenShareBuildResult {
videoCodec: 'vp9' | 'h264';
videoEncoding: { maxBitrate: number; maxFramerate: number };
simulcast: false;
- backupCodec?: { codec: 'h264'; encoding: { maxBitrate: number; maxFramerate: number } };
+ backupCodec?: { codec: 'vp8' | 'h264'; encoding: { maxBitrate: number; maxFramerate: number } };
backupCodecPolicy?: BackupCodecPolicy;
};
overdrive: OverdriveOptions;
@@ -131,12 +131,16 @@ export function buildScreenShareOptions(config: ScreenShareConfig): ScreenShareB
const bps = clampedKbps * 1000;
const minBps = Math.round(bps * 0.25);
- // VP9: better quality per bit, software-encoded (CPU). Best for text/static content.
- // H.264: hardware-encoded via NVENC/QSV/VCE (zero CPU). Universal browser support.
- // When VP9 is primary, H.264 SIMULCAST backup handles Safari/incompatible viewers.
- // When H.264 is primary, no backup needed — universally supported.
+ // VP9: better quality per bit via libvpx (software, CPU).
+ // H.264: OpenH264 software encoder in Electron/Chrome (NOT hardware NVENC).
+ // When VP9 is primary, VP8 SIMULCAST backup (also libvpx, lightweight) handles
+ // incompatible viewers (Safari). Backup capped at 30fps to minimize dual-encode overhead.
const useVp9 = config.codec !== 'h264';
+ // Backup encoding: cap at 30fps and proportional bitrate to keep CPU overhead low
+ const backupFps = Math.min(fps, 30);
+ const backupBps = Math.round(bps * (backupFps / fps));
+
return {
capture: { width: captureWidth, height: captureHeight, frameRate: fps },
publish: {
@@ -145,8 +149,8 @@ export function buildScreenShareOptions(config: ScreenShareConfig): ScreenShareB
simulcast: false,
...(useVp9 ? {
backupCodec: {
- codec: 'h264' as const,
- encoding: { maxBitrate: bps, maxFramerate: fps },
+ codec: 'vp8' as const,
+ encoding: { maxBitrate: backupBps, maxFramerate: backupFps },
},
backupCodecPolicy: BackupCodecPolicy.SIMULCAST,
} : {}),