import AudioVideoObserver from '../audiovideoobserver/AudioVideoObserver'; import ClientMetricReport from '../clientmetricreport/ClientMetricReport'; import { EncodedTransformMessage } from '../encodedtransformworker/EncodedTransform'; import RedundantAudioRecoveryMetricsObserver from '../redundantaudiorecoverymetricsobserver/RedundantAudioRecoveryMetricsObserver'; import EncodedTransformManager from './EncodedTransformManager'; /** * Metrics for redundant audio encoding/decoding */ export interface RedundantAudioMetrics { totalAudioPacketsLost: number; totalAudioPacketsExpected: number; totalAudioPacketsRecoveredRed: number; totalAudioPacketsRecoveredFec: number; } /** * Manages redundant audio encoding transforms. * Handles RED configuration, metrics collection, and observer notifications. * Implements AudioVideoObserver to receive metrics directly. */ export default class RedundantAudioEncodedTransformManager extends EncodedTransformManager implements AudioVideoObserver { private numRedundantEncodings; private redundancyEnabled; private metrics; private observers; private audioMetricsHistory; private currentNumRedundantEncodings; private lastRedHolddownTimerStartTimestampMs; private lastHighPacketLossEventTimestampMs; private lastAudioRedTurnOffTimestampMs; private readonly maxAudioMetricsHistory; private readonly audioRedPacketLossShortEvalPeriodMs; private readonly audioRedPacketLossLongEvalPeriodMs; private readonly audioRedHoldDownTimeMs; private readonly redRecoveryTimeMs; /** * Get the transform names that this manager handles */ transformNames(): string[]; /** * Handle RED metrics messages from the Web Worker */ handleWorkerMessage(message: EncodedTransformMessage): void; /** * Set audio payload types from SDP */ setAudioPayloadTypes(payloadTypes: Map): void; /** * Update the number of redundant encodings based on packet loss */ updateNumRedundantEncodings(packetLossPercent: number): void; /** * Enable or disable redundancy */ setRedundancyEnabled(enabled: boolean): void; /** * AudioVideoObserver callback - receives metrics from the audio/video controller */ metricsDidReceive(clientMetricReport: ClientMetricReport): void; /** * Calculate packet loss percentage for a given time window */ private lossPercent; /** * Returns the number of encodings based on packetLoss value. This is used to * determine when to alert the encoder to update the number of encodings. It also determines if we need to * turn off red in cases of very high packet loss to avoid congestion collapse. */ static getNumRedundantEncodingsForPacketLoss(packetLoss: number): [number, boolean]; /** * Check if we should update the worker encodings. * If newNumRedundantEncodings is the same as the current then we don't need to send a message to the red worker. * If newNumRedundantEncodings is less than the current, check if we've cleared the hold down time and only * then allow the update to be sent to the red worker. */ private shouldUpdateAudioRedWorkerEncodings; /** * Reset hold down timer if needed */ private maybeResetHoldDownTimer; /** * Start the redundant audio transform manager */ start(): Promise; /** * Stop transform and reset state */ stop(): Promise; /** * Add an observer to receive RED recovery metrics */ addObserver(observer: RedundantAudioRecoveryMetricsObserver): void; /** * Remove an observer */ removeObserver(observer: RedundantAudioRecoveryMetricsObserver): void; /** * Update metrics from worker message */ private updateMetrics; /** * Notify all observers with updated metrics */ private notifyObservers; }