infobip-rtc
Version:
Infobip RTC JavaScript SDK - Infobip WebRTC API Implementation
127 lines • 9.89 kB
JavaScript
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