UNPKG

infobip-rtc

Version:

Infobip RTC JavaScript SDK - Infobip WebRTC API Implementation

127 lines 9.89 kB
import { CallStats } from "../CallStats"; import { VideoLocalMediaStats } from "./video/VideoLocalMediaStats"; import { VideoRemoteMediaStats } from "./video/VideoRemoteMediaStats"; import { ExtractedStats } from "./ExtractedStats"; import { AudioLocalMediaStats } from "./audio/AudioLocalMediaStats"; import { AudioRemoteMediaStats } from "./audio/AudioRemoteMediaStats"; export class MediaStatsDiffUtil { static diff(previousCallStats, currentCallStats, isVideo) { if (!previousCallStats) { return currentCallStats; } let diffCallStats = new CallStats(isVideo); let diffLocalStats = new Map(); let diffRemoteStats = new Map(); diffCallStats.bytesSent = currentCallStats.callStats.bytesSent - previousCallStats.callStats.bytesSent; diffCallStats.bytesReceived = currentCallStats.callStats.bytesReceived - previousCallStats.callStats.bytesReceived; diffCallStats.currentRoundTripTime = currentCallStats.callStats.currentRoundTripTime; diffCallStats.availableOutgoingBitrate = currentCallStats.callStats.availableOutgoingBitrate; MediaStatsDiffUtil.calculateLocalDiff(diffLocalStats, previousCallStats.extractedLocalStats, currentCallStats.extractedLocalStats); MediaStatsDiffUtil.calculateRemoteDiff(diffRemoteStats, previousCallStats.extractedRemoteStats, currentCallStats.extractedRemoteStats); return new ExtractedStats(diffCallStats, diffRemoteStats, diffLocalStats); } static forEachStatsPair(previousCallStats, currentCallStats, callback) { currentCallStats.forEach((currentStats, key) => { const previousStats = previousCallStats.get(key); if (!previousStats) { return; } callback(previousStats, currentStats); }); } static calculateRemoteDiff(diffCallStats, previousCallStats, currentCallStats) { MediaStatsDiffUtil.forEachStatsPair(previousCallStats, currentCallStats, (previousStats, currentStats) => { let diffStats; if (currentStats.video) { diffStats = new VideoRemoteMediaStats(currentStats.id); MediaStatsDiffUtil.calculateRemoteVideoDiff(diffStats, currentStats, previousStats); diffCallStats[currentStats.id] = diffStats; } else { diffStats = new AudioRemoteMediaStats(currentStats.id); MediaStatsDiffUtil.calculateRemoteAudioDiff(diffStats, currentStats, previousStats); } diffCallStats.set(currentStats.id, diffStats); }); } static calculateLocalDiff(diffCallStats, previousCallStats, currentCallStats) { MediaStatsDiffUtil.forEachStatsPair(previousCallStats, currentCallStats, (previousStats, currentStats) => { let diffStats; if (currentStats.video) { diffStats = new VideoLocalMediaStats(currentStats.id); MediaStatsDiffUtil.calculateLocalVideoDiff(diffStats, currentStats, previousStats); } else { diffStats = new AudioLocalMediaStats(currentStats.id); MediaStatsDiffUtil.calculateLocalAudioDiff(diffStats, currentStats, previousStats); } diffCallStats.set(currentStats.id, diffStats); }); } static calculateLocalAudioDiff(diffAudioMediaStats, currentAudioMediaStats, previousAudioMediaStats) { MediaStatsDiffUtil.calculateCommonLocalMediaDiff(diffAudioMediaStats, currentAudioMediaStats, previousAudioMediaStats); } static calculateRemoteAudioDiff(diffAudioMediaStats, currentAudioMediaStats, previousAudioMediaStats) { MediaStatsDiffUtil.calculateCommonRemoteMediaDiff(diffAudioMediaStats, currentAudioMediaStats, previousAudioMediaStats); diffAudioMediaStats.jitter = currentAudioMediaStats.jitter; diffAudioMediaStats.concealedSamples = currentAudioMediaStats.concealedSamples - previousAudioMediaStats.concealedSamples; diffAudioMediaStats.concealmentEvents = currentAudioMediaStats.concealmentEvents - previousAudioMediaStats.concealmentEvents; diffAudioMediaStats.codec = currentAudioMediaStats.codec; } static calculateLocalVideoDiff(diffVideoMediaStats, currentVideoMediaStats, previousVideoMediaStats) { MediaStatsDiffUtil.calculateCommonLocalMediaDiff(diffVideoMediaStats, currentVideoMediaStats, previousVideoMediaStats); MediaStatsDiffUtil.calculateCommonVideoLocalMediaDiff(diffVideoMediaStats, currentVideoMediaStats, previousVideoMediaStats); } static calculateRemoteVideoDiff(diffVideoMediaStats, currentVideoMediaStats, previousVideoMediaStats) { MediaStatsDiffUtil.calculateCommonRemoteMediaDiff(diffVideoMediaStats, currentVideoMediaStats, previousVideoMediaStats); MediaStatsDiffUtil.calculateCommonVideoRemoteMediaDiff(diffVideoMediaStats, currentVideoMediaStats, previousVideoMediaStats); diffVideoMediaStats.codec = currentVideoMediaStats.codec; } static calculateCommonLocalMediaDiff(diffLocalMediaStats, currentLocalMediaStats, previousLocalMediaStats) { diffLocalMediaStats.bytesSent = currentLocalMediaStats.bytesSent - previousLocalMediaStats.bytesSent; diffLocalMediaStats.packetsSent = currentLocalMediaStats.packetsSent - previousLocalMediaStats.packetsSent; diffLocalMediaStats.retransmittedBytesSent = currentLocalMediaStats.retransmittedBytesSent - previousLocalMediaStats.retransmittedBytesSent; diffLocalMediaStats.retransmittedPacketsSent = currentLocalMediaStats.retransmittedPacketsSent - previousLocalMediaStats.retransmittedPacketsSent; } static calculateCommonRemoteMediaDiff(diffRemoteMediaStats, currentRemoteMediaStats, previousRemoteMediaStats) { diffRemoteMediaStats.bytesReceived = currentRemoteMediaStats.bytesReceived - previousRemoteMediaStats.bytesReceived; diffRemoteMediaStats.packetsReceived = currentRemoteMediaStats.packetsReceived - previousRemoteMediaStats.packetsReceived; diffRemoteMediaStats.packetsLost = currentRemoteMediaStats.packetsLost - previousRemoteMediaStats.packetsLost; diffRemoteMediaStats.jitterBufferDelay = currentRemoteMediaStats.jitterBufferDelay - previousRemoteMediaStats.jitterBufferDelay; diffRemoteMediaStats.jitterBufferEmittedCount = currentRemoteMediaStats.jitterBufferEmittedCount - previousRemoteMediaStats.jitterBufferEmittedCount; if (diffRemoteMediaStats.jitterBufferEmittedCount > 0) { diffRemoteMediaStats.averageJitterBufferDelay = Math.round(diffRemoteMediaStats.jitterBufferDelay / diffRemoteMediaStats.jitterBufferEmittedCount); } } static calculateCommonVideoLocalMediaDiff(diffVideoLocalMediaStats, currentVideoLocalMediaStats, previousVideoLocalMediaStats) { diffVideoLocalMediaStats.frameHeight = currentVideoLocalMediaStats.frameHeight; diffVideoLocalMediaStats.frameWidth = currentVideoLocalMediaStats.frameWidth; diffVideoLocalMediaStats.framesSent = currentVideoLocalMediaStats.framesSent - previousVideoLocalMediaStats.framesSent; diffVideoLocalMediaStats.framesEncoded = currentVideoLocalMediaStats.framesEncoded - previousVideoLocalMediaStats.framesEncoded; diffVideoLocalMediaStats.keyFramesEncoded = currentVideoLocalMediaStats.keyFramesEncoded - previousVideoLocalMediaStats.keyFramesEncoded; diffVideoLocalMediaStats.nackCount = currentVideoLocalMediaStats.nackCount - previousVideoLocalMediaStats.nackCount; diffVideoLocalMediaStats.firCount = currentVideoLocalMediaStats.firCount - previousVideoLocalMediaStats.firCount; diffVideoLocalMediaStats.pliCount = currentVideoLocalMediaStats.pliCount - previousVideoLocalMediaStats.pliCount; diffVideoLocalMediaStats.qpSum = currentVideoLocalMediaStats.qpSum - previousVideoLocalMediaStats.qpSum; diffVideoLocalMediaStats.qualityLimitationReason = currentVideoLocalMediaStats.qualityLimitationReason; if (diffVideoLocalMediaStats.framesEncoded > 0) { diffVideoLocalMediaStats.averageQP = Math.round(diffVideoLocalMediaStats.qpSum / diffVideoLocalMediaStats.framesEncoded); } } static calculateCommonVideoRemoteMediaDiff(diffVideoRemoteMediaStats, currentVideoRemoteMediaStats, previousVideoRemoteMediaStats) { diffVideoRemoteMediaStats.frameHeight = currentVideoRemoteMediaStats.frameHeight; diffVideoRemoteMediaStats.frameWidth = currentVideoRemoteMediaStats.frameWidth; diffVideoRemoteMediaStats.framesReceived = currentVideoRemoteMediaStats.framesReceived - previousVideoRemoteMediaStats.framesReceived; diffVideoRemoteMediaStats.framesDecoded = currentVideoRemoteMediaStats.framesDecoded - previousVideoRemoteMediaStats.framesDecoded; diffVideoRemoteMediaStats.keyFramesDecoded = currentVideoRemoteMediaStats.keyFramesDecoded - previousVideoRemoteMediaStats.keyFramesDecoded; diffVideoRemoteMediaStats.framesDropped = currentVideoRemoteMediaStats.framesDropped - previousVideoRemoteMediaStats.framesDropped; diffVideoRemoteMediaStats.nackCount = currentVideoRemoteMediaStats.nackCount - previousVideoRemoteMediaStats.nackCount; diffVideoRemoteMediaStats.firCount = currentVideoRemoteMediaStats.firCount - previousVideoRemoteMediaStats.firCount; diffVideoRemoteMediaStats.pliCount = currentVideoRemoteMediaStats.pliCount - previousVideoRemoteMediaStats.pliCount; diffVideoRemoteMediaStats.qpSum = currentVideoRemoteMediaStats.qpSum - previousVideoRemoteMediaStats.qpSum; if (diffVideoRemoteMediaStats.framesDecoded > 0) { diffVideoRemoteMediaStats.averageQP = Math.round(diffVideoRemoteMediaStats.qpSum / diffVideoRemoteMediaStats.framesDecoded); } } } //# sourceMappingURL=MediaStatsDiffUtil.js.map