import { VideoPresets, type TrackPublishDefaults } from 'livekit-client' import type { PublishQualityCap } from '@/api/conferences' /** * Потолок качества публикации → `TrackPublishDefaults` для `RoomOptions.publishDefaults` * (см. `RoomPage.tsx`, `roomOptions`). * * Ограничивается только `videoEncoding` (битрейт/framerate верхнего слоя * симулкаста) и набор дополнительных слоёв `videoSimulcastLayers` — НЕ * фактическое разрешение захвата камеры (`videoCaptureDefaults`, трогать * его не входит в задачу). WebRTC сам подстраивает реальное разрешение * кодирования под урезанный битрейт (`degradationPreference`), поэтому * проверять эффект нужно по фактическому битрейту исходящего видео, а не по * заявленному разрешению потока. * * Слои каждого потолка — все пресеты LiveKit НИЖЕ и РАВНО потолку (без * дефолтного «h180, h360», который иначе подставился бы сам при пустом * `videoSimulcastLayers` и мог бы превысить потолок 180p). */ const PUBLISH_DEFAULTS_BY_CAP: Record, TrackPublishDefaults> = { '180p': { videoEncoding: VideoPresets.h180.encoding, videoSimulcastLayers: [] }, '360p': { videoEncoding: VideoPresets.h360.encoding, videoSimulcastLayers: [VideoPresets.h180] }, '720p': { videoEncoding: VideoPresets.h720.encoding, videoSimulcastLayers: [VideoPresets.h180, VideoPresets.h360], }, } /** * `off` — `undefined`: `publishDefaults` не задаётся вовсе, поведение * библиотеки не отличается от состояния до появления настройки (см. * критерий готовности «дефолты сохраняют текущее поведение»). */ export function buildPublishDefaults(cap: PublishQualityCap): TrackPublishDefaults | undefined { return cap === 'off' ? undefined : PUBLISH_DEFAULTS_BY_CAP[cap] }