import ClientMetricReport from '../clientmetricreport/DefaultClientMetricReport'; import Logger from '../logger/Logger'; import VideoStreamIdSet from '../videostreamidset/VideoStreamIdSet'; import VideoStreamIndex from '../videostreamindex/VideoStreamIndex'; import VideoTileController from '../videotilecontroller/VideoTileController'; import VideoDownlinkBandwidthPolicy from './VideoDownlinkBandwidthPolicy'; import VideoDownlinkObserver from './VideoDownlinkObserver'; import { VideoPreferences } from './VideoPreferences'; import VideoPriorityBasedPolicyConfig from './VideoPriorityBasedPolicyConfig'; export default class VideoPriorityBasedPolicy implements VideoDownlinkBandwidthPolicy { protected logger: Logger; private videoPriorityBasedPolicyConfig; private static readonly DEFAULT_BANDWIDTH_KBPS; private static readonly STARTUP_PERIOD_MS; private static readonly LARGE_RATE_CHANGE_TRIGGER_PERCENT; private static readonly TARGET_RATE_CHANGE_TRIGGER_PERCENT; private static readonly LOW_BITRATE_THRESHOLD_KBPS; private static readonly MIN_TIME_BETWEEN_PROBE_MS; private static readonly MIN_TIME_BETWEEN_SUBSCRIBE_MS; private static readonly MAX_HOLD_BEFORE_PROBE_MS; private static readonly MAX_ALLOWED_PROBE_TIME_MS; protected tileController: VideoTileController | undefined; protected videoPreferences: VideoPreferences | undefined; protected defaultVideoPreferences: VideoPreferences | undefined; protected shouldPauseTiles: boolean; protected videoIndex: VideoStreamIndex; protected videoPreferencesUpdated: boolean; protected observerQueue: Set; private logCount; private optimalNonPausedReceiveStreams; private optimalReceiveStreams; private optimalReceiveSet; private subscribedReceiveSet; private subscribedReceiveStreams; private preProbeReceiveStreams; private preProbeNonPausedReceiveStreams; private pausedStreamIds; private pausedBwAttendeeIds; private downlinkStats; private prevDownlinkStats; private prevRemoteInfos; private rateProbeState; private startupPeriod; private usingPrevTargetRate; private prevTargetRateKbps; private lastUpgradeRateKbps; private firstEstimateTimestamp; private lastSubscribeTimestamp; private timeBeforeAllowSubscribeMs; private probePendingStartTimestamp; private timeBeforeAllowProbeMs; private lastProbeTimestamp; private probeFailed; constructor(logger: Logger, videoPriorityBasedPolicyConfig?: VideoPriorityBasedPolicyConfig); reset(): void; bindToTileController(tileController: VideoTileController): void; chooseRemoteVideoSources(preferences: VideoPreferences): void; updateIndex(videoIndex: VideoStreamIndex): void; private updateDefaultVideoPreferences; updateMetrics(clientMetricReport: ClientMetricReport): void; wantsResubscribe(): boolean; chooseSubscriptions(): VideoStreamIdSet; addObserver(observer: VideoDownlinkObserver): void; removeObserver(observer: VideoDownlinkObserver): void; forEachObserver(observerFunc: (observer: VideoDownlinkObserver) => void): void; setVideoPriorityBasedPolicyConfigs(config: VideoPriorityBasedPolicyConfig): void; private static readonly MINIMUM_DELAY; private static readonly MAXIMUM_DELAY; private getSubscribeDelay; protected calculateOptimalReceiveStreams(): void; protected calculateOptimalReceiveSet(): void; private determineTargetRate; private setProbeState; private upgradeToStream; private handleProbe; private maybeOverrideOrProbe; private calculateSubscribeRate; private handleAppPausedStreams; private processBwPausedStreams; private cleanBwPausedTiles; private priorityPolicy; private getVideoTileForAttendeeId; private canUpgrade; private hasSimulcastStreams; private availStreamsSameAsLast; private chosenStreamsSameAsLast; private policyStateLogStr; private getCurrentVideoPreferences; }