From 0ec540190b2c3bf60d43604e495572fc33629e08 Mon Sep 17 00:00:00 2001 From: mertalev <101130780+mertalev@users.noreply.github.com> Date: Thu, 21 May 2026 16:50:15 -0400 Subject: [PATCH] move level filtering to manager --- .../asset-viewer/VideoNativeViewer.svelte | 17 +---------------- .../media-capabilities-manager.svelte.ts | 18 ++++++++++++++++++ 2 files changed, 19 insertions(+), 16 deletions(-) diff --git a/web/src/lib/components/asset-viewer/VideoNativeViewer.svelte b/web/src/lib/components/asset-viewer/VideoNativeViewer.svelte index 821ba2d6b6..e68bed858a 100644 --- a/web/src/lib/components/asset-viewer/VideoNativeViewer.svelte +++ b/web/src/lib/components/asset-viewer/VideoNativeViewer.svelte @@ -158,22 +158,7 @@ activeSession = { assetId, id }; } - const decodingInfo = await Promise.all(api.levels.map((level) => mediaCapabilitiesManager.decodingInfo(level))); - // eslint-disable-next-line svelte/prefer-svelte-reactivity - const lowestBitrateByHeight = new Map(); - for (let i = 0; i < api.levels.length; i++) { - if (!decodingInfo[i].powerEfficient) { - continue; - } - - const { bitrate, height } = api.levels[i]; - const cur = lowestBitrateByHeight.get(height); - if (cur === undefined || bitrate < api.levels[cur].bitrate) { - lowestBitrateByHeight.set(height, i); - } - } - - const keep = new Set(lowestBitrateByHeight.values()); + const keep = await mediaCapabilitiesManager.efficientLevels(api.levels); for (let i = api.levels.length - 1; i >= 0; i--) { if (!keep.has(i)) { api.removeLevel(i); diff --git a/web/src/lib/managers/media-capabilities-manager.svelte.ts b/web/src/lib/managers/media-capabilities-manager.svelte.ts index f366ef2c0a..d5a4db30d6 100644 --- a/web/src/lib/managers/media-capabilities-manager.svelte.ts +++ b/web/src/lib/managers/media-capabilities-manager.svelte.ts @@ -34,6 +34,24 @@ class MediaCapabilitiesManager { } } + async efficientLevels(levels: Level[]) { + const decodingInfo = await Promise.all(levels.map((level) => this.decodingInfo(level))); + const lowestBitrateByHeight = new Map(); + for (let i = 0; i < levels.length; i++) { + if (!decodingInfo[i].powerEfficient) { + continue; + } + + const { bitrate, height } = levels[i]; + const cur = lowestBitrateByHeight.get(height); + if (cur === undefined || bitrate < levels[cur].bitrate) { + lowestBitrateByHeight.set(height, i); + } + } + + return new Set(lowestBitrateByHeight.values()); + } + decodingInfo(level: Level) { const key = this.cacheKey(level); const existing = this.cache.get(key);