@webex/plugin-meetings 3.0.0-stream-classes.4 → 3.0.0-test.1
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/README.md +12 -0
- package/dist/breakouts/breakout.js +1 -1
- package/dist/breakouts/index.js +1 -1
- package/dist/common/errors/no-meeting-info.js +51 -0
- package/dist/common/errors/no-meeting-info.js.map +1 -0
- package/dist/common/errors/reclaim-host-role-errors.js +158 -0
- package/dist/common/errors/reclaim-host-role-errors.js.map +1 -0
- package/dist/common/errors/webex-errors.js +23 -3
- package/dist/common/errors/webex-errors.js.map +1 -1
- package/dist/common/logs/request.js +5 -1
- package/dist/common/logs/request.js.map +1 -1
- package/dist/config.js +1 -1
- package/dist/config.js.map +1 -1
- package/dist/constants.js +69 -9
- package/dist/constants.js.map +1 -1
- package/dist/index.js +11 -1
- package/dist/index.js.map +1 -1
- package/dist/interceptors/index.js +15 -0
- package/dist/interceptors/index.js.map +1 -0
- package/dist/interceptors/locusRetry.js +93 -0
- package/dist/interceptors/locusRetry.js.map +1 -0
- package/dist/interpretation/index.js +16 -2
- package/dist/interpretation/index.js.map +1 -1
- package/dist/interpretation/siLanguage.js +1 -1
- package/dist/locus-info/index.js +40 -11
- package/dist/locus-info/index.js.map +1 -1
- package/dist/locus-info/mediaSharesUtils.js +15 -1
- package/dist/locus-info/mediaSharesUtils.js.map +1 -1
- package/dist/locus-info/parser.js +42 -21
- package/dist/locus-info/parser.js.map +1 -1
- package/dist/media/index.js +10 -6
- package/dist/media/index.js.map +1 -1
- package/dist/media/properties.js +13 -3
- package/dist/media/properties.js.map +1 -1
- package/dist/mediaQualityMetrics/config.js +135 -330
- package/dist/mediaQualityMetrics/config.js.map +1 -1
- package/dist/meeting/in-meeting-actions.js +4 -0
- package/dist/meeting/in-meeting-actions.js.map +1 -1
- package/dist/meeting/index.js +2187 -1074
- package/dist/meeting/index.js.map +1 -1
- package/dist/meeting/muteState.js +37 -25
- package/dist/meeting/muteState.js.map +1 -1
- package/dist/meeting/request.js +34 -19
- package/dist/meeting/request.js.map +1 -1
- package/dist/meeting/util.js +71 -0
- package/dist/meeting/util.js.map +1 -1
- package/dist/meeting-info/index.js +48 -23
- package/dist/meeting-info/index.js.map +1 -1
- package/dist/meeting-info/meeting-info-v2.js +25 -4
- package/dist/meeting-info/meeting-info-v2.js.map +1 -1
- package/dist/meeting-info/utilv2.js +1 -1
- package/dist/meeting-info/utilv2.js.map +1 -1
- package/dist/meetings/collection.js +17 -0
- package/dist/meetings/collection.js.map +1 -1
- package/dist/meetings/index.js +142 -57
- package/dist/meetings/index.js.map +1 -1
- package/dist/meetings/util.js +2 -6
- package/dist/meetings/util.js.map +1 -1
- package/dist/member/index.js +9 -0
- package/dist/member/index.js.map +1 -1
- package/dist/member/util.js +11 -0
- package/dist/member/util.js.map +1 -1
- package/dist/members/index.js +17 -1
- package/dist/members/index.js.map +1 -1
- package/dist/members/types.js.map +1 -1
- package/dist/members/util.js +15 -4
- package/dist/members/util.js.map +1 -1
- package/dist/metrics/constants.js +15 -1
- package/dist/metrics/constants.js.map +1 -1
- package/dist/multistream/mediaRequestManager.js +1 -1
- package/dist/multistream/mediaRequestManager.js.map +1 -1
- package/dist/multistream/remoteMediaGroup.js +16 -2
- package/dist/multistream/remoteMediaGroup.js.map +1 -1
- package/dist/multistream/remoteMediaManager.js +222 -73
- package/dist/multistream/remoteMediaManager.js.map +1 -1
- package/dist/multistream/sendSlotManager.js +22 -0
- package/dist/multistream/sendSlotManager.js.map +1 -1
- package/dist/reachability/clusterReachability.js +356 -0
- package/dist/reachability/clusterReachability.js.map +1 -0
- package/dist/reachability/index.js +262 -432
- package/dist/reachability/index.js.map +1 -1
- package/dist/reachability/request.js +1 -1
- package/dist/reachability/request.js.map +1 -1
- package/dist/reachability/util.js +29 -0
- package/dist/reachability/util.js.map +1 -0
- package/dist/reconnection-manager/index.js +113 -96
- package/dist/reconnection-manager/index.js.map +1 -1
- package/dist/roap/index.js +57 -25
- package/dist/roap/index.js.map +1 -1
- package/dist/roap/request.js +5 -13
- package/dist/roap/request.js.map +1 -1
- package/dist/roap/turnDiscovery.js +173 -81
- package/dist/roap/turnDiscovery.js.map +1 -1
- package/dist/rtcMetrics/index.js +68 -6
- package/dist/rtcMetrics/index.js.map +1 -1
- package/dist/statsAnalyzer/index.js +338 -289
- package/dist/statsAnalyzer/index.js.map +1 -1
- package/dist/statsAnalyzer/mqaUtil.js +296 -156
- package/dist/statsAnalyzer/mqaUtil.js.map +1 -1
- package/dist/types/common/errors/no-meeting-info.d.ts +14 -0
- package/dist/types/common/errors/reclaim-host-role-errors.d.ts +60 -0
- package/dist/types/common/errors/webex-errors.d.ts +13 -1
- package/dist/types/common/logs/request.d.ts +2 -0
- package/dist/types/config.d.ts +1 -1
- package/dist/types/constants.d.ts +66 -13
- package/dist/types/index.d.ts +1 -1
- package/dist/types/interceptors/index.d.ts +2 -0
- package/dist/types/interceptors/locusRetry.d.ts +27 -0
- package/dist/types/locus-info/index.d.ts +1 -1
- package/dist/types/locus-info/parser.d.ts +3 -2
- package/dist/types/mediaQualityMetrics/config.d.ts +99 -223
- package/dist/types/meeting/in-meeting-actions.d.ts +4 -0
- package/dist/types/meeting/index.d.ts +285 -34
- package/dist/types/meeting/locusMediaRequest.d.ts +1 -2
- package/dist/types/meeting/muteState.d.ts +2 -8
- package/dist/types/meeting/request.d.ts +4 -1
- package/dist/types/meeting/util.d.ts +25 -1
- package/dist/types/meeting-info/index.d.ts +7 -0
- package/dist/types/meeting-info/meeting-info-v2.d.ts +1 -0
- package/dist/types/meetings/collection.d.ts +9 -0
- package/dist/types/meetings/index.d.ts +42 -14
- package/dist/types/member/index.d.ts +1 -0
- package/dist/types/members/types.d.ts +1 -0
- package/dist/types/members/util.d.ts +5 -0
- package/dist/types/metrics/constants.d.ts +15 -0
- package/dist/types/multistream/mediaRequestManager.d.ts +2 -0
- package/dist/types/multistream/remoteMediaGroup.d.ts +2 -0
- package/dist/types/multistream/remoteMediaManager.d.ts +25 -1
- package/dist/types/multistream/sendSlotManager.d.ts +9 -0
- package/dist/types/reachability/clusterReachability.d.ts +109 -0
- package/dist/types/reachability/index.d.ts +59 -112
- package/dist/types/reachability/request.d.ts +1 -1
- package/dist/types/reachability/util.d.ts +8 -0
- package/dist/types/reconnection-manager/index.d.ts +10 -0
- package/dist/types/roap/index.d.ts +2 -1
- package/dist/types/roap/request.d.ts +2 -1
- package/dist/types/roap/turnDiscovery.d.ts +21 -4
- package/dist/types/rtcMetrics/index.d.ts +15 -1
- package/dist/types/statsAnalyzer/index.d.ts +28 -11
- package/dist/types/statsAnalyzer/mqaUtil.d.ts +28 -4
- package/dist/types/webinar/collection.d.ts +16 -0
- package/dist/types/webinar/index.d.ts +5 -0
- package/dist/webinar/collection.js +44 -0
- package/dist/webinar/collection.js.map +1 -0
- package/dist/webinar/index.js +69 -0
- package/dist/webinar/index.js.map +1 -0
- package/package.json +3 -2
- package/src/common/errors/no-meeting-info.ts +24 -0
- package/src/common/errors/reclaim-host-role-errors.ts +134 -0
- package/src/common/errors/webex-errors.ts +19 -2
- package/src/common/logs/request.ts +5 -1
- package/src/config.ts +1 -1
- package/src/constants.ts +71 -6
- package/src/index.ts +5 -0
- package/src/interceptors/index.ts +3 -0
- package/src/interceptors/locusRetry.ts +67 -0
- package/src/interpretation/index.ts +18 -1
- package/src/locus-info/index.ts +52 -16
- package/src/locus-info/mediaSharesUtils.ts +16 -0
- package/src/locus-info/parser.ts +47 -21
- package/src/media/index.ts +8 -6
- package/src/media/properties.ts +17 -2
- package/src/mediaQualityMetrics/config.ts +103 -238
- package/src/meeting/in-meeting-actions.ts +8 -0
- package/src/meeting/index.ts +1510 -529
- package/src/meeting/muteState.ts +34 -20
- package/src/meeting/request.ts +19 -1
- package/src/meeting/util.ts +97 -0
- package/src/meeting-info/index.ts +47 -20
- package/src/meeting-info/meeting-info-v2.ts +27 -5
- package/src/meeting-info/utilv2.ts +1 -1
- package/src/meetings/collection.ts +13 -0
- package/src/meetings/index.ts +112 -31
- package/src/meetings/util.ts +2 -8
- package/src/member/index.ts +9 -0
- package/src/member/util.ts +14 -0
- package/src/members/index.ts +29 -2
- package/src/members/types.ts +1 -0
- package/src/members/util.ts +15 -1
- package/src/metrics/constants.ts +14 -0
- package/src/multistream/mediaRequestManager.ts +4 -1
- package/src/multistream/remoteMediaGroup.ts +19 -0
- package/src/multistream/remoteMediaManager.ts +141 -18
- package/src/multistream/sendSlotManager.ts +29 -0
- package/src/reachability/clusterReachability.ts +320 -0
- package/src/reachability/index.ts +221 -382
- package/src/reachability/request.ts +1 -1
- package/src/reachability/util.ts +24 -0
- package/src/reconnection-manager/index.ts +87 -83
- package/src/roap/index.ts +60 -24
- package/src/roap/request.ts +3 -16
- package/src/roap/turnDiscovery.ts +112 -39
- package/src/rtcMetrics/index.ts +71 -5
- package/src/statsAnalyzer/index.ts +430 -427
- package/src/statsAnalyzer/mqaUtil.ts +317 -168
- package/src/webinar/collection.ts +31 -0
- package/src/webinar/index.ts +62 -0
- package/test/integration/spec/converged-space-meetings.js +7 -7
- package/test/integration/spec/journey.js +86 -104
- package/test/integration/spec/space-meeting.js +9 -9
- package/test/unit/spec/interceptors/locusRetry.ts +131 -0
- package/test/unit/spec/interpretation/index.ts +36 -3
- package/test/unit/spec/locus-info/index.js +205 -12
- package/test/unit/spec/locus-info/lib/SeqCmp.json +16 -0
- package/test/unit/spec/locus-info/mediaSharesUtils.ts +10 -0
- package/test/unit/spec/locus-info/parser.js +54 -13
- package/test/unit/spec/media/index.ts +20 -4
- package/test/unit/spec/media/properties.ts +2 -2
- package/test/unit/spec/meeting/in-meeting-actions.ts +4 -0
- package/test/unit/spec/meeting/index.js +4027 -1075
- package/test/unit/spec/meeting/muteState.js +219 -67
- package/test/unit/spec/meeting/request.js +63 -12
- package/test/unit/spec/meeting/utils.js +93 -0
- package/test/unit/spec/meeting-info/index.js +180 -61
- package/test/unit/spec/meeting-info/meetinginfov2.js +196 -53
- package/test/unit/spec/meetings/collection.js +12 -0
- package/test/unit/spec/meetings/index.js +619 -206
- package/test/unit/spec/meetings/utils.js +35 -12
- package/test/unit/spec/member/index.js +8 -7
- package/test/unit/spec/member/util.js +32 -0
- package/test/unit/spec/members/index.js +130 -17
- package/test/unit/spec/members/utils.js +26 -0
- package/test/unit/spec/multistream/mediaRequestManager.ts +20 -2
- package/test/unit/spec/multistream/remoteMediaGroup.ts +80 -1
- package/test/unit/spec/multistream/remoteMediaManager.ts +210 -3
- package/test/unit/spec/multistream/sendSlotManager.ts +50 -18
- package/test/unit/spec/reachability/clusterReachability.ts +279 -0
- package/test/unit/spec/reachability/index.ts +505 -135
- package/test/unit/spec/reachability/util.ts +40 -0
- package/test/unit/spec/reconnection-manager/index.js +74 -17
- package/test/unit/spec/roap/index.ts +181 -61
- package/test/unit/spec/roap/request.ts +27 -3
- package/test/unit/spec/roap/turnDiscovery.ts +362 -101
- package/test/unit/spec/rtcMetrics/index.ts +57 -3
- package/test/unit/spec/stats-analyzer/index.js +1225 -12
- package/test/unit/spec/webinar/collection.ts +13 -0
- package/test/unit/spec/webinar/index.ts +60 -0
- package/test/utils/integrationTestUtils.js +4 -4
- package/test/utils/webex-test-users.js +12 -4
|
@@ -4,11 +4,82 @@ import {mean, max} from 'lodash';
|
|
|
4
4
|
|
|
5
5
|
import {STATS} from '../constants';
|
|
6
6
|
|
|
7
|
-
|
|
7
|
+
/**
|
|
8
|
+
* Get the totals of a certain value from a certain media type.
|
|
9
|
+
*
|
|
10
|
+
* @param {object} stats - The large stats object.
|
|
11
|
+
* @param {string} sendrecvType - "send" or "recv".
|
|
12
|
+
* @param {string} baseMediaType - audio or video _and_ share or non-share.
|
|
13
|
+
* @param {string} value - The value we want to get the totals of.
|
|
14
|
+
* @returns {number}
|
|
15
|
+
*/
|
|
16
|
+
const getTotalValueFromBaseType = (
|
|
17
|
+
stats: object,
|
|
18
|
+
sendrecvType: string,
|
|
19
|
+
baseMediaType: string,
|
|
20
|
+
value: string
|
|
21
|
+
): number =>
|
|
22
|
+
Object.keys(stats)
|
|
23
|
+
.filter((mt) => mt.includes(baseMediaType))
|
|
24
|
+
.reduce((acc, mt) => acc + (stats[mt]?.[sendrecvType]?.[value] || 0), 0);
|
|
25
|
+
|
|
26
|
+
export const getAudioReceiverMqa = ({
|
|
27
|
+
audioReceiver,
|
|
28
|
+
statsResults,
|
|
29
|
+
lastMqaDataSent,
|
|
30
|
+
baseMediaType,
|
|
31
|
+
}) => {
|
|
32
|
+
const sendrecvType = STATS.RECEIVE_DIRECTION;
|
|
33
|
+
|
|
34
|
+
const getLastTotalValue = (value: string) =>
|
|
35
|
+
getTotalValueFromBaseType(lastMqaDataSent, sendrecvType, baseMediaType, value);
|
|
36
|
+
const getTotalValue = (value: string) =>
|
|
37
|
+
getTotalValueFromBaseType(statsResults, sendrecvType, baseMediaType, value);
|
|
38
|
+
|
|
39
|
+
const lastPacketsReceived = getLastTotalValue('totalPacketsReceived');
|
|
40
|
+
const lastPacketsLost = getLastTotalValue('totalPacketsLost');
|
|
41
|
+
const lastBytesReceived = getLastTotalValue('totalBytesReceived');
|
|
42
|
+
const lastFecPacketsReceived = getLastTotalValue('fecPacketsReceived');
|
|
43
|
+
const lastFecPacketsDiscarded = getLastTotalValue('fecPacketsDiscarded');
|
|
44
|
+
|
|
45
|
+
const totalPacketsReceived = getTotalValue('totalPacketsReceived');
|
|
46
|
+
const packetsLost = getTotalValue('totalPacketsLost');
|
|
47
|
+
const totalBytesReceived = getTotalValue('totalBytesReceived');
|
|
48
|
+
const totalFecPacketsReceived = getTotalValue('fecPacketsReceived');
|
|
49
|
+
const totalFecPacketsDiscarded = getTotalValue('fecPacketsDiscarded');
|
|
50
|
+
|
|
51
|
+
audioReceiver.common.common.direction =
|
|
52
|
+
statsResults[Object.keys(statsResults).find((mediaType) => mediaType.includes(baseMediaType))]
|
|
53
|
+
?.direction || 'inactive';
|
|
54
|
+
audioReceiver.common.common.isMain = !baseMediaType.includes('-share');
|
|
55
|
+
audioReceiver.common.transportType = statsResults.connectionType.local.transport;
|
|
56
|
+
|
|
57
|
+
// add rtpPacket info inside common as also for call analyzer
|
|
58
|
+
audioReceiver.common.rtpPackets = totalPacketsReceived - lastPacketsReceived;
|
|
59
|
+
|
|
60
|
+
// Hop by hop are numbers and not percentage so we compare on what we sent the last min
|
|
61
|
+
// collect the packets received for the last min
|
|
62
|
+
const totalPacketsLost = packetsLost - lastPacketsLost;
|
|
63
|
+
audioReceiver.common.mediaHopByHopLost = totalPacketsLost;
|
|
64
|
+
audioReceiver.common.rtpHopByHopLost = totalPacketsLost;
|
|
65
|
+
|
|
66
|
+
const fecRecovered =
|
|
67
|
+
totalFecPacketsReceived -
|
|
68
|
+
lastFecPacketsReceived -
|
|
69
|
+
(totalFecPacketsDiscarded - lastFecPacketsDiscarded);
|
|
70
|
+
audioReceiver.common.fecPackets = fecRecovered;
|
|
71
|
+
|
|
72
|
+
audioReceiver.common.rtpBitrate = ((totalBytesReceived - lastBytesReceived) * 8) / 60 || 0;
|
|
73
|
+
};
|
|
74
|
+
|
|
75
|
+
export const getAudioReceiverStreamMqa = ({
|
|
76
|
+
audioReceiverStream,
|
|
77
|
+
statsResults,
|
|
78
|
+
lastMqaDataSent,
|
|
79
|
+
mediaType,
|
|
80
|
+
}) => {
|
|
8
81
|
const sendrecvType = STATS.RECEIVE_DIRECTION;
|
|
9
82
|
|
|
10
|
-
const lastPacketsReceived = lastMqaDataSent[mediaType]?.[sendrecvType].totalPacketsReceived || 0;
|
|
11
|
-
const lastPacketsLost = lastMqaDataSent[mediaType]?.[sendrecvType].totalPacketsLost || 0;
|
|
12
83
|
const lastPacketsDecoded = lastMqaDataSent[mediaType]?.[sendrecvType].totalSamplesDecoded || 0;
|
|
13
84
|
const lastSamplesReceived = lastMqaDataSent[mediaType]?.[sendrecvType].totalSamplesReceived || 0;
|
|
14
85
|
const lastConcealedSamples = lastMqaDataSent[mediaType]?.[sendrecvType].concealedSamples || 0;
|
|
@@ -16,32 +87,23 @@ export const getAudioReceiverMqa = ({audioReceiver, statsResults, lastMqaDataSen
|
|
|
16
87
|
const lastFecPacketsReceived = lastMqaDataSent[mediaType]?.[sendrecvType].fecPacketsReceived || 0;
|
|
17
88
|
const lastFecPacketsDiscarded =
|
|
18
89
|
lastMqaDataSent[mediaType]?.[sendrecvType].fecPacketsDiscarded || 0;
|
|
90
|
+
const lastPacketsReceived = lastMqaDataSent[mediaType]?.[sendrecvType].totalPacketsReceived || 0;
|
|
91
|
+
const lastPacketsLost = lastMqaDataSent[mediaType]?.[sendrecvType].totalPacketsLost || 0;
|
|
19
92
|
|
|
20
93
|
const {csi} = statsResults[mediaType];
|
|
21
|
-
if (csi && !
|
|
22
|
-
|
|
94
|
+
if (csi && !audioReceiverStream.common.csi.includes(csi)) {
|
|
95
|
+
audioReceiverStream.common.csi.push(csi);
|
|
23
96
|
}
|
|
24
97
|
|
|
25
|
-
|
|
26
|
-
audioReceiver.common.transportType = statsResults.connectionType.remote.transport[0];
|
|
27
|
-
|
|
28
|
-
// add rtpPacket info inside common as also for call analyzer
|
|
29
|
-
audioReceiver.common.rtpPackets =
|
|
98
|
+
audioReceiverStream.common.rtpPackets =
|
|
30
99
|
statsResults[mediaType][sendrecvType].totalPacketsReceived - lastPacketsReceived || 0;
|
|
31
|
-
// Hop by hop are numbers and not percentage so we compare on what we sent the last min
|
|
32
|
-
// collect the packets received for the last min
|
|
33
|
-
audioReceiver.streams[0].common.rtpPackets = audioReceiver.common.rtpPackets;
|
|
34
|
-
audioReceiver.common.mediaHopByHopLost =
|
|
35
|
-
statsResults[mediaType][sendrecvType].totalPacketsLost - lastPacketsLost || 0;
|
|
36
|
-
audioReceiver.common.rtpHopByHopLost =
|
|
37
|
-
statsResults[mediaType][sendrecvType].totalPacketsLost - lastPacketsLost || 0;
|
|
38
100
|
|
|
39
|
-
|
|
101
|
+
audioReceiverStream.common.maxRtpJitter =
|
|
40
102
|
// @ts-ignore
|
|
41
103
|
max(statsResults[mediaType][sendrecvType].meanRtpJitter) * 1000 || 0;
|
|
42
|
-
|
|
104
|
+
audioReceiverStream.common.meanRtpJitter =
|
|
43
105
|
mean(statsResults[mediaType][sendrecvType].meanRtpJitter) * 1000 || 0;
|
|
44
|
-
|
|
106
|
+
audioReceiverStream.common.rtpJitter = audioReceiverStream.common.maxRtpJitter;
|
|
45
107
|
|
|
46
108
|
// Fec packets do come in as part of the FEC only for audio
|
|
47
109
|
const fecRecovered =
|
|
@@ -49,86 +111,171 @@ export const getAudioReceiverMqa = ({audioReceiver, statsResults, lastMqaDataSen
|
|
|
49
111
|
lastFecPacketsReceived -
|
|
50
112
|
(statsResults[mediaType][sendrecvType].fecPacketsDiscarded - lastFecPacketsDiscarded);
|
|
51
113
|
|
|
52
|
-
|
|
114
|
+
audioReceiverStream.common.rtpEndToEndLost =
|
|
53
115
|
statsResults[mediaType][sendrecvType].totalPacketsLost - lastPacketsLost - fecRecovered || 0;
|
|
54
116
|
|
|
55
|
-
|
|
117
|
+
audioReceiverStream.common.framesDropped =
|
|
56
118
|
statsResults[mediaType][sendrecvType].totalSamplesDecoded - lastPacketsDecoded || 0;
|
|
57
|
-
|
|
58
|
-
(
|
|
119
|
+
audioReceiverStream.common.renderedFrameRate =
|
|
120
|
+
(audioReceiverStream.common.framesDropped * 100) / 60 || 0;
|
|
59
121
|
|
|
60
|
-
|
|
122
|
+
audioReceiverStream.common.framesReceived =
|
|
61
123
|
statsResults[mediaType][sendrecvType].totalSamplesReceived - lastSamplesReceived || 0;
|
|
62
|
-
|
|
124
|
+
audioReceiverStream.common.concealedFrames =
|
|
63
125
|
statsResults[mediaType][sendrecvType].concealedSamples - lastConcealedSamples || 0;
|
|
64
|
-
|
|
126
|
+
audioReceiverStream.common.receivedBitrate =
|
|
65
127
|
((statsResults[mediaType][sendrecvType].totalBytesReceived - lastBytesReceived) * 8) / 60 || 0;
|
|
66
|
-
|
|
67
|
-
audioReceiver.common.rtpBitrate = audioReceiver.streams[0].common.receivedBitrate;
|
|
68
128
|
};
|
|
69
129
|
|
|
70
|
-
export const getAudioSenderMqa = ({audioSender, statsResults, lastMqaDataSent,
|
|
130
|
+
export const getAudioSenderMqa = ({audioSender, statsResults, lastMqaDataSent, baseMediaType}) => {
|
|
71
131
|
const sendrecvType = STATS.SEND_DIRECTION;
|
|
72
132
|
|
|
73
|
-
const
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
const lastFramesEncoded = lastMqaDataSent[mediaType]?.[sendrecvType].totalKeyFramesEncoded || 0;
|
|
78
|
-
const lastFirCount = lastMqaDataSent[mediaType]?.[sendrecvType].totalFirCount || 0;
|
|
133
|
+
const getLastTotalValue = (value: string) =>
|
|
134
|
+
getTotalValueFromBaseType(lastMqaDataSent, sendrecvType, baseMediaType, value);
|
|
135
|
+
const getTotalValue = (value: string) =>
|
|
136
|
+
getTotalValueFromBaseType(statsResults, sendrecvType, baseMediaType, value);
|
|
79
137
|
|
|
80
|
-
const
|
|
81
|
-
|
|
82
|
-
audioSender.streams[0].common.csi.push(csi);
|
|
83
|
-
}
|
|
138
|
+
const lastPacketsSent = getLastTotalValue('totalPacketsSent');
|
|
139
|
+
const lastPacketsLostTotal = getLastTotalValue('totalPacketsLostOnReceiver');
|
|
84
140
|
|
|
85
|
-
|
|
86
|
-
|
|
141
|
+
const totalPacketsLostOnReceiver = getTotalValue('totalPacketsLostOnReceiver');
|
|
142
|
+
const totalPacketsSent = getTotalValue('totalPacketsSent');
|
|
87
143
|
|
|
88
|
-
|
|
89
|
-
|
|
90
|
-
|
|
91
|
-
|
|
92
|
-
|
|
144
|
+
const meanRemoteJitter = Object.keys(statsResults)
|
|
145
|
+
.filter((mt) => mt.includes(baseMediaType))
|
|
146
|
+
.reduce((acc, mt) => acc.concat(statsResults[mt][sendrecvType].meanRemoteJitter), []);
|
|
147
|
+
const meanRoundTripTime = Object.keys(statsResults)
|
|
148
|
+
.filter((mt) => mt.includes(baseMediaType))
|
|
149
|
+
.reduce((acc, mt) => acc.concat(statsResults[mt][sendrecvType].meanRoundTripTime), []);
|
|
93
150
|
|
|
94
|
-
audioSender.common.
|
|
95
|
-
statsResults[mediaType
|
|
96
|
-
|
|
151
|
+
audioSender.common.common.direction =
|
|
152
|
+
statsResults[Object.keys(statsResults).find((mediaType) => mediaType.includes(baseMediaType))]
|
|
153
|
+
?.direction || 'inactive';
|
|
154
|
+
audioSender.common.common.isMain = !baseMediaType.includes('-share');
|
|
155
|
+
audioSender.common.transportType = statsResults.connectionType.local.transport;
|
|
156
|
+
|
|
157
|
+
audioSender.common.maxRemoteJitter = max(meanRemoteJitter) * 1000 || 0;
|
|
158
|
+
audioSender.common.meanRemoteJitter = mean(meanRemoteJitter) * 1000 || 0;
|
|
159
|
+
|
|
160
|
+
audioSender.common.rtpPackets = totalPacketsSent - lastPacketsSent || 0;
|
|
161
|
+
// audioSender.streams[0].common.rtpPackets = audioSender.common.rtpPackets;
|
|
97
162
|
// From candidate-pair
|
|
98
|
-
audioSender.common.availableBitrate =
|
|
99
|
-
statsResults
|
|
163
|
+
audioSender.common.availableBitrate = getTotalValueFromBaseType(
|
|
164
|
+
statsResults,
|
|
165
|
+
sendrecvType,
|
|
166
|
+
baseMediaType,
|
|
167
|
+
'availableOutgoingBitrate'
|
|
168
|
+
);
|
|
100
169
|
// Calculate based on how much packets lost of received compated to how to the client sent
|
|
101
170
|
|
|
102
|
-
const
|
|
103
|
-
statsResults[mediaType][sendrecvType].totalPacketsLostOnReceiver - lastPacketsLost;
|
|
104
|
-
|
|
171
|
+
const totalPacketsLostForaMin = totalPacketsLostOnReceiver - lastPacketsLostTotal;
|
|
105
172
|
audioSender.common.remoteLossRate =
|
|
106
|
-
|
|
107
|
-
? (
|
|
108
|
-
: 0; // This is the packets sent with in last min
|
|
173
|
+
totalPacketsSent - lastPacketsSent > 0
|
|
174
|
+
? (totalPacketsLostForaMin * 100) / (totalPacketsSent - lastPacketsSent)
|
|
175
|
+
: 0; // This is the packets sent with in last min
|
|
109
176
|
|
|
110
|
-
audioSender.common.maxRoundTripTime =
|
|
111
|
-
|
|
112
|
-
max(statsResults[mediaType][sendrecvType].meanRoundTripTime) * 1000 || 0;
|
|
113
|
-
audioSender.common.meanRoundTripTime =
|
|
114
|
-
mean(statsResults[mediaType][sendrecvType].meanRoundTripTime) * 1000 || 0;
|
|
177
|
+
audioSender.common.maxRoundTripTime = max(meanRoundTripTime) * 1000 || 0;
|
|
178
|
+
audioSender.common.meanRoundTripTime = mean(meanRoundTripTime) * 1000 || 0;
|
|
115
179
|
audioSender.common.roundTripTime = audioSender.common.maxRoundTripTime;
|
|
116
180
|
|
|
117
181
|
// Calculate the outgoing bitrate
|
|
118
|
-
const totalBytesSentInaMin =
|
|
182
|
+
const totalBytesSentInaMin =
|
|
183
|
+
getTotalValueFromBaseType(statsResults, sendrecvType, baseMediaType, 'totalBytesSent') -
|
|
184
|
+
getTotalValueFromBaseType(lastMqaDataSent, sendrecvType, baseMediaType, 'totalBytesSent');
|
|
185
|
+
|
|
186
|
+
audioSender.common.rtpBitrate = totalBytesSentInaMin ? (totalBytesSentInaMin * 8) / 60 : 0;
|
|
187
|
+
};
|
|
188
|
+
|
|
189
|
+
export const getAudioSenderStreamMqa = ({
|
|
190
|
+
audioSenderStream,
|
|
191
|
+
statsResults,
|
|
192
|
+
lastMqaDataSent,
|
|
193
|
+
mediaType,
|
|
194
|
+
}) => {
|
|
195
|
+
const sendrecvType = STATS.SEND_DIRECTION;
|
|
196
|
+
|
|
197
|
+
const lastBytesSent = lastMqaDataSent[mediaType]?.[sendrecvType].totalBytesSent || 0;
|
|
198
|
+
const lastFramesEncoded = lastMqaDataSent[mediaType]?.[sendrecvType].totalKeyFramesEncoded || 0;
|
|
199
|
+
const lastFirCount = lastMqaDataSent[mediaType]?.[sendrecvType].totalFirCount || 0;
|
|
200
|
+
const lastPacketsSent = lastMqaDataSent[mediaType]?.[sendrecvType].totalPacketsSent || 0;
|
|
201
|
+
|
|
202
|
+
const {csi} = statsResults[mediaType];
|
|
203
|
+
if (csi && !audioSenderStream.common.csi.includes(csi)) {
|
|
204
|
+
audioSenderStream.common.csi.push(csi);
|
|
205
|
+
}
|
|
206
|
+
|
|
207
|
+
audioSenderStream.common.rtpPackets =
|
|
208
|
+
statsResults[mediaType][sendrecvType].totalPacketsSent - lastPacketsSent || 0;
|
|
119
209
|
|
|
120
|
-
|
|
210
|
+
const totalBytesSentInaMin = statsResults[mediaType][sendrecvType].totalBytesSent - lastBytesSent;
|
|
211
|
+
audioSenderStream.common.transmittedBitrate = totalBytesSentInaMin
|
|
121
212
|
? (totalBytesSentInaMin * 8) / 60
|
|
122
213
|
: 0;
|
|
123
|
-
audioSender.common.rtpBitrate = audioSender.streams[0].common.transmittedBitrate;
|
|
124
214
|
|
|
125
|
-
|
|
215
|
+
audioSenderStream.transmittedKeyFrames =
|
|
126
216
|
statsResults[mediaType][sendrecvType].totalKeyFramesEncoded - lastFramesEncoded || 0;
|
|
127
|
-
|
|
217
|
+
audioSenderStream.requestedKeyFrames =
|
|
128
218
|
statsResults[mediaType][sendrecvType].totalFirCount - lastFirCount || 0;
|
|
129
219
|
};
|
|
130
220
|
|
|
131
|
-
export const getVideoReceiverMqa = ({
|
|
221
|
+
export const getVideoReceiverMqa = ({
|
|
222
|
+
videoReceiver,
|
|
223
|
+
statsResults,
|
|
224
|
+
lastMqaDataSent,
|
|
225
|
+
baseMediaType,
|
|
226
|
+
}) => {
|
|
227
|
+
const sendrecvType = STATS.RECEIVE_DIRECTION;
|
|
228
|
+
|
|
229
|
+
const getLastTotalValue = (value: string) =>
|
|
230
|
+
getTotalValueFromBaseType(lastMqaDataSent, sendrecvType, baseMediaType, value);
|
|
231
|
+
const getTotalValue = (value: string) =>
|
|
232
|
+
getTotalValueFromBaseType(statsResults, sendrecvType, baseMediaType, value);
|
|
233
|
+
|
|
234
|
+
const lastPacketsReceived = getLastTotalValue('totalPacketsReceived');
|
|
235
|
+
const lastPacketsLost = getLastTotalValue('totalPacketsLost');
|
|
236
|
+
const lastBytesReceived = getLastTotalValue('totalBytesReceived');
|
|
237
|
+
|
|
238
|
+
const packetsLost = getTotalValue('totalPacketsLost');
|
|
239
|
+
const totalPacketsReceived = getTotalValue('totalPacketsReceived');
|
|
240
|
+
const totalBytesReceived = getTotalValue('totalBytesReceived');
|
|
241
|
+
|
|
242
|
+
const meanRemoteJitter = Object.keys(statsResults)
|
|
243
|
+
.filter((mt) => mt.includes(baseMediaType))
|
|
244
|
+
.reduce((acc, mt) => acc.concat(statsResults[mt][sendrecvType].meanRemoteJitter), []);
|
|
245
|
+
|
|
246
|
+
videoReceiver.common.common.direction =
|
|
247
|
+
statsResults[Object.keys(statsResults).find((mediaType) => mediaType.includes(baseMediaType))]
|
|
248
|
+
?.direction || 'inactive';
|
|
249
|
+
videoReceiver.common.common.isMain = !baseMediaType.includes('-share');
|
|
250
|
+
videoReceiver.common.transportType = statsResults.connectionType.local.transport;
|
|
251
|
+
|
|
252
|
+
// collect the packets received for the last min
|
|
253
|
+
videoReceiver.common.rtpPackets = totalPacketsReceived - lastPacketsReceived || 0;
|
|
254
|
+
|
|
255
|
+
// Hop by hop are numbers and not percentage so we compare on what we sent the last min
|
|
256
|
+
// this is including packet lost
|
|
257
|
+
const totalPacketsLost = packetsLost - lastPacketsLost;
|
|
258
|
+
videoReceiver.common.mediaHopByHopLost = totalPacketsLost;
|
|
259
|
+
videoReceiver.common.rtpHopByHopLost = totalPacketsLost;
|
|
260
|
+
|
|
261
|
+
// calculate this values
|
|
262
|
+
videoReceiver.common.maxRemoteJitter = max(meanRemoteJitter) * 1000 || 0;
|
|
263
|
+
videoReceiver.common.meanRemoteJitter = mean(meanRemoteJitter) * 1000 || 0;
|
|
264
|
+
|
|
265
|
+
// Calculate the outgoing bitrate
|
|
266
|
+
const totalBytesReceivedInaMin = totalBytesReceived - lastBytesReceived;
|
|
267
|
+
|
|
268
|
+
videoReceiver.common.rtpBitrate = totalBytesReceivedInaMin
|
|
269
|
+
? (totalBytesReceivedInaMin * 8) / 60
|
|
270
|
+
: 0;
|
|
271
|
+
};
|
|
272
|
+
|
|
273
|
+
export const getVideoReceiverStreamMqa = ({
|
|
274
|
+
videoReceiverStream,
|
|
275
|
+
statsResults,
|
|
276
|
+
lastMqaDataSent,
|
|
277
|
+
mediaType,
|
|
278
|
+
}) => {
|
|
132
279
|
const sendrecvType = STATS.RECEIVE_DIRECTION;
|
|
133
280
|
|
|
134
281
|
const lastPacketsReceived = lastMqaDataSent[mediaType]?.[sendrecvType].totalPacketsReceived || 0;
|
|
@@ -141,151 +288,153 @@ export const getVideoReceiverMqa = ({videoReceiver, statsResults, lastMqaDataSen
|
|
|
141
288
|
const lastPliCount = lastMqaDataSent[mediaType]?.[sendrecvType].totalPliCount || 0;
|
|
142
289
|
|
|
143
290
|
const {csi} = statsResults[mediaType];
|
|
144
|
-
if (csi && !
|
|
145
|
-
|
|
291
|
+
if (csi && !videoReceiverStream.common.csi.includes(csi)) {
|
|
292
|
+
videoReceiverStream.common.csi.push(csi);
|
|
146
293
|
}
|
|
147
294
|
|
|
148
|
-
|
|
149
|
-
videoReceiver.common.transportType = statsResults.connectionType.remote.transport[0];
|
|
150
|
-
// collect the packets received for the last min
|
|
151
|
-
videoReceiver.common.rtpPackets =
|
|
295
|
+
videoReceiverStream.common.rtpPackets =
|
|
152
296
|
statsResults[mediaType][sendrecvType].totalPacketsReceived - lastPacketsReceived || 0;
|
|
153
|
-
videoReceiver.streams[0].common.rtpPackets = videoReceiver.common.rtpPackets;
|
|
154
297
|
|
|
155
298
|
const totalPacketLoss =
|
|
156
299
|
statsResults[mediaType][sendrecvType].totalPacketsLost - lastPacketsLost || 0;
|
|
157
300
|
|
|
158
|
-
// Hope by hop are numbers and not percentage so we compare on what we sent the last min
|
|
159
|
-
// this is including packet lost
|
|
160
|
-
videoReceiver.common.mediaHopByHopLost = totalPacketLoss;
|
|
161
|
-
videoReceiver.common.rtpHopByHopLost = totalPacketLoss;
|
|
162
|
-
|
|
163
301
|
// End to end packetloss is after recovery
|
|
164
|
-
|
|
302
|
+
videoReceiverStream.common.rtpEndToEndLost = totalPacketLoss;
|
|
165
303
|
|
|
166
|
-
|
|
167
|
-
|
|
168
|
-
videoReceiver.common.maxRemoteJitter =
|
|
304
|
+
videoReceiverStream.common.rtpJitter =
|
|
169
305
|
// @ts-ignore
|
|
170
306
|
max(statsResults[mediaType][sendrecvType].meanRemoteJitter) * 1000 || 0;
|
|
171
|
-
videoReceiver.common.meanRemoteJitter =
|
|
172
|
-
mean(statsResults[mediaType][sendrecvType].meanRemoteJitter) * 1000 || 0;
|
|
173
307
|
|
|
174
|
-
videoReceiver.streams[0].common.rtpJitter = videoReceiver.common.maxRemoteJitter;
|
|
175
|
-
// 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;
|
|
176
|
-
|
|
177
|
-
// Calculate the outgoing bitrate
|
|
178
308
|
const totalBytesReceivedInaMin =
|
|
179
309
|
statsResults[mediaType][sendrecvType].totalBytesReceived - lastBytesReceived;
|
|
180
|
-
|
|
181
|
-
videoReceiver.streams[0].common.receivedBitrate = totalBytesReceivedInaMin
|
|
310
|
+
videoReceiverStream.common.receivedBitrate = totalBytesReceivedInaMin
|
|
182
311
|
? (totalBytesReceivedInaMin * 8) / 60
|
|
183
312
|
: 0;
|
|
184
|
-
videoReceiver.common.rtpBitrate = videoReceiver.streams[0].common.receivedBitrate;
|
|
185
313
|
|
|
186
|
-
// From tracks //TODO: calculate a proper one
|
|
187
314
|
const totalFrameReceivedInaMin =
|
|
188
|
-
statsResults
|
|
315
|
+
statsResults[mediaType][sendrecvType].framesReceived - lastFramesReceived;
|
|
189
316
|
const totalFrameDecodedInaMin =
|
|
190
|
-
statsResults
|
|
191
|
-
|
|
192
|
-
|
|
193
|
-
?
|
|
194
|
-
|
|
195
|
-
|
|
196
|
-
?
|
|
197
|
-
|
|
198
|
-
|
|
199
|
-
|
|
200
|
-
statsResults
|
|
201
|
-
|
|
202
|
-
|
|
203
|
-
|
|
204
|
-
|
|
205
|
-
|
|
206
|
-
|
|
207
|
-
|
|
208
|
-
videoReceiver.streams[0].receivedKeyFrames =
|
|
317
|
+
statsResults[mediaType][sendrecvType].framesDecoded - lastFramesDecoded;
|
|
318
|
+
|
|
319
|
+
videoReceiverStream.common.receivedFrameRate = Math.round(
|
|
320
|
+
totalFrameReceivedInaMin ? totalFrameReceivedInaMin / 60 : 0
|
|
321
|
+
);
|
|
322
|
+
videoReceiverStream.common.renderedFrameRate = Math.round(
|
|
323
|
+
totalFrameDecodedInaMin ? totalFrameDecodedInaMin / 60 : 0
|
|
324
|
+
);
|
|
325
|
+
|
|
326
|
+
videoReceiverStream.common.framesDropped =
|
|
327
|
+
statsResults[mediaType][sendrecvType].framesDropped - lastFramesDropped || 0;
|
|
328
|
+
videoReceiverStream.receivedHeight = statsResults[mediaType][sendrecvType].height || 0;
|
|
329
|
+
videoReceiverStream.receivedWidth = statsResults[mediaType][sendrecvType].width || 0;
|
|
330
|
+
videoReceiverStream.receivedFrameSize =
|
|
331
|
+
(videoReceiverStream.receivedHeight * videoReceiverStream.receivedWidth) / 256;
|
|
332
|
+
|
|
333
|
+
videoReceiverStream.receivedKeyFrames =
|
|
209
334
|
statsResults[mediaType][sendrecvType].keyFramesDecoded - lastKeyFramesDecoded || 0;
|
|
210
|
-
|
|
335
|
+
videoReceiverStream.requestedKeyFrames =
|
|
211
336
|
statsResults[mediaType][sendrecvType].totalPliCount - lastPliCount || 0;
|
|
212
337
|
};
|
|
213
338
|
|
|
214
|
-
export const getVideoSenderMqa = ({videoSender, statsResults, lastMqaDataSent,
|
|
339
|
+
export const getVideoSenderMqa = ({videoSender, statsResults, lastMqaDataSent, baseMediaType}) => {
|
|
215
340
|
const sendrecvType = STATS.SEND_DIRECTION;
|
|
216
341
|
|
|
217
|
-
const
|
|
218
|
-
|
|
219
|
-
|
|
220
|
-
|
|
221
|
-
|
|
222
|
-
|
|
223
|
-
const
|
|
224
|
-
const
|
|
225
|
-
|
|
226
|
-
|
|
227
|
-
|
|
228
|
-
|
|
229
|
-
|
|
230
|
-
|
|
231
|
-
videoSender.common.
|
|
342
|
+
const getLastTotalValue = (value: string) =>
|
|
343
|
+
getTotalValueFromBaseType(lastMqaDataSent, sendrecvType, baseMediaType, value);
|
|
344
|
+
const getTotalValue = (value: string) =>
|
|
345
|
+
getTotalValueFromBaseType(statsResults, sendrecvType, baseMediaType, value);
|
|
346
|
+
|
|
347
|
+
const lastPacketsSent = getLastTotalValue('totalPacketsSent');
|
|
348
|
+
const lastBytesSent = getLastTotalValue('totalBytesSent');
|
|
349
|
+
const lastPacketsLostTotal = getLastTotalValue('totalPacketsLostOnReceiver');
|
|
350
|
+
|
|
351
|
+
const totalPacketsLostOnReceiver = getTotalValue('totalPacketsLostOnReceiver');
|
|
352
|
+
const totalPacketsSent = getTotalValue('totalPacketsSent');
|
|
353
|
+
const totalBytesSent = getTotalValue('totalBytesSent');
|
|
354
|
+
const availableOutgoingBitrate = getTotalValue('availableOutgoingBitrate');
|
|
355
|
+
|
|
356
|
+
videoSender.common.common.direction =
|
|
357
|
+
statsResults[Object.keys(statsResults).find((mediaType) => mediaType.includes(baseMediaType))]
|
|
358
|
+
?.direction || 'inactive';
|
|
359
|
+
videoSender.common.common.isMain = !baseMediaType.includes('-share');
|
|
360
|
+
videoSender.common.transportType = statsResults.connectionType.local.transport;
|
|
361
|
+
|
|
362
|
+
const meanRemoteJitter = Object.keys(statsResults)
|
|
363
|
+
.filter((mt) => mt.includes(baseMediaType))
|
|
364
|
+
.reduce((acc, mt) => acc.concat(statsResults[mt][sendrecvType].meanRemoteJitter), []);
|
|
365
|
+
const meanRoundTripTime = Object.keys(statsResults)
|
|
366
|
+
.filter((mt) => mt.includes(baseMediaType))
|
|
367
|
+
.reduce((acc, mt) => acc.concat(statsResults[mt][sendrecvType].meanRoundTripTime), []);
|
|
232
368
|
|
|
233
369
|
// @ts-ignore
|
|
234
|
-
videoSender.common.maxRemoteJitter =
|
|
235
|
-
|
|
236
|
-
max(statsResults[mediaType][sendrecvType].meanRemoteJitter) * 1000 || 0;
|
|
237
|
-
videoSender.common.meanRemoteJitter =
|
|
238
|
-
mean(statsResults[mediaType][sendrecvType].meanRemoteJitter) * 1000 || 0;
|
|
370
|
+
videoSender.common.maxRemoteJitter = max(meanRemoteJitter) * 1000 || 0;
|
|
371
|
+
videoSender.common.meanRemoteJitter = mean(meanRemoteJitter) * 1000 || 0;
|
|
239
372
|
|
|
240
|
-
videoSender.common.rtpPackets =
|
|
241
|
-
|
|
242
|
-
videoSender.common.availableBitrate =
|
|
243
|
-
statsResults[mediaType][sendrecvType].availableOutgoingBitrate || 0;
|
|
244
|
-
// Calculate based on how much packets lost of received compated to how to the client sent
|
|
373
|
+
videoSender.common.rtpPackets = totalPacketsSent - lastPacketsSent;
|
|
374
|
+
videoSender.common.availableBitrate = availableOutgoingBitrate;
|
|
245
375
|
|
|
246
|
-
|
|
247
|
-
|
|
376
|
+
// Calculate based on how much packets lost of received compated to how to the client sent
|
|
377
|
+
const totalPacketsLostForaMin = totalPacketsLostOnReceiver - lastPacketsLostTotal;
|
|
248
378
|
|
|
249
379
|
videoSender.common.remoteLossRate =
|
|
250
|
-
|
|
251
|
-
? (
|
|
380
|
+
totalPacketsSent - lastPacketsSent > 0
|
|
381
|
+
? (totalPacketsLostForaMin * 100) / (totalPacketsSent - lastPacketsSent)
|
|
252
382
|
: 0; // This is the packets sent with in last min || 0;
|
|
253
383
|
|
|
254
|
-
videoSender.common.maxRoundTripTime =
|
|
255
|
-
|
|
256
|
-
max(statsResults[mediaType][sendrecvType].meanRoundTripTime) * 1000 || 0;
|
|
257
|
-
videoSender.common.meanRoundTripTime =
|
|
258
|
-
mean(statsResults[mediaType][sendrecvType].meanRoundTripTime) * 1000 || 0;
|
|
384
|
+
videoSender.common.maxRoundTripTime = max(meanRoundTripTime) * 1000 || 0;
|
|
385
|
+
videoSender.common.meanRoundTripTime = mean(meanRoundTripTime) * 1000 || 0;
|
|
259
386
|
videoSender.common.roundTripTime = videoSender.common.maxRoundTripTime;
|
|
260
387
|
|
|
261
|
-
|
|
388
|
+
// Calculate the outgoing bitrate
|
|
389
|
+
const totalBytesSentInaMin = totalBytesSent - lastBytesSent;
|
|
390
|
+
|
|
391
|
+
videoSender.common.rtpBitrate = totalBytesSentInaMin ? (totalBytesSentInaMin * 8) / 60 : 0;
|
|
392
|
+
};
|
|
393
|
+
|
|
394
|
+
export const getVideoSenderStreamMqa = ({
|
|
395
|
+
videoSenderStream,
|
|
396
|
+
statsResults,
|
|
397
|
+
lastMqaDataSent,
|
|
398
|
+
mediaType,
|
|
399
|
+
}) => {
|
|
400
|
+
const sendrecvType = STATS.SEND_DIRECTION;
|
|
401
|
+
|
|
402
|
+
const lastPacketsSent = lastMqaDataSent[mediaType]?.[sendrecvType].totalPacketsSent || 0;
|
|
403
|
+
const lastBytesSent = lastMqaDataSent[mediaType]?.[sendrecvType].totalBytesSent || 0;
|
|
404
|
+
const lastKeyFramesEncoded =
|
|
405
|
+
lastMqaDataSent[mediaType]?.[sendrecvType].totalKeyFramesEncoded || 0;
|
|
406
|
+
const lastFirCount = lastMqaDataSent[mediaType]?.[sendrecvType].totalFirCount || 0;
|
|
407
|
+
const lastFramesSent = lastMqaDataSent[mediaType]?.[sendrecvType].framesSent || 0;
|
|
408
|
+
|
|
409
|
+
const {csi} = statsResults[mediaType];
|
|
410
|
+
if (csi && !videoSenderStream.common.csi.includes(csi)) {
|
|
411
|
+
videoSenderStream.common.csi.push(csi);
|
|
412
|
+
}
|
|
413
|
+
|
|
414
|
+
videoSenderStream.common.rtpPackets =
|
|
262
415
|
statsResults[mediaType][sendrecvType].totalPacketsSent - lastPacketsSent || 0;
|
|
263
416
|
|
|
264
417
|
// Calculate the outgoing bitrate
|
|
265
418
|
const totalBytesSentInaMin = statsResults[mediaType][sendrecvType].totalBytesSent - lastBytesSent;
|
|
266
419
|
|
|
267
|
-
|
|
420
|
+
videoSenderStream.common.transmittedBitrate = totalBytesSentInaMin
|
|
268
421
|
? (totalBytesSentInaMin * 8) / 60
|
|
269
422
|
: 0;
|
|
270
423
|
|
|
271
|
-
|
|
272
|
-
|
|
273
|
-
videoSender.streams[0].transmittedKeyFrames =
|
|
424
|
+
videoSenderStream.transmittedKeyFrames =
|
|
274
425
|
statsResults[mediaType][sendrecvType].totalKeyFramesEncoded - lastKeyFramesEncoded || 0;
|
|
275
|
-
|
|
426
|
+
videoSenderStream.requestedKeyFrames =
|
|
276
427
|
statsResults[mediaType][sendrecvType].totalFirCount - lastFirCount || 0;
|
|
277
428
|
|
|
278
429
|
// From tracks //TODO: calculate a proper one
|
|
279
430
|
const totalFrameSentInaMin =
|
|
280
|
-
statsResults
|
|
281
|
-
|
|
282
|
-
|
|
283
|
-
?
|
|
284
|
-
|
|
285
|
-
|
|
286
|
-
|
|
287
|
-
|
|
288
|
-
|
|
289
|
-
videoSender.streams[0].transmittedFrameSize =
|
|
290
|
-
(videoSender.streams[0].transmittedHeight * videoSender.streams[0].transmittedWidth) / 256;
|
|
431
|
+
statsResults[mediaType][sendrecvType].framesSent - (lastFramesSent || 0);
|
|
432
|
+
|
|
433
|
+
videoSenderStream.common.transmittedFrameRate = Math.round(
|
|
434
|
+
totalFrameSentInaMin ? totalFrameSentInaMin / 60 : 0
|
|
435
|
+
);
|
|
436
|
+
videoSenderStream.transmittedHeight = statsResults[mediaType][sendrecvType].height || 0;
|
|
437
|
+
videoSenderStream.transmittedWidth = statsResults[mediaType][sendrecvType].width || 0;
|
|
438
|
+
videoSenderStream.transmittedFrameSize =
|
|
439
|
+
(videoSenderStream.transmittedHeight * videoSenderStream.transmittedWidth) / 256;
|
|
291
440
|
};
|
|
@@ -0,0 +1,31 @@
|
|
|
1
|
+
/*!
|
|
2
|
+
* Copyright (c) 2015-2023 Cisco Systems, Inc. See LICENSE file.
|
|
3
|
+
*/
|
|
4
|
+
|
|
5
|
+
import {MEETINGS} from '../constants';
|
|
6
|
+
|
|
7
|
+
class WebinarCollection {
|
|
8
|
+
webinarInfo: any;
|
|
9
|
+
|
|
10
|
+
namespace = MEETINGS;
|
|
11
|
+
|
|
12
|
+
mainIndex = 'sessionId';
|
|
13
|
+
|
|
14
|
+
constructor() {
|
|
15
|
+
this.webinarInfo = {};
|
|
16
|
+
}
|
|
17
|
+
|
|
18
|
+
set(id, info) {
|
|
19
|
+
this.webinarInfo[id] = info;
|
|
20
|
+
}
|
|
21
|
+
|
|
22
|
+
/**
|
|
23
|
+
* @param {String} id
|
|
24
|
+
* @returns {Member}
|
|
25
|
+
*/
|
|
26
|
+
get(id: string) {
|
|
27
|
+
return this.webinarInfo[id];
|
|
28
|
+
}
|
|
29
|
+
}
|
|
30
|
+
|
|
31
|
+
export default WebinarCollection;
|