import type { ParsedConnectionStats, ParsedInboundAudioStreamStats, ParsedInboundVideoStreamStats, ParsedOutboundAudioStreamStats, ParsedOutboundVideoStreamStats, ParsedRemoteInboundStreamStats } from 'webrtc-issue-detector'; /** * Нормализованные метрики аудиопотока, которые используются при расчёте качества. */ export interface AudioStreamStats { /** SSRC потока, к которому относятся расчётные метрики. */ ssrc: number; /** Доля потерянных аудиопакетов в процентах. */ packetLoss: number; /** Текущий bitrate потока. */ bitrate: number; /** Оценка RTT до удалённой стороны в миллисекундах. */ roundTripTime: number; /** Задержка буфера воспроизведения или кодирования в миллисекундах. */ bufferDelay: number; /** Показывает, включена ли FEC-защита для компенсации потерь пакетов. */ fec: boolean; /** Показывает, используется ли режим DTX для экономии полосы в тишине. */ dtx: boolean; } /** * Нормализованные метрики видеопотока, которые используются при расчёте качества. */ export interface VideoStreamStats { /** SSRC потока, к которому относятся расчётные метрики. */ ssrc: number; /** Доля потерянных видеопакетов в процентах. */ packetLoss: number; /** Текущий bitrate потока. */ bitrate: number; /** Оценка RTT до удалённой стороны в миллисекундах. */ roundTripTime: number; /** Задержка буфера воспроизведения или кодирования в миллисекундах. */ bufferDelay: number; /** Кодек, которым сейчас кодируется или декодируется видео. */ codec?: string; /** Фактическая ширина потока. */ width: number; /** Фактическая высота потока. */ height: number; /** Ожидаемая ширина, с которой поток сравнивается при оценке качества. */ expectedWidth: number; /** Ожидаемая высота, с которой поток сравнивается при оценке качества. */ expectedHeight: number; /** Фактический frame rate потока. */ frameRate: number; /** Ожидаемый frame rate, на который ориентируется расчёт качества. */ expectedFrameRate: number; /** Подсказывает, нужно ли снижать штраф за низкий bitrate на исходящем видео. */ decreaseOutboundPenalty?: boolean; /** Отмечает статичный контент, например демонстрацию слайдов или документов. */ isStaticContent?: boolean; /** Среднее значение QP, полезное для интерпретации визуального качества кодирования. */ averageQP?: number; /** Причина ограничения качества, если браузер или encoder её сообщил. */ qualityLimitationReason?: 'none' | 'bandwidth' | 'cpu' | 'other'; } export interface AdaptedWIDStats { inbound: { audio: AudioStreamStats[]; video: VideoStreamStats[]; }; outbound: { audio: AudioStreamStats[]; video: VideoStreamStats[]; }; } export interface CodecFactors { vp9?: number; vp8?: number; h264?: number; [codec: string]: number | undefined; } export interface VideoCalculatorConfig { codecFactors?: CodecFactors; } export interface ScoresCalculatorConfig { video?: VideoCalculatorConfig; } export interface BaseCalculatorConfig { video: Required; defaults: Required<{ audio: AudioStreamStats; video: VideoStreamStats; }>; } export type DeviceType = 'mobile' | 'pc' | 'tv'; /** * MOS-оценки качества аудио и видео в понятной для UI форме. * * Эти значения удобно использовать в индикаторах качества связи, диагностике * и собственных правилах деградации интерфейса. */ export interface MOSScores { /** Оценка качества аудио по шкале MOS. */ Qa?: number; /** Оценка качества видео по шкале MOS. */ Qv?: number; } export interface ExpectedVideoParams { width?: number; height?: number; maxFramerate?: number; } export interface PacketLossStats { packetsLost: number; packetsReceivedOrSent: number; } type RemoteInboundStats = Pick; interface OutboundPrevStats { outbound: { packetsSent: number; qpSum?: number; framesEncoded?: number; }; remoteInbound: { packetsLost: number; }; } export interface AdaptInboundAudioStatsPayload { stats: ParsedInboundAudioStreamStats; connectionStats: ParsedConnectionStats; fec: boolean; dtx: boolean; prevStats?: ParsedInboundAudioStreamStats; } export interface AdaptInboundVideoStatsPayload { stats: ParsedInboundVideoStreamStats; connectionStats: ParsedConnectionStats; prevStats?: ParsedInboundVideoStreamStats; expectedWidth?: number; expectedHeight?: number; expectedFrameRate?: number; isStaticContent?: boolean; } export interface AdaptOutboundAudioStatsPayload { stats: ParsedOutboundAudioStreamStats; remoteInboundStats?: RemoteInboundStats; fec: boolean; dtx: boolean; prevStats?: OutboundPrevStats; } export interface AdaptOutboundVideoStatsPayload { stats: ParsedOutboundVideoStreamStats; remoteInboundStats?: RemoteInboundStats; prevStats?: OutboundPrevStats; isStaticContent?: boolean; } export {};