@webex/plugin-meetings 3.0.0-beta.312 → 3.0.0-beta.313
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/breakouts/breakout.js +1 -1
- package/dist/breakouts/index.js +1 -1
- package/dist/interpretation/index.js +1 -1
- package/dist/interpretation/siLanguage.js +1 -1
- package/dist/statsAnalyzer/index.js +21 -1
- package/dist/statsAnalyzer/index.js.map +1 -1
- package/dist/statsAnalyzer/mqaUtil.js +16 -16
- package/dist/statsAnalyzer/mqaUtil.js.map +1 -1
- package/dist/webinar/index.js +1 -1
- package/package.json +19 -19
- package/src/statsAnalyzer/index.ts +30 -1
- package/src/statsAnalyzer/mqaUtil.ts +17 -14
- package/test/unit/spec/stats-analyzer/index.js +12 -2
package/dist/breakouts/index.js
CHANGED
|
@@ -1041,7 +1041,7 @@ var Breakouts = _webexCore.WebexPlugin.extend({
|
|
|
1041
1041
|
this.trigger(_constants.BREAKOUTS.EVENTS.ASK_RETURN_TO_MAIN);
|
|
1042
1042
|
}
|
|
1043
1043
|
},
|
|
1044
|
-
version: "3.0.0-beta.
|
|
1044
|
+
version: "3.0.0-beta.313"
|
|
1045
1045
|
});
|
|
1046
1046
|
var _default = Breakouts;
|
|
1047
1047
|
exports.default = _default;
|
|
@@ -168,7 +168,9 @@ var StatsAnalyzer = /*#__PURE__*/function (_EventsScope) {
|
|
|
168
168
|
_this.networkQualityMonitor = networkQualityMonitor;
|
|
169
169
|
_this.correlationId = config.correlationId;
|
|
170
170
|
_this.mqaSentCount = -1;
|
|
171
|
-
_this.lastMqaDataSent = {
|
|
171
|
+
_this.lastMqaDataSent = {
|
|
172
|
+
resolutions: {}
|
|
173
|
+
};
|
|
172
174
|
_this.lastEmittedStartStopEvent = {};
|
|
173
175
|
_this.receiveSlotCallback = receiveSlotCallback;
|
|
174
176
|
_this.successfulCandidatePair = {};
|
|
@@ -224,6 +226,18 @@ var StatsAnalyzer = /*#__PURE__*/function (_EventsScope) {
|
|
|
224
226
|
var _this3 = this;
|
|
225
227
|
var newMqa = (0, _cloneDeep2.default)(_config.emptyMqaInterval);
|
|
226
228
|
(0, _keys.default)(this.statsResults).forEach(function (mediaType) {
|
|
229
|
+
if (!_this3.lastMqaDataSent[mediaType]) {
|
|
230
|
+
_this3.lastMqaDataSent[mediaType] = {};
|
|
231
|
+
_this3.lastMqaDataSent.resolutions[mediaType] = {};
|
|
232
|
+
}
|
|
233
|
+
if (!_this3.lastMqaDataSent[mediaType].send && mediaType.includes('-send')) {
|
|
234
|
+
_this3.lastMqaDataSent[mediaType].send = {};
|
|
235
|
+
_this3.lastMqaDataSent.resolutions[mediaType].send = {};
|
|
236
|
+
}
|
|
237
|
+
if (!_this3.lastMqaDataSent[mediaType].recv && mediaType.includes('-recv')) {
|
|
238
|
+
_this3.lastMqaDataSent[mediaType].recv = {};
|
|
239
|
+
_this3.lastMqaDataSent.resolutions[mediaType].recv = {};
|
|
240
|
+
}
|
|
227
241
|
if (mediaType.includes('audio-send') || mediaType.includes('audio-share-send')) {
|
|
228
242
|
var audioSender = (0, _cloneDeep2.default)(_config.emptyAudioTransmit);
|
|
229
243
|
(0, _mqaUtil.getAudioSenderMqa)({
|
|
@@ -233,6 +247,7 @@ var StatsAnalyzer = /*#__PURE__*/function (_EventsScope) {
|
|
|
233
247
|
mediaType: mediaType
|
|
234
248
|
});
|
|
235
249
|
newMqa.audioTransmit.push(audioSender);
|
|
250
|
+
_this3.lastMqaDataSent[mediaType].send = (0, _cloneDeep2.default)(_this3.statsResults[mediaType].send);
|
|
236
251
|
} else if (mediaType.includes('audio-recv') || mediaType.includes('audio-share-recv')) {
|
|
237
252
|
var audioReceiver = (0, _cloneDeep2.default)(_config.emptyAudioReceive);
|
|
238
253
|
(0, _mqaUtil.getAudioReceiverMqa)({
|
|
@@ -242,6 +257,7 @@ var StatsAnalyzer = /*#__PURE__*/function (_EventsScope) {
|
|
|
242
257
|
mediaType: mediaType
|
|
243
258
|
});
|
|
244
259
|
newMqa.audioReceive.push(audioReceiver);
|
|
260
|
+
_this3.lastMqaDataSent[mediaType].recv = (0, _cloneDeep2.default)(_this3.statsResults[mediaType].recv);
|
|
245
261
|
} else if (mediaType.includes('video-send') || mediaType.includes('video-share-send')) {
|
|
246
262
|
var videoSender = (0, _cloneDeep2.default)(_config.emptyVideoTransmit);
|
|
247
263
|
(0, _mqaUtil.getVideoSenderMqa)({
|
|
@@ -251,6 +267,8 @@ var StatsAnalyzer = /*#__PURE__*/function (_EventsScope) {
|
|
|
251
267
|
mediaType: mediaType
|
|
252
268
|
});
|
|
253
269
|
newMqa.videoTransmit.push(videoSender);
|
|
270
|
+
_this3.lastMqaDataSent[mediaType].send = (0, _cloneDeep2.default)(_this3.statsResults[mediaType].send);
|
|
271
|
+
_this3.lastMqaDataSent.resolutions[mediaType].send = (0, _cloneDeep2.default)(_this3.statsResults.resolutions[mediaType].send);
|
|
254
272
|
} else if (mediaType.includes('video-recv') || mediaType.includes('video-share-recv')) {
|
|
255
273
|
var videoReceiver = (0, _cloneDeep2.default)(_config.emptyVideoReceive);
|
|
256
274
|
(0, _mqaUtil.getVideoReceiverMqa)({
|
|
@@ -260,6 +278,8 @@ var StatsAnalyzer = /*#__PURE__*/function (_EventsScope) {
|
|
|
260
278
|
mediaType: mediaType
|
|
261
279
|
});
|
|
262
280
|
newMqa.videoReceive.push(videoReceiver);
|
|
281
|
+
_this3.lastMqaDataSent[mediaType].recv = (0, _cloneDeep2.default)(_this3.statsResults[mediaType].recv);
|
|
282
|
+
_this3.lastMqaDataSent.resolutions[mediaType].recv = (0, _cloneDeep2.default)(_this3.statsResults.resolutions[mediaType].recv);
|
|
263
283
|
}
|
|
264
284
|
});
|
|
265
285
|
newMqa.intervalMetadata.peerReflexiveIP = this.statsResults.connectionType.local.ipAddress;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"names":["EVENTS","MEDIA_QUALITY","LOCAL_MEDIA_STARTED","LOCAL_MEDIA_STOPPED","REMOTE_MEDIA_STARTED","REMOTE_MEDIA_STOPPED","emptySender","trackLabel","maxPacketLossRatio","availableBandwidth","bytesSent","meanRemoteJitter","meanRoundTripTime","emptyReceiver","bytesReceived","meanRtpJitter","StatsAnalyzer","config","receiveSlotCallback","undefined","networkQualityMonitor","statsResults","defaultStats","mediaType","previousValue","currentValue","isLocal","Error","lastEmittedStartStopEvent","lastEmittedEvent","local","remote","newEvent","emit","file","function","type","result","isSender","isRemote","id","successfulCandidatePair","localCandidateId","transport","relayProtocol","toUpperCase","protocol","sendRecvType","STATS","SEND_DIRECTION","RECEIVE_DIRECTION","ipType","REMOTE","LOCAL","internal","candidates","candidateType","ipAddress","ip","portNumber","port","networkType","priority","timestamp","time","connectionType","NETWORK_TYPE","VPN","UNKNOWN","totalRoundTripTime","statsStarted","lastStatsResults","correlationId","mqaSentCount","lastMqaDataSent","forEach","includes","recv","send","status","meetingMediaStatus","newMqa","emptyMqaInterval","audioSender","emptyAudioTransmit","getAudioSenderMqa","audioTransmit","push","audioReceiver","emptyAudioReceive","getAudioReceiverMqa","audioReceive","videoSender","emptyVideoTransmit","getVideoSenderMqa","videoTransmit","videoReceiver","emptyVideoReceive","getVideoReceiverMqa","videoReceive","intervalMetadata","peerReflexiveIP","peripherals","information","_UNKNOWN_","name","MEDIA_DEVICES","SPEAKER","MICROPHONE","CAMERA","intervalNumber","resetStatsResults","data","mediaConnection","getStatsAndParse","then","statsInterval","setInterval","analyzerInterval","sendMqaData","mqaInterval","MQA_INTEVAL","resolve","sendOneLastMqa","clearInterval","getStatsResult","resolutions","processOutboundRTPResult","processInboundRTPResult","processTrackResult","compareSentAndReceived","parseCandidate","parseAudioSource","statsItem","types","DEFAULT_GET_STATS_FILTER","report","state","parseGetStatsResult","direction","currentDirection","localTrackLabel","csi","audioLevel","totalAudioEnergy","getCurrentStatsTotals","keyPrefix","value","filter","key","startsWith","reduce","prev","cur","getPreviousStatsTotals","getCurrentResolutionsStatsTotals","getPreviousResolutionsStatsTotals","expected","sendAudio","currentStats","previousStats","totalPacketsSent","LoggerProxy","logger","info","emitStartStopEvents","receiveAudio","currentPacketsReceived","previousPacketsReceived","currentSamplesReceived","previousSamplesReceived","sendVideo","framesEncoded","framesSent","receiveVideo","currentFramesReceived","previousFramesReceived","currentFramesDecoded","previousFramesDecoded","currentFramesDropped","previousFramesDropped","sendShare","getConnectionState","ConnectionState","Failed","trace","getTransceiverStats","transceiverStats","video","receivers","receiver","i","filterAndParseGetStatsResults","audio","screenShareVideo","screenShareAudio","senders","sender","compareLastStatsResult","JSON","parse","sendrecvType","kilobytes","frameWidth","frameHeight","width","height","hugeFramesSent","prevBytesSent","keyFramesEncoded","bytes","toFixed","outboundRtpId","packetsSent","totalKeyFramesEncoded","totalNackCount","nackCount","totalPliCount","pliCount","totalFirCount","firCount","encoderImplementation","qualityLimitationReason","qualityLimitationResolutionChanges","retransmittedPacketsSent","totalBytesSent","headerBytesSent","retransmittedBytesSent","receiveSlot","ssrc","idAndCsi","framesReceived","prevBytesReceived","packetsLost","totalPacketsReceived","packetsReceived","lastPacketReceivedTimestamp","currentPacketsLost","currentPacketLossRatio","totalPacketsLost","framesDecoded","keyFramesDecoded","decoderImplementation","fecPacketsDiscarded","fecPacketsReceived","totalBytesReceived","headerBytesReceived","jitter","totalSamplesReceived","totalSamplesDecoded","concealedSamples","remoteSource","framesDropped","trackIdentifier","jitterBufferDelay","jitterBufferEmittedCount","avgJitterDelay","totalPacketsLostOnReceiver","currentPacketLoss","packetsLostOnReceiver","roundTripTime","reportsReceived","overAllPacketLossRatio","determineUplinkNetworkQuality","remoteRtpResults","statsAnalyzerCurrentStats","EventsScope"],"sources":["index.ts"],"sourcesContent":["/* eslint-disable prefer-destructuring */\n\nimport {cloneDeep} from 'lodash';\nimport {ConnectionState} from '@webex/internal-media-core';\n\nimport EventsScope from '../common/events/events-scope';\nimport {\n DEFAULT_GET_STATS_FILTER,\n STATS,\n MQA_INTEVAL,\n NETWORK_TYPE,\n MEDIA_DEVICES,\n _UNKNOWN_,\n} from '../constants';\nimport {\n emptyAudioReceive,\n emptyAudioTransmit,\n emptyMqaInterval,\n emptyVideoReceive,\n emptyVideoTransmit,\n} from '../mediaQualityMetrics/config';\nimport LoggerProxy from '../common/logs/logger-proxy';\n\nimport defaultStats from './global';\nimport {\n getAudioSenderMqa,\n getAudioReceiverMqa,\n getVideoSenderMqa,\n getVideoReceiverMqa,\n} from './mqaUtil';\nimport {ReceiveSlot} from '../multistream/receiveSlot';\n\nexport const EVENTS = {\n MEDIA_QUALITY: 'MEDIA_QUALITY',\n LOCAL_MEDIA_STARTED: 'LOCAL_MEDIA_STARTED',\n LOCAL_MEDIA_STOPPED: 'LOCAL_MEDIA_STOPPED',\n REMOTE_MEDIA_STARTED: 'REMOTE_MEDIA_STARTED',\n REMOTE_MEDIA_STOPPED: 'REMOTE_MEDIA_STOPPED',\n};\n\nconst emptySender = {\n trackLabel: '',\n maxPacketLossRatio: 0,\n availableBandwidth: 0,\n bytesSent: 0,\n meanRemoteJitter: [],\n meanRoundTripTime: [],\n};\n\nconst emptyReceiver = {\n availableBandwidth: 0,\n bytesReceived: 0,\n meanRtpJitter: [],\n meanRoundTripTime: [],\n};\n\ntype ReceiveSlotCallback = (csi: number) => ReceiveSlot | undefined;\n\n/**\n * Stats Analyzer class that will emit events based on detected quality\n *\n * @export\n * @class StatsAnalyzer\n * @extends {EventsScope}\n */\nexport class StatsAnalyzer extends EventsScope {\n config: any;\n correlationId: any;\n lastEmittedStartStopEvent: any;\n lastMqaDataSent: any;\n lastStatsResults: any;\n meetingMediaStatus: any;\n mqaInterval: NodeJS.Timeout;\n mqaSentCount: any;\n networkQualityMonitor: any;\n mediaConnection: any;\n statsInterval: NodeJS.Timeout;\n statsResults: any;\n statsStarted: any;\n successfulCandidatePair: any;\n receiveSlotCallback: ReceiveSlotCallback;\n\n /**\n * Creates a new instance of StatsAnalyzer\n * @constructor\n * @public\n * @param {Object} config SDK Configuration Object\n * @param {Function} receiveSlotCallback Callback used to access receive slots.\n * @param {Object} networkQualityMonitor class for assessing network characteristics (jitter, packetLoss, latency)\n * @param {Object} statsResults Default properties for stats\n */\n constructor(\n config: any,\n receiveSlotCallback: ReceiveSlotCallback = () => undefined,\n networkQualityMonitor: object = {},\n statsResults: object = defaultStats\n ) {\n super();\n this.statsStarted = false;\n this.statsResults = statsResults;\n this.lastStatsResults = null;\n this.config = config;\n this.networkQualityMonitor = networkQualityMonitor;\n this.correlationId = config.correlationId;\n this.mqaSentCount = -1;\n this.lastMqaDataSent = {};\n this.lastEmittedStartStopEvent = {};\n this.receiveSlotCallback = receiveSlotCallback;\n this.successfulCandidatePair = {};\n }\n\n /**\n * Resets cumulative stats arrays.\n *\n * @public\n * @memberof StatsAnalyzer\n * @returns {void}\n */\n resetStatsResults() {\n Object.keys(this.statsResults).forEach((mediaType) => {\n if (mediaType.includes('recv')) {\n this.statsResults[mediaType].recv.meanRtpJitter = [];\n }\n\n if (mediaType.includes('send')) {\n this.statsResults[mediaType].send.meanRemoteJitter = [];\n this.statsResults[mediaType].send.meanRoundTripTime = [];\n }\n });\n }\n\n /**\n * sets mediaStatus status for analyzing metrics\n *\n * @public\n * @param {Object} status for the audio and video\n * @memberof StatsAnalyzer\n * @returns {void}\n */\n public updateMediaStatus(status: object) {\n this.meetingMediaStatus = status;\n }\n\n /**\n * captures MQA data from media connection\n *\n * @public\n * @memberof StatsAnalyzer\n * @returns {void}\n */\n sendMqaData() {\n const newMqa = cloneDeep(emptyMqaInterval);\n\n Object.keys(this.statsResults).forEach((mediaType) => {\n if (mediaType.includes('audio-send') || mediaType.includes('audio-share-send')) {\n const audioSender = cloneDeep(emptyAudioTransmit);\n\n getAudioSenderMqa({\n audioSender,\n statsResults: this.statsResults,\n lastMqaDataSent: this.lastMqaDataSent,\n mediaType,\n });\n newMqa.audioTransmit.push(audioSender);\n } else if (mediaType.includes('audio-recv') || mediaType.includes('audio-share-recv')) {\n const audioReceiver = cloneDeep(emptyAudioReceive);\n\n getAudioReceiverMqa({\n audioReceiver,\n statsResults: this.statsResults,\n lastMqaDataSent: this.lastMqaDataSent,\n mediaType,\n });\n newMqa.audioReceive.push(audioReceiver);\n } else if (mediaType.includes('video-send') || mediaType.includes('video-share-send')) {\n const videoSender = cloneDeep(emptyVideoTransmit);\n\n getVideoSenderMqa({\n videoSender,\n statsResults: this.statsResults,\n lastMqaDataSent: this.lastMqaDataSent,\n mediaType,\n });\n newMqa.videoTransmit.push(videoSender);\n } else if (mediaType.includes('video-recv') || mediaType.includes('video-share-recv')) {\n const videoReceiver = cloneDeep(emptyVideoReceive);\n\n getVideoReceiverMqa({\n videoReceiver,\n statsResults: this.statsResults,\n lastMqaDataSent: this.lastMqaDataSent,\n mediaType,\n });\n newMqa.videoReceive.push(videoReceiver);\n }\n });\n\n newMqa.intervalMetadata.peerReflexiveIP = this.statsResults.connectionType.local.ipAddress;\n\n // Adding peripheral information\n newMqa.intervalMetadata.peripherals.push({information: _UNKNOWN_, name: MEDIA_DEVICES.SPEAKER});\n if (this.statsResults['audio-send']) {\n newMqa.intervalMetadata.peripherals.push({\n information: this.statsResults['audio-send'].trackLabel || _UNKNOWN_,\n name: MEDIA_DEVICES.MICROPHONE,\n });\n }\n if (this.statsResults['video-send']) {\n newMqa.intervalMetadata.peripherals.push({\n information: this.statsResults['video-send'].trackLabel || _UNKNOWN_,\n name: MEDIA_DEVICES.CAMERA,\n });\n }\n\n newMqa.networkType = this.statsResults.connectionType.local.networkType;\n\n this.mqaSentCount += 1;\n\n newMqa.intervalNumber = this.mqaSentCount;\n\n this.resetStatsResults();\n\n this.emit(\n {\n file: 'statsAnalyzer',\n function: 'sendMqaData',\n },\n EVENTS.MEDIA_QUALITY,\n {\n data: newMqa,\n // @ts-ignore\n networkType: newMqa.networkType,\n }\n );\n }\n\n /**\n * updated the media connection when changed\n *\n * @private\n * @memberof StatsAnalyzer\n * @param {RoapMediaConnection} mediaConnection\n * @returns {void}\n */\n updateMediaConnection(mediaConnection: any) {\n this.mediaConnection = mediaConnection;\n }\n\n /**\n * Starts the stats analyzer on interval\n *\n * @public\n * @memberof StatsAnalyzer\n * @param {RoapMediaConnection} mediaConnection\n * @returns {Promise}\n */\n public startAnalyzer(mediaConnection: any) {\n if (!this.statsStarted) {\n this.statsStarted = true;\n this.mediaConnection = mediaConnection;\n\n return this.getStatsAndParse().then(() => {\n this.statsInterval = setInterval(() => {\n this.getStatsAndParse();\n }, this.config.analyzerInterval);\n // Trigger initial fetch\n this.sendMqaData();\n this.mqaInterval = setInterval(() => {\n this.sendMqaData();\n }, MQA_INTEVAL);\n });\n }\n\n return Promise.resolve();\n }\n\n /**\n * Cleans up the analyzer when done\n *\n * @public\n * @memberof StatsAnalyzer\n * @returns {void}\n */\n public stopAnalyzer() {\n const sendOneLastMqa = this.mqaInterval && this.statsInterval;\n\n if (this.statsInterval) {\n clearInterval(this.statsInterval);\n this.statsInterval = undefined;\n }\n\n if (this.mqaInterval) {\n clearInterval(this.mqaInterval);\n this.mqaInterval = undefined;\n }\n\n if (sendOneLastMqa) {\n return this.getStatsAndParse().then(() => {\n this.sendMqaData();\n this.mediaConnection = null;\n });\n }\n\n return Promise.resolve();\n }\n\n /**\n * Parse a single result of get stats\n *\n * @private\n * @param {*} getStatsResult\n * @param {String} type\n * @param {boolean} isSender\n * @returns {void}\n * @memberof StatsAnalyzer\n */\n private parseGetStatsResult(getStatsResult: any, type: string, isSender: boolean) {\n if (!getStatsResult) {\n return;\n }\n\n // Generate empty stats results\n if (!this.statsResults[type]) {\n this.statsResults[type] = {};\n }\n\n if (isSender && !this.statsResults[type].send) {\n this.statsResults[type].send = cloneDeep(emptySender);\n } else if (!isSender && !this.statsResults[type].recv) {\n this.statsResults[type].recv = cloneDeep(emptyReceiver);\n }\n\n if (!this.statsResults.resolutions[type]) {\n this.statsResults.resolutions[type] = {};\n }\n\n if (isSender && !this.statsResults.resolutions[type].send) {\n this.statsResults.resolutions[type].send = cloneDeep(emptySender);\n } else if (!isSender && !this.statsResults.resolutions[type].recv) {\n this.statsResults.resolutions[type].recv = cloneDeep(emptyReceiver);\n }\n\n if (!this.statsResults.internal[type]) {\n this.statsResults.internal[type] = {};\n }\n\n if (isSender && !this.statsResults.internal[type].send) {\n this.statsResults.internal[type].send = cloneDeep(emptySender);\n } else if (!isSender && !this.statsResults.internal[type].recv) {\n this.statsResults.internal[type].recv = cloneDeep(emptyReceiver);\n }\n\n switch (getStatsResult.type) {\n case 'outbound-rtp':\n this.processOutboundRTPResult(getStatsResult, type);\n break;\n case 'inbound-rtp':\n this.processInboundRTPResult(getStatsResult, type);\n break;\n case 'track':\n this.processTrackResult(getStatsResult, type);\n break;\n case 'remote-inbound-rtp':\n case 'remote-outbound-rtp':\n // @ts-ignore\n this.compareSentAndReceived(getStatsResult, type, isSender);\n break;\n case 'remotecandidate':\n case 'remote-candidate':\n this.parseCandidate(getStatsResult, type, isSender, true);\n break;\n case 'local-candidate':\n this.parseCandidate(getStatsResult, type, isSender, false);\n break;\n case 'media-source':\n // @ts-ignore\n this.parseAudioSource(getStatsResult, type);\n break;\n default:\n break;\n }\n }\n\n /**\n * Filters the get stats results for types\n * @private\n * @param {Array} statsItem\n * @param {String} type\n * @param {boolean} isSender\n * @returns {void}\n */\n filterAndParseGetStatsResults(statsItem: any, type: string, isSender: boolean) {\n const {types} = DEFAULT_GET_STATS_FILTER;\n\n // get the successful candidate pair before parsing stats.\n statsItem.report.forEach((report) => {\n if (report.type === 'candidate-pair' && report.state === 'succeeded') {\n this.successfulCandidatePair = report;\n }\n });\n\n statsItem.report.forEach((result) => {\n if (types.includes(result.type)) {\n this.parseGetStatsResult(result, type, isSender);\n }\n });\n\n if (this.statsResults[type]) {\n this.statsResults[type].direction = statsItem.currentDirection;\n this.statsResults[type].trackLabel = statsItem.localTrackLabel;\n this.statsResults[type].csi = statsItem.csi;\n // reset the successful candidate pair.\n this.successfulCandidatePair = {};\n }\n }\n\n /**\n * parse the audio\n * @param {String} result\n * @param {boolean} type\n * @returns {void}\n */\n parseAudioSource(result: any, type: any) {\n if (!result) {\n return;\n }\n\n if (type.includes('audio-send')) {\n this.statsResults[type].send.audioLevel = result.audioLevel;\n this.statsResults[type].send.totalAudioEnergy = result.totalAudioEnergy;\n }\n }\n\n /**\n * emits started/stopped events for local/remote media by checking\n * if given values are increasing or not. The previousValue, currentValue\n * params can be any numerical value like number of receive packets or\n * decoded frames, etc.\n *\n * @private\n * @param {string} mediaType\n * @param {number} previousValue - value to compare\n * @param {number} currentValue - value to compare (must be same type of value as previousValue)\n * @param {boolean} isLocal - true if stats are for local media being sent out, false for remote media being received\n * @memberof StatsAnalyzer\n * @returns {void}\n */\n emitStartStopEvents = (\n mediaType: string,\n previousValue: number,\n currentValue: number,\n isLocal: boolean\n ) => {\n if (mediaType !== 'audio' && mediaType !== 'video' && mediaType !== 'share') {\n throw new Error(`Unsupported mediaType: ${mediaType}`);\n }\n\n // eslint-disable-next-line no-param-reassign\n if (previousValue === undefined) previousValue = 0;\n // eslint-disable-next-line no-param-reassign\n if (currentValue === undefined) currentValue = 0;\n\n if (!this.lastEmittedStartStopEvent[mediaType]) {\n this.lastEmittedStartStopEvent[mediaType] = {};\n }\n\n const lastEmittedEvent = isLocal\n ? this.lastEmittedStartStopEvent[mediaType].local\n : this.lastEmittedStartStopEvent[mediaType].remote;\n\n let newEvent;\n\n if (currentValue - previousValue > 0) {\n newEvent = isLocal ? EVENTS.LOCAL_MEDIA_STARTED : EVENTS.REMOTE_MEDIA_STARTED;\n } else if (currentValue === previousValue && currentValue > 0) {\n newEvent = isLocal ? EVENTS.LOCAL_MEDIA_STOPPED : EVENTS.REMOTE_MEDIA_STOPPED;\n }\n\n if (newEvent && lastEmittedEvent !== newEvent) {\n if (isLocal) {\n this.lastEmittedStartStopEvent[mediaType].local = newEvent;\n } else {\n this.lastEmittedStartStopEvent[mediaType].remote = newEvent;\n }\n this.emit(\n {\n file: 'statsAnalyzer/index',\n function: 'compareLastStatsResult',\n },\n newEvent,\n {\n type: mediaType,\n }\n );\n }\n };\n\n /**\n * compares current and previous stats to check if packets are not sent\n *\n * @private\n * @memberof StatsAnalyzer\n * @returns {void}\n */\n private compareLastStatsResult() {\n if (this.lastStatsResults !== null && this.meetingMediaStatus) {\n const getCurrentStatsTotals = (keyPrefix: string, value: string): number =>\n Object.keys(this.statsResults)\n .filter((key) => key.startsWith(keyPrefix))\n .reduce((prev, cur) => prev + (this.statsResults[cur]?.recv[value] || 0), 0);\n\n const getPreviousStatsTotals = (keyPrefix: string, value: string): number =>\n Object.keys(this.statsResults)\n .filter((key) => key.startsWith(keyPrefix))\n .reduce((prev, cur) => prev + (this.lastStatsResults[cur]?.recv[value] || 0), 0);\n\n const getCurrentResolutionsStatsTotals = (keyPrefix: string, value: string): number =>\n Object.keys(this.statsResults)\n .filter((key) => key.startsWith(keyPrefix))\n .reduce((prev, cur) => prev + (this.statsResults.resolutions[cur]?.recv[value] || 0), 0);\n\n const getPreviousResolutionsStatsTotals = (keyPrefix: string, value: string): number =>\n Object.keys(this.statsResults)\n .filter((key) => key.startsWith(keyPrefix))\n .reduce(\n (prev, cur) => prev + (this.lastStatsResults.resolutions[cur]?.recv[value] || 0),\n 0\n );\n\n if (this.meetingMediaStatus.expected.sendAudio && this.lastStatsResults['audio-send']) {\n // compare audio stats sent\n // NOTE: relies on there being only one sender.\n const currentStats = this.statsResults['audio-send'].send;\n const previousStats = this.lastStatsResults['audio-send'].send;\n\n if (\n currentStats.totalPacketsSent === previousStats.totalPacketsSent ||\n currentStats.totalPacketsSent === 0\n ) {\n LoggerProxy.logger.info(\n `StatsAnalyzer:index#compareLastStatsResult --> No audio RTP packets sent`,\n currentStats.totalPacketsSent\n );\n } else {\n if (\n currentStats.totalAudioEnergy === previousStats.totalAudioEnergy ||\n currentStats.totalAudioEnergy === 0\n ) {\n LoggerProxy.logger.info(\n `StatsAnalyzer:index#compareLastStatsResult --> No audio Energy present`,\n currentStats.totalAudioEnergy\n );\n }\n\n if (currentStats.audioLevel === 0) {\n LoggerProxy.logger.info(\n `StatsAnalyzer:index#compareLastStatsResult --> audio level is 0 for the user`\n );\n }\n }\n\n this.emitStartStopEvents(\n 'audio',\n previousStats.totalPacketsSent,\n currentStats.totalPacketsSent,\n true\n );\n }\n\n if (this.meetingMediaStatus.expected.receiveAudio) {\n // compare audio stats received\n const currentPacketsReceived = getCurrentStatsTotals('audio-recv', 'totalPacketsReceived');\n const previousPacketsReceived = getPreviousStatsTotals(\n 'audio-recv',\n 'totalPacketsReceived'\n );\n const currentSamplesReceived = getCurrentStatsTotals('audio-recv', 'totalSamplesReceived');\n const previousSamplesReceived = getPreviousStatsTotals(\n 'audio-recv',\n 'totalSamplesReceived'\n );\n\n if (currentPacketsReceived === previousPacketsReceived || currentPacketsReceived === 0) {\n LoggerProxy.logger.info(\n `StatsAnalyzer:index#compareLastStatsResult --> No audio RTP packets received`,\n currentPacketsReceived\n );\n } else if (\n currentSamplesReceived === previousSamplesReceived ||\n currentSamplesReceived === 0\n ) {\n LoggerProxy.logger.info(\n `StatsAnalyzer:index#compareLastStatsResult --> No audio samples received`,\n currentSamplesReceived\n );\n }\n\n this.emitStartStopEvents('audio', previousPacketsReceived, currentPacketsReceived, false);\n }\n\n if (this.meetingMediaStatus.expected.sendVideo && this.lastStatsResults['video-send']) {\n // compare video stats sent\n const currentStats = this.statsResults['video-send'].send;\n const previousStats = this.lastStatsResults['video-send'].send;\n\n if (\n currentStats.totalPacketsSent === previousStats.totalPacketsSent ||\n currentStats.totalPacketsSent === 0\n ) {\n LoggerProxy.logger.info(\n `StatsAnalyzer:index#compareLastStatsResult --> No video RTP packets sent`,\n currentStats.totalPacketsSent\n );\n } else {\n if (\n currentStats.framesEncoded === previousStats.framesEncoded ||\n currentStats.framesEncoded === 0\n ) {\n LoggerProxy.logger.info(\n `StatsAnalyzer:index#compareLastStatsResult --> No video Frames Encoded`,\n currentStats.framesEncoded\n );\n }\n\n if (\n this.statsResults.resolutions['video-send'].send.framesSent ===\n this.lastStatsResults.resolutions['video-send'].send.framesSent ||\n this.statsResults.resolutions['video-send'].send.framesSent === 0\n ) {\n LoggerProxy.logger.info(\n `StatsAnalyzer:index#compareLastStatsResult --> No video Frames sent`,\n this.statsResults.resolutions['video-send'].send.framesSent\n );\n }\n }\n\n this.emitStartStopEvents('video', previousStats.framesSent, currentStats.framesSent, true);\n }\n\n if (this.meetingMediaStatus.expected.receiveVideo) {\n // compare video stats received\n const currentPacketsReceived = getCurrentStatsTotals('video-recv', 'totalPacketsReceived');\n const previousPacketsReceived = getPreviousStatsTotals(\n 'video-recv',\n 'totalPacketsReceived'\n );\n const currentFramesReceived = getCurrentResolutionsStatsTotals(\n 'video-recv',\n 'framesReceived'\n );\n const previousFramesReceived = getPreviousResolutionsStatsTotals(\n 'video-recv',\n 'framesReceived'\n );\n const currentFramesDecoded = getCurrentStatsTotals('video-recv', 'framesDecoded');\n const previousFramesDecoded = getPreviousStatsTotals('video-recv', 'framesDecoded');\n const currentFramesDropped = getCurrentResolutionsStatsTotals(\n 'video-recv',\n 'framesDropped'\n );\n const previousFramesDropped = getPreviousResolutionsStatsTotals(\n 'video-recv',\n 'framesDropped'\n );\n\n if (currentPacketsReceived === previousPacketsReceived || currentPacketsReceived === 0) {\n LoggerProxy.logger.info(\n `StatsAnalyzer:index#compareLastStatsResult --> No video RTP packets received`,\n currentPacketsReceived\n );\n } else {\n if (currentFramesReceived === previousFramesReceived || currentFramesReceived === 0) {\n LoggerProxy.logger.info(\n `StatsAnalyzer:index#compareLastStatsResult --> No video frames received`,\n currentFramesReceived\n );\n }\n\n if (currentFramesDecoded === previousFramesDecoded || currentFramesDecoded === 0) {\n LoggerProxy.logger.info(\n `StatsAnalyzer:index#compareLastStatsResult --> No video frames decoded`,\n currentFramesDecoded\n );\n }\n\n if (currentFramesDropped - previousFramesDropped > 10) {\n LoggerProxy.logger.info(\n `StatsAnalyzer:index#compareLastStatsResult --> video frames are getting dropped`,\n currentFramesDropped - previousFramesDropped\n );\n }\n }\n\n this.emitStartStopEvents('video', previousFramesDecoded, currentFramesDecoded, false);\n }\n\n if (this.meetingMediaStatus.expected.sendShare && this.lastStatsResults['video-share-send']) {\n // compare share stats sent\n\n const currentStats = this.statsResults['video-share-send'].send;\n const previousStats = this.lastStatsResults['video-share-send'].send;\n\n if (\n currentStats.totalPacketsSent === previousStats.totalPacketsSent ||\n currentStats.totalPacketsSent === 0\n ) {\n LoggerProxy.logger.info(\n `StatsAnalyzer:index#compareLastStatsResult --> No share RTP packets sent`,\n currentStats.totalPacketsSent\n );\n } else {\n if (\n currentStats.framesEncoded === previousStats.framesEncoded ||\n currentStats.framesEncoded === 0\n ) {\n LoggerProxy.logger.info(\n `StatsAnalyzer:index#compareLastStatsResult --> No share frames getting encoded`,\n currentStats.framesEncoded\n );\n }\n\n if (\n this.statsResults.resolutions['video-share-send'].send.framesSent ===\n this.lastStatsResults.resolutions['video-share-send'].send.framesSent ||\n this.statsResults.resolutions['video-share-send'].send.framesSent === 0\n ) {\n LoggerProxy.logger.info(\n `StatsAnalyzer:index#compareLastStatsResult --> No share frames sent`,\n this.statsResults.resolutions['video-share-send'].send.framesSent\n );\n }\n }\n }\n\n if (this.meetingMediaStatus.expected.sendShare) {\n // TODO:need to check receive share value\n // compare share stats received\n const currentPacketsReceived = getCurrentStatsTotals(\n 'video-share-recv',\n 'totalPacketsReceived'\n );\n const previousPacketsReceived = getPreviousStatsTotals(\n 'video-share-recv',\n 'totalPacketsReceived'\n );\n const currentFramesReceived = getCurrentResolutionsStatsTotals(\n 'video-share-recv',\n 'framesReceived'\n );\n const previousFramesReceived = getPreviousResolutionsStatsTotals(\n 'video-share-recv',\n 'framesReceived'\n );\n const currentFramesDecoded = getCurrentStatsTotals('video-share-recv', 'framesDecoded');\n const previousFramesDecoded = getPreviousStatsTotals('video-share-recv', 'framesDecoded');\n const currentFramesDropped = getCurrentResolutionsStatsTotals(\n 'video-share-recv',\n 'framesDropped'\n );\n const previousFramesDropped = getPreviousResolutionsStatsTotals(\n 'video-share-recv',\n 'framesDropped'\n );\n\n if (currentPacketsReceived === previousPacketsReceived || currentPacketsReceived === 0) {\n LoggerProxy.logger.info(\n `StatsAnalyzer:index#compareLastStatsResult --> No share RTP packets received`,\n currentPacketsReceived\n );\n } else {\n if (currentFramesReceived === previousFramesReceived || currentFramesReceived === 0) {\n LoggerProxy.logger.info(\n `StatsAnalyzer:index#compareLastStatsResult --> No share frames received`,\n currentFramesReceived\n );\n }\n\n if (currentFramesDecoded === previousFramesDecoded || currentFramesDecoded === 0) {\n LoggerProxy.logger.info(\n `StatsAnalyzer:index#compareLastStatsResult --> No share frames decoded`,\n currentFramesDecoded\n );\n }\n\n if (currentFramesDropped - previousFramesDropped > 10) {\n LoggerProxy.logger.info(\n `StatsAnalyzer:index#compareLastStatsResult --> share frames are getting dropped`,\n currentFramesDropped - previousFramesDropped\n );\n }\n }\n\n // we are not calling emitStartStopEvents() for sending or receiving share because sharing is often started and stopped\n // in meetings and this.meetingMediaStatus.expected values can be out of sync with the actual packet flow\n // so we would send \"sharing stopped\" events incorrectly\n }\n }\n }\n\n /**\n * Does a `getStats` on all the transceivers and parses the results\n *\n * @private\n * @memberof StatsAnalyzer\n * @returns {Promise}\n */\n private getStatsAndParse() {\n if (!this.mediaConnection) {\n return Promise.resolve();\n }\n\n if (\n this.mediaConnection &&\n this.mediaConnection.getConnectionState() === ConnectionState.Failed\n ) {\n LoggerProxy.logger.trace(\n 'StatsAnalyzer:index#getStatsAndParse --> media connection is in failed state'\n );\n\n return Promise.resolve();\n }\n\n LoggerProxy.logger.trace('StatsAnalyzer:index#getStatsAndParse --> Collecting Stats');\n\n return this.mediaConnection.getTransceiverStats().then((transceiverStats) => {\n transceiverStats.video.receivers.forEach((receiver, i) =>\n this.filterAndParseGetStatsResults(receiver, `video-recv-${i}`, false)\n );\n transceiverStats.audio.receivers.forEach((receiver, i) =>\n this.filterAndParseGetStatsResults(receiver, `audio-recv-${i}`, false)\n );\n transceiverStats.screenShareVideo.receivers.forEach((receiver, i) =>\n this.filterAndParseGetStatsResults(receiver, `video-share-recv-${i}`, false)\n );\n transceiverStats.screenShareAudio.receivers.forEach((receiver, i) =>\n this.filterAndParseGetStatsResults(receiver, `audio-share-recv-${i}`, false)\n );\n\n transceiverStats.video.senders.forEach((sender, i) => {\n if (i > 0) {\n throw new Error('Stats Analyzer does not support multiple senders.');\n }\n this.filterAndParseGetStatsResults(sender, 'video-send', true);\n });\n transceiverStats.audio.senders.forEach((sender, i) => {\n if (i > 0) {\n throw new Error('Stats Analyzer does not support multiple senders.');\n }\n this.filterAndParseGetStatsResults(sender, 'audio-send', true);\n });\n transceiverStats.screenShareVideo.senders.forEach((sender, i) => {\n if (i > 0) {\n throw new Error('Stats Analyzer does not support multiple senders.');\n }\n this.filterAndParseGetStatsResults(sender, 'video-share-send', true);\n });\n transceiverStats.screenShareAudio.senders.forEach((sender, i) => {\n if (i > 0) {\n throw new Error('Stats Analyzer does not support multiple senders.');\n }\n this.filterAndParseGetStatsResults(sender, 'audio-share-send', true);\n });\n\n this.compareLastStatsResult();\n\n // Save the last results to compare with the current\n // DO Deep copy, for some reason it takes the reference all the time rather then old value set\n this.lastStatsResults = JSON.parse(JSON.stringify(this.statsResults));\n\n LoggerProxy.logger.trace(\n 'StatsAnalyzer:index#getStatsAndParse --> Finished Collecting Stats'\n );\n });\n }\n\n /**\n * Processes OutboundRTP stats result and stores\n * @private\n * @param {*} result\n * @param {*} mediaType\n * @returns {void}\n */\n private processOutboundRTPResult(result: any, mediaType: any) {\n const sendrecvType = STATS.SEND_DIRECTION;\n\n if (result.bytesSent) {\n let kilobytes = 0;\n\n if (result.frameWidth && result.frameHeight) {\n this.statsResults.resolutions[mediaType][sendrecvType].width = result.frameWidth;\n this.statsResults.resolutions[mediaType][sendrecvType].height = result.frameHeight;\n this.statsResults.resolutions[mediaType][sendrecvType].framesSent = result.framesSent;\n this.statsResults.resolutions[mediaType][sendrecvType].hugeFramesSent =\n result.hugeFramesSent;\n }\n\n if (!this.statsResults.internal[mediaType][sendrecvType].prevBytesSent) {\n this.statsResults.internal[mediaType][sendrecvType].prevBytesSent = result.bytesSent;\n }\n if (!this.statsResults.internal[mediaType][sendrecvType].framesEncoded) {\n this.statsResults.internal[mediaType][sendrecvType].framesEncoded = result.framesEncoded;\n }\n if (!this.statsResults.internal[mediaType][sendrecvType].keyFramesEncoded) {\n this.statsResults.internal[mediaType][sendrecvType].keyFramesEncoded =\n result.keyFramesEncoded;\n }\n\n const bytes =\n result.bytesSent - this.statsResults.internal[mediaType][sendrecvType].prevBytesSent;\n\n this.statsResults.internal[mediaType][sendrecvType].prevBytesSent = result.bytesSent;\n\n kilobytes = bytes / 1024;\n\n this.statsResults[mediaType][sendrecvType].availableBandwidth = kilobytes.toFixed(1);\n this.statsResults[mediaType].bytesSent = kilobytes;\n\n this.statsResults[mediaType][sendrecvType].framesEncoded =\n result.framesEncoded - this.statsResults.internal[mediaType][sendrecvType].framesEncoded;\n this.statsResults[mediaType][sendrecvType].keyFramesEncoded =\n result.keyFramesEncoded -\n this.statsResults.internal[mediaType][sendrecvType].keyFramesEncoded;\n this.statsResults.internal[mediaType].outboundRtpId = result.id;\n\n if (!this.statsResults.internal[mediaType][sendrecvType].packetsSent) {\n this.statsResults.internal[mediaType][sendrecvType].packetsSent = result.packetsSent;\n }\n\n this.statsResults[mediaType][sendrecvType].packetsSent =\n result.packetsSent - this.statsResults.internal[mediaType][sendrecvType].packetsSent;\n this.statsResults.internal[mediaType][sendrecvType].packetsSent = result.packetsSent;\n\n // Data saved to send MQA metrics\n\n this.statsResults[mediaType][sendrecvType].totalKeyFramesEncoded = result.keyFramesEncoded;\n this.statsResults[mediaType][sendrecvType].totalNackCount = result.nackCount;\n this.statsResults[mediaType][sendrecvType].totalPliCount = result.pliCount;\n this.statsResults[mediaType][sendrecvType].totalPacketsSent = result.packetsSent;\n this.statsResults[mediaType][sendrecvType].totalFirCount = result.firCount;\n this.statsResults[mediaType][sendrecvType].framesSent = result.framesSent;\n this.statsResults[mediaType][sendrecvType].framesEncoded = result.framesEncoded;\n this.statsResults[mediaType][sendrecvType].encoderImplementation =\n result.encoderImplementation;\n this.statsResults[mediaType][sendrecvType].qualityLimitationReason =\n result.qualityLimitationReason;\n this.statsResults[mediaType][sendrecvType].qualityLimitationResolutionChanges =\n result.qualityLimitationResolutionChanges;\n this.statsResults[mediaType][sendrecvType].retransmittedPacketsSent =\n result.retransmittedPacketsSent;\n this.statsResults[mediaType][sendrecvType].totalBytesSent = result.bytesSent;\n this.statsResults[mediaType][sendrecvType].headerBytesSent = result.headerBytesSent;\n this.statsResults[mediaType][sendrecvType].retransmittedBytesSent =\n result.retransmittedBytesSent;\n }\n }\n\n /**\n * Processes InboundRTP stats result and stores\n * @private\n * @param {*} result\n * @param {*} mediaType\n * @returns {void}\n */\n private processInboundRTPResult(result: any, mediaType: any) {\n const sendrecvType = STATS.RECEIVE_DIRECTION;\n\n if (result.bytesReceived) {\n let kilobytes = 0;\n const receiveSlot = this.receiveSlotCallback(result.ssrc);\n const idAndCsi = receiveSlot\n ? `id: \"${receiveSlot.id || ''}\"${receiveSlot.csi ? ` and csi: ${receiveSlot.csi}` : ''}`\n : '';\n\n if (result.frameWidth && result.frameHeight) {\n this.statsResults.resolutions[mediaType][sendrecvType].width = result.frameWidth;\n this.statsResults.resolutions[mediaType][sendrecvType].height = result.frameHeight;\n this.statsResults.resolutions[mediaType][sendrecvType].framesReceived =\n result.framesReceived;\n }\n\n if (!this.statsResults.internal[mediaType][sendrecvType].prevBytesReceived) {\n this.statsResults.internal[mediaType][sendrecvType].prevBytesReceived =\n result.bytesReceived;\n }\n\n if (!this.statsResults.internal[mediaType][sendrecvType].pliCount) {\n this.statsResults.internal[mediaType][sendrecvType].pliCount = result.pliCount;\n }\n\n if (!this.statsResults.internal[mediaType][sendrecvType].packetsLost) {\n this.statsResults.internal[mediaType][sendrecvType].packetsLost = result.packetsLost;\n }\n\n if (!this.statsResults.internal[mediaType][sendrecvType].totalPacketsReceived) {\n this.statsResults.internal[mediaType][sendrecvType].totalPacketsReceived =\n result.packetsReceived;\n }\n\n if (!this.statsResults.internal[mediaType][sendrecvType].lastPacketReceivedTimestamp) {\n this.statsResults.internal[mediaType][sendrecvType].lastPacketReceivedTimestamp =\n result.lastPacketReceivedTimestamp;\n }\n\n const bytes =\n result.bytesReceived -\n this.statsResults.internal[mediaType][sendrecvType].prevBytesReceived;\n\n this.statsResults.internal[mediaType][sendrecvType].prevBytesReceived = result.bytesReceived;\n\n kilobytes = bytes / 1024;\n this.statsResults[mediaType][sendrecvType].availableBandwidth = kilobytes.toFixed(1);\n this.statsResults[mediaType].bytesReceived = kilobytes.toFixed(1);\n\n this.statsResults[mediaType][sendrecvType].pliCount =\n result.pliCount - this.statsResults.internal[mediaType][sendrecvType].pliCount;\n this.statsResults[mediaType][sendrecvType].currentPacketsLost =\n result.packetsLost - this.statsResults.internal[mediaType][sendrecvType].packetsLost;\n if (this.statsResults[mediaType][sendrecvType].currentPacketsLost < 0) {\n this.statsResults[mediaType][sendrecvType].currentPacketsLost = 0;\n }\n\n this.statsResults[mediaType][sendrecvType].packetsReceived =\n result.packetsReceived -\n this.statsResults.internal[mediaType][sendrecvType].totalPacketsReceived;\n this.statsResults.internal[mediaType][sendrecvType].totalPacketsReceived =\n result.packetsReceived;\n\n if (this.statsResults[mediaType][sendrecvType].packetsReceived === 0) {\n if (receiveSlot) {\n LoggerProxy.logger.info(\n `StatsAnalyzer:index#processInboundRTPResult --> No packets received for receive slot ${idAndCsi}`,\n this.statsResults[mediaType][sendrecvType].packetsReceived\n );\n }\n }\n\n // Check the over all packet Lost ratio\n this.statsResults[mediaType][sendrecvType].currentPacketLossRatio =\n this.statsResults[mediaType][sendrecvType].currentPacketsLost > 0\n ? this.statsResults[mediaType][sendrecvType].currentPacketsLost /\n (this.statsResults[mediaType][sendrecvType].packetsReceived +\n this.statsResults[mediaType][sendrecvType].currentPacketsLost)\n : 0;\n if (this.statsResults[mediaType][sendrecvType].currentPacketLossRatio > 3) {\n LoggerProxy.logger.info(\n `StatsAnalyzer:index#processInboundRTPResult --> Packets getting lost from the receiver with slot ${idAndCsi}`,\n this.statsResults[mediaType][sendrecvType].currentPacketLossRatio\n );\n }\n\n // TODO: check the packet loss value is negative values here\n\n if (result.packetsLost) {\n this.statsResults[mediaType][sendrecvType].totalPacketsLost =\n result.packetsLost > 0 ? result.packetsLost : -result.packetsLost;\n } else {\n this.statsResults[mediaType][sendrecvType].totalPacketsLost = 0;\n }\n\n this.statsResults[mediaType][sendrecvType].lastPacketReceivedTimestamp =\n result.lastPacketReceivedTimestamp;\n\n // From Thin\n this.statsResults[mediaType][sendrecvType].totalNackCount = result.nackCount;\n this.statsResults[mediaType][sendrecvType].totalPliCount = result.pliCount;\n this.statsResults[mediaType][sendrecvType].framesDecoded = result.framesDecoded;\n this.statsResults[mediaType][sendrecvType].keyFramesDecoded = result.keyFramesDecoded;\n\n this.statsResults[mediaType][sendrecvType].decoderImplementation =\n result.decoderImplementation;\n this.statsResults[mediaType][sendrecvType].totalPacketsReceived = result.packetsReceived;\n\n this.statsResults[mediaType][sendrecvType].fecPacketsDiscarded = result.fecPacketsDiscarded;\n this.statsResults[mediaType][sendrecvType].fecPacketsReceived = result.fecPacketsReceived;\n this.statsResults[mediaType][sendrecvType].totalBytesReceived = result.bytesReceived;\n this.statsResults[mediaType][sendrecvType].headerBytesReceived = result.headerBytesReceived;\n\n this.statsResults[mediaType][sendrecvType].meanRtpJitter.push(result.jitter);\n\n // Audio stats\n\n this.statsResults[mediaType][sendrecvType].audioLevel = result.audioLevel;\n this.statsResults[mediaType][sendrecvType].totalAudioEnergy = result.totalAudioEnergy;\n this.statsResults[mediaType][sendrecvType].totalSamplesReceived =\n result.totalSamplesReceived || 0;\n this.statsResults[mediaType][sendrecvType].totalSamplesDecoded =\n result.totalSamplesDecoded || 0;\n this.statsResults[mediaType][sendrecvType].concealedSamples = result.concealedSamples || 0;\n }\n }\n\n /**\n * Processes remote and local candidate result and stores\n * @private\n * @param {*} result\n * @param {*} type\n * @param {boolean} isSender\n * @param {boolean} isRemote\n *\n * @returns {void}\n */\n parseCandidate = (result: any, type: any, isSender: boolean, isRemote: boolean) => {\n if (!result || !result.id) {\n return;\n }\n\n // We only care about the successful local candidate\n if (this.successfulCandidatePair?.localCandidateId !== result.id) {\n return;\n }\n\n let transport;\n if (result.relayProtocol) {\n transport = result.relayProtocol.toUpperCase();\n } else if (result.protocol) {\n transport = result.protocol.toUpperCase();\n }\n\n const sendRecvType = isSender ? STATS.SEND_DIRECTION : STATS.RECEIVE_DIRECTION;\n const ipType = isRemote ? STATS.REMOTE : STATS.LOCAL;\n\n this.statsResults.internal.candidates[result.id] = {\n candidateType: result.candidateType,\n ipAddress: result.ip, // TODO: add ports\n portNumber: result.port,\n networkType: result.networkType,\n priority: result.priority,\n transport,\n timestamp: result.time,\n id: result.id,\n type: result.type,\n };\n\n this.statsResults.connectionType[ipType].candidateType = result.candidateType;\n this.statsResults.connectionType[ipType].ipAddress = result.ipAddress;\n\n this.statsResults.connectionType[ipType].networkType =\n result.networkType === NETWORK_TYPE.VPN ? NETWORK_TYPE.UNKNOWN : result.networkType;\n this.statsResults.connectionType[ipType].transport = transport;\n\n this.statsResults[type][sendRecvType].totalRoundTripTime = result.totalRoundTripTime;\n };\n\n /**\n * Process Track results\n *\n * @private\n * @param {*} result\n * @param {*} mediaType\n * @returns {void}\n * @memberof StatsAnalyzer\n */\n private processTrackResult(result: any, mediaType: any) {\n if (!result || result.type !== 'track') {\n return;\n }\n\n const sendrecvType =\n result.remoteSource === true ? STATS.RECEIVE_DIRECTION : STATS.SEND_DIRECTION;\n\n if (sendrecvType === STATS.RECEIVE_DIRECTION) {\n this.statsResults.resolutions[mediaType][sendrecvType].framesReceived = result.framesReceived;\n this.statsResults.resolutions[mediaType][sendrecvType].framesDecoded = result.framesDecoded;\n this.statsResults.resolutions[mediaType][sendrecvType].framesDropped = result.framesDropped;\n }\n\n if (result.trackIdentifier && !mediaType.includes('audio')) {\n this.statsResults.resolutions[mediaType][sendrecvType].trackIdentifier =\n result.trackIdentifier;\n\n const jitterBufferDelay = result && result.jitterBufferDelay;\n const jitterBufferEmittedCount = result && result.jitterBufferEmittedCount;\n\n this.statsResults.resolutions[mediaType][sendrecvType].avgJitterDelay =\n jitterBufferEmittedCount && +jitterBufferDelay / +jitterBufferEmittedCount;\n\n // Used to calculate the jitter\n this.statsResults.resolutions[mediaType][sendrecvType].jitterBufferDelay =\n result.jitterBufferDelay;\n this.statsResults.resolutions[mediaType][sendrecvType].jitterBufferEmittedCount =\n result.jitterBufferEmittedCount;\n }\n }\n\n /**\n *\n * @private\n * @param {*} result\n * @param {*} type\n * @returns {void}\n * @memberof StatsAnalyzer\n */\n compareSentAndReceived(result, type) {\n // Don't compare on transceivers without a sender.\n if (!type || !this.statsResults.internal[type].send) {\n return;\n }\n\n const mediaType = type;\n\n if (!this.statsResults.internal[mediaType].send.totalPacketsLostOnReceiver) {\n this.statsResults.internal[mediaType].send.totalPacketsLostOnReceiver = result.packetsLost;\n }\n\n const currentPacketLoss =\n result.packetsLost - this.statsResults.internal[mediaType].send.totalPacketsLostOnReceiver;\n\n this.statsResults.internal[mediaType].send.totalPacketsLostOnReceiver = result.packetsLost;\n this.statsResults[mediaType].send.packetsLostOnReceiver = currentPacketLoss;\n this.statsResults[mediaType].send.totalPacketsLostOnReceiver = result.packetsLost;\n\n this.statsResults[mediaType].send.meanRemoteJitter.push(result.jitter);\n this.statsResults[mediaType].send.meanRoundTripTime.push(result.roundTripTime);\n\n this.statsResults[mediaType].send.timestamp = result.timestamp;\n this.statsResults[mediaType].send.ssrc = result.ssrc;\n this.statsResults[mediaType].send.reportsReceived = result.reportsReceived;\n\n // Total packloss ratio on this video section of the call\n this.statsResults[mediaType].send.overAllPacketLossRatio =\n this.statsResults[mediaType].send.totalPacketsLostOnReceiver > 0\n ? this.statsResults[mediaType].send.totalPacketsLostOnReceiver /\n this.statsResults[mediaType].send.totalPacketsSent\n : 0;\n this.statsResults[mediaType].send.currentPacketLossRatio =\n this.statsResults[mediaType].send.packetsLostOnReceiver > 0\n ? (this.statsResults[mediaType].send.packetsLostOnReceiver * 100) /\n (this.statsResults[mediaType].send.packetsSent +\n this.statsResults[mediaType].send.packetsLostOnReceiver)\n : 0;\n\n if (\n this.statsResults[mediaType].send.maxPacketLossRatio <\n this.statsResults[mediaType].send.currentPacketLossRatio\n ) {\n this.statsResults[mediaType].send.maxPacketLossRatio =\n this.statsResults[mediaType].send.currentPacketLossRatio;\n }\n\n if (result.type === 'remote-inbound-rtp') {\n this.networkQualityMonitor.determineUplinkNetworkQuality({\n mediaType,\n remoteRtpResults: result,\n statsAnalyzerCurrentStats: this.statsResults,\n });\n }\n }\n}\n"],"mappings":"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"}
|
|
1
|
+
{"version":3,"names":["EVENTS","MEDIA_QUALITY","LOCAL_MEDIA_STARTED","LOCAL_MEDIA_STOPPED","REMOTE_MEDIA_STARTED","REMOTE_MEDIA_STOPPED","emptySender","trackLabel","maxPacketLossRatio","availableBandwidth","bytesSent","meanRemoteJitter","meanRoundTripTime","emptyReceiver","bytesReceived","meanRtpJitter","StatsAnalyzer","config","receiveSlotCallback","undefined","networkQualityMonitor","statsResults","defaultStats","mediaType","previousValue","currentValue","isLocal","Error","lastEmittedStartStopEvent","lastEmittedEvent","local","remote","newEvent","emit","file","function","type","result","isSender","isRemote","id","successfulCandidatePair","localCandidateId","transport","relayProtocol","toUpperCase","protocol","sendRecvType","STATS","SEND_DIRECTION","RECEIVE_DIRECTION","ipType","REMOTE","LOCAL","internal","candidates","candidateType","ipAddress","ip","portNumber","port","networkType","priority","timestamp","time","connectionType","NETWORK_TYPE","VPN","UNKNOWN","totalRoundTripTime","statsStarted","lastStatsResults","correlationId","mqaSentCount","lastMqaDataSent","resolutions","forEach","includes","recv","send","status","meetingMediaStatus","newMqa","emptyMqaInterval","audioSender","emptyAudioTransmit","getAudioSenderMqa","audioTransmit","push","audioReceiver","emptyAudioReceive","getAudioReceiverMqa","audioReceive","videoSender","emptyVideoTransmit","getVideoSenderMqa","videoTransmit","videoReceiver","emptyVideoReceive","getVideoReceiverMqa","videoReceive","intervalMetadata","peerReflexiveIP","peripherals","information","_UNKNOWN_","name","MEDIA_DEVICES","SPEAKER","MICROPHONE","CAMERA","intervalNumber","resetStatsResults","data","mediaConnection","getStatsAndParse","then","statsInterval","setInterval","analyzerInterval","sendMqaData","mqaInterval","MQA_INTEVAL","resolve","sendOneLastMqa","clearInterval","getStatsResult","processOutboundRTPResult","processInboundRTPResult","processTrackResult","compareSentAndReceived","parseCandidate","parseAudioSource","statsItem","types","DEFAULT_GET_STATS_FILTER","report","state","parseGetStatsResult","direction","currentDirection","localTrackLabel","csi","audioLevel","totalAudioEnergy","getCurrentStatsTotals","keyPrefix","value","filter","key","startsWith","reduce","prev","cur","getPreviousStatsTotals","getCurrentResolutionsStatsTotals","getPreviousResolutionsStatsTotals","expected","sendAudio","currentStats","previousStats","totalPacketsSent","LoggerProxy","logger","info","emitStartStopEvents","receiveAudio","currentPacketsReceived","previousPacketsReceived","currentSamplesReceived","previousSamplesReceived","sendVideo","framesEncoded","framesSent","receiveVideo","currentFramesReceived","previousFramesReceived","currentFramesDecoded","previousFramesDecoded","currentFramesDropped","previousFramesDropped","sendShare","getConnectionState","ConnectionState","Failed","trace","getTransceiverStats","transceiverStats","video","receivers","receiver","i","filterAndParseGetStatsResults","audio","screenShareVideo","screenShareAudio","senders","sender","compareLastStatsResult","JSON","parse","sendrecvType","kilobytes","frameWidth","frameHeight","width","height","hugeFramesSent","prevBytesSent","keyFramesEncoded","bytes","toFixed","outboundRtpId","packetsSent","totalKeyFramesEncoded","totalNackCount","nackCount","totalPliCount","pliCount","totalFirCount","firCount","encoderImplementation","qualityLimitationReason","qualityLimitationResolutionChanges","retransmittedPacketsSent","totalBytesSent","headerBytesSent","retransmittedBytesSent","receiveSlot","ssrc","idAndCsi","framesReceived","prevBytesReceived","packetsLost","totalPacketsReceived","packetsReceived","lastPacketReceivedTimestamp","currentPacketsLost","currentPacketLossRatio","totalPacketsLost","framesDecoded","keyFramesDecoded","decoderImplementation","fecPacketsDiscarded","fecPacketsReceived","totalBytesReceived","headerBytesReceived","jitter","totalSamplesReceived","totalSamplesDecoded","concealedSamples","remoteSource","framesDropped","trackIdentifier","jitterBufferDelay","jitterBufferEmittedCount","avgJitterDelay","totalPacketsLostOnReceiver","currentPacketLoss","packetsLostOnReceiver","roundTripTime","reportsReceived","overAllPacketLossRatio","determineUplinkNetworkQuality","remoteRtpResults","statsAnalyzerCurrentStats","EventsScope"],"sources":["index.ts"],"sourcesContent":["/* eslint-disable prefer-destructuring */\n\nimport {cloneDeep} from 'lodash';\nimport {ConnectionState} from '@webex/internal-media-core';\n\nimport EventsScope from '../common/events/events-scope';\nimport {\n DEFAULT_GET_STATS_FILTER,\n STATS,\n MQA_INTEVAL,\n NETWORK_TYPE,\n MEDIA_DEVICES,\n _UNKNOWN_,\n} from '../constants';\nimport {\n emptyAudioReceive,\n emptyAudioTransmit,\n emptyMqaInterval,\n emptyVideoReceive,\n emptyVideoTransmit,\n} from '../mediaQualityMetrics/config';\nimport LoggerProxy from '../common/logs/logger-proxy';\n\nimport defaultStats from './global';\nimport {\n getAudioSenderMqa,\n getAudioReceiverMqa,\n getVideoSenderMqa,\n getVideoReceiverMqa,\n} from './mqaUtil';\nimport {ReceiveSlot} from '../multistream/receiveSlot';\n\nexport const EVENTS = {\n MEDIA_QUALITY: 'MEDIA_QUALITY',\n LOCAL_MEDIA_STARTED: 'LOCAL_MEDIA_STARTED',\n LOCAL_MEDIA_STOPPED: 'LOCAL_MEDIA_STOPPED',\n REMOTE_MEDIA_STARTED: 'REMOTE_MEDIA_STARTED',\n REMOTE_MEDIA_STOPPED: 'REMOTE_MEDIA_STOPPED',\n};\n\nconst emptySender = {\n trackLabel: '',\n maxPacketLossRatio: 0,\n availableBandwidth: 0,\n bytesSent: 0,\n meanRemoteJitter: [],\n meanRoundTripTime: [],\n};\n\nconst emptyReceiver = {\n availableBandwidth: 0,\n bytesReceived: 0,\n meanRtpJitter: [],\n meanRoundTripTime: [],\n};\n\ntype ReceiveSlotCallback = (csi: number) => ReceiveSlot | undefined;\n\n/**\n * Stats Analyzer class that will emit events based on detected quality\n *\n * @export\n * @class StatsAnalyzer\n * @extends {EventsScope}\n */\nexport class StatsAnalyzer extends EventsScope {\n config: any;\n correlationId: any;\n lastEmittedStartStopEvent: any;\n lastMqaDataSent: any;\n lastStatsResults: any;\n meetingMediaStatus: any;\n mqaInterval: NodeJS.Timeout;\n mqaSentCount: any;\n networkQualityMonitor: any;\n mediaConnection: any;\n statsInterval: NodeJS.Timeout;\n statsResults: any;\n statsStarted: any;\n successfulCandidatePair: any;\n receiveSlotCallback: ReceiveSlotCallback;\n\n /**\n * Creates a new instance of StatsAnalyzer\n * @constructor\n * @public\n * @param {Object} config SDK Configuration Object\n * @param {Function} receiveSlotCallback Callback used to access receive slots.\n * @param {Object} networkQualityMonitor class for assessing network characteristics (jitter, packetLoss, latency)\n * @param {Object} statsResults Default properties for stats\n */\n constructor(\n config: any,\n receiveSlotCallback: ReceiveSlotCallback = () => undefined,\n networkQualityMonitor: object = {},\n statsResults: object = defaultStats\n ) {\n super();\n this.statsStarted = false;\n this.statsResults = statsResults;\n this.lastStatsResults = null;\n this.config = config;\n this.networkQualityMonitor = networkQualityMonitor;\n this.correlationId = config.correlationId;\n this.mqaSentCount = -1;\n this.lastMqaDataSent = {resolutions: {}};\n this.lastEmittedStartStopEvent = {};\n this.receiveSlotCallback = receiveSlotCallback;\n this.successfulCandidatePair = {};\n }\n\n /**\n * Resets cumulative stats arrays.\n *\n * @public\n * @memberof StatsAnalyzer\n * @returns {void}\n */\n resetStatsResults() {\n Object.keys(this.statsResults).forEach((mediaType) => {\n if (mediaType.includes('recv')) {\n this.statsResults[mediaType].recv.meanRtpJitter = [];\n }\n\n if (mediaType.includes('send')) {\n this.statsResults[mediaType].send.meanRemoteJitter = [];\n this.statsResults[mediaType].send.meanRoundTripTime = [];\n }\n });\n }\n\n /**\n * sets mediaStatus status for analyzing metrics\n *\n * @public\n * @param {Object} status for the audio and video\n * @memberof StatsAnalyzer\n * @returns {void}\n */\n public updateMediaStatus(status: object) {\n this.meetingMediaStatus = status;\n }\n\n /**\n * captures MQA data from media connection\n *\n * @public\n * @memberof StatsAnalyzer\n * @returns {void}\n */\n sendMqaData() {\n const newMqa = cloneDeep(emptyMqaInterval);\n\n Object.keys(this.statsResults).forEach((mediaType) => {\n if (!this.lastMqaDataSent[mediaType]) {\n this.lastMqaDataSent[mediaType] = {};\n this.lastMqaDataSent.resolutions[mediaType] = {};\n }\n\n if (!this.lastMqaDataSent[mediaType].send && mediaType.includes('-send')) {\n this.lastMqaDataSent[mediaType].send = {};\n this.lastMqaDataSent.resolutions[mediaType].send = {};\n }\n\n if (!this.lastMqaDataSent[mediaType].recv && mediaType.includes('-recv')) {\n this.lastMqaDataSent[mediaType].recv = {};\n this.lastMqaDataSent.resolutions[mediaType].recv = {};\n }\n\n if (mediaType.includes('audio-send') || mediaType.includes('audio-share-send')) {\n const audioSender = cloneDeep(emptyAudioTransmit);\n\n getAudioSenderMqa({\n audioSender,\n statsResults: this.statsResults,\n lastMqaDataSent: this.lastMqaDataSent,\n mediaType,\n });\n newMqa.audioTransmit.push(audioSender);\n\n this.lastMqaDataSent[mediaType].send = cloneDeep(this.statsResults[mediaType].send);\n } else if (mediaType.includes('audio-recv') || mediaType.includes('audio-share-recv')) {\n const audioReceiver = cloneDeep(emptyAudioReceive);\n\n getAudioReceiverMqa({\n audioReceiver,\n statsResults: this.statsResults,\n lastMqaDataSent: this.lastMqaDataSent,\n mediaType,\n });\n newMqa.audioReceive.push(audioReceiver);\n\n this.lastMqaDataSent[mediaType].recv = cloneDeep(this.statsResults[mediaType].recv);\n } else if (mediaType.includes('video-send') || mediaType.includes('video-share-send')) {\n const videoSender = cloneDeep(emptyVideoTransmit);\n\n getVideoSenderMqa({\n videoSender,\n statsResults: this.statsResults,\n lastMqaDataSent: this.lastMqaDataSent,\n mediaType,\n });\n newMqa.videoTransmit.push(videoSender);\n\n this.lastMqaDataSent[mediaType].send = cloneDeep(this.statsResults[mediaType].send);\n this.lastMqaDataSent.resolutions[mediaType].send = cloneDeep(\n this.statsResults.resolutions[mediaType].send\n );\n } else if (mediaType.includes('video-recv') || mediaType.includes('video-share-recv')) {\n const videoReceiver = cloneDeep(emptyVideoReceive);\n\n getVideoReceiverMqa({\n videoReceiver,\n statsResults: this.statsResults,\n lastMqaDataSent: this.lastMqaDataSent,\n mediaType,\n });\n newMqa.videoReceive.push(videoReceiver);\n\n this.lastMqaDataSent[mediaType].recv = cloneDeep(this.statsResults[mediaType].recv);\n this.lastMqaDataSent.resolutions[mediaType].recv = cloneDeep(\n this.statsResults.resolutions[mediaType].recv\n );\n }\n });\n\n newMqa.intervalMetadata.peerReflexiveIP = this.statsResults.connectionType.local.ipAddress;\n\n // Adding peripheral information\n newMqa.intervalMetadata.peripherals.push({information: _UNKNOWN_, name: MEDIA_DEVICES.SPEAKER});\n if (this.statsResults['audio-send']) {\n newMqa.intervalMetadata.peripherals.push({\n information: this.statsResults['audio-send'].trackLabel || _UNKNOWN_,\n name: MEDIA_DEVICES.MICROPHONE,\n });\n }\n if (this.statsResults['video-send']) {\n newMqa.intervalMetadata.peripherals.push({\n information: this.statsResults['video-send'].trackLabel || _UNKNOWN_,\n name: MEDIA_DEVICES.CAMERA,\n });\n }\n\n newMqa.networkType = this.statsResults.connectionType.local.networkType;\n\n this.mqaSentCount += 1;\n\n newMqa.intervalNumber = this.mqaSentCount;\n\n this.resetStatsResults();\n\n this.emit(\n {\n file: 'statsAnalyzer',\n function: 'sendMqaData',\n },\n EVENTS.MEDIA_QUALITY,\n {\n data: newMqa,\n // @ts-ignore\n networkType: newMqa.networkType,\n }\n );\n }\n\n /**\n * updated the media connection when changed\n *\n * @private\n * @memberof StatsAnalyzer\n * @param {RoapMediaConnection} mediaConnection\n * @returns {void}\n */\n updateMediaConnection(mediaConnection: any) {\n this.mediaConnection = mediaConnection;\n }\n\n /**\n * Starts the stats analyzer on interval\n *\n * @public\n * @memberof StatsAnalyzer\n * @param {RoapMediaConnection} mediaConnection\n * @returns {Promise}\n */\n public startAnalyzer(mediaConnection: any) {\n if (!this.statsStarted) {\n this.statsStarted = true;\n this.mediaConnection = mediaConnection;\n\n return this.getStatsAndParse().then(() => {\n this.statsInterval = setInterval(() => {\n this.getStatsAndParse();\n }, this.config.analyzerInterval);\n // Trigger initial fetch\n this.sendMqaData();\n this.mqaInterval = setInterval(() => {\n this.sendMqaData();\n }, MQA_INTEVAL);\n });\n }\n\n return Promise.resolve();\n }\n\n /**\n * Cleans up the analyzer when done\n *\n * @public\n * @memberof StatsAnalyzer\n * @returns {void}\n */\n public stopAnalyzer() {\n const sendOneLastMqa = this.mqaInterval && this.statsInterval;\n\n if (this.statsInterval) {\n clearInterval(this.statsInterval);\n this.statsInterval = undefined;\n }\n\n if (this.mqaInterval) {\n clearInterval(this.mqaInterval);\n this.mqaInterval = undefined;\n }\n\n if (sendOneLastMqa) {\n return this.getStatsAndParse().then(() => {\n this.sendMqaData();\n this.mediaConnection = null;\n });\n }\n\n return Promise.resolve();\n }\n\n /**\n * Parse a single result of get stats\n *\n * @private\n * @param {*} getStatsResult\n * @param {String} type\n * @param {boolean} isSender\n * @returns {void}\n * @memberof StatsAnalyzer\n */\n private parseGetStatsResult(getStatsResult: any, type: string, isSender: boolean) {\n if (!getStatsResult) {\n return;\n }\n\n // Generate empty stats results\n if (!this.statsResults[type]) {\n this.statsResults[type] = {};\n }\n\n if (isSender && !this.statsResults[type].send) {\n this.statsResults[type].send = cloneDeep(emptySender);\n } else if (!isSender && !this.statsResults[type].recv) {\n this.statsResults[type].recv = cloneDeep(emptyReceiver);\n }\n\n if (!this.statsResults.resolutions[type]) {\n this.statsResults.resolutions[type] = {};\n }\n\n if (isSender && !this.statsResults.resolutions[type].send) {\n this.statsResults.resolutions[type].send = cloneDeep(emptySender);\n } else if (!isSender && !this.statsResults.resolutions[type].recv) {\n this.statsResults.resolutions[type].recv = cloneDeep(emptyReceiver);\n }\n\n if (!this.statsResults.internal[type]) {\n this.statsResults.internal[type] = {};\n }\n\n if (isSender && !this.statsResults.internal[type].send) {\n this.statsResults.internal[type].send = cloneDeep(emptySender);\n } else if (!isSender && !this.statsResults.internal[type].recv) {\n this.statsResults.internal[type].recv = cloneDeep(emptyReceiver);\n }\n\n switch (getStatsResult.type) {\n case 'outbound-rtp':\n this.processOutboundRTPResult(getStatsResult, type);\n break;\n case 'inbound-rtp':\n this.processInboundRTPResult(getStatsResult, type);\n break;\n case 'track':\n this.processTrackResult(getStatsResult, type);\n break;\n case 'remote-inbound-rtp':\n case 'remote-outbound-rtp':\n // @ts-ignore\n this.compareSentAndReceived(getStatsResult, type, isSender);\n break;\n case 'remotecandidate':\n case 'remote-candidate':\n this.parseCandidate(getStatsResult, type, isSender, true);\n break;\n case 'local-candidate':\n this.parseCandidate(getStatsResult, type, isSender, false);\n break;\n case 'media-source':\n // @ts-ignore\n this.parseAudioSource(getStatsResult, type);\n break;\n default:\n break;\n }\n }\n\n /**\n * Filters the get stats results for types\n * @private\n * @param {Array} statsItem\n * @param {String} type\n * @param {boolean} isSender\n * @returns {void}\n */\n filterAndParseGetStatsResults(statsItem: any, type: string, isSender: boolean) {\n const {types} = DEFAULT_GET_STATS_FILTER;\n\n // get the successful candidate pair before parsing stats.\n statsItem.report.forEach((report) => {\n if (report.type === 'candidate-pair' && report.state === 'succeeded') {\n this.successfulCandidatePair = report;\n }\n });\n\n statsItem.report.forEach((result) => {\n if (types.includes(result.type)) {\n this.parseGetStatsResult(result, type, isSender);\n }\n });\n\n if (this.statsResults[type]) {\n this.statsResults[type].direction = statsItem.currentDirection;\n this.statsResults[type].trackLabel = statsItem.localTrackLabel;\n this.statsResults[type].csi = statsItem.csi;\n // reset the successful candidate pair.\n this.successfulCandidatePair = {};\n }\n }\n\n /**\n * parse the audio\n * @param {String} result\n * @param {boolean} type\n * @returns {void}\n */\n parseAudioSource(result: any, type: any) {\n if (!result) {\n return;\n }\n\n if (type.includes('audio-send')) {\n this.statsResults[type].send.audioLevel = result.audioLevel;\n this.statsResults[type].send.totalAudioEnergy = result.totalAudioEnergy;\n }\n }\n\n /**\n * emits started/stopped events for local/remote media by checking\n * if given values are increasing or not. The previousValue, currentValue\n * params can be any numerical value like number of receive packets or\n * decoded frames, etc.\n *\n * @private\n * @param {string} mediaType\n * @param {number} previousValue - value to compare\n * @param {number} currentValue - value to compare (must be same type of value as previousValue)\n * @param {boolean} isLocal - true if stats are for local media being sent out, false for remote media being received\n * @memberof StatsAnalyzer\n * @returns {void}\n */\n emitStartStopEvents = (\n mediaType: string,\n previousValue: number,\n currentValue: number,\n isLocal: boolean\n ) => {\n if (mediaType !== 'audio' && mediaType !== 'video' && mediaType !== 'share') {\n throw new Error(`Unsupported mediaType: ${mediaType}`);\n }\n\n // eslint-disable-next-line no-param-reassign\n if (previousValue === undefined) previousValue = 0;\n // eslint-disable-next-line no-param-reassign\n if (currentValue === undefined) currentValue = 0;\n\n if (!this.lastEmittedStartStopEvent[mediaType]) {\n this.lastEmittedStartStopEvent[mediaType] = {};\n }\n\n const lastEmittedEvent = isLocal\n ? this.lastEmittedStartStopEvent[mediaType].local\n : this.lastEmittedStartStopEvent[mediaType].remote;\n\n let newEvent;\n\n if (currentValue - previousValue > 0) {\n newEvent = isLocal ? EVENTS.LOCAL_MEDIA_STARTED : EVENTS.REMOTE_MEDIA_STARTED;\n } else if (currentValue === previousValue && currentValue > 0) {\n newEvent = isLocal ? EVENTS.LOCAL_MEDIA_STOPPED : EVENTS.REMOTE_MEDIA_STOPPED;\n }\n\n if (newEvent && lastEmittedEvent !== newEvent) {\n if (isLocal) {\n this.lastEmittedStartStopEvent[mediaType].local = newEvent;\n } else {\n this.lastEmittedStartStopEvent[mediaType].remote = newEvent;\n }\n this.emit(\n {\n file: 'statsAnalyzer/index',\n function: 'compareLastStatsResult',\n },\n newEvent,\n {\n type: mediaType,\n }\n );\n }\n };\n\n /**\n * compares current and previous stats to check if packets are not sent\n *\n * @private\n * @memberof StatsAnalyzer\n * @returns {void}\n */\n private compareLastStatsResult() {\n if (this.lastStatsResults !== null && this.meetingMediaStatus) {\n const getCurrentStatsTotals = (keyPrefix: string, value: string): number =>\n Object.keys(this.statsResults)\n .filter((key) => key.startsWith(keyPrefix))\n .reduce((prev, cur) => prev + (this.statsResults[cur]?.recv[value] || 0), 0);\n\n const getPreviousStatsTotals = (keyPrefix: string, value: string): number =>\n Object.keys(this.statsResults)\n .filter((key) => key.startsWith(keyPrefix))\n .reduce((prev, cur) => prev + (this.lastStatsResults[cur]?.recv[value] || 0), 0);\n\n const getCurrentResolutionsStatsTotals = (keyPrefix: string, value: string): number =>\n Object.keys(this.statsResults)\n .filter((key) => key.startsWith(keyPrefix))\n .reduce((prev, cur) => prev + (this.statsResults.resolutions[cur]?.recv[value] || 0), 0);\n\n const getPreviousResolutionsStatsTotals = (keyPrefix: string, value: string): number =>\n Object.keys(this.statsResults)\n .filter((key) => key.startsWith(keyPrefix))\n .reduce(\n (prev, cur) => prev + (this.lastStatsResults.resolutions[cur]?.recv[value] || 0),\n 0\n );\n\n if (this.meetingMediaStatus.expected.sendAudio && this.lastStatsResults['audio-send']) {\n // compare audio stats sent\n // NOTE: relies on there being only one sender.\n const currentStats = this.statsResults['audio-send'].send;\n const previousStats = this.lastStatsResults['audio-send'].send;\n\n if (\n currentStats.totalPacketsSent === previousStats.totalPacketsSent ||\n currentStats.totalPacketsSent === 0\n ) {\n LoggerProxy.logger.info(\n `StatsAnalyzer:index#compareLastStatsResult --> No audio RTP packets sent`,\n currentStats.totalPacketsSent\n );\n } else {\n if (\n currentStats.totalAudioEnergy === previousStats.totalAudioEnergy ||\n currentStats.totalAudioEnergy === 0\n ) {\n LoggerProxy.logger.info(\n `StatsAnalyzer:index#compareLastStatsResult --> No audio Energy present`,\n currentStats.totalAudioEnergy\n );\n }\n\n if (currentStats.audioLevel === 0) {\n LoggerProxy.logger.info(\n `StatsAnalyzer:index#compareLastStatsResult --> audio level is 0 for the user`\n );\n }\n }\n\n this.emitStartStopEvents(\n 'audio',\n previousStats.totalPacketsSent,\n currentStats.totalPacketsSent,\n true\n );\n }\n\n if (this.meetingMediaStatus.expected.receiveAudio) {\n // compare audio stats received\n const currentPacketsReceived = getCurrentStatsTotals('audio-recv', 'totalPacketsReceived');\n const previousPacketsReceived = getPreviousStatsTotals(\n 'audio-recv',\n 'totalPacketsReceived'\n );\n const currentSamplesReceived = getCurrentStatsTotals('audio-recv', 'totalSamplesReceived');\n const previousSamplesReceived = getPreviousStatsTotals(\n 'audio-recv',\n 'totalSamplesReceived'\n );\n\n if (currentPacketsReceived === previousPacketsReceived || currentPacketsReceived === 0) {\n LoggerProxy.logger.info(\n `StatsAnalyzer:index#compareLastStatsResult --> No audio RTP packets received`,\n currentPacketsReceived\n );\n } else if (\n currentSamplesReceived === previousSamplesReceived ||\n currentSamplesReceived === 0\n ) {\n LoggerProxy.logger.info(\n `StatsAnalyzer:index#compareLastStatsResult --> No audio samples received`,\n currentSamplesReceived\n );\n }\n\n this.emitStartStopEvents('audio', previousPacketsReceived, currentPacketsReceived, false);\n }\n\n if (this.meetingMediaStatus.expected.sendVideo && this.lastStatsResults['video-send']) {\n // compare video stats sent\n const currentStats = this.statsResults['video-send'].send;\n const previousStats = this.lastStatsResults['video-send'].send;\n\n if (\n currentStats.totalPacketsSent === previousStats.totalPacketsSent ||\n currentStats.totalPacketsSent === 0\n ) {\n LoggerProxy.logger.info(\n `StatsAnalyzer:index#compareLastStatsResult --> No video RTP packets sent`,\n currentStats.totalPacketsSent\n );\n } else {\n if (\n currentStats.framesEncoded === previousStats.framesEncoded ||\n currentStats.framesEncoded === 0\n ) {\n LoggerProxy.logger.info(\n `StatsAnalyzer:index#compareLastStatsResult --> No video Frames Encoded`,\n currentStats.framesEncoded\n );\n }\n\n if (\n this.statsResults.resolutions['video-send'].send.framesSent ===\n this.lastStatsResults.resolutions['video-send'].send.framesSent ||\n this.statsResults.resolutions['video-send'].send.framesSent === 0\n ) {\n LoggerProxy.logger.info(\n `StatsAnalyzer:index#compareLastStatsResult --> No video Frames sent`,\n this.statsResults.resolutions['video-send'].send.framesSent\n );\n }\n }\n\n this.emitStartStopEvents('video', previousStats.framesSent, currentStats.framesSent, true);\n }\n\n if (this.meetingMediaStatus.expected.receiveVideo) {\n // compare video stats received\n const currentPacketsReceived = getCurrentStatsTotals('video-recv', 'totalPacketsReceived');\n const previousPacketsReceived = getPreviousStatsTotals(\n 'video-recv',\n 'totalPacketsReceived'\n );\n const currentFramesReceived = getCurrentResolutionsStatsTotals(\n 'video-recv',\n 'framesReceived'\n );\n const previousFramesReceived = getPreviousResolutionsStatsTotals(\n 'video-recv',\n 'framesReceived'\n );\n const currentFramesDecoded = getCurrentStatsTotals('video-recv', 'framesDecoded');\n const previousFramesDecoded = getPreviousStatsTotals('video-recv', 'framesDecoded');\n const currentFramesDropped = getCurrentResolutionsStatsTotals(\n 'video-recv',\n 'framesDropped'\n );\n const previousFramesDropped = getPreviousResolutionsStatsTotals(\n 'video-recv',\n 'framesDropped'\n );\n\n if (currentPacketsReceived === previousPacketsReceived || currentPacketsReceived === 0) {\n LoggerProxy.logger.info(\n `StatsAnalyzer:index#compareLastStatsResult --> No video RTP packets received`,\n currentPacketsReceived\n );\n } else {\n if (currentFramesReceived === previousFramesReceived || currentFramesReceived === 0) {\n LoggerProxy.logger.info(\n `StatsAnalyzer:index#compareLastStatsResult --> No video frames received`,\n currentFramesReceived\n );\n }\n\n if (currentFramesDecoded === previousFramesDecoded || currentFramesDecoded === 0) {\n LoggerProxy.logger.info(\n `StatsAnalyzer:index#compareLastStatsResult --> No video frames decoded`,\n currentFramesDecoded\n );\n }\n\n if (currentFramesDropped - previousFramesDropped > 10) {\n LoggerProxy.logger.info(\n `StatsAnalyzer:index#compareLastStatsResult --> video frames are getting dropped`,\n currentFramesDropped - previousFramesDropped\n );\n }\n }\n\n this.emitStartStopEvents('video', previousFramesDecoded, currentFramesDecoded, false);\n }\n\n if (this.meetingMediaStatus.expected.sendShare && this.lastStatsResults['video-share-send']) {\n // compare share stats sent\n\n const currentStats = this.statsResults['video-share-send'].send;\n const previousStats = this.lastStatsResults['video-share-send'].send;\n\n if (\n currentStats.totalPacketsSent === previousStats.totalPacketsSent ||\n currentStats.totalPacketsSent === 0\n ) {\n LoggerProxy.logger.info(\n `StatsAnalyzer:index#compareLastStatsResult --> No share RTP packets sent`,\n currentStats.totalPacketsSent\n );\n } else {\n if (\n currentStats.framesEncoded === previousStats.framesEncoded ||\n currentStats.framesEncoded === 0\n ) {\n LoggerProxy.logger.info(\n `StatsAnalyzer:index#compareLastStatsResult --> No share frames getting encoded`,\n currentStats.framesEncoded\n );\n }\n\n if (\n this.statsResults.resolutions['video-share-send'].send.framesSent ===\n this.lastStatsResults.resolutions['video-share-send'].send.framesSent ||\n this.statsResults.resolutions['video-share-send'].send.framesSent === 0\n ) {\n LoggerProxy.logger.info(\n `StatsAnalyzer:index#compareLastStatsResult --> No share frames sent`,\n this.statsResults.resolutions['video-share-send'].send.framesSent\n );\n }\n }\n }\n\n if (this.meetingMediaStatus.expected.sendShare) {\n // TODO:need to check receive share value\n // compare share stats received\n const currentPacketsReceived = getCurrentStatsTotals(\n 'video-share-recv',\n 'totalPacketsReceived'\n );\n const previousPacketsReceived = getPreviousStatsTotals(\n 'video-share-recv',\n 'totalPacketsReceived'\n );\n const currentFramesReceived = getCurrentResolutionsStatsTotals(\n 'video-share-recv',\n 'framesReceived'\n );\n const previousFramesReceived = getPreviousResolutionsStatsTotals(\n 'video-share-recv',\n 'framesReceived'\n );\n const currentFramesDecoded = getCurrentStatsTotals('video-share-recv', 'framesDecoded');\n const previousFramesDecoded = getPreviousStatsTotals('video-share-recv', 'framesDecoded');\n const currentFramesDropped = getCurrentResolutionsStatsTotals(\n 'video-share-recv',\n 'framesDropped'\n );\n const previousFramesDropped = getPreviousResolutionsStatsTotals(\n 'video-share-recv',\n 'framesDropped'\n );\n\n if (currentPacketsReceived === previousPacketsReceived || currentPacketsReceived === 0) {\n LoggerProxy.logger.info(\n `StatsAnalyzer:index#compareLastStatsResult --> No share RTP packets received`,\n currentPacketsReceived\n );\n } else {\n if (currentFramesReceived === previousFramesReceived || currentFramesReceived === 0) {\n LoggerProxy.logger.info(\n `StatsAnalyzer:index#compareLastStatsResult --> No share frames received`,\n currentFramesReceived\n );\n }\n\n if (currentFramesDecoded === previousFramesDecoded || currentFramesDecoded === 0) {\n LoggerProxy.logger.info(\n `StatsAnalyzer:index#compareLastStatsResult --> No share frames decoded`,\n currentFramesDecoded\n );\n }\n\n if (currentFramesDropped - previousFramesDropped > 10) {\n LoggerProxy.logger.info(\n `StatsAnalyzer:index#compareLastStatsResult --> share frames are getting dropped`,\n currentFramesDropped - previousFramesDropped\n );\n }\n }\n\n // we are not calling emitStartStopEvents() for sending or receiving share because sharing is often started and stopped\n // in meetings and this.meetingMediaStatus.expected values can be out of sync with the actual packet flow\n // so we would send \"sharing stopped\" events incorrectly\n }\n }\n }\n\n /**\n * Does a `getStats` on all the transceivers and parses the results\n *\n * @private\n * @memberof StatsAnalyzer\n * @returns {Promise}\n */\n private getStatsAndParse() {\n if (!this.mediaConnection) {\n return Promise.resolve();\n }\n\n if (\n this.mediaConnection &&\n this.mediaConnection.getConnectionState() === ConnectionState.Failed\n ) {\n LoggerProxy.logger.trace(\n 'StatsAnalyzer:index#getStatsAndParse --> media connection is in failed state'\n );\n\n return Promise.resolve();\n }\n\n LoggerProxy.logger.trace('StatsAnalyzer:index#getStatsAndParse --> Collecting Stats');\n\n return this.mediaConnection.getTransceiverStats().then((transceiverStats) => {\n transceiverStats.video.receivers.forEach((receiver, i) =>\n this.filterAndParseGetStatsResults(receiver, `video-recv-${i}`, false)\n );\n transceiverStats.audio.receivers.forEach((receiver, i) =>\n this.filterAndParseGetStatsResults(receiver, `audio-recv-${i}`, false)\n );\n transceiverStats.screenShareVideo.receivers.forEach((receiver, i) =>\n this.filterAndParseGetStatsResults(receiver, `video-share-recv-${i}`, false)\n );\n transceiverStats.screenShareAudio.receivers.forEach((receiver, i) =>\n this.filterAndParseGetStatsResults(receiver, `audio-share-recv-${i}`, false)\n );\n\n transceiverStats.video.senders.forEach((sender, i) => {\n if (i > 0) {\n throw new Error('Stats Analyzer does not support multiple senders.');\n }\n this.filterAndParseGetStatsResults(sender, 'video-send', true);\n });\n transceiverStats.audio.senders.forEach((sender, i) => {\n if (i > 0) {\n throw new Error('Stats Analyzer does not support multiple senders.');\n }\n this.filterAndParseGetStatsResults(sender, 'audio-send', true);\n });\n transceiverStats.screenShareVideo.senders.forEach((sender, i) => {\n if (i > 0) {\n throw new Error('Stats Analyzer does not support multiple senders.');\n }\n this.filterAndParseGetStatsResults(sender, 'video-share-send', true);\n });\n transceiverStats.screenShareAudio.senders.forEach((sender, i) => {\n if (i > 0) {\n throw new Error('Stats Analyzer does not support multiple senders.');\n }\n this.filterAndParseGetStatsResults(sender, 'audio-share-send', true);\n });\n\n this.compareLastStatsResult();\n\n // Save the last results to compare with the current\n // DO Deep copy, for some reason it takes the reference all the time rather then old value set\n this.lastStatsResults = JSON.parse(JSON.stringify(this.statsResults));\n\n LoggerProxy.logger.trace(\n 'StatsAnalyzer:index#getStatsAndParse --> Finished Collecting Stats'\n );\n });\n }\n\n /**\n * Processes OutboundRTP stats result and stores\n * @private\n * @param {*} result\n * @param {*} mediaType\n * @returns {void}\n */\n private processOutboundRTPResult(result: any, mediaType: any) {\n const sendrecvType = STATS.SEND_DIRECTION;\n\n if (result.bytesSent) {\n let kilobytes = 0;\n\n if (result.frameWidth && result.frameHeight) {\n this.statsResults.resolutions[mediaType][sendrecvType].width = result.frameWidth;\n this.statsResults.resolutions[mediaType][sendrecvType].height = result.frameHeight;\n this.statsResults.resolutions[mediaType][sendrecvType].framesSent = result.framesSent;\n this.statsResults.resolutions[mediaType][sendrecvType].hugeFramesSent =\n result.hugeFramesSent;\n }\n\n if (!this.statsResults.internal[mediaType][sendrecvType].prevBytesSent) {\n this.statsResults.internal[mediaType][sendrecvType].prevBytesSent = result.bytesSent;\n }\n if (!this.statsResults.internal[mediaType][sendrecvType].framesEncoded) {\n this.statsResults.internal[mediaType][sendrecvType].framesEncoded = result.framesEncoded;\n }\n if (!this.statsResults.internal[mediaType][sendrecvType].keyFramesEncoded) {\n this.statsResults.internal[mediaType][sendrecvType].keyFramesEncoded =\n result.keyFramesEncoded;\n }\n\n const bytes =\n result.bytesSent - this.statsResults.internal[mediaType][sendrecvType].prevBytesSent;\n\n this.statsResults.internal[mediaType][sendrecvType].prevBytesSent = result.bytesSent;\n\n kilobytes = bytes / 1024;\n\n this.statsResults[mediaType][sendrecvType].availableBandwidth = kilobytes.toFixed(1);\n this.statsResults[mediaType].bytesSent = kilobytes;\n\n this.statsResults[mediaType][sendrecvType].framesEncoded =\n result.framesEncoded - this.statsResults.internal[mediaType][sendrecvType].framesEncoded;\n this.statsResults[mediaType][sendrecvType].keyFramesEncoded =\n result.keyFramesEncoded -\n this.statsResults.internal[mediaType][sendrecvType].keyFramesEncoded;\n this.statsResults.internal[mediaType].outboundRtpId = result.id;\n\n if (!this.statsResults.internal[mediaType][sendrecvType].packetsSent) {\n this.statsResults.internal[mediaType][sendrecvType].packetsSent = result.packetsSent;\n }\n\n this.statsResults[mediaType][sendrecvType].packetsSent =\n result.packetsSent - this.statsResults.internal[mediaType][sendrecvType].packetsSent;\n this.statsResults.internal[mediaType][sendrecvType].packetsSent = result.packetsSent;\n\n // Data saved to send MQA metrics\n\n this.statsResults[mediaType][sendrecvType].totalKeyFramesEncoded = result.keyFramesEncoded;\n this.statsResults[mediaType][sendrecvType].totalNackCount = result.nackCount;\n this.statsResults[mediaType][sendrecvType].totalPliCount = result.pliCount;\n this.statsResults[mediaType][sendrecvType].totalPacketsSent = result.packetsSent;\n this.statsResults[mediaType][sendrecvType].totalFirCount = result.firCount;\n this.statsResults[mediaType][sendrecvType].framesSent = result.framesSent;\n this.statsResults[mediaType][sendrecvType].framesEncoded = result.framesEncoded;\n this.statsResults[mediaType][sendrecvType].encoderImplementation =\n result.encoderImplementation;\n this.statsResults[mediaType][sendrecvType].qualityLimitationReason =\n result.qualityLimitationReason;\n this.statsResults[mediaType][sendrecvType].qualityLimitationResolutionChanges =\n result.qualityLimitationResolutionChanges;\n this.statsResults[mediaType][sendrecvType].retransmittedPacketsSent =\n result.retransmittedPacketsSent;\n this.statsResults[mediaType][sendrecvType].totalBytesSent = result.bytesSent;\n this.statsResults[mediaType][sendrecvType].headerBytesSent = result.headerBytesSent;\n this.statsResults[mediaType][sendrecvType].retransmittedBytesSent =\n result.retransmittedBytesSent;\n }\n }\n\n /**\n * Processes InboundRTP stats result and stores\n * @private\n * @param {*} result\n * @param {*} mediaType\n * @returns {void}\n */\n private processInboundRTPResult(result: any, mediaType: any) {\n const sendrecvType = STATS.RECEIVE_DIRECTION;\n\n if (result.bytesReceived) {\n let kilobytes = 0;\n const receiveSlot = this.receiveSlotCallback(result.ssrc);\n const idAndCsi = receiveSlot\n ? `id: \"${receiveSlot.id || ''}\"${receiveSlot.csi ? ` and csi: ${receiveSlot.csi}` : ''}`\n : '';\n\n if (result.frameWidth && result.frameHeight) {\n this.statsResults.resolutions[mediaType][sendrecvType].width = result.frameWidth;\n this.statsResults.resolutions[mediaType][sendrecvType].height = result.frameHeight;\n this.statsResults.resolutions[mediaType][sendrecvType].framesReceived =\n result.framesReceived;\n }\n\n if (!this.statsResults.internal[mediaType][sendrecvType].prevBytesReceived) {\n this.statsResults.internal[mediaType][sendrecvType].prevBytesReceived =\n result.bytesReceived;\n }\n\n if (!this.statsResults.internal[mediaType][sendrecvType].pliCount) {\n this.statsResults.internal[mediaType][sendrecvType].pliCount = result.pliCount;\n }\n\n if (!this.statsResults.internal[mediaType][sendrecvType].packetsLost) {\n this.statsResults.internal[mediaType][sendrecvType].packetsLost = result.packetsLost;\n }\n\n if (!this.statsResults.internal[mediaType][sendrecvType].totalPacketsReceived) {\n this.statsResults.internal[mediaType][sendrecvType].totalPacketsReceived =\n result.packetsReceived;\n }\n\n if (!this.statsResults.internal[mediaType][sendrecvType].lastPacketReceivedTimestamp) {\n this.statsResults.internal[mediaType][sendrecvType].lastPacketReceivedTimestamp =\n result.lastPacketReceivedTimestamp;\n }\n\n const bytes =\n result.bytesReceived -\n this.statsResults.internal[mediaType][sendrecvType].prevBytesReceived;\n\n this.statsResults.internal[mediaType][sendrecvType].prevBytesReceived = result.bytesReceived;\n\n kilobytes = bytes / 1024;\n this.statsResults[mediaType][sendrecvType].availableBandwidth = kilobytes.toFixed(1);\n this.statsResults[mediaType].bytesReceived = kilobytes.toFixed(1);\n\n this.statsResults[mediaType][sendrecvType].pliCount =\n result.pliCount - this.statsResults.internal[mediaType][sendrecvType].pliCount;\n this.statsResults[mediaType][sendrecvType].currentPacketsLost =\n result.packetsLost - this.statsResults.internal[mediaType][sendrecvType].packetsLost;\n if (this.statsResults[mediaType][sendrecvType].currentPacketsLost < 0) {\n this.statsResults[mediaType][sendrecvType].currentPacketsLost = 0;\n }\n\n this.statsResults[mediaType][sendrecvType].packetsReceived =\n result.packetsReceived -\n this.statsResults.internal[mediaType][sendrecvType].totalPacketsReceived;\n this.statsResults.internal[mediaType][sendrecvType].totalPacketsReceived =\n result.packetsReceived;\n\n if (this.statsResults[mediaType][sendrecvType].packetsReceived === 0) {\n if (receiveSlot) {\n LoggerProxy.logger.info(\n `StatsAnalyzer:index#processInboundRTPResult --> No packets received for receive slot ${idAndCsi}`,\n this.statsResults[mediaType][sendrecvType].packetsReceived\n );\n }\n }\n\n // Check the over all packet Lost ratio\n this.statsResults[mediaType][sendrecvType].currentPacketLossRatio =\n this.statsResults[mediaType][sendrecvType].currentPacketsLost > 0\n ? this.statsResults[mediaType][sendrecvType].currentPacketsLost /\n (this.statsResults[mediaType][sendrecvType].packetsReceived +\n this.statsResults[mediaType][sendrecvType].currentPacketsLost)\n : 0;\n if (this.statsResults[mediaType][sendrecvType].currentPacketLossRatio > 3) {\n LoggerProxy.logger.info(\n `StatsAnalyzer:index#processInboundRTPResult --> Packets getting lost from the receiver with slot ${idAndCsi}`,\n this.statsResults[mediaType][sendrecvType].currentPacketLossRatio\n );\n }\n\n // TODO: check the packet loss value is negative values here\n\n if (result.packetsLost) {\n this.statsResults[mediaType][sendrecvType].totalPacketsLost =\n result.packetsLost > 0 ? result.packetsLost : -result.packetsLost;\n } else {\n this.statsResults[mediaType][sendrecvType].totalPacketsLost = 0;\n }\n\n this.statsResults[mediaType][sendrecvType].lastPacketReceivedTimestamp =\n result.lastPacketReceivedTimestamp;\n\n // From Thin\n this.statsResults[mediaType][sendrecvType].totalNackCount = result.nackCount;\n this.statsResults[mediaType][sendrecvType].totalPliCount = result.pliCount;\n this.statsResults[mediaType][sendrecvType].framesDecoded = result.framesDecoded;\n this.statsResults[mediaType][sendrecvType].keyFramesDecoded = result.keyFramesDecoded;\n\n this.statsResults[mediaType][sendrecvType].decoderImplementation =\n result.decoderImplementation;\n this.statsResults[mediaType][sendrecvType].totalPacketsReceived = result.packetsReceived;\n\n this.statsResults[mediaType][sendrecvType].fecPacketsDiscarded = result.fecPacketsDiscarded;\n this.statsResults[mediaType][sendrecvType].fecPacketsReceived = result.fecPacketsReceived;\n this.statsResults[mediaType][sendrecvType].totalBytesReceived = result.bytesReceived;\n this.statsResults[mediaType][sendrecvType].headerBytesReceived = result.headerBytesReceived;\n\n this.statsResults[mediaType][sendrecvType].meanRtpJitter.push(result.jitter);\n\n // Audio stats\n\n this.statsResults[mediaType][sendrecvType].audioLevel = result.audioLevel;\n this.statsResults[mediaType][sendrecvType].totalAudioEnergy = result.totalAudioEnergy;\n this.statsResults[mediaType][sendrecvType].totalSamplesReceived =\n result.totalSamplesReceived || 0;\n this.statsResults[mediaType][sendrecvType].totalSamplesDecoded =\n result.totalSamplesDecoded || 0;\n this.statsResults[mediaType][sendrecvType].concealedSamples = result.concealedSamples || 0;\n }\n }\n\n /**\n * Processes remote and local candidate result and stores\n * @private\n * @param {*} result\n * @param {*} type\n * @param {boolean} isSender\n * @param {boolean} isRemote\n *\n * @returns {void}\n */\n parseCandidate = (result: any, type: any, isSender: boolean, isRemote: boolean) => {\n if (!result || !result.id) {\n return;\n }\n\n // We only care about the successful local candidate\n if (this.successfulCandidatePair?.localCandidateId !== result.id) {\n return;\n }\n\n let transport;\n if (result.relayProtocol) {\n transport = result.relayProtocol.toUpperCase();\n } else if (result.protocol) {\n transport = result.protocol.toUpperCase();\n }\n\n const sendRecvType = isSender ? STATS.SEND_DIRECTION : STATS.RECEIVE_DIRECTION;\n const ipType = isRemote ? STATS.REMOTE : STATS.LOCAL;\n\n this.statsResults.internal.candidates[result.id] = {\n candidateType: result.candidateType,\n ipAddress: result.ip, // TODO: add ports\n portNumber: result.port,\n networkType: result.networkType,\n priority: result.priority,\n transport,\n timestamp: result.time,\n id: result.id,\n type: result.type,\n };\n\n this.statsResults.connectionType[ipType].candidateType = result.candidateType;\n this.statsResults.connectionType[ipType].ipAddress = result.ipAddress;\n\n this.statsResults.connectionType[ipType].networkType =\n result.networkType === NETWORK_TYPE.VPN ? NETWORK_TYPE.UNKNOWN : result.networkType;\n this.statsResults.connectionType[ipType].transport = transport;\n\n this.statsResults[type][sendRecvType].totalRoundTripTime = result.totalRoundTripTime;\n };\n\n /**\n * Process Track results\n *\n * @private\n * @param {*} result\n * @param {*} mediaType\n * @returns {void}\n * @memberof StatsAnalyzer\n */\n private processTrackResult(result: any, mediaType: any) {\n if (!result || result.type !== 'track') {\n return;\n }\n\n const sendrecvType =\n result.remoteSource === true ? STATS.RECEIVE_DIRECTION : STATS.SEND_DIRECTION;\n\n if (sendrecvType === STATS.RECEIVE_DIRECTION) {\n this.statsResults.resolutions[mediaType][sendrecvType].framesReceived = result.framesReceived;\n this.statsResults.resolutions[mediaType][sendrecvType].framesDecoded = result.framesDecoded;\n this.statsResults.resolutions[mediaType][sendrecvType].framesDropped = result.framesDropped;\n }\n\n if (result.trackIdentifier && !mediaType.includes('audio')) {\n this.statsResults.resolutions[mediaType][sendrecvType].trackIdentifier =\n result.trackIdentifier;\n\n const jitterBufferDelay = result && result.jitterBufferDelay;\n const jitterBufferEmittedCount = result && result.jitterBufferEmittedCount;\n\n this.statsResults.resolutions[mediaType][sendrecvType].avgJitterDelay =\n jitterBufferEmittedCount && +jitterBufferDelay / +jitterBufferEmittedCount;\n\n // Used to calculate the jitter\n this.statsResults.resolutions[mediaType][sendrecvType].jitterBufferDelay =\n result.jitterBufferDelay;\n this.statsResults.resolutions[mediaType][sendrecvType].jitterBufferEmittedCount =\n result.jitterBufferEmittedCount;\n }\n }\n\n /**\n *\n * @private\n * @param {*} result\n * @param {*} type\n * @returns {void}\n * @memberof StatsAnalyzer\n */\n compareSentAndReceived(result, type) {\n // Don't compare on transceivers without a sender.\n if (!type || !this.statsResults.internal[type].send) {\n return;\n }\n\n const mediaType = type;\n\n if (!this.statsResults.internal[mediaType].send.totalPacketsLostOnReceiver) {\n this.statsResults.internal[mediaType].send.totalPacketsLostOnReceiver = result.packetsLost;\n }\n\n const currentPacketLoss =\n result.packetsLost - this.statsResults.internal[mediaType].send.totalPacketsLostOnReceiver;\n\n this.statsResults.internal[mediaType].send.totalPacketsLostOnReceiver = result.packetsLost;\n this.statsResults[mediaType].send.packetsLostOnReceiver = currentPacketLoss;\n this.statsResults[mediaType].send.totalPacketsLostOnReceiver = result.packetsLost;\n\n this.statsResults[mediaType].send.meanRemoteJitter.push(result.jitter);\n this.statsResults[mediaType].send.meanRoundTripTime.push(result.roundTripTime);\n\n this.statsResults[mediaType].send.timestamp = result.timestamp;\n this.statsResults[mediaType].send.ssrc = result.ssrc;\n this.statsResults[mediaType].send.reportsReceived = result.reportsReceived;\n\n // Total packloss ratio on this video section of the call\n this.statsResults[mediaType].send.overAllPacketLossRatio =\n this.statsResults[mediaType].send.totalPacketsLostOnReceiver > 0\n ? this.statsResults[mediaType].send.totalPacketsLostOnReceiver /\n this.statsResults[mediaType].send.totalPacketsSent\n : 0;\n this.statsResults[mediaType].send.currentPacketLossRatio =\n this.statsResults[mediaType].send.packetsLostOnReceiver > 0\n ? (this.statsResults[mediaType].send.packetsLostOnReceiver * 100) /\n (this.statsResults[mediaType].send.packetsSent +\n this.statsResults[mediaType].send.packetsLostOnReceiver)\n : 0;\n\n if (\n this.statsResults[mediaType].send.maxPacketLossRatio <\n this.statsResults[mediaType].send.currentPacketLossRatio\n ) {\n this.statsResults[mediaType].send.maxPacketLossRatio =\n this.statsResults[mediaType].send.currentPacketLossRatio;\n }\n\n if (result.type === 'remote-inbound-rtp') {\n this.networkQualityMonitor.determineUplinkNetworkQuality({\n mediaType,\n remoteRtpResults: result,\n statsAnalyzerCurrentStats: this.statsResults,\n });\n }\n }\n}\n"],"mappings":"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"}
|
|
@@ -101,7 +101,7 @@ var getAudioSenderMqa = function getAudioSenderMqa(_ref2) {
|
|
|
101
101
|
};
|
|
102
102
|
exports.getAudioSenderMqa = getAudioSenderMqa;
|
|
103
103
|
var getVideoReceiverMqa = function getVideoReceiverMqa(_ref3) {
|
|
104
|
-
var _lastMqaDataSent$medi14, _lastMqaDataSent$medi15, _lastMqaDataSent$medi16, _lastMqaDataSent$
|
|
104
|
+
var _lastMqaDataSent$medi14, _lastMqaDataSent$medi15, _lastMqaDataSent$medi16, _lastMqaDataSent$reso, _lastMqaDataSent$reso2, _lastMqaDataSent$reso3, _lastMqaDataSent$medi17, _lastMqaDataSent$medi18;
|
|
105
105
|
var videoReceiver = _ref3.videoReceiver,
|
|
106
106
|
statsResults = _ref3.statsResults,
|
|
107
107
|
lastMqaDataSent = _ref3.lastMqaDataSent,
|
|
@@ -110,11 +110,11 @@ var getVideoReceiverMqa = function getVideoReceiverMqa(_ref3) {
|
|
|
110
110
|
var lastPacketsReceived = ((_lastMqaDataSent$medi14 = lastMqaDataSent[mediaType]) === null || _lastMqaDataSent$medi14 === void 0 ? void 0 : _lastMqaDataSent$medi14[sendrecvType].totalPacketsReceived) || 0;
|
|
111
111
|
var lastPacketsLost = ((_lastMqaDataSent$medi15 = lastMqaDataSent[mediaType]) === null || _lastMqaDataSent$medi15 === void 0 ? void 0 : _lastMqaDataSent$medi15[sendrecvType].totalPacketsLost) || 0;
|
|
112
112
|
var lastBytesReceived = ((_lastMqaDataSent$medi16 = lastMqaDataSent[mediaType]) === null || _lastMqaDataSent$medi16 === void 0 ? void 0 : _lastMqaDataSent$medi16[sendrecvType].totalBytesReceived) || 0;
|
|
113
|
-
var lastFramesReceived = ((_lastMqaDataSent$
|
|
114
|
-
var lastFramesDecoded = ((_lastMqaDataSent$
|
|
115
|
-
var lastFramesDropped = ((_lastMqaDataSent$
|
|
116
|
-
var lastKeyFramesDecoded = ((_lastMqaDataSent$
|
|
117
|
-
var lastPliCount = ((_lastMqaDataSent$
|
|
113
|
+
var lastFramesReceived = ((_lastMqaDataSent$reso = lastMqaDataSent.resolutions[mediaType]) === null || _lastMqaDataSent$reso === void 0 ? void 0 : _lastMqaDataSent$reso[sendrecvType].framesReceived) || 0;
|
|
114
|
+
var lastFramesDecoded = ((_lastMqaDataSent$reso2 = lastMqaDataSent.resolutions[mediaType]) === null || _lastMqaDataSent$reso2 === void 0 ? void 0 : _lastMqaDataSent$reso2[sendrecvType].framesDecoded) || 0;
|
|
115
|
+
var lastFramesDropped = ((_lastMqaDataSent$reso3 = lastMqaDataSent.resolutions[mediaType]) === null || _lastMqaDataSent$reso3 === void 0 ? void 0 : _lastMqaDataSent$reso3[sendrecvType].framesDropped) || 0;
|
|
116
|
+
var lastKeyFramesDecoded = ((_lastMqaDataSent$medi17 = lastMqaDataSent[mediaType]) === null || _lastMqaDataSent$medi17 === void 0 ? void 0 : _lastMqaDataSent$medi17[sendrecvType].keyFramesDecoded) || 0;
|
|
117
|
+
var lastPliCount = ((_lastMqaDataSent$medi18 = lastMqaDataSent[mediaType]) === null || _lastMqaDataSent$medi18 === void 0 ? void 0 : _lastMqaDataSent$medi18[sendrecvType].totalPliCount) || 0;
|
|
118
118
|
var csi = statsResults[mediaType].csi;
|
|
119
119
|
if (csi && !videoReceiver.streams[0].common.csi.includes(csi)) {
|
|
120
120
|
videoReceiver.streams[0].common.csi.push(csi);
|
|
@@ -152,8 +152,8 @@ var getVideoReceiverMqa = function getVideoReceiverMqa(_ref3) {
|
|
|
152
152
|
// From tracks //TODO: calculate a proper one
|
|
153
153
|
var totalFrameReceivedInaMin = statsResults.resolutions[mediaType][sendrecvType].framesReceived - lastFramesReceived;
|
|
154
154
|
var totalFrameDecodedInaMin = statsResults.resolutions[mediaType][sendrecvType].framesDecoded - lastFramesDecoded;
|
|
155
|
-
videoReceiver.streams[0].common.receivedFrameRate = totalFrameReceivedInaMin ? totalFrameReceivedInaMin
|
|
156
|
-
videoReceiver.streams[0].common.renderedFrameRate = totalFrameDecodedInaMin ? totalFrameDecodedInaMin
|
|
155
|
+
videoReceiver.streams[0].common.receivedFrameRate = Math.round(totalFrameReceivedInaMin ? totalFrameReceivedInaMin / 60 : 0);
|
|
156
|
+
videoReceiver.streams[0].common.renderedFrameRate = Math.round(totalFrameDecodedInaMin ? totalFrameDecodedInaMin / 60 : 0);
|
|
157
157
|
videoReceiver.streams[0].common.framesDropped = statsResults.resolutions[mediaType][sendrecvType].framesDropped - lastFramesDropped;
|
|
158
158
|
videoReceiver.streams[0].receivedHeight = statsResults.resolutions[mediaType][sendrecvType].height || 0;
|
|
159
159
|
videoReceiver.streams[0].receivedWidth = statsResults.resolutions[mediaType][sendrecvType].width || 0;
|
|
@@ -163,18 +163,18 @@ var getVideoReceiverMqa = function getVideoReceiverMqa(_ref3) {
|
|
|
163
163
|
};
|
|
164
164
|
exports.getVideoReceiverMqa = getVideoReceiverMqa;
|
|
165
165
|
var getVideoSenderMqa = function getVideoSenderMqa(_ref4) {
|
|
166
|
-
var _lastMqaDataSent$
|
|
166
|
+
var _lastMqaDataSent$medi19, _lastMqaDataSent$medi20, _lastMqaDataSent$medi21, _lastMqaDataSent$reso4, _lastMqaDataSent$medi22, _lastMqaDataSent$reso5;
|
|
167
167
|
var videoSender = _ref4.videoSender,
|
|
168
168
|
statsResults = _ref4.statsResults,
|
|
169
169
|
lastMqaDataSent = _ref4.lastMqaDataSent,
|
|
170
170
|
mediaType = _ref4.mediaType;
|
|
171
171
|
var sendrecvType = _constants.STATS.SEND_DIRECTION;
|
|
172
|
-
var lastPacketsSent = ((_lastMqaDataSent$
|
|
173
|
-
var lastPacketsLost = ((_lastMqaDataSent$
|
|
174
|
-
var lastBytesSent = ((_lastMqaDataSent$
|
|
175
|
-
var lastKeyFramesEncoded = ((_lastMqaDataSent$
|
|
176
|
-
var lastFirCount = ((_lastMqaDataSent$
|
|
177
|
-
var lastFramesSent = ((_lastMqaDataSent$
|
|
172
|
+
var lastPacketsSent = ((_lastMqaDataSent$medi19 = lastMqaDataSent[mediaType]) === null || _lastMqaDataSent$medi19 === void 0 ? void 0 : _lastMqaDataSent$medi19[sendrecvType].totalPacketsSent) || 0;
|
|
173
|
+
var lastPacketsLost = ((_lastMqaDataSent$medi20 = lastMqaDataSent[mediaType]) === null || _lastMqaDataSent$medi20 === void 0 ? void 0 : _lastMqaDataSent$medi20[sendrecvType].totalPacketsLostOnReceiver) || 0;
|
|
174
|
+
var lastBytesSent = ((_lastMqaDataSent$medi21 = lastMqaDataSent[mediaType]) === null || _lastMqaDataSent$medi21 === void 0 ? void 0 : _lastMqaDataSent$medi21[sendrecvType].totalBytesSent) || 0;
|
|
175
|
+
var lastKeyFramesEncoded = ((_lastMqaDataSent$reso4 = lastMqaDataSent.resolutions[mediaType]) === null || _lastMqaDataSent$reso4 === void 0 ? void 0 : _lastMqaDataSent$reso4[sendrecvType].totalKeyFramesEncoded) || 0;
|
|
176
|
+
var lastFirCount = ((_lastMqaDataSent$medi22 = lastMqaDataSent[mediaType]) === null || _lastMqaDataSent$medi22 === void 0 ? void 0 : _lastMqaDataSent$medi22[sendrecvType].totalFirCount) || 0;
|
|
177
|
+
var lastFramesSent = ((_lastMqaDataSent$reso5 = lastMqaDataSent.resolutions[mediaType]) === null || _lastMqaDataSent$reso5 === void 0 ? void 0 : _lastMqaDataSent$reso5[sendrecvType].framesSent) || 0;
|
|
178
178
|
var csi = statsResults[mediaType].csi;
|
|
179
179
|
if (csi && !videoSender.streams[0].common.csi.includes(csi)) {
|
|
180
180
|
videoSender.streams[0].common.csi.push(csi);
|
|
@@ -210,7 +210,7 @@ var getVideoSenderMqa = function getVideoSenderMqa(_ref4) {
|
|
|
210
210
|
|
|
211
211
|
// From tracks //TODO: calculate a proper one
|
|
212
212
|
var totalFrameSentInaMin = statsResults.resolutions[mediaType][sendrecvType].framesSent - (lastFramesSent || 0);
|
|
213
|
-
videoSender.streams[0].common.transmittedFrameRate = totalFrameSentInaMin ? totalFrameSentInaMin
|
|
213
|
+
videoSender.streams[0].common.transmittedFrameRate = Math.round(totalFrameSentInaMin ? totalFrameSentInaMin / 60 : 0);
|
|
214
214
|
videoSender.streams[0].transmittedHeight = statsResults.resolutions[mediaType][sendrecvType].height || 0;
|
|
215
215
|
videoSender.streams[0].transmittedWidth = statsResults.resolutions[mediaType][sendrecvType].width || 0;
|
|
216
216
|
videoSender.streams[0].transmittedFrameSize = videoSender.streams[0].transmittedHeight * videoSender.streams[0].transmittedWidth / 256;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"names":["getAudioReceiverMqa","audioReceiver","statsResults","lastMqaDataSent","mediaType","sendrecvType","STATS","RECEIVE_DIRECTION","lastPacketsReceived","totalPacketsReceived","lastPacketsLost","totalPacketsLost","lastPacketsDecoded","totalSamplesDecoded","lastSamplesReceived","totalSamplesReceived","lastConcealedSamples","concealedSamples","lastBytesReceived","totalBytesReceived","lastFecPacketsReceived","fecPacketsReceived","lastFecPacketsDiscarded","fecPacketsDiscarded","csi","streams","common","includes","push","direction","transportType","connectionType","local","transport","rtpPackets","mediaHopByHopLost","rtpHopByHopLost","maxRtpJitter","meanRtpJitter","rtpJitter","fecRecovered","rtpEndToEndLost","framesDropped","renderedFrameRate","framesReceived","concealedFrames","receivedBitrate","rtpBitrate","getAudioSenderMqa","audioSender","SEND_DIRECTION","lastPacketsSent","totalPacketsSent","totalPacketsLostOnReceiver","lastBytesSent","totalBytesSent","lastFramesEncoded","totalKeyFramesEncoded","lastFirCount","totalFirCount","maxRemoteJitter","meanRemoteJitter","availableBitrate","availableOutgoingBitrate","totalpacketsLostForaMin","remoteLossRate","maxRoundTripTime","meanRoundTripTime","roundTripTime","totalBytesSentInaMin","transmittedBitrate","transmittedKeyFrames","requestedKeyFrames","getVideoReceiverMqa","videoReceiver","lastFramesReceived","lastFramesDecoded","framesDecoded","lastFramesDropped","lastKeyFramesDecoded","keyFramesDecoded","lastPliCount","totalPliCount","totalPacketLoss","totalBytesReceivedInaMin","totalFrameReceivedInaMin","resolutions","totalFrameDecodedInaMin","receivedFrameRate","receivedHeight","height","receivedWidth","width","receivedFrameSize","receivedKeyFrames","getVideoSenderMqa","videoSender","lastKeyFramesEncoded","lastFramesSent","framesSent","totalFrameSentInaMin","transmittedFrameRate","transmittedHeight","transmittedWidth","transmittedFrameSize"],"sources":["mqaUtil.ts"],"sourcesContent":["/* eslint-disable no-param-reassign, prefer-destructuring */\n\nimport {mean, max} from 'lodash';\n\nimport {STATS} from '../constants';\n\nexport const getAudioReceiverMqa = ({audioReceiver, statsResults, lastMqaDataSent, mediaType}) => {\n const sendrecvType = STATS.RECEIVE_DIRECTION;\n\n const lastPacketsReceived = lastMqaDataSent[mediaType]?.[sendrecvType].totalPacketsReceived || 0;\n const lastPacketsLost = lastMqaDataSent[mediaType]?.[sendrecvType].totalPacketsLost || 0;\n const lastPacketsDecoded = lastMqaDataSent[mediaType]?.[sendrecvType].totalSamplesDecoded || 0;\n const lastSamplesReceived = lastMqaDataSent[mediaType]?.[sendrecvType].totalSamplesReceived || 0;\n const lastConcealedSamples = lastMqaDataSent[mediaType]?.[sendrecvType].concealedSamples || 0;\n const lastBytesReceived = lastMqaDataSent[mediaType]?.[sendrecvType].totalBytesReceived || 0;\n const lastFecPacketsReceived = lastMqaDataSent[mediaType]?.[sendrecvType].fecPacketsReceived || 0;\n const lastFecPacketsDiscarded =\n lastMqaDataSent[mediaType]?.[sendrecvType].fecPacketsDiscarded || 0;\n\n const {csi} = statsResults[mediaType];\n if (csi && !audioReceiver.streams[0].common.csi.includes(csi)) {\n audioReceiver.streams[0].common.csi.push(csi);\n }\n\n audioReceiver.common.common.direction = statsResults[mediaType].direction;\n audioReceiver.common.transportType = statsResults.connectionType.local.transport;\n\n // add rtpPacket info inside common as also for call analyzer\n audioReceiver.common.rtpPackets =\n statsResults[mediaType][sendrecvType].totalPacketsReceived - lastPacketsReceived || 0;\n // Hop by hop are numbers and not percentage so we compare on what we sent the last min\n // collect the packets received for the last min\n audioReceiver.streams[0].common.rtpPackets = audioReceiver.common.rtpPackets;\n audioReceiver.common.mediaHopByHopLost =\n statsResults[mediaType][sendrecvType].totalPacketsLost - lastPacketsLost || 0;\n audioReceiver.common.rtpHopByHopLost =\n statsResults[mediaType][sendrecvType].totalPacketsLost - lastPacketsLost || 0;\n\n audioReceiver.streams[0].common.maxRtpJitter =\n // @ts-ignore\n max(statsResults[mediaType][sendrecvType].meanRtpJitter) * 1000 || 0;\n audioReceiver.streams[0].common.meanRtpJitter =\n mean(statsResults[mediaType][sendrecvType].meanRtpJitter) * 1000 || 0;\n audioReceiver.streams[0].common.rtpJitter = audioReceiver.streams[0].common.maxRtpJitter;\n\n // Fec packets do come in as part of the FEC only for audio\n const fecRecovered =\n statsResults[mediaType][sendrecvType].fecPacketsReceived -\n lastFecPacketsReceived -\n (statsResults[mediaType][sendrecvType].fecPacketsDiscarded - lastFecPacketsDiscarded);\n\n audioReceiver.streams[0].common.rtpEndToEndLost =\n statsResults[mediaType][sendrecvType].totalPacketsLost - lastPacketsLost - fecRecovered || 0;\n\n audioReceiver.streams[0].common.framesDropped =\n statsResults[mediaType][sendrecvType].totalSamplesDecoded - lastPacketsDecoded || 0;\n audioReceiver.streams[0].common.renderedFrameRate =\n (audioReceiver.streams[0].common.framesDropped * 100) / 60 || 0;\n\n audioReceiver.streams[0].common.framesReceived =\n statsResults[mediaType][sendrecvType].totalSamplesReceived - lastSamplesReceived || 0;\n audioReceiver.streams[0].common.concealedFrames =\n statsResults[mediaType][sendrecvType].concealedSamples - lastConcealedSamples || 0;\n audioReceiver.streams[0].common.receivedBitrate =\n ((statsResults[mediaType][sendrecvType].totalBytesReceived - lastBytesReceived) * 8) / 60 || 0;\n\n audioReceiver.common.rtpBitrate = audioReceiver.streams[0].common.receivedBitrate;\n};\n\nexport const getAudioSenderMqa = ({audioSender, statsResults, lastMqaDataSent, mediaType}) => {\n const sendrecvType = STATS.SEND_DIRECTION;\n\n const lastPacketsSent = lastMqaDataSent[mediaType]?.[sendrecvType].totalPacketsSent || 0;\n const lastPacketsLost =\n lastMqaDataSent[mediaType]?.[sendrecvType].totalPacketsLostOnReceiver || 0;\n const lastBytesSent = lastMqaDataSent[mediaType]?.[sendrecvType].totalBytesSent || 0;\n const lastFramesEncoded = lastMqaDataSent[mediaType]?.[sendrecvType].totalKeyFramesEncoded || 0;\n const lastFirCount = lastMqaDataSent[mediaType]?.[sendrecvType].totalFirCount || 0;\n\n const {csi} = statsResults[mediaType];\n if (csi && !audioSender.streams[0].common.csi.includes(csi)) {\n audioSender.streams[0].common.csi.push(csi);\n }\n\n audioSender.common.common.direction = statsResults[mediaType].direction;\n audioSender.common.transportType = statsResults.connectionType.local.transport;\n\n audioSender.common.maxRemoteJitter =\n // @ts-ignore\n max(statsResults[mediaType][sendrecvType].meanRemoteJitter) * 1000 || 0;\n audioSender.common.meanRemoteJitter =\n mean(statsResults[mediaType][sendrecvType].meanRemoteJitter) * 1000 || 0;\n\n audioSender.common.rtpPackets =\n statsResults[mediaType][sendrecvType].totalPacketsSent - lastPacketsSent || 0;\n audioSender.streams[0].common.rtpPackets = audioSender.common.rtpPackets;\n // From candidate-pair\n audioSender.common.availableBitrate =\n statsResults[mediaType][sendrecvType].availableOutgoingBitrate || 0;\n // Calculate based on how much packets lost of received compated to how to the client sent\n\n const totalpacketsLostForaMin =\n statsResults[mediaType][sendrecvType].totalPacketsLostOnReceiver - lastPacketsLost;\n\n audioSender.common.remoteLossRate =\n totalpacketsLostForaMin > 0\n ? (totalpacketsLostForaMin * 100) / audioSender.common.rtpPackets\n : 0; // This is the packets sent with in last min || 0;\n\n audioSender.common.maxRoundTripTime =\n // @ts-ignore\n max(statsResults[mediaType][sendrecvType].meanRoundTripTime) * 1000 || 0;\n audioSender.common.meanRoundTripTime =\n mean(statsResults[mediaType][sendrecvType].meanRoundTripTime) * 1000 || 0;\n audioSender.common.roundTripTime = audioSender.common.maxRoundTripTime;\n\n // Calculate the outgoing bitrate\n const totalBytesSentInaMin = statsResults[mediaType][sendrecvType].totalBytesSent - lastBytesSent;\n\n audioSender.streams[0].common.transmittedBitrate = totalBytesSentInaMin\n ? (totalBytesSentInaMin * 8) / 60\n : 0;\n audioSender.common.rtpBitrate = audioSender.streams[0].common.transmittedBitrate;\n\n audioSender.streams[0].transmittedKeyFrames =\n statsResults[mediaType][sendrecvType].totalKeyFramesEncoded - lastFramesEncoded || 0;\n audioSender.streams[0].requestedKeyFrames =\n statsResults[mediaType][sendrecvType].totalFirCount - lastFirCount || 0;\n};\n\nexport const getVideoReceiverMqa = ({videoReceiver, statsResults, lastMqaDataSent, mediaType}) => {\n const sendrecvType = STATS.RECEIVE_DIRECTION;\n\n const lastPacketsReceived = lastMqaDataSent[mediaType]?.[sendrecvType].totalPacketsReceived || 0;\n const lastPacketsLost = lastMqaDataSent[mediaType]?.[sendrecvType].totalPacketsLost || 0;\n const lastBytesReceived = lastMqaDataSent[mediaType]?.[sendrecvType].totalBytesReceived || 0;\n const lastFramesReceived = lastMqaDataSent[mediaType]?.[sendrecvType].framesReceived || 0;\n const lastFramesDecoded = lastMqaDataSent[mediaType]?.[sendrecvType].framesDecoded || 0;\n const lastFramesDropped = lastMqaDataSent[mediaType]?.[sendrecvType].framesDropped || 0;\n const lastKeyFramesDecoded = lastMqaDataSent[mediaType]?.[sendrecvType].keyFramesDecoded || 0;\n const lastPliCount = lastMqaDataSent[mediaType]?.[sendrecvType].totalPliCount || 0;\n\n const {csi} = statsResults[mediaType];\n if (csi && !videoReceiver.streams[0].common.csi.includes(csi)) {\n videoReceiver.streams[0].common.csi.push(csi);\n }\n\n videoReceiver.common.common.direction = statsResults[mediaType].direction;\n videoReceiver.common.transportType = statsResults.connectionType.local.transport;\n\n // collect the packets received for the last min\n videoReceiver.common.rtpPackets =\n statsResults[mediaType][sendrecvType].totalPacketsReceived - lastPacketsReceived || 0;\n videoReceiver.streams[0].common.rtpPackets = videoReceiver.common.rtpPackets;\n\n const totalPacketLoss =\n statsResults[mediaType][sendrecvType].totalPacketsLost - lastPacketsLost || 0;\n\n // Hope by hop are numbers and not percentage so we compare on what we sent the last min\n // this is including packet lost\n videoReceiver.common.mediaHopByHopLost = totalPacketLoss;\n videoReceiver.common.rtpHopByHopLost = totalPacketLoss;\n\n // End to end packetloss is after recovery\n videoReceiver.streams[0].common.rtpEndToEndLost = totalPacketLoss;\n\n // calculate this values\n\n videoReceiver.common.maxRemoteJitter =\n // @ts-ignore\n max(statsResults[mediaType][sendrecvType].meanRemoteJitter) * 1000 || 0;\n videoReceiver.common.meanRemoteJitter =\n mean(statsResults[mediaType][sendrecvType].meanRemoteJitter) * 1000 || 0;\n\n videoReceiver.streams[0].common.rtpJitter = videoReceiver.common.maxRemoteJitter;\n // videoReceiver.streams[0].common.rtpJitter = (statsResults.resolutions[mediaType][sendrecvType].jitterBufferDelay - lastMqaDataSent.resolutions[mediaType]?.[sendrecvType].jitterBufferDelay) / (statsResults.resolutions[mediaType][sendrecvType].jitterBufferEmittedCount - lastMqaDataSent.resolutions[mediaType]?.[sendrecvType].jitterBufferEmittedCount) * 1000 || 0;\n\n // Calculate the outgoing bitrate\n const totalBytesReceivedInaMin =\n statsResults[mediaType][sendrecvType].totalBytesReceived - lastBytesReceived;\n\n videoReceiver.streams[0].common.receivedBitrate = totalBytesReceivedInaMin\n ? (totalBytesReceivedInaMin * 8) / 60\n : 0;\n videoReceiver.common.rtpBitrate = videoReceiver.streams[0].common.receivedBitrate;\n\n // From tracks //TODO: calculate a proper one\n const totalFrameReceivedInaMin =\n statsResults.resolutions[mediaType][sendrecvType].framesReceived - lastFramesReceived;\n const totalFrameDecodedInaMin =\n statsResults.resolutions[mediaType][sendrecvType].framesDecoded - lastFramesDecoded;\n\n videoReceiver.streams[0].common.receivedFrameRate = totalFrameReceivedInaMin\n ? (totalFrameReceivedInaMin * 100) / 60\n : 0;\n videoReceiver.streams[0].common.renderedFrameRate = totalFrameDecodedInaMin\n ? (totalFrameDecodedInaMin * 100) / 60\n : 0;\n\n videoReceiver.streams[0].common.framesDropped =\n statsResults.resolutions[mediaType][sendrecvType].framesDropped - lastFramesDropped;\n videoReceiver.streams[0].receivedHeight =\n statsResults.resolutions[mediaType][sendrecvType].height || 0;\n videoReceiver.streams[0].receivedWidth =\n statsResults.resolutions[mediaType][sendrecvType].width || 0;\n videoReceiver.streams[0].receivedFrameSize =\n (videoReceiver.streams[0].receivedHeight * videoReceiver.streams[0].receivedWidth) / 256;\n\n videoReceiver.streams[0].receivedKeyFrames =\n statsResults[mediaType][sendrecvType].keyFramesDecoded - lastKeyFramesDecoded || 0;\n videoReceiver.streams[0].requestedKeyFrames =\n statsResults[mediaType][sendrecvType].totalPliCount - lastPliCount || 0;\n};\n\nexport const getVideoSenderMqa = ({videoSender, statsResults, lastMqaDataSent, mediaType}) => {\n const sendrecvType = STATS.SEND_DIRECTION;\n\n const lastPacketsSent = lastMqaDataSent[mediaType]?.[sendrecvType].totalPacketsSent || 0;\n const lastPacketsLost =\n lastMqaDataSent[mediaType]?.[sendrecvType].totalPacketsLostOnReceiver || 0;\n const lastBytesSent = lastMqaDataSent[mediaType]?.[sendrecvType].totalBytesSent || 0;\n const lastKeyFramesEncoded =\n lastMqaDataSent[mediaType]?.[sendrecvType].totalKeyFramesEncoded || 0;\n const lastFirCount = lastMqaDataSent[mediaType]?.[sendrecvType].totalFirCount || 0;\n const lastFramesSent = lastMqaDataSent[mediaType]?.[sendrecvType].framesSent || 0;\n const {csi} = statsResults[mediaType];\n if (csi && !videoSender.streams[0].common.csi.includes(csi)) {\n videoSender.streams[0].common.csi.push(csi);\n }\n\n videoSender.common.common.direction = statsResults[mediaType].direction;\n videoSender.common.transportType = statsResults.connectionType.local.transport;\n\n // @ts-ignore\n videoSender.common.maxRemoteJitter =\n // @ts-ignore\n max(statsResults[mediaType][sendrecvType].meanRemoteJitter) * 1000 || 0;\n videoSender.common.meanRemoteJitter =\n mean(statsResults[mediaType][sendrecvType].meanRemoteJitter) * 1000 || 0;\n\n videoSender.common.rtpPackets =\n statsResults[mediaType][sendrecvType].totalPacketsSent - lastPacketsSent || 0;\n videoSender.common.availableBitrate =\n statsResults[mediaType][sendrecvType].availableOutgoingBitrate || 0;\n // Calculate based on how much packets lost of received compated to how to the client sent\n\n const totalpacketsLostForaMin =\n statsResults[mediaType][sendrecvType].totalPacketsLostOnReceiver - lastPacketsLost;\n\n videoSender.common.remoteLossRate =\n totalpacketsLostForaMin > 0\n ? (totalpacketsLostForaMin * 100) / (videoSender.common.rtpPackets + totalpacketsLostForaMin)\n : 0; // This is the packets sent with in last min || 0;\n\n videoSender.common.maxRoundTripTime =\n // @ts-ignore\n max(statsResults[mediaType][sendrecvType].meanRoundTripTime) * 1000 || 0;\n videoSender.common.meanRoundTripTime =\n mean(statsResults[mediaType][sendrecvType].meanRoundTripTime) * 1000 || 0;\n videoSender.common.roundTripTime = videoSender.common.maxRoundTripTime;\n\n videoSender.streams[0].common.rtpPackets =\n statsResults[mediaType][sendrecvType].totalPacketsSent - lastPacketsSent || 0;\n\n // Calculate the outgoing bitrate\n const totalBytesSentInaMin = statsResults[mediaType][sendrecvType].totalBytesSent - lastBytesSent;\n\n videoSender.streams[0].common.transmittedBitrate = totalBytesSentInaMin\n ? (totalBytesSentInaMin * 8) / 60\n : 0;\n\n videoSender.common.rtpBitrate = videoSender.streams[0].common.transmittedBitrate;\n\n videoSender.streams[0].transmittedKeyFrames =\n statsResults[mediaType][sendrecvType].totalKeyFramesEncoded - lastKeyFramesEncoded || 0;\n videoSender.streams[0].requestedKeyFrames =\n statsResults[mediaType][sendrecvType].totalFirCount - lastFirCount || 0;\n\n // From tracks //TODO: calculate a proper one\n const totalFrameSentInaMin =\n statsResults.resolutions[mediaType][sendrecvType].framesSent - (lastFramesSent || 0);\n\n videoSender.streams[0].common.transmittedFrameRate = totalFrameSentInaMin\n ? (totalFrameSentInaMin * 100) / 60\n : 0;\n videoSender.streams[0].transmittedHeight =\n statsResults.resolutions[mediaType][sendrecvType].height || 0;\n videoSender.streams[0].transmittedWidth =\n statsResults.resolutions[mediaType][sendrecvType].width || 0;\n videoSender.streams[0].transmittedFrameSize =\n (videoSender.streams[0].transmittedHeight * videoSender.streams[0].transmittedWidth) / 256;\n};\n"],"mappings":"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"}
|
|
1
|
+
{"version":3,"names":["getAudioReceiverMqa","audioReceiver","statsResults","lastMqaDataSent","mediaType","sendrecvType","STATS","RECEIVE_DIRECTION","lastPacketsReceived","totalPacketsReceived","lastPacketsLost","totalPacketsLost","lastPacketsDecoded","totalSamplesDecoded","lastSamplesReceived","totalSamplesReceived","lastConcealedSamples","concealedSamples","lastBytesReceived","totalBytesReceived","lastFecPacketsReceived","fecPacketsReceived","lastFecPacketsDiscarded","fecPacketsDiscarded","csi","streams","common","includes","push","direction","transportType","connectionType","local","transport","rtpPackets","mediaHopByHopLost","rtpHopByHopLost","maxRtpJitter","meanRtpJitter","rtpJitter","fecRecovered","rtpEndToEndLost","framesDropped","renderedFrameRate","framesReceived","concealedFrames","receivedBitrate","rtpBitrate","getAudioSenderMqa","audioSender","SEND_DIRECTION","lastPacketsSent","totalPacketsSent","totalPacketsLostOnReceiver","lastBytesSent","totalBytesSent","lastFramesEncoded","totalKeyFramesEncoded","lastFirCount","totalFirCount","maxRemoteJitter","meanRemoteJitter","availableBitrate","availableOutgoingBitrate","totalpacketsLostForaMin","remoteLossRate","maxRoundTripTime","meanRoundTripTime","roundTripTime","totalBytesSentInaMin","transmittedBitrate","transmittedKeyFrames","requestedKeyFrames","getVideoReceiverMqa","videoReceiver","lastFramesReceived","resolutions","lastFramesDecoded","framesDecoded","lastFramesDropped","lastKeyFramesDecoded","keyFramesDecoded","lastPliCount","totalPliCount","totalPacketLoss","totalBytesReceivedInaMin","totalFrameReceivedInaMin","totalFrameDecodedInaMin","receivedFrameRate","Math","round","receivedHeight","height","receivedWidth","width","receivedFrameSize","receivedKeyFrames","getVideoSenderMqa","videoSender","lastKeyFramesEncoded","lastFramesSent","framesSent","totalFrameSentInaMin","transmittedFrameRate","transmittedHeight","transmittedWidth","transmittedFrameSize"],"sources":["mqaUtil.ts"],"sourcesContent":["/* eslint-disable no-param-reassign, prefer-destructuring */\n\nimport {mean, max} from 'lodash';\n\nimport {STATS} from '../constants';\n\nexport const getAudioReceiverMqa = ({audioReceiver, statsResults, lastMqaDataSent, mediaType}) => {\n const sendrecvType = STATS.RECEIVE_DIRECTION;\n\n const lastPacketsReceived = lastMqaDataSent[mediaType]?.[sendrecvType].totalPacketsReceived || 0;\n const lastPacketsLost = lastMqaDataSent[mediaType]?.[sendrecvType].totalPacketsLost || 0;\n const lastPacketsDecoded = lastMqaDataSent[mediaType]?.[sendrecvType].totalSamplesDecoded || 0;\n const lastSamplesReceived = lastMqaDataSent[mediaType]?.[sendrecvType].totalSamplesReceived || 0;\n const lastConcealedSamples = lastMqaDataSent[mediaType]?.[sendrecvType].concealedSamples || 0;\n const lastBytesReceived = lastMqaDataSent[mediaType]?.[sendrecvType].totalBytesReceived || 0;\n const lastFecPacketsReceived = lastMqaDataSent[mediaType]?.[sendrecvType].fecPacketsReceived || 0;\n const lastFecPacketsDiscarded =\n lastMqaDataSent[mediaType]?.[sendrecvType].fecPacketsDiscarded || 0;\n\n const {csi} = statsResults[mediaType];\n if (csi && !audioReceiver.streams[0].common.csi.includes(csi)) {\n audioReceiver.streams[0].common.csi.push(csi);\n }\n\n audioReceiver.common.common.direction = statsResults[mediaType].direction;\n audioReceiver.common.transportType = statsResults.connectionType.local.transport;\n\n // add rtpPacket info inside common as also for call analyzer\n audioReceiver.common.rtpPackets =\n statsResults[mediaType][sendrecvType].totalPacketsReceived - lastPacketsReceived || 0;\n // Hop by hop are numbers and not percentage so we compare on what we sent the last min\n // collect the packets received for the last min\n audioReceiver.streams[0].common.rtpPackets = audioReceiver.common.rtpPackets;\n audioReceiver.common.mediaHopByHopLost =\n statsResults[mediaType][sendrecvType].totalPacketsLost - lastPacketsLost || 0;\n audioReceiver.common.rtpHopByHopLost =\n statsResults[mediaType][sendrecvType].totalPacketsLost - lastPacketsLost || 0;\n\n audioReceiver.streams[0].common.maxRtpJitter =\n // @ts-ignore\n max(statsResults[mediaType][sendrecvType].meanRtpJitter) * 1000 || 0;\n audioReceiver.streams[0].common.meanRtpJitter =\n mean(statsResults[mediaType][sendrecvType].meanRtpJitter) * 1000 || 0;\n audioReceiver.streams[0].common.rtpJitter = audioReceiver.streams[0].common.maxRtpJitter;\n\n // Fec packets do come in as part of the FEC only for audio\n const fecRecovered =\n statsResults[mediaType][sendrecvType].fecPacketsReceived -\n lastFecPacketsReceived -\n (statsResults[mediaType][sendrecvType].fecPacketsDiscarded - lastFecPacketsDiscarded);\n\n audioReceiver.streams[0].common.rtpEndToEndLost =\n statsResults[mediaType][sendrecvType].totalPacketsLost - lastPacketsLost - fecRecovered || 0;\n\n audioReceiver.streams[0].common.framesDropped =\n statsResults[mediaType][sendrecvType].totalSamplesDecoded - lastPacketsDecoded || 0;\n audioReceiver.streams[0].common.renderedFrameRate =\n (audioReceiver.streams[0].common.framesDropped * 100) / 60 || 0;\n\n audioReceiver.streams[0].common.framesReceived =\n statsResults[mediaType][sendrecvType].totalSamplesReceived - lastSamplesReceived || 0;\n audioReceiver.streams[0].common.concealedFrames =\n statsResults[mediaType][sendrecvType].concealedSamples - lastConcealedSamples || 0;\n audioReceiver.streams[0].common.receivedBitrate =\n ((statsResults[mediaType][sendrecvType].totalBytesReceived - lastBytesReceived) * 8) / 60 || 0;\n\n audioReceiver.common.rtpBitrate = audioReceiver.streams[0].common.receivedBitrate;\n};\n\nexport const getAudioSenderMqa = ({audioSender, statsResults, lastMqaDataSent, mediaType}) => {\n const sendrecvType = STATS.SEND_DIRECTION;\n\n const lastPacketsSent = lastMqaDataSent[mediaType]?.[sendrecvType].totalPacketsSent || 0;\n const lastPacketsLost =\n lastMqaDataSent[mediaType]?.[sendrecvType].totalPacketsLostOnReceiver || 0;\n const lastBytesSent = lastMqaDataSent[mediaType]?.[sendrecvType].totalBytesSent || 0;\n const lastFramesEncoded = lastMqaDataSent[mediaType]?.[sendrecvType].totalKeyFramesEncoded || 0;\n const lastFirCount = lastMqaDataSent[mediaType]?.[sendrecvType].totalFirCount || 0;\n\n const {csi} = statsResults[mediaType];\n if (csi && !audioSender.streams[0].common.csi.includes(csi)) {\n audioSender.streams[0].common.csi.push(csi);\n }\n\n audioSender.common.common.direction = statsResults[mediaType].direction;\n audioSender.common.transportType = statsResults.connectionType.local.transport;\n\n audioSender.common.maxRemoteJitter =\n // @ts-ignore\n max(statsResults[mediaType][sendrecvType].meanRemoteJitter) * 1000 || 0;\n audioSender.common.meanRemoteJitter =\n mean(statsResults[mediaType][sendrecvType].meanRemoteJitter) * 1000 || 0;\n\n audioSender.common.rtpPackets =\n statsResults[mediaType][sendrecvType].totalPacketsSent - lastPacketsSent || 0;\n audioSender.streams[0].common.rtpPackets = audioSender.common.rtpPackets;\n // From candidate-pair\n audioSender.common.availableBitrate =\n statsResults[mediaType][sendrecvType].availableOutgoingBitrate || 0;\n // Calculate based on how much packets lost of received compated to how to the client sent\n\n const totalpacketsLostForaMin =\n statsResults[mediaType][sendrecvType].totalPacketsLostOnReceiver - lastPacketsLost;\n\n audioSender.common.remoteLossRate =\n totalpacketsLostForaMin > 0\n ? (totalpacketsLostForaMin * 100) / audioSender.common.rtpPackets\n : 0; // This is the packets sent with in last min || 0;\n\n audioSender.common.maxRoundTripTime =\n // @ts-ignore\n max(statsResults[mediaType][sendrecvType].meanRoundTripTime) * 1000 || 0;\n audioSender.common.meanRoundTripTime =\n mean(statsResults[mediaType][sendrecvType].meanRoundTripTime) * 1000 || 0;\n audioSender.common.roundTripTime = audioSender.common.maxRoundTripTime;\n\n // Calculate the outgoing bitrate\n const totalBytesSentInaMin = statsResults[mediaType][sendrecvType].totalBytesSent - lastBytesSent;\n\n audioSender.streams[0].common.transmittedBitrate = totalBytesSentInaMin\n ? (totalBytesSentInaMin * 8) / 60\n : 0;\n audioSender.common.rtpBitrate = audioSender.streams[0].common.transmittedBitrate;\n\n audioSender.streams[0].transmittedKeyFrames =\n statsResults[mediaType][sendrecvType].totalKeyFramesEncoded - lastFramesEncoded || 0;\n audioSender.streams[0].requestedKeyFrames =\n statsResults[mediaType][sendrecvType].totalFirCount - lastFirCount || 0;\n};\n\nexport const getVideoReceiverMqa = ({videoReceiver, statsResults, lastMqaDataSent, mediaType}) => {\n const sendrecvType = STATS.RECEIVE_DIRECTION;\n\n const lastPacketsReceived = lastMqaDataSent[mediaType]?.[sendrecvType].totalPacketsReceived || 0;\n const lastPacketsLost = lastMqaDataSent[mediaType]?.[sendrecvType].totalPacketsLost || 0;\n const lastBytesReceived = lastMqaDataSent[mediaType]?.[sendrecvType].totalBytesReceived || 0;\n const lastFramesReceived =\n lastMqaDataSent.resolutions[mediaType]?.[sendrecvType].framesReceived || 0;\n const lastFramesDecoded =\n lastMqaDataSent.resolutions[mediaType]?.[sendrecvType].framesDecoded || 0;\n const lastFramesDropped =\n lastMqaDataSent.resolutions[mediaType]?.[sendrecvType].framesDropped || 0;\n const lastKeyFramesDecoded = lastMqaDataSent[mediaType]?.[sendrecvType].keyFramesDecoded || 0;\n const lastPliCount = lastMqaDataSent[mediaType]?.[sendrecvType].totalPliCount || 0;\n\n const {csi} = statsResults[mediaType];\n if (csi && !videoReceiver.streams[0].common.csi.includes(csi)) {\n videoReceiver.streams[0].common.csi.push(csi);\n }\n\n videoReceiver.common.common.direction = statsResults[mediaType].direction;\n videoReceiver.common.transportType = statsResults.connectionType.local.transport;\n\n // collect the packets received for the last min\n videoReceiver.common.rtpPackets =\n statsResults[mediaType][sendrecvType].totalPacketsReceived - lastPacketsReceived || 0;\n videoReceiver.streams[0].common.rtpPackets = videoReceiver.common.rtpPackets;\n\n const totalPacketLoss =\n statsResults[mediaType][sendrecvType].totalPacketsLost - lastPacketsLost || 0;\n\n // Hope by hop are numbers and not percentage so we compare on what we sent the last min\n // this is including packet lost\n videoReceiver.common.mediaHopByHopLost = totalPacketLoss;\n videoReceiver.common.rtpHopByHopLost = totalPacketLoss;\n\n // End to end packetloss is after recovery\n videoReceiver.streams[0].common.rtpEndToEndLost = totalPacketLoss;\n\n // calculate this values\n\n videoReceiver.common.maxRemoteJitter =\n // @ts-ignore\n max(statsResults[mediaType][sendrecvType].meanRemoteJitter) * 1000 || 0;\n videoReceiver.common.meanRemoteJitter =\n mean(statsResults[mediaType][sendrecvType].meanRemoteJitter) * 1000 || 0;\n\n videoReceiver.streams[0].common.rtpJitter = videoReceiver.common.maxRemoteJitter;\n // videoReceiver.streams[0].common.rtpJitter = (statsResults.resolutions[mediaType][sendrecvType].jitterBufferDelay - lastMqaDataSent.resolutions[mediaType]?.[sendrecvType].jitterBufferDelay) / (statsResults.resolutions[mediaType][sendrecvType].jitterBufferEmittedCount - lastMqaDataSent.resolutions[mediaType]?.[sendrecvType].jitterBufferEmittedCount) * 1000 || 0;\n\n // Calculate the outgoing bitrate\n const totalBytesReceivedInaMin =\n statsResults[mediaType][sendrecvType].totalBytesReceived - lastBytesReceived;\n\n videoReceiver.streams[0].common.receivedBitrate = totalBytesReceivedInaMin\n ? (totalBytesReceivedInaMin * 8) / 60\n : 0;\n videoReceiver.common.rtpBitrate = videoReceiver.streams[0].common.receivedBitrate;\n\n // From tracks //TODO: calculate a proper one\n const totalFrameReceivedInaMin =\n statsResults.resolutions[mediaType][sendrecvType].framesReceived - lastFramesReceived;\n const totalFrameDecodedInaMin =\n statsResults.resolutions[mediaType][sendrecvType].framesDecoded - lastFramesDecoded;\n\n videoReceiver.streams[0].common.receivedFrameRate = Math.round(\n totalFrameReceivedInaMin ? totalFrameReceivedInaMin / 60 : 0\n );\n videoReceiver.streams[0].common.renderedFrameRate = Math.round(\n totalFrameDecodedInaMin ? totalFrameDecodedInaMin / 60 : 0\n );\n\n videoReceiver.streams[0].common.framesDropped =\n statsResults.resolutions[mediaType][sendrecvType].framesDropped - lastFramesDropped;\n videoReceiver.streams[0].receivedHeight =\n statsResults.resolutions[mediaType][sendrecvType].height || 0;\n videoReceiver.streams[0].receivedWidth =\n statsResults.resolutions[mediaType][sendrecvType].width || 0;\n videoReceiver.streams[0].receivedFrameSize =\n (videoReceiver.streams[0].receivedHeight * videoReceiver.streams[0].receivedWidth) / 256;\n\n videoReceiver.streams[0].receivedKeyFrames =\n statsResults[mediaType][sendrecvType].keyFramesDecoded - lastKeyFramesDecoded || 0;\n videoReceiver.streams[0].requestedKeyFrames =\n statsResults[mediaType][sendrecvType].totalPliCount - lastPliCount || 0;\n};\n\nexport const getVideoSenderMqa = ({videoSender, statsResults, lastMqaDataSent, mediaType}) => {\n const sendrecvType = STATS.SEND_DIRECTION;\n\n const lastPacketsSent = lastMqaDataSent[mediaType]?.[sendrecvType].totalPacketsSent || 0;\n const lastPacketsLost =\n lastMqaDataSent[mediaType]?.[sendrecvType].totalPacketsLostOnReceiver || 0;\n const lastBytesSent = lastMqaDataSent[mediaType]?.[sendrecvType].totalBytesSent || 0;\n const lastKeyFramesEncoded =\n lastMqaDataSent.resolutions[mediaType]?.[sendrecvType].totalKeyFramesEncoded || 0;\n const lastFirCount = lastMqaDataSent[mediaType]?.[sendrecvType].totalFirCount || 0;\n const lastFramesSent = lastMqaDataSent.resolutions[mediaType]?.[sendrecvType].framesSent || 0;\n const {csi} = statsResults[mediaType];\n if (csi && !videoSender.streams[0].common.csi.includes(csi)) {\n videoSender.streams[0].common.csi.push(csi);\n }\n\n videoSender.common.common.direction = statsResults[mediaType].direction;\n videoSender.common.transportType = statsResults.connectionType.local.transport;\n\n // @ts-ignore\n videoSender.common.maxRemoteJitter =\n // @ts-ignore\n max(statsResults[mediaType][sendrecvType].meanRemoteJitter) * 1000 || 0;\n videoSender.common.meanRemoteJitter =\n mean(statsResults[mediaType][sendrecvType].meanRemoteJitter) * 1000 || 0;\n\n videoSender.common.rtpPackets =\n statsResults[mediaType][sendrecvType].totalPacketsSent - lastPacketsSent || 0;\n videoSender.common.availableBitrate =\n statsResults[mediaType][sendrecvType].availableOutgoingBitrate || 0;\n // Calculate based on how much packets lost of received compated to how to the client sent\n\n const totalpacketsLostForaMin =\n statsResults[mediaType][sendrecvType].totalPacketsLostOnReceiver - lastPacketsLost;\n\n videoSender.common.remoteLossRate =\n totalpacketsLostForaMin > 0\n ? (totalpacketsLostForaMin * 100) / (videoSender.common.rtpPackets + totalpacketsLostForaMin)\n : 0; // This is the packets sent with in last min || 0;\n\n videoSender.common.maxRoundTripTime =\n // @ts-ignore\n max(statsResults[mediaType][sendrecvType].meanRoundTripTime) * 1000 || 0;\n videoSender.common.meanRoundTripTime =\n mean(statsResults[mediaType][sendrecvType].meanRoundTripTime) * 1000 || 0;\n videoSender.common.roundTripTime = videoSender.common.maxRoundTripTime;\n\n videoSender.streams[0].common.rtpPackets =\n statsResults[mediaType][sendrecvType].totalPacketsSent - lastPacketsSent || 0;\n\n // Calculate the outgoing bitrate\n const totalBytesSentInaMin = statsResults[mediaType][sendrecvType].totalBytesSent - lastBytesSent;\n\n videoSender.streams[0].common.transmittedBitrate = totalBytesSentInaMin\n ? (totalBytesSentInaMin * 8) / 60\n : 0;\n\n videoSender.common.rtpBitrate = videoSender.streams[0].common.transmittedBitrate;\n\n videoSender.streams[0].transmittedKeyFrames =\n statsResults[mediaType][sendrecvType].totalKeyFramesEncoded - lastKeyFramesEncoded || 0;\n videoSender.streams[0].requestedKeyFrames =\n statsResults[mediaType][sendrecvType].totalFirCount - lastFirCount || 0;\n\n // From tracks //TODO: calculate a proper one\n const totalFrameSentInaMin =\n statsResults.resolutions[mediaType][sendrecvType].framesSent - (lastFramesSent || 0);\n\n videoSender.streams[0].common.transmittedFrameRate = Math.round(\n totalFrameSentInaMin ? totalFrameSentInaMin / 60 : 0\n );\n videoSender.streams[0].transmittedHeight =\n statsResults.resolutions[mediaType][sendrecvType].height || 0;\n videoSender.streams[0].transmittedWidth =\n statsResults.resolutions[mediaType][sendrecvType].width || 0;\n videoSender.streams[0].transmittedFrameSize =\n (videoSender.streams[0].transmittedHeight * videoSender.streams[0].transmittedWidth) / 256;\n};\n"],"mappings":"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"}
|
package/dist/webinar/index.js
CHANGED
|
@@ -62,7 +62,7 @@ var Webinar = _webexCore.WebexPlugin.extend({
|
|
|
62
62
|
updateCanManageWebcast: function updateCanManageWebcast(canManageWebcast) {
|
|
63
63
|
this.set('canManageWebcast', canManageWebcast);
|
|
64
64
|
},
|
|
65
|
-
version: "3.0.0-beta.
|
|
65
|
+
version: "3.0.0-beta.313"
|
|
66
66
|
});
|
|
67
67
|
var _default = Webinar;
|
|
68
68
|
exports.default = _default;
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@webex/plugin-meetings",
|
|
3
|
-
"version": "3.0.0-beta.
|
|
3
|
+
"version": "3.0.0-beta.313",
|
|
4
4
|
"description": "",
|
|
5
5
|
"license": "Cisco EULA (https://www.cisco.com/c/en/us/products/end-user-license-agreement.html)",
|
|
6
6
|
"contributors": [
|
|
@@ -32,12 +32,12 @@
|
|
|
32
32
|
"build": "yarn run -T tsc --declaration true --declarationDir ./dist/types"
|
|
33
33
|
},
|
|
34
34
|
"devDependencies": {
|
|
35
|
-
"@webex/plugin-meetings": "3.0.0-beta.
|
|
36
|
-
"@webex/test-helper-chai": "3.0.0-beta.
|
|
37
|
-
"@webex/test-helper-mocha": "3.0.0-beta.
|
|
38
|
-
"@webex/test-helper-mock-webex": "3.0.0-beta.
|
|
39
|
-
"@webex/test-helper-retry": "3.0.0-beta.
|
|
40
|
-
"@webex/test-helper-test-users": "3.0.0-beta.
|
|
35
|
+
"@webex/plugin-meetings": "3.0.0-beta.313",
|
|
36
|
+
"@webex/test-helper-chai": "3.0.0-beta.313",
|
|
37
|
+
"@webex/test-helper-mocha": "3.0.0-beta.313",
|
|
38
|
+
"@webex/test-helper-mock-webex": "3.0.0-beta.313",
|
|
39
|
+
"@webex/test-helper-retry": "3.0.0-beta.313",
|
|
40
|
+
"@webex/test-helper-test-users": "3.0.0-beta.313",
|
|
41
41
|
"chai": "^4.3.4",
|
|
42
42
|
"chai-as-promised": "^7.1.1",
|
|
43
43
|
"jsdom-global": "3.0.2",
|
|
@@ -46,19 +46,19 @@
|
|
|
46
46
|
"typescript": "^4.7.4"
|
|
47
47
|
},
|
|
48
48
|
"dependencies": {
|
|
49
|
-
"@webex/common": "3.0.0-beta.
|
|
49
|
+
"@webex/common": "3.0.0-beta.313",
|
|
50
50
|
"@webex/internal-media-core": "2.2.1",
|
|
51
|
-
"@webex/internal-plugin-conversation": "3.0.0-beta.
|
|
52
|
-
"@webex/internal-plugin-device": "3.0.0-beta.
|
|
53
|
-
"@webex/internal-plugin-llm": "3.0.0-beta.
|
|
54
|
-
"@webex/internal-plugin-mercury": "3.0.0-beta.
|
|
55
|
-
"@webex/internal-plugin-metrics": "3.0.0-beta.
|
|
56
|
-
"@webex/internal-plugin-support": "3.0.0-beta.
|
|
57
|
-
"@webex/internal-plugin-user": "3.0.0-beta.
|
|
58
|
-
"@webex/media-helpers": "3.0.0-beta.
|
|
59
|
-
"@webex/plugin-people": "3.0.0-beta.
|
|
60
|
-
"@webex/plugin-rooms": "3.0.0-beta.
|
|
61
|
-
"@webex/webex-core": "3.0.0-beta.
|
|
51
|
+
"@webex/internal-plugin-conversation": "3.0.0-beta.313",
|
|
52
|
+
"@webex/internal-plugin-device": "3.0.0-beta.313",
|
|
53
|
+
"@webex/internal-plugin-llm": "3.0.0-beta.313",
|
|
54
|
+
"@webex/internal-plugin-mercury": "3.0.0-beta.313",
|
|
55
|
+
"@webex/internal-plugin-metrics": "3.0.0-beta.313",
|
|
56
|
+
"@webex/internal-plugin-support": "3.0.0-beta.313",
|
|
57
|
+
"@webex/internal-plugin-user": "3.0.0-beta.313",
|
|
58
|
+
"@webex/media-helpers": "3.0.0-beta.313",
|
|
59
|
+
"@webex/plugin-people": "3.0.0-beta.313",
|
|
60
|
+
"@webex/plugin-rooms": "3.0.0-beta.313",
|
|
61
|
+
"@webex/webex-core": "3.0.0-beta.313",
|
|
62
62
|
"ampersand-collection": "^2.0.2",
|
|
63
63
|
"bowser": "^2.11.0",
|
|
64
64
|
"btoa": "^1.2.1",
|
|
@@ -103,7 +103,7 @@ export class StatsAnalyzer extends EventsScope {
|
|
|
103
103
|
this.networkQualityMonitor = networkQualityMonitor;
|
|
104
104
|
this.correlationId = config.correlationId;
|
|
105
105
|
this.mqaSentCount = -1;
|
|
106
|
-
this.lastMqaDataSent = {};
|
|
106
|
+
this.lastMqaDataSent = {resolutions: {}};
|
|
107
107
|
this.lastEmittedStartStopEvent = {};
|
|
108
108
|
this.receiveSlotCallback = receiveSlotCallback;
|
|
109
109
|
this.successfulCandidatePair = {};
|
|
@@ -152,6 +152,21 @@ export class StatsAnalyzer extends EventsScope {
|
|
|
152
152
|
const newMqa = cloneDeep(emptyMqaInterval);
|
|
153
153
|
|
|
154
154
|
Object.keys(this.statsResults).forEach((mediaType) => {
|
|
155
|
+
if (!this.lastMqaDataSent[mediaType]) {
|
|
156
|
+
this.lastMqaDataSent[mediaType] = {};
|
|
157
|
+
this.lastMqaDataSent.resolutions[mediaType] = {};
|
|
158
|
+
}
|
|
159
|
+
|
|
160
|
+
if (!this.lastMqaDataSent[mediaType].send && mediaType.includes('-send')) {
|
|
161
|
+
this.lastMqaDataSent[mediaType].send = {};
|
|
162
|
+
this.lastMqaDataSent.resolutions[mediaType].send = {};
|
|
163
|
+
}
|
|
164
|
+
|
|
165
|
+
if (!this.lastMqaDataSent[mediaType].recv && mediaType.includes('-recv')) {
|
|
166
|
+
this.lastMqaDataSent[mediaType].recv = {};
|
|
167
|
+
this.lastMqaDataSent.resolutions[mediaType].recv = {};
|
|
168
|
+
}
|
|
169
|
+
|
|
155
170
|
if (mediaType.includes('audio-send') || mediaType.includes('audio-share-send')) {
|
|
156
171
|
const audioSender = cloneDeep(emptyAudioTransmit);
|
|
157
172
|
|
|
@@ -162,6 +177,8 @@ export class StatsAnalyzer extends EventsScope {
|
|
|
162
177
|
mediaType,
|
|
163
178
|
});
|
|
164
179
|
newMqa.audioTransmit.push(audioSender);
|
|
180
|
+
|
|
181
|
+
this.lastMqaDataSent[mediaType].send = cloneDeep(this.statsResults[mediaType].send);
|
|
165
182
|
} else if (mediaType.includes('audio-recv') || mediaType.includes('audio-share-recv')) {
|
|
166
183
|
const audioReceiver = cloneDeep(emptyAudioReceive);
|
|
167
184
|
|
|
@@ -172,6 +189,8 @@ export class StatsAnalyzer extends EventsScope {
|
|
|
172
189
|
mediaType,
|
|
173
190
|
});
|
|
174
191
|
newMqa.audioReceive.push(audioReceiver);
|
|
192
|
+
|
|
193
|
+
this.lastMqaDataSent[mediaType].recv = cloneDeep(this.statsResults[mediaType].recv);
|
|
175
194
|
} else if (mediaType.includes('video-send') || mediaType.includes('video-share-send')) {
|
|
176
195
|
const videoSender = cloneDeep(emptyVideoTransmit);
|
|
177
196
|
|
|
@@ -182,6 +201,11 @@ export class StatsAnalyzer extends EventsScope {
|
|
|
182
201
|
mediaType,
|
|
183
202
|
});
|
|
184
203
|
newMqa.videoTransmit.push(videoSender);
|
|
204
|
+
|
|
205
|
+
this.lastMqaDataSent[mediaType].send = cloneDeep(this.statsResults[mediaType].send);
|
|
206
|
+
this.lastMqaDataSent.resolutions[mediaType].send = cloneDeep(
|
|
207
|
+
this.statsResults.resolutions[mediaType].send
|
|
208
|
+
);
|
|
185
209
|
} else if (mediaType.includes('video-recv') || mediaType.includes('video-share-recv')) {
|
|
186
210
|
const videoReceiver = cloneDeep(emptyVideoReceive);
|
|
187
211
|
|
|
@@ -192,6 +216,11 @@ export class StatsAnalyzer extends EventsScope {
|
|
|
192
216
|
mediaType,
|
|
193
217
|
});
|
|
194
218
|
newMqa.videoReceive.push(videoReceiver);
|
|
219
|
+
|
|
220
|
+
this.lastMqaDataSent[mediaType].recv = cloneDeep(this.statsResults[mediaType].recv);
|
|
221
|
+
this.lastMqaDataSent.resolutions[mediaType].recv = cloneDeep(
|
|
222
|
+
this.statsResults.resolutions[mediaType].recv
|
|
223
|
+
);
|
|
195
224
|
}
|
|
196
225
|
});
|
|
197
226
|
|
|
@@ -134,9 +134,12 @@ export const getVideoReceiverMqa = ({videoReceiver, statsResults, lastMqaDataSen
|
|
|
134
134
|
const lastPacketsReceived = lastMqaDataSent[mediaType]?.[sendrecvType].totalPacketsReceived || 0;
|
|
135
135
|
const lastPacketsLost = lastMqaDataSent[mediaType]?.[sendrecvType].totalPacketsLost || 0;
|
|
136
136
|
const lastBytesReceived = lastMqaDataSent[mediaType]?.[sendrecvType].totalBytesReceived || 0;
|
|
137
|
-
const lastFramesReceived =
|
|
138
|
-
|
|
139
|
-
const
|
|
137
|
+
const lastFramesReceived =
|
|
138
|
+
lastMqaDataSent.resolutions[mediaType]?.[sendrecvType].framesReceived || 0;
|
|
139
|
+
const lastFramesDecoded =
|
|
140
|
+
lastMqaDataSent.resolutions[mediaType]?.[sendrecvType].framesDecoded || 0;
|
|
141
|
+
const lastFramesDropped =
|
|
142
|
+
lastMqaDataSent.resolutions[mediaType]?.[sendrecvType].framesDropped || 0;
|
|
140
143
|
const lastKeyFramesDecoded = lastMqaDataSent[mediaType]?.[sendrecvType].keyFramesDecoded || 0;
|
|
141
144
|
const lastPliCount = lastMqaDataSent[mediaType]?.[sendrecvType].totalPliCount || 0;
|
|
142
145
|
|
|
@@ -190,12 +193,12 @@ export const getVideoReceiverMqa = ({videoReceiver, statsResults, lastMqaDataSen
|
|
|
190
193
|
const totalFrameDecodedInaMin =
|
|
191
194
|
statsResults.resolutions[mediaType][sendrecvType].framesDecoded - lastFramesDecoded;
|
|
192
195
|
|
|
193
|
-
videoReceiver.streams[0].common.receivedFrameRate =
|
|
194
|
-
?
|
|
195
|
-
|
|
196
|
-
videoReceiver.streams[0].common.renderedFrameRate =
|
|
197
|
-
?
|
|
198
|
-
|
|
196
|
+
videoReceiver.streams[0].common.receivedFrameRate = Math.round(
|
|
197
|
+
totalFrameReceivedInaMin ? totalFrameReceivedInaMin / 60 : 0
|
|
198
|
+
);
|
|
199
|
+
videoReceiver.streams[0].common.renderedFrameRate = Math.round(
|
|
200
|
+
totalFrameDecodedInaMin ? totalFrameDecodedInaMin / 60 : 0
|
|
201
|
+
);
|
|
199
202
|
|
|
200
203
|
videoReceiver.streams[0].common.framesDropped =
|
|
201
204
|
statsResults.resolutions[mediaType][sendrecvType].framesDropped - lastFramesDropped;
|
|
@@ -220,9 +223,9 @@ export const getVideoSenderMqa = ({videoSender, statsResults, lastMqaDataSent, m
|
|
|
220
223
|
lastMqaDataSent[mediaType]?.[sendrecvType].totalPacketsLostOnReceiver || 0;
|
|
221
224
|
const lastBytesSent = lastMqaDataSent[mediaType]?.[sendrecvType].totalBytesSent || 0;
|
|
222
225
|
const lastKeyFramesEncoded =
|
|
223
|
-
lastMqaDataSent[mediaType]?.[sendrecvType].totalKeyFramesEncoded || 0;
|
|
226
|
+
lastMqaDataSent.resolutions[mediaType]?.[sendrecvType].totalKeyFramesEncoded || 0;
|
|
224
227
|
const lastFirCount = lastMqaDataSent[mediaType]?.[sendrecvType].totalFirCount || 0;
|
|
225
|
-
const lastFramesSent = lastMqaDataSent[mediaType]?.[sendrecvType].framesSent || 0;
|
|
228
|
+
const lastFramesSent = lastMqaDataSent.resolutions[mediaType]?.[sendrecvType].framesSent || 0;
|
|
226
229
|
const {csi} = statsResults[mediaType];
|
|
227
230
|
if (csi && !videoSender.streams[0].common.csi.includes(csi)) {
|
|
228
231
|
videoSender.streams[0].common.csi.push(csi);
|
|
@@ -280,9 +283,9 @@ export const getVideoSenderMqa = ({videoSender, statsResults, lastMqaDataSent, m
|
|
|
280
283
|
const totalFrameSentInaMin =
|
|
281
284
|
statsResults.resolutions[mediaType][sendrecvType].framesSent - (lastFramesSent || 0);
|
|
282
285
|
|
|
283
|
-
videoSender.streams[0].common.transmittedFrameRate =
|
|
284
|
-
?
|
|
285
|
-
|
|
286
|
+
videoSender.streams[0].common.transmittedFrameRate = Math.round(
|
|
287
|
+
totalFrameSentInaMin ? totalFrameSentInaMin / 60 : 0
|
|
288
|
+
);
|
|
286
289
|
videoSender.streams[0].transmittedHeight =
|
|
287
290
|
statsResults.resolutions[mediaType][sendrecvType].height || 0;
|
|
288
291
|
videoSender.streams[0].transmittedWidth =
|
|
@@ -179,7 +179,7 @@ describe('plugin-meetings', () => {
|
|
|
179
179
|
report: [
|
|
180
180
|
{
|
|
181
181
|
type: 'outbound-rtp',
|
|
182
|
-
framesSent:
|
|
182
|
+
framesSent: 1500,
|
|
183
183
|
bytesSent: 1,
|
|
184
184
|
},
|
|
185
185
|
{
|
|
@@ -209,7 +209,7 @@ describe('plugin-meetings', () => {
|
|
|
209
209
|
bytesReceived: 1,
|
|
210
210
|
frameHeight: 720,
|
|
211
211
|
frameWidth: 1280,
|
|
212
|
-
framesReceived:
|
|
212
|
+
framesReceived: 1500,
|
|
213
213
|
},
|
|
214
214
|
{
|
|
215
215
|
type: 'candidate-pair',
|
|
@@ -437,6 +437,16 @@ describe('plugin-meetings', () => {
|
|
|
437
437
|
assert.strictEqual(mqeData.intervalMetadata.peripherals.find((val) => val.name === MEDIA_DEVICES.MICROPHONE).information, _UNKNOWN_);
|
|
438
438
|
assert.strictEqual(mqeData.intervalMetadata.peripherals.find((val) => val.name === MEDIA_DEVICES.CAMERA).information, _UNKNOWN_);
|
|
439
439
|
});
|
|
440
|
+
|
|
441
|
+
it('emits the correct frameRate', async () => {
|
|
442
|
+
await startStatsAnalyzer({expected: {receiveVideo: true}});
|
|
443
|
+
|
|
444
|
+
await progressTime();
|
|
445
|
+
assert.strictEqual(mqeData.videoReceive[0].streams[0].common.receivedFrameRate, 25);
|
|
446
|
+
fakeStats.video.receivers[0].framesReceived = 3000;
|
|
447
|
+
await progressTime();
|
|
448
|
+
assert.strictEqual(mqeData.videoReceive[0].streams[0].common.receivedFrameRate, 25);
|
|
449
|
+
});
|
|
440
450
|
});
|
|
441
451
|
});
|
|
442
452
|
});
|