@webex/plugin-meetings 3.0.0-beta.14 → 3.0.0-beta.16
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/UPGRADING.md +9 -9
- package/browsers.js +19 -24
- package/dist/common/browser-detection.js +1 -20
- package/dist/common/browser-detection.js.map +1 -1
- package/dist/common/collection.js +5 -20
- package/dist/common/collection.js.map +1 -1
- package/dist/common/config.js +0 -7
- package/dist/common/config.js.map +1 -1
- package/dist/common/errors/captcha-error.js +5 -26
- package/dist/common/errors/captcha-error.js.map +1 -1
- package/dist/common/errors/intent-to-join.js +5 -26
- package/dist/common/errors/intent-to-join.js.map +1 -1
- package/dist/common/errors/join-meeting.js +6 -27
- package/dist/common/errors/join-meeting.js.map +1 -1
- package/dist/common/errors/media.js +5 -26
- package/dist/common/errors/media.js.map +1 -1
- package/dist/common/errors/parameter.js +5 -33
- package/dist/common/errors/parameter.js.map +1 -1
- package/dist/common/errors/password-error.js +5 -26
- package/dist/common/errors/password-error.js.map +1 -1
- package/dist/common/errors/permission.js +4 -25
- package/dist/common/errors/permission.js.map +1 -1
- package/dist/common/errors/reconnection-in-progress.js +0 -17
- package/dist/common/errors/reconnection-in-progress.js.map +1 -1
- package/dist/common/errors/reconnection.js +5 -26
- package/dist/common/errors/reconnection.js.map +1 -1
- package/dist/common/errors/stats.js +5 -26
- package/dist/common/errors/stats.js.map +1 -1
- package/dist/common/errors/webex-errors.js +6 -41
- package/dist/common/errors/webex-errors.js.map +1 -1
- package/dist/common/errors/webex-meetings-error.js +1 -24
- package/dist/common/errors/webex-meetings-error.js.map +1 -1
- package/dist/common/events/events-scope.js +0 -22
- package/dist/common/events/events-scope.js.map +1 -1
- package/dist/common/events/events.js +0 -23
- package/dist/common/events/events.js.map +1 -1
- package/dist/common/events/trigger-proxy.js +0 -12
- package/dist/common/events/trigger-proxy.js.map +1 -1
- package/dist/common/events/util.js +0 -15
- package/dist/common/events/util.js.map +1 -1
- package/dist/common/logs/logger-config.js +0 -4
- package/dist/common/logs/logger-config.js.map +1 -1
- package/dist/common/logs/logger-proxy.js +1 -8
- package/dist/common/logs/logger-proxy.js.map +1 -1
- package/dist/common/logs/request.js +35 -61
- package/dist/common/logs/request.js.map +1 -1
- package/dist/common/queue.js +4 -14
- package/dist/common/queue.js.map +1 -1
- package/dist/config.js +1 -5
- package/dist/config.js.map +1 -1
- package/dist/constants.js +45 -40
- package/dist/constants.js.map +1 -1
- package/dist/index.js +1 -17
- package/dist/index.js.map +1 -1
- package/dist/locus-info/controlsUtils.js +10 -28
- package/dist/locus-info/controlsUtils.js.map +1 -1
- package/dist/locus-info/embeddedAppsUtils.js +3 -26
- package/dist/locus-info/embeddedAppsUtils.js.map +1 -1
- package/dist/locus-info/fullState.js +0 -15
- package/dist/locus-info/fullState.js.map +1 -1
- package/dist/locus-info/hostUtils.js +4 -12
- package/dist/locus-info/hostUtils.js.map +1 -1
- package/dist/locus-info/index.js +101 -193
- package/dist/locus-info/index.js.map +1 -1
- package/dist/locus-info/infoUtils.js +0 -38
- package/dist/locus-info/infoUtils.js.map +1 -1
- package/dist/locus-info/mediaSharesUtils.js +12 -38
- package/dist/locus-info/mediaSharesUtils.js.map +1 -1
- package/dist/locus-info/parser.js +87 -123
- package/dist/locus-info/parser.js.map +1 -1
- package/dist/locus-info/selfUtils.js +16 -81
- package/dist/locus-info/selfUtils.js.map +1 -1
- package/dist/media/index.js +43 -97
- package/dist/media/index.js.map +1 -1
- package/dist/media/internal-media-core-wrapper.js +0 -4
- package/dist/media/internal-media-core-wrapper.js.map +1 -1
- package/dist/media/properties.js +64 -110
- package/dist/media/properties.js.map +1 -1
- package/dist/media/util.js +2 -9
- package/dist/media/util.js.map +1 -1
- package/dist/mediaQualityMetrics/config.js +10 -12
- package/dist/mediaQualityMetrics/config.js.map +1 -1
- package/dist/meeting/effectsState.js +120 -192
- package/dist/meeting/effectsState.js.map +1 -1
- package/dist/meeting/in-meeting-actions.js +0 -13
- package/dist/meeting/in-meeting-actions.js.map +1 -1
- package/dist/meeting/index.js +819 -1591
- package/dist/meeting/index.js.map +1 -1
- package/dist/meeting/muteState.js +31 -78
- package/dist/meeting/muteState.js.map +1 -1
- package/dist/meeting/request.js +160 -230
- package/dist/meeting/request.js.map +1 -1
- package/dist/meeting/request.type.js +0 -1
- package/dist/meeting/request.type.js.map +1 -1
- package/dist/meeting/state.js +21 -31
- package/dist/meeting/state.js.map +1 -1
- package/dist/meeting/util.js +19 -158
- package/dist/meeting/util.js.map +1 -1
- package/dist/meeting-info/collection.js +3 -25
- package/dist/meeting-info/collection.js.map +1 -1
- package/dist/meeting-info/index.js +10 -33
- package/dist/meeting-info/index.js.map +1 -1
- package/dist/meeting-info/meeting-info-v2.js +179 -268
- package/dist/meeting-info/meeting-info-v2.js.map +1 -1
- package/dist/meeting-info/request.js +1 -16
- package/dist/meeting-info/request.js.map +1 -1
- package/dist/meeting-info/util.js +98 -183
- package/dist/meeting-info/util.js.map +1 -1
- package/dist/meeting-info/utilv2.js +137 -228
- package/dist/meeting-info/utilv2.js.map +1 -1
- package/dist/meetings/collection.js +3 -21
- package/dist/meetings/collection.js.map +1 -1
- package/dist/meetings/index.js +450 -582
- package/dist/meetings/index.js.map +1 -1
- package/dist/meetings/request.js +7 -30
- package/dist/meetings/request.js.map +1 -1
- package/dist/meetings/util.js +99 -155
- package/dist/meetings/util.js.map +1 -1
- package/dist/member/index.js +49 -89
- package/dist/member/index.js.map +1 -1
- package/dist/member/util.js +17 -68
- package/dist/member/util.js.map +1 -1
- package/dist/members/collection.js +2 -12
- package/dist/members/collection.js.map +1 -1
- package/dist/members/index.js +72 -194
- package/dist/members/index.js.map +1 -1
- package/dist/members/request.js +21 -56
- package/dist/members/request.js.map +1 -1
- package/dist/members/util.js +9 -38
- package/dist/members/util.js.map +1 -1
- package/dist/metrics/config.js +0 -2
- package/dist/metrics/config.js.map +1 -1
- package/dist/metrics/constants.js +1 -2
- package/dist/metrics/constants.js.map +1 -1
- package/dist/metrics/index.js +48 -136
- package/dist/metrics/index.js.map +1 -1
- package/dist/multistream/mediaRequestManager.js +12 -28
- package/dist/multistream/mediaRequestManager.js.map +1 -1
- package/dist/multistream/multistreamMedia.js +11 -21
- package/dist/multistream/multistreamMedia.js.map +1 -1
- package/dist/multistream/receiveSlot.js +7 -47
- package/dist/multistream/receiveSlot.js.map +1 -1
- package/dist/multistream/receiveSlotManager.js +38 -77
- package/dist/multistream/receiveSlotManager.js.map +1 -1
- package/dist/multistream/remoteMedia.js +11 -56
- package/dist/multistream/remoteMedia.js.map +1 -1
- package/dist/multistream/remoteMediaGroup.js +6 -40
- package/dist/multistream/remoteMediaGroup.js.map +1 -1
- package/dist/multistream/remoteMediaManager.js +221 -380
- package/dist/multistream/remoteMediaManager.js.map +1 -1
- package/dist/networkQualityMonitor/index.js +28 -57
- package/dist/networkQualityMonitor/index.js.map +1 -1
- package/dist/personal-meeting-room/index.js +10 -45
- package/dist/personal-meeting-room/index.js.map +1 -1
- package/dist/personal-meeting-room/request.js +2 -33
- package/dist/personal-meeting-room/request.js.map +1 -1
- package/dist/personal-meeting-room/util.js +0 -13
- package/dist/personal-meeting-room/util.js.map +1 -1
- package/dist/reachability/index.js +100 -166
- package/dist/reachability/index.js.map +1 -1
- package/dist/reachability/request.js +2 -18
- package/dist/reachability/request.js.map +1 -1
- package/dist/reactions/reactions.js +0 -2
- package/dist/reactions/reactions.js.map +1 -1
- package/dist/reactions/reactions.type.js +2 -6
- package/dist/reactions/reactions.type.js.map +1 -1
- package/dist/reconnection-manager/index.js +294 -459
- package/dist/reconnection-manager/index.js.map +1 -1
- package/dist/roap/index.js +18 -53
- package/dist/roap/index.js.map +1 -1
- package/dist/roap/request.js +13 -55
- package/dist/roap/request.js.map +1 -1
- package/dist/roap/turnDiscovery.js +10 -52
- package/dist/roap/turnDiscovery.js.map +1 -1
- package/dist/statsAnalyzer/global.js +0 -2
- package/dist/statsAnalyzer/global.js.map +1 -1
- package/dist/statsAnalyzer/index.js +66 -174
- package/dist/statsAnalyzer/index.js.map +1 -1
- package/dist/statsAnalyzer/mqaUtil.js +54 -53
- package/dist/statsAnalyzer/mqaUtil.js.map +1 -1
- package/dist/transcription/index.js +13 -45
- package/dist/transcription/index.js.map +1 -1
- package/internal-README.md +7 -6
- package/package.json +18 -18
- package/src/common/browser-detection.ts +9 -6
- package/src/common/collection.ts +3 -1
- package/src/common/errors/captcha-error.ts +6 -6
- package/src/common/errors/intent-to-join.ts +6 -6
- package/src/common/errors/join-meeting.ts +12 -8
- package/src/common/errors/media.ts +6 -6
- package/src/common/errors/parameter.ts +9 -6
- package/src/common/errors/password-error.ts +6 -6
- package/src/common/errors/permission.ts +5 -5
- package/src/common/errors/reconnection.ts +6 -6
- package/src/common/errors/stats.ts +6 -6
- package/src/common/errors/webex-errors.ts +7 -5
- package/src/common/errors/webex-meetings-error.ts +1 -1
- package/src/common/events/events-scope.ts +5 -1
- package/src/common/events/events.ts +5 -1
- package/src/common/events/trigger-proxy.ts +8 -3
- package/src/common/events/util.ts +1 -2
- package/src/common/logs/logger-proxy.ts +21 -10
- package/src/common/logs/request.ts +11 -8
- package/src/config.ts +11 -11
- package/src/constants.ts +1 -1
- package/src/index.js +1 -1
- package/src/locus-info/controlsUtils.ts +34 -24
- package/src/locus-info/fullState.ts +15 -11
- package/src/locus-info/hostUtils.ts +4 -3
- package/src/locus-info/index.ts +25 -34
- package/src/locus-info/infoUtils.ts +12 -4
- package/src/locus-info/mediaSharesUtils.ts +4 -4
- package/src/locus-info/parser.ts +45 -68
- package/src/locus-info/selfUtils.ts +106 -57
- package/src/media/index.ts +123 -135
- package/src/media/internal-media-core-wrapper.ts +2 -2
- package/src/media/properties.ts +30 -20
- package/src/media/util.ts +1 -1
- package/src/mediaQualityMetrics/config.ts +46 -46
- package/src/meeting/effectsState.ts +35 -35
- package/src/meeting/in-meeting-actions.ts +7 -3
- package/src/meeting/index.ts +1559 -1292
- package/src/meeting/muteState.ts +62 -31
- package/src/meeting/request.ts +155 -116
- package/src/meeting/request.type.ts +8 -8
- package/src/meeting/state.ts +45 -30
- package/src/meeting/util.ts +101 -70
- package/src/meeting-info/collection.ts +2 -1
- package/src/meeting-info/index.ts +32 -30
- package/src/meeting-info/meeting-info-v2.ts +106 -108
- package/src/meeting-info/request.ts +9 -3
- package/src/meeting-info/util.ts +54 -46
- package/src/meeting-info/utilv2.ts +59 -53
- package/src/meetings/collection.ts +1 -1
- package/src/meetings/index.ts +512 -440
- package/src/meetings/request.ts +26 -24
- package/src/meetings/util.ts +29 -29
- package/src/member/index.ts +55 -49
- package/src/member/util.ts +26 -13
- package/src/members/collection.ts +0 -1
- package/src/members/index.ts +182 -126
- package/src/members/request.ts +46 -14
- package/src/members/util.ts +44 -42
- package/src/metrics/config.ts +254 -81
- package/src/metrics/constants.ts +0 -2
- package/src/metrics/index.ts +84 -71
- package/src/multistream/multistreamMedia.ts +1 -0
- package/src/multistream/receiveSlot.ts +1 -0
- package/src/multistream/receiveSlotManager.ts +1 -0
- package/src/multistream/remoteMedia.ts +1 -1
- package/src/multistream/remoteMediaGroup.ts +2 -1
- package/src/multistream/remoteMediaManager.ts +3 -0
- package/src/networkQualityMonitor/index.ts +20 -23
- package/src/personal-meeting-room/index.ts +12 -16
- package/src/personal-meeting-room/request.ts +10 -3
- package/src/personal-meeting-room/util.ts +3 -3
- package/src/reachability/index.ts +61 -59
- package/src/reachability/request.ts +36 -32
- package/src/reactions/reactions.ts +4 -4
- package/src/reactions/reactions.type.ts +4 -3
- package/src/reconnection-manager/index.ts +139 -84
- package/src/roap/index.ts +46 -38
- package/src/roap/request.ts +44 -31
- package/src/roap/turnDiscovery.ts +59 -30
- package/src/statsAnalyzer/global.ts +30 -33
- package/src/statsAnalyzer/index.ts +432 -175
- package/src/statsAnalyzer/mqaUtil.ts +178 -72
- package/src/transcription/index.ts +34 -32
- package/test/integration/spec/journey.js +664 -463
- package/test/integration/spec/space-meeting.js +319 -204
- package/test/integration/spec/transcription.js +7 -8
- package/test/unit/spec/common/browser-detection.js +9 -28
- package/test/unit/spec/fixture/locus.js +92 -90
- package/test/unit/spec/locus-info/controlsUtils.js +5 -5
- package/test/unit/spec/locus-info/embeddedAppsUtils.js +8 -6
- package/test/unit/spec/locus-info/index.js +1 -2
- package/test/unit/spec/locus-info/infoUtils.js +26 -33
- package/test/unit/spec/locus-info/lib/BasicSeqCmp.json +88 -430
- package/test/unit/spec/locus-info/lib/SeqCmp.json +513 -685
- package/test/unit/spec/locus-info/parser.js +3 -9
- package/test/unit/spec/locus-info/selfConstant.js +72 -103
- package/test/unit/spec/locus-info/selfUtils.js +21 -12
- package/test/unit/spec/meeting/effectsState.js +36 -46
- package/test/unit/spec/meeting/in-meeting-actions.ts +2 -3
- package/test/unit/spec/meeting/index.js +1279 -685
- package/test/unit/spec/meeting/muteState.js +42 -33
- package/test/unit/spec/meeting/request.js +57 -46
- package/test/unit/spec/meeting/utils.js +78 -53
- package/test/unit/spec/meeting-info/meetinginfov2.js +100 -73
- package/test/unit/spec/meeting-info/request.js +7 -9
- package/test/unit/spec/meeting-info/util.js +11 -12
- package/test/unit/spec/meeting-info/utilv2.js +110 -74
- package/test/unit/spec/meetings/collection.js +1 -1
- package/test/unit/spec/meetings/index.js +438 -257
- package/test/unit/spec/meetings/utils.js +14 -12
- package/test/unit/spec/member/index.js +0 -1
- package/test/unit/spec/member/util.js +5 -6
- package/test/unit/spec/members/index.js +104 -54
- package/test/unit/spec/members/request.js +29 -20
- package/test/unit/spec/members/utils.js +8 -5
- package/test/unit/spec/metrics/index.js +16 -21
- package/test/unit/spec/networkQualityMonitor/index.js +21 -15
- package/test/unit/spec/personal-meeting-room/personal-meeting-room.js +2 -7
- package/test/unit/spec/reachability/index.ts +9 -11
- package/test/unit/spec/reconnection-manager/index.js +16 -18
- package/test/unit/spec/roap/turnDiscovery.ts +22 -19
- package/test/unit/spec/stats-analyzer/index.js +25 -20
- package/test/utils/cmr.js +44 -42
- package/test/utils/testUtils.js +83 -74
- package/test/utils/webex-config.js +18 -18
- package/test/utils/webex-test-users.js +53 -50
|
@@ -1,8 +1,17 @@
|
|
|
1
|
+
/* eslint-disable prefer-destructuring */
|
|
2
|
+
|
|
1
3
|
import {cloneDeep} from 'lodash';
|
|
2
4
|
import {MediaConnection as MC} from '@webex/internal-media-core';
|
|
3
5
|
|
|
4
6
|
import EventsScope from '../common/events/events-scope';
|
|
5
|
-
import {
|
|
7
|
+
import {
|
|
8
|
+
DEFAULT_GET_STATS_FILTER,
|
|
9
|
+
STATS,
|
|
10
|
+
MQA_INTEVAL,
|
|
11
|
+
NETWORK_TYPE,
|
|
12
|
+
MEDIA_DEVICES,
|
|
13
|
+
_UNKNOWN_,
|
|
14
|
+
} from '../constants';
|
|
6
15
|
import mqaData from '../mediaQualityMetrics/config';
|
|
7
16
|
import LoggerProxy from '../common/logs/logger-proxy';
|
|
8
17
|
|
|
@@ -11,7 +20,7 @@ import {
|
|
|
11
20
|
getAudioSenderMqa,
|
|
12
21
|
getAudioReceiverMqa,
|
|
13
22
|
getVideoSenderMqa,
|
|
14
|
-
getVideoReceiverMqa
|
|
23
|
+
getVideoReceiverMqa,
|
|
15
24
|
} from './mqaUtil';
|
|
16
25
|
|
|
17
26
|
export const EVENTS = {
|
|
@@ -53,7 +62,11 @@ export class StatsAnalyzer extends EventsScope {
|
|
|
53
62
|
* @param {Object} networkQualityMonitor class for assessing network characteristics (jitter, packetLoss, latency)
|
|
54
63
|
* @param {Object} statsResults Default properties for stats
|
|
55
64
|
*/
|
|
56
|
-
constructor(
|
|
65
|
+
constructor(
|
|
66
|
+
config: any,
|
|
67
|
+
networkQualityMonitor: object = {},
|
|
68
|
+
statsResults: object = defaultStats
|
|
69
|
+
) {
|
|
57
70
|
super();
|
|
58
71
|
this.statsStarted = false;
|
|
59
72
|
this.statsResults = statsResults;
|
|
@@ -63,10 +76,14 @@ export class StatsAnalyzer extends EventsScope {
|
|
|
63
76
|
this.correlationId = config.correlationId;
|
|
64
77
|
this.mqaSentCount = -1;
|
|
65
78
|
this.lastMqaDataSent = {
|
|
66
|
-
resolutions: {
|
|
79
|
+
resolutions: {
|
|
80
|
+
video: {send: {}, recv: {}},
|
|
81
|
+
audio: {send: {}, recv: {}},
|
|
82
|
+
share: {send: {}, recv: {}},
|
|
83
|
+
},
|
|
67
84
|
video: {send: {}, recv: {}},
|
|
68
85
|
audio: {send: {}, recv: {}},
|
|
69
|
-
share: {send: {}, recv: {}}
|
|
86
|
+
share: {send: {}, recv: {}},
|
|
70
87
|
};
|
|
71
88
|
this.localMQEStats = {
|
|
72
89
|
audio: {
|
|
@@ -74,14 +91,14 @@ export class StatsAnalyzer extends EventsScope {
|
|
|
74
91
|
packetsLost: [],
|
|
75
92
|
jitter: [],
|
|
76
93
|
latency: [],
|
|
77
|
-
bitRate: []
|
|
94
|
+
bitRate: [],
|
|
78
95
|
},
|
|
79
96
|
TX: {
|
|
80
97
|
packetsLost: [],
|
|
81
98
|
jitter: [],
|
|
82
99
|
latency: [],
|
|
83
|
-
bitRate: []
|
|
84
|
-
}
|
|
100
|
+
bitRate: [],
|
|
101
|
+
},
|
|
85
102
|
},
|
|
86
103
|
video: {
|
|
87
104
|
RX: {
|
|
@@ -93,7 +110,7 @@ export class StatsAnalyzer extends EventsScope {
|
|
|
93
110
|
resolutionWidth: [],
|
|
94
111
|
resolutionHeight: [],
|
|
95
112
|
requestedKeyFrame: [],
|
|
96
|
-
receivedKeyFrame: []
|
|
113
|
+
receivedKeyFrame: [],
|
|
97
114
|
},
|
|
98
115
|
TX: {
|
|
99
116
|
packetsLost: [],
|
|
@@ -104,9 +121,9 @@ export class StatsAnalyzer extends EventsScope {
|
|
|
104
121
|
resolutionWidth: [],
|
|
105
122
|
resolutionHeight: [],
|
|
106
123
|
requestedKeyFrame: [],
|
|
107
|
-
receivedKeyFrame: []
|
|
108
|
-
}
|
|
109
|
-
}
|
|
124
|
+
receivedKeyFrame: [],
|
|
125
|
+
},
|
|
126
|
+
},
|
|
110
127
|
};
|
|
111
128
|
this.lastEmittedStartStopEvent = {
|
|
112
129
|
audio: {
|
|
@@ -130,37 +147,60 @@ export class StatsAnalyzer extends EventsScope {
|
|
|
130
147
|
this.localMQEStats.audio.RX.packetsLost.push(lastMqa.audioReceive[0].common.mediaHopByHopLost);
|
|
131
148
|
this.localMQEStats.audio.RX.jitter.push(lastMqa.audioReceive[0].streams[0].common.rtpJitter);
|
|
132
149
|
this.localMQEStats.audio.RX.latency.push(lastMqa.audioReceive[0].common.roundTripTime);
|
|
133
|
-
this.localMQEStats.audio.RX.bitRate.push(
|
|
150
|
+
this.localMQEStats.audio.RX.bitRate.push(
|
|
151
|
+
lastMqa.audioReceive[0].streams[0].common.receivedBitrate
|
|
152
|
+
);
|
|
134
153
|
|
|
135
154
|
this.localMQEStats.audio.TX.packetsLost.push(lastMqa.audioTransmit[0].common.remoteLossRate);
|
|
136
155
|
this.localMQEStats.audio.TX.jitter.push(lastMqa.audioTransmit[0].common.remoteJitter);
|
|
137
156
|
this.localMQEStats.audio.TX.latency.push(lastMqa.audioTransmit[0].common.roundTripTime);
|
|
138
|
-
this.localMQEStats.audio.TX.bitRate.push(
|
|
157
|
+
this.localMQEStats.audio.TX.bitRate.push(
|
|
158
|
+
lastMqa.audioTransmit[0].streams[0].common.transmittedBitrate
|
|
159
|
+
);
|
|
139
160
|
|
|
140
161
|
// Video
|
|
141
162
|
|
|
142
163
|
this.localMQEStats.video.RX.packetsLost.push(lastMqa.videoReceive[0].common.mediaHopByHopLost);
|
|
143
164
|
this.localMQEStats.video.RX.jitter.push(lastMqa.videoReceive[0].streams[0].common.rtpJitter);
|
|
144
|
-
this.localMQEStats.video.RX.latency.push(
|
|
145
|
-
|
|
146
|
-
|
|
147
|
-
this.localMQEStats.video.RX.
|
|
148
|
-
|
|
165
|
+
this.localMQEStats.video.RX.latency.push(
|
|
166
|
+
lastMqa.videoReceive[0].streams[0].common.roundTripTime
|
|
167
|
+
);
|
|
168
|
+
this.localMQEStats.video.RX.bitRate.push(
|
|
169
|
+
lastMqa.videoReceive[0].streams[0].common.receivedBitrate
|
|
170
|
+
);
|
|
171
|
+
this.localMQEStats.video.RX.frameRate.push(
|
|
172
|
+
lastMqa.videoReceive[0].streams[0].common.receivedFrameRate
|
|
173
|
+
);
|
|
174
|
+
this.localMQEStats.video.RX.resolutionWidth.push(
|
|
175
|
+
lastMqa.videoReceive[0].streams[0].receivedWidth
|
|
176
|
+
);
|
|
177
|
+
this.localMQEStats.video.RX.resolutionHeight.push(
|
|
178
|
+
lastMqa.videoReceive[0].streams[0].receivedHeight
|
|
179
|
+
);
|
|
149
180
|
this.localMQEStats.video.RX.requestedKeyFrame.push();
|
|
150
181
|
this.localMQEStats.video.RX.receivedKeyFrame.push();
|
|
151
182
|
|
|
152
183
|
this.localMQEStats.video.TX.packetsLost.push(lastMqa.videoTransmit[0].common.remoteLossRate);
|
|
153
184
|
this.localMQEStats.video.TX.jitter.push(lastMqa.videoTransmit[0].common.remoteJitter);
|
|
154
185
|
this.localMQEStats.video.TX.latency.push(lastMqa.videoTransmit[0].common.roundTripTime);
|
|
155
|
-
this.localMQEStats.video.TX.bitRate.push(
|
|
156
|
-
|
|
157
|
-
|
|
158
|
-
this.localMQEStats.video.TX.
|
|
159
|
-
|
|
186
|
+
this.localMQEStats.video.TX.bitRate.push(
|
|
187
|
+
lastMqa.videoTransmit[0].streams[0].common.transmittedBitrate
|
|
188
|
+
);
|
|
189
|
+
this.localMQEStats.video.TX.frameRate.push(
|
|
190
|
+
lastMqa.videoTransmit[0].streams[0].common.transmittedFrameRate
|
|
191
|
+
);
|
|
192
|
+
this.localMQEStats.video.TX.resolutionWidth.push(
|
|
193
|
+
lastMqa.videoTransmit[0].streams[0].transmittedWidth
|
|
194
|
+
);
|
|
195
|
+
this.localMQEStats.video.TX.resolutionHeight.push(
|
|
196
|
+
lastMqa.videoTransmit[0].streams[0].transmittedHeight
|
|
197
|
+
);
|
|
198
|
+
this.localMQEStats.video.TX.requestedKeyFrame.push(
|
|
199
|
+
lastMqa.videoTransmit[0].streams[0].requestedKeyFrames
|
|
200
|
+
);
|
|
160
201
|
this.localMQEStats.video.TX.receivedKeyFrame.push();
|
|
161
202
|
}
|
|
162
203
|
|
|
163
|
-
|
|
164
204
|
resetStatsResults() {
|
|
165
205
|
this.statsResults.audio.send.meanRemoteJitter = [];
|
|
166
206
|
this.statsResults.video.send.meanRemoteJitter = [];
|
|
@@ -208,23 +248,23 @@ export class StatsAnalyzer extends EventsScope {
|
|
|
208
248
|
getAudioSenderMqa({
|
|
209
249
|
audioSender,
|
|
210
250
|
statsResults: this.statsResults,
|
|
211
|
-
lastMqaDataSent: this.lastMqaDataSent
|
|
251
|
+
lastMqaDataSent: this.lastMqaDataSent,
|
|
212
252
|
});
|
|
213
253
|
getAudioReceiverMqa({
|
|
214
254
|
audioReceiver,
|
|
215
255
|
statsResults: this.statsResults,
|
|
216
|
-
lastMqaDataSent: this.lastMqaDataSent
|
|
256
|
+
lastMqaDataSent: this.lastMqaDataSent,
|
|
217
257
|
});
|
|
218
258
|
|
|
219
259
|
getVideoReceiverMqa({
|
|
220
260
|
videoReceiver,
|
|
221
261
|
statsResults: this.statsResults,
|
|
222
|
-
lastMqaDataSent: this.lastMqaDataSent
|
|
262
|
+
lastMqaDataSent: this.lastMqaDataSent,
|
|
223
263
|
});
|
|
224
264
|
getVideoSenderMqa({
|
|
225
265
|
videoSender,
|
|
226
266
|
statsResults: this.statsResults,
|
|
227
|
-
lastMqaDataSent: this.lastMqaDataSent
|
|
267
|
+
lastMqaDataSent: this.lastMqaDataSent,
|
|
228
268
|
});
|
|
229
269
|
|
|
230
270
|
// Capture mqa for share scenario
|
|
@@ -233,24 +273,34 @@ export class StatsAnalyzer extends EventsScope {
|
|
|
233
273
|
videoSender: shareSender,
|
|
234
274
|
statsResults: this.statsResults,
|
|
235
275
|
lastMqaDataSent: this.lastMqaDataSent,
|
|
236
|
-
isShareStream: true
|
|
276
|
+
isShareStream: true,
|
|
237
277
|
});
|
|
238
278
|
|
|
239
279
|
getVideoReceiverMqa({
|
|
240
280
|
videoReceiver: shareReceiver,
|
|
241
281
|
statsResults: this.statsResults,
|
|
242
282
|
lastMqaDataSent: this.lastMqaDataSent,
|
|
243
|
-
isShareStream: true
|
|
283
|
+
isShareStream: true,
|
|
244
284
|
});
|
|
245
|
-
|
|
246
|
-
|
|
285
|
+
mqaData.intervals[0].intervalMetadata.peerReflexiveIP =
|
|
286
|
+
this.statsResults.connectionType.local.ipAddress[0];
|
|
247
287
|
|
|
248
288
|
// Adding peripheral information
|
|
249
289
|
mqaData.intervals[0].intervalMetadata.peripherals = [];
|
|
250
|
-
mqaData.intervals[0].intervalMetadata.peripherals.push({
|
|
251
|
-
|
|
252
|
-
|
|
253
|
-
|
|
290
|
+
mqaData.intervals[0].intervalMetadata.peripherals.push({
|
|
291
|
+
information: _UNKNOWN_,
|
|
292
|
+
name: MEDIA_DEVICES.SPEAKER,
|
|
293
|
+
});
|
|
294
|
+
mqaData.intervals[0].intervalMetadata.peripherals.push({
|
|
295
|
+
information:
|
|
296
|
+
this.statsResults[STATS.AUDIO_CORRELATE][STATS.SEND_DIRECTION].trackLabel || _UNKNOWN_,
|
|
297
|
+
name: MEDIA_DEVICES.MICROPHONE,
|
|
298
|
+
});
|
|
299
|
+
mqaData.intervals[0].intervalMetadata.peripherals.push({
|
|
300
|
+
information:
|
|
301
|
+
this.statsResults[STATS.VIDEO_CORRELATE][STATS.SEND_DIRECTION].trackLabel || _UNKNOWN_,
|
|
302
|
+
name: MEDIA_DEVICES.CAMERA,
|
|
303
|
+
});
|
|
254
304
|
|
|
255
305
|
// @ts-ignore
|
|
256
306
|
mqaData.networkType = this.statsResults.connectionType.local.networkType;
|
|
@@ -269,13 +319,13 @@ export class StatsAnalyzer extends EventsScope {
|
|
|
269
319
|
this.emit(
|
|
270
320
|
{
|
|
271
321
|
file: 'statsAnalyzer',
|
|
272
|
-
function: 'sendMqaData'
|
|
322
|
+
function: 'sendMqaData',
|
|
273
323
|
},
|
|
274
324
|
EVENTS.MEDIA_QUALITY,
|
|
275
325
|
{
|
|
276
326
|
data: mqaData.intervals[0],
|
|
277
327
|
// @ts-ignore
|
|
278
|
-
networkType: mqaData.networkType
|
|
328
|
+
networkType: mqaData.networkType,
|
|
279
329
|
}
|
|
280
330
|
);
|
|
281
331
|
}
|
|
@@ -305,17 +355,16 @@ export class StatsAnalyzer extends EventsScope {
|
|
|
305
355
|
this.statsStarted = true;
|
|
306
356
|
this.mediaConnection = mediaConnection;
|
|
307
357
|
|
|
308
|
-
return this.getStatsAndParse()
|
|
309
|
-
.
|
|
310
|
-
this.
|
|
311
|
-
|
|
312
|
-
|
|
313
|
-
|
|
358
|
+
return this.getStatsAndParse().then(() => {
|
|
359
|
+
this.statsInterval = setInterval(() => {
|
|
360
|
+
this.getStatsAndParse();
|
|
361
|
+
}, this.config.analyzerInterval);
|
|
362
|
+
// Trigger initial fetch
|
|
363
|
+
this.sendMqaData();
|
|
364
|
+
this.mqaInterval = setInterval(() => {
|
|
314
365
|
this.sendMqaData();
|
|
315
|
-
|
|
316
|
-
|
|
317
|
-
}, MQA_INTEVAL);
|
|
318
|
-
});
|
|
366
|
+
}, MQA_INTEVAL);
|
|
367
|
+
});
|
|
319
368
|
}
|
|
320
369
|
|
|
321
370
|
return Promise.resolve();
|
|
@@ -406,7 +455,11 @@ export class StatsAnalyzer extends EventsScope {
|
|
|
406
455
|
* @param {boolean} isSender
|
|
407
456
|
* @returns {void}
|
|
408
457
|
*/
|
|
409
|
-
private filterAndParseGetStatsResults(
|
|
458
|
+
private filterAndParseGetStatsResults(
|
|
459
|
+
getStatsResults: Array<any>,
|
|
460
|
+
type: string,
|
|
461
|
+
isSender: boolean
|
|
462
|
+
) {
|
|
410
463
|
const {types} = DEFAULT_GET_STATS_FILTER;
|
|
411
464
|
|
|
412
465
|
getStatsResults.forEach((result) => {
|
|
@@ -447,7 +500,12 @@ export class StatsAnalyzer extends EventsScope {
|
|
|
447
500
|
* @memberof StatsAnalyzer
|
|
448
501
|
* @returns {void}
|
|
449
502
|
*/
|
|
450
|
-
emitStartStopEvents = (
|
|
503
|
+
emitStartStopEvents = (
|
|
504
|
+
mediaType: string,
|
|
505
|
+
previousValue: number,
|
|
506
|
+
currentValue: number,
|
|
507
|
+
isLocal: boolean
|
|
508
|
+
) => {
|
|
451
509
|
if (mediaType !== 'audio' && mediaType !== 'video' && mediaType !== 'share') {
|
|
452
510
|
throw new Error(`Unsupported mediaType: ${mediaType}`);
|
|
453
511
|
}
|
|
@@ -457,32 +515,32 @@ export class StatsAnalyzer extends EventsScope {
|
|
|
457
515
|
// eslint-disable-next-line no-param-reassign
|
|
458
516
|
if (currentValue === undefined) currentValue = 0;
|
|
459
517
|
|
|
460
|
-
const lastEmittedEvent = isLocal
|
|
518
|
+
const lastEmittedEvent = isLocal
|
|
519
|
+
? this.lastEmittedStartStopEvent[mediaType].local
|
|
520
|
+
: this.lastEmittedStartStopEvent[mediaType].remote;
|
|
461
521
|
|
|
462
522
|
let newEvent;
|
|
463
523
|
|
|
464
|
-
if (
|
|
524
|
+
if (currentValue - previousValue > 0) {
|
|
465
525
|
newEvent = isLocal ? EVENTS.LOCAL_MEDIA_STARTED : EVENTS.REMOTE_MEDIA_STARTED;
|
|
466
|
-
}
|
|
467
|
-
else if ((currentValue === previousValue) && currentValue > 0) {
|
|
526
|
+
} else if (currentValue === previousValue && currentValue > 0) {
|
|
468
527
|
newEvent = isLocal ? EVENTS.LOCAL_MEDIA_STOPPED : EVENTS.REMOTE_MEDIA_STOPPED;
|
|
469
528
|
}
|
|
470
529
|
|
|
471
530
|
if (newEvent && lastEmittedEvent !== newEvent) {
|
|
472
531
|
if (isLocal) {
|
|
473
532
|
this.lastEmittedStartStopEvent[mediaType].local = newEvent;
|
|
474
|
-
}
|
|
475
|
-
else {
|
|
533
|
+
} else {
|
|
476
534
|
this.lastEmittedStartStopEvent[mediaType].remote = newEvent;
|
|
477
535
|
}
|
|
478
536
|
this.emit(
|
|
479
537
|
{
|
|
480
538
|
file: 'statsAnalyzer/index',
|
|
481
|
-
function: 'compareLastStatsResult'
|
|
539
|
+
function: 'compareLastStatsResult',
|
|
482
540
|
},
|
|
483
541
|
newEvent,
|
|
484
542
|
{
|
|
485
|
-
type: mediaType
|
|
543
|
+
type: mediaType,
|
|
486
544
|
}
|
|
487
545
|
);
|
|
488
546
|
}
|
|
@@ -506,54 +564,98 @@ export class StatsAnalyzer extends EventsScope {
|
|
|
506
564
|
currentStats = this.statsResults[mediaType].send;
|
|
507
565
|
previousStats = this.lastStatsResults[mediaType].send;
|
|
508
566
|
|
|
509
|
-
if (
|
|
510
|
-
|
|
511
|
-
|
|
512
|
-
|
|
513
|
-
|
|
514
|
-
|
|
567
|
+
if (
|
|
568
|
+
currentStats.totalPacketsSent === previousStats.totalPacketsSent ||
|
|
569
|
+
currentStats.totalPacketsSent === 0
|
|
570
|
+
) {
|
|
571
|
+
LoggerProxy.logger.info(
|
|
572
|
+
`StatsAnalyzer:index#compareLastStatsResult --> No ${mediaType} RTP packets sent`
|
|
573
|
+
);
|
|
574
|
+
} else {
|
|
575
|
+
if (
|
|
576
|
+
currentStats.totalAudioEnergy === previousStats.totalAudioEnergy ||
|
|
577
|
+
currentStats.totalAudioEnergy === 0
|
|
578
|
+
) {
|
|
579
|
+
LoggerProxy.logger.info(
|
|
580
|
+
`StatsAnalyzer:index#compareLastStatsResult --> No ${mediaType} Energy present`
|
|
581
|
+
);
|
|
515
582
|
}
|
|
516
583
|
|
|
517
584
|
if (currentStats.audioLevel === 0) {
|
|
518
|
-
LoggerProxy.logger.info(
|
|
585
|
+
LoggerProxy.logger.info(
|
|
586
|
+
`StatsAnalyzer:index#compareLastStatsResult --> ${mediaType} level is 0 for the user`
|
|
587
|
+
);
|
|
519
588
|
}
|
|
520
589
|
}
|
|
521
590
|
|
|
522
|
-
this.emitStartStopEvents(
|
|
591
|
+
this.emitStartStopEvents(
|
|
592
|
+
mediaType,
|
|
593
|
+
previousStats.totalPacketsSent,
|
|
594
|
+
currentStats.totalPacketsSent,
|
|
595
|
+
true
|
|
596
|
+
);
|
|
523
597
|
}
|
|
524
598
|
|
|
525
599
|
if (this.meetingMediaStatus.expected.receiveAudio) {
|
|
526
|
-
|
|
600
|
+
// compare audio stats received
|
|
527
601
|
currentStats = this.statsResults[mediaType].recv;
|
|
528
602
|
previousStats = this.lastStatsResults[mediaType].recv;
|
|
529
603
|
|
|
530
|
-
if (
|
|
531
|
-
|
|
532
|
-
|
|
533
|
-
|
|
534
|
-
|
|
535
|
-
|
|
604
|
+
if (
|
|
605
|
+
currentStats.totalPacketsReceived === previousStats.totalPacketsReceived ||
|
|
606
|
+
currentStats.totalPacketsReceived === 0
|
|
607
|
+
) {
|
|
608
|
+
LoggerProxy.logger.info(
|
|
609
|
+
`StatsAnalyzer:index#compareLastStatsResult --> No ${mediaType} RTP packets received`
|
|
610
|
+
);
|
|
611
|
+
} else if (
|
|
612
|
+
currentStats.totalSamplesReceived === previousStats.totalSamplesReceived ||
|
|
613
|
+
currentStats.totalSamplesReceived === 0
|
|
614
|
+
) {
|
|
615
|
+
LoggerProxy.logger.info(
|
|
616
|
+
`StatsAnalyzer:index#compareLastStatsResult --> No ${mediaType} samples received`
|
|
617
|
+
);
|
|
536
618
|
}
|
|
537
619
|
|
|
538
|
-
this.emitStartStopEvents(
|
|
620
|
+
this.emitStartStopEvents(
|
|
621
|
+
mediaType,
|
|
622
|
+
previousStats.totalPacketsReceived,
|
|
623
|
+
currentStats.totalPacketsReceived,
|
|
624
|
+
false
|
|
625
|
+
);
|
|
539
626
|
}
|
|
540
627
|
|
|
541
628
|
mediaType = STATS.VIDEO_CORRELATE;
|
|
542
629
|
if (this.meetingMediaStatus.expected.sendVideo) {
|
|
543
|
-
|
|
630
|
+
// compare video stats sent
|
|
544
631
|
currentStats = this.statsResults[mediaType].send;
|
|
545
632
|
previousStats = this.lastStatsResults[mediaType].send;
|
|
546
633
|
|
|
547
|
-
if (
|
|
548
|
-
|
|
549
|
-
|
|
550
|
-
|
|
551
|
-
|
|
552
|
-
|
|
634
|
+
if (
|
|
635
|
+
currentStats.totalPacketsSent === previousStats.totalPacketsSent ||
|
|
636
|
+
currentStats.totalPacketsSent === 0
|
|
637
|
+
) {
|
|
638
|
+
LoggerProxy.logger.info(
|
|
639
|
+
`StatsAnalyzer:index#compareLastStatsResult --> No ${mediaType} RTP packets sent`
|
|
640
|
+
);
|
|
641
|
+
} else {
|
|
642
|
+
if (
|
|
643
|
+
currentStats.framesEncoded === previousStats.framesEncoded ||
|
|
644
|
+
currentStats.framesEncoded === 0
|
|
645
|
+
) {
|
|
646
|
+
LoggerProxy.logger.info(
|
|
647
|
+
`StatsAnalyzer:index#compareLastStatsResult --> No ${mediaType} Frames Encoded`
|
|
648
|
+
);
|
|
553
649
|
}
|
|
554
650
|
|
|
555
|
-
if (
|
|
556
|
-
|
|
651
|
+
if (
|
|
652
|
+
this.statsResults.resolutions[mediaType].send.framesSent ===
|
|
653
|
+
this.lastStatsResults.resolutions[mediaType].send.framesSent ||
|
|
654
|
+
this.statsResults.resolutions[mediaType].send.framesSent === 0
|
|
655
|
+
) {
|
|
656
|
+
LoggerProxy.logger.info(
|
|
657
|
+
`StatsAnalyzer:index#compareLastStatsResult --> No ${mediaType} Frames sent`
|
|
658
|
+
);
|
|
557
659
|
}
|
|
558
660
|
}
|
|
559
661
|
|
|
@@ -565,27 +667,48 @@ export class StatsAnalyzer extends EventsScope {
|
|
|
565
667
|
);
|
|
566
668
|
}
|
|
567
669
|
|
|
568
|
-
|
|
569
670
|
if (this.meetingMediaStatus.expected.receiveVideo) {
|
|
570
|
-
|
|
671
|
+
// compare video stats reveived
|
|
571
672
|
|
|
572
673
|
currentStats = this.statsResults[mediaType].recv;
|
|
573
674
|
previousStats = this.lastStatsResults[mediaType].recv;
|
|
574
675
|
|
|
575
|
-
if (
|
|
576
|
-
|
|
577
|
-
|
|
578
|
-
|
|
579
|
-
|
|
580
|
-
|
|
676
|
+
if (
|
|
677
|
+
currentStats.totalPacketsReceived === previousStats.totalPacketsReceived ||
|
|
678
|
+
currentStats.totalPacketsReceived === 0
|
|
679
|
+
) {
|
|
680
|
+
LoggerProxy.logger.info(
|
|
681
|
+
`StatsAnalyzer:index#compareLastStatsResult --> No ${mediaType} RTP packets received`
|
|
682
|
+
);
|
|
683
|
+
} else {
|
|
684
|
+
if (
|
|
685
|
+
this.statsResults.resolutions[mediaType].recv.framesReceived ===
|
|
686
|
+
this.lastStatsResults.resolutions[mediaType].recv.framesReceived ||
|
|
687
|
+
this.statsResults.resolutions[mediaType].recv.framesReceived === 0
|
|
688
|
+
) {
|
|
689
|
+
LoggerProxy.logger.info(
|
|
690
|
+
`StatsAnalyzer:index#compareLastStatsResult --> No ${mediaType} frames received`
|
|
691
|
+
);
|
|
581
692
|
}
|
|
582
693
|
|
|
583
|
-
if (
|
|
584
|
-
|
|
694
|
+
if (
|
|
695
|
+
this.statsResults[mediaType].recv.framesDecoded ===
|
|
696
|
+
this.lastStatsResults[mediaType].recv.framesDecoded ||
|
|
697
|
+
this.statsResults.resolutions[mediaType].send.framesDecoded === 0
|
|
698
|
+
) {
|
|
699
|
+
LoggerProxy.logger.info(
|
|
700
|
+
`StatsAnalyzer:index#compareLastStatsResult --> No ${mediaType} frames decoded`
|
|
701
|
+
);
|
|
585
702
|
}
|
|
586
703
|
|
|
587
|
-
if (
|
|
588
|
-
|
|
704
|
+
if (
|
|
705
|
+
this.statsResults.resolutions[mediaType].recv.framesDropped -
|
|
706
|
+
this.lastStatsResults.resolutions[mediaType].recv.framesDropped >
|
|
707
|
+
10
|
|
708
|
+
) {
|
|
709
|
+
LoggerProxy.logger.info(
|
|
710
|
+
`StatsAnalyzer:index#compareLastStatsResult --> ${mediaType} frames are getting dropped`
|
|
711
|
+
);
|
|
589
712
|
}
|
|
590
713
|
}
|
|
591
714
|
|
|
@@ -599,21 +722,36 @@ export class StatsAnalyzer extends EventsScope {
|
|
|
599
722
|
|
|
600
723
|
mediaType = STATS.SHARE_CORRELATE;
|
|
601
724
|
if (this.meetingMediaStatus.expected.sendShare) {
|
|
602
|
-
|
|
725
|
+
// compare share stats sent
|
|
603
726
|
|
|
604
727
|
currentStats = this.statsResults[mediaType].send;
|
|
605
728
|
previousStats = this.lastStatsResults[mediaType].send;
|
|
606
729
|
|
|
607
|
-
if (
|
|
608
|
-
|
|
609
|
-
|
|
610
|
-
|
|
611
|
-
|
|
612
|
-
|
|
730
|
+
if (
|
|
731
|
+
currentStats.totalPacketsSent === previousStats.totalPacketsSent ||
|
|
732
|
+
currentStats.totalPacketsSent === 0
|
|
733
|
+
) {
|
|
734
|
+
LoggerProxy.logger.info(
|
|
735
|
+
`StatsAnalyzer:index#compareLastStatsResult --> No ${mediaType} RTP packets sent`
|
|
736
|
+
);
|
|
737
|
+
} else {
|
|
738
|
+
if (
|
|
739
|
+
currentStats.framesEncoded === previousStats.framesEncoded ||
|
|
740
|
+
currentStats.framesEncoded === 0
|
|
741
|
+
) {
|
|
742
|
+
LoggerProxy.logger.info(
|
|
743
|
+
`StatsAnalyzer:index#compareLastStatsResult --> No ${mediaType} frames getting encoded`
|
|
744
|
+
);
|
|
613
745
|
}
|
|
614
746
|
|
|
615
|
-
if (
|
|
616
|
-
|
|
747
|
+
if (
|
|
748
|
+
this.statsResults.resolutions[mediaType].send.framesSent ===
|
|
749
|
+
this.lastStatsResults.resolutions[mediaType].send.framesSent ||
|
|
750
|
+
this.statsResults.resolutions[mediaType].send.framesSent === 0
|
|
751
|
+
) {
|
|
752
|
+
LoggerProxy.logger.info(
|
|
753
|
+
`StatsAnalyzer:index#compareLastStatsResult --> No ${mediaType} frames sent`
|
|
754
|
+
);
|
|
617
755
|
}
|
|
618
756
|
}
|
|
619
757
|
|
|
@@ -622,20 +760,42 @@ export class StatsAnalyzer extends EventsScope {
|
|
|
622
760
|
currentStats = this.statsResults[mediaType].recv;
|
|
623
761
|
previousStats = this.lastStatsResults[mediaType].recv;
|
|
624
762
|
|
|
625
|
-
if (
|
|
626
|
-
|
|
627
|
-
|
|
628
|
-
|
|
629
|
-
|
|
630
|
-
|
|
763
|
+
if (
|
|
764
|
+
currentStats.totalPacketsReceived === previousStats.totalPacketsReceived ||
|
|
765
|
+
currentStats.totalPacketsSent === 0
|
|
766
|
+
) {
|
|
767
|
+
LoggerProxy.logger.info(
|
|
768
|
+
`StatsAnalyzer:index#compareLastStatsResult --> No ${mediaType} RTP packets received`
|
|
769
|
+
);
|
|
770
|
+
} else {
|
|
771
|
+
if (
|
|
772
|
+
this.statsResults.resolutions[mediaType].recv.framesReceived ===
|
|
773
|
+
this.lastStatsResults.resolutions[mediaType].recv.framesReceived ||
|
|
774
|
+
this.statsResults.resolutions[mediaType].recv.framesReceived === 0
|
|
775
|
+
) {
|
|
776
|
+
LoggerProxy.logger.info(
|
|
777
|
+
`StatsAnalyzer:index#compareLastStatsResult --> No ${mediaType} frames received`
|
|
778
|
+
);
|
|
631
779
|
}
|
|
632
780
|
|
|
633
|
-
if (
|
|
634
|
-
|
|
781
|
+
if (
|
|
782
|
+
this.statsResults[mediaType].recv.framesDecoded ===
|
|
783
|
+
this.lastStatsResults[mediaType].recv.framesDecoded ||
|
|
784
|
+
this.statsResults.resolutions[mediaType].send.framesDecoded === 0
|
|
785
|
+
) {
|
|
786
|
+
LoggerProxy.logger.info(
|
|
787
|
+
`StatsAnalyzer:index#compareLastStatsResult --> No ${mediaType} frames decoded`
|
|
788
|
+
);
|
|
635
789
|
}
|
|
636
790
|
|
|
637
|
-
if (
|
|
638
|
-
|
|
791
|
+
if (
|
|
792
|
+
this.statsResults.resolutions[mediaType].recv.framesDropped -
|
|
793
|
+
this.lastStatsResults.resolutions[mediaType].recv.framesDropped >
|
|
794
|
+
10
|
|
795
|
+
) {
|
|
796
|
+
LoggerProxy.logger.info(
|
|
797
|
+
`StatsAnalyzer:index#compareLastStatsResult --> ${mediaType} frames are getting dropped`
|
|
798
|
+
);
|
|
639
799
|
}
|
|
640
800
|
}
|
|
641
801
|
|
|
@@ -658,8 +818,13 @@ export class StatsAnalyzer extends EventsScope {
|
|
|
658
818
|
return Promise.resolve();
|
|
659
819
|
}
|
|
660
820
|
|
|
661
|
-
if (
|
|
662
|
-
|
|
821
|
+
if (
|
|
822
|
+
this.mediaConnection &&
|
|
823
|
+
this.mediaConnection.getConnectionState() === MC.ConnectionState.Failed
|
|
824
|
+
) {
|
|
825
|
+
LoggerProxy.logger.trace(
|
|
826
|
+
'StatsAnalyzer:index#getStatsAndParse --> media connection is in failed state'
|
|
827
|
+
);
|
|
663
828
|
|
|
664
829
|
return Promise.resolve();
|
|
665
830
|
}
|
|
@@ -667,20 +832,47 @@ export class StatsAnalyzer extends EventsScope {
|
|
|
667
832
|
LoggerProxy.logger.trace('StatsAnalyzer:index#getStatsAndParse --> Collecting Stats');
|
|
668
833
|
|
|
669
834
|
return this.mediaConnection.getTransceiverStats().then((transceiverStats) => {
|
|
670
|
-
this.filterAndParseGetStatsResults(
|
|
671
|
-
|
|
672
|
-
|
|
673
|
-
|
|
674
|
-
|
|
675
|
-
this.filterAndParseGetStatsResults(
|
|
835
|
+
this.filterAndParseGetStatsResults(
|
|
836
|
+
transceiverStats.video.sender,
|
|
837
|
+
STATS.VIDEO_CORRELATE,
|
|
838
|
+
true
|
|
839
|
+
);
|
|
840
|
+
this.filterAndParseGetStatsResults(
|
|
841
|
+
transceiverStats.video.receiver,
|
|
842
|
+
STATS.VIDEO_CORRELATE,
|
|
843
|
+
false
|
|
844
|
+
);
|
|
845
|
+
this.filterAndParseGetStatsResults(
|
|
846
|
+
transceiverStats.audio.sender,
|
|
847
|
+
STATS.AUDIO_CORRELATE,
|
|
848
|
+
true
|
|
849
|
+
);
|
|
850
|
+
this.filterAndParseGetStatsResults(
|
|
851
|
+
transceiverStats.audio.receiver,
|
|
852
|
+
STATS.AUDIO_CORRELATE,
|
|
853
|
+
false
|
|
854
|
+
);
|
|
855
|
+
this.filterAndParseGetStatsResults(
|
|
856
|
+
transceiverStats.screenShareVideo.sender,
|
|
857
|
+
STATS.SHARE_CORRELATE,
|
|
858
|
+
true
|
|
859
|
+
);
|
|
860
|
+
this.filterAndParseGetStatsResults(
|
|
861
|
+
transceiverStats.screenShareVideo.receiver,
|
|
862
|
+
STATS.SHARE_CORRELATE,
|
|
863
|
+
false
|
|
864
|
+
);
|
|
676
865
|
|
|
677
866
|
// updates the current direction of media
|
|
678
867
|
this.statsResults[STATS.AUDIO_CORRELATE].direction = transceiverStats.audio.currentDirection;
|
|
679
868
|
this.statsResults[STATS.VIDEO_CORRELATE].direction = transceiverStats.video.currentDirection;
|
|
680
|
-
this.statsResults[STATS.SHARE_CORRELATE].direction =
|
|
869
|
+
this.statsResults[STATS.SHARE_CORRELATE].direction =
|
|
870
|
+
transceiverStats.screenShareVideo.currentDirection;
|
|
681
871
|
|
|
682
|
-
this.statsResults[STATS.AUDIO_CORRELATE][STATS.SEND_DIRECTION].trackLabel =
|
|
683
|
-
|
|
872
|
+
this.statsResults[STATS.AUDIO_CORRELATE][STATS.SEND_DIRECTION].trackLabel =
|
|
873
|
+
transceiverStats.audio.localTrackLabel;
|
|
874
|
+
this.statsResults[STATS.VIDEO_CORRELATE][STATS.SEND_DIRECTION].trackLabel =
|
|
875
|
+
transceiverStats.video.localTrackLabel;
|
|
684
876
|
|
|
685
877
|
this.compareLastStatsResult();
|
|
686
878
|
|
|
@@ -688,7 +880,9 @@ export class StatsAnalyzer extends EventsScope {
|
|
|
688
880
|
// DO Deep copy, for some reason it takes the reference all the time rather then old value set
|
|
689
881
|
this.lastStatsResults = JSON.parse(JSON.stringify(this.statsResults));
|
|
690
882
|
|
|
691
|
-
LoggerProxy.logger.trace(
|
|
883
|
+
LoggerProxy.logger.trace(
|
|
884
|
+
'StatsAnalyzer:index#getStatsAndParse --> Finished Collecting Stats'
|
|
885
|
+
);
|
|
692
886
|
});
|
|
693
887
|
}
|
|
694
888
|
|
|
@@ -713,10 +907,12 @@ export class StatsAnalyzer extends EventsScope {
|
|
|
713
907
|
this.statsResults.internal[mediaType][sendrecvType].framesEncoded = result.framesEncoded;
|
|
714
908
|
}
|
|
715
909
|
if (!this.statsResults.internal[mediaType][sendrecvType].keyFramesEncoded) {
|
|
716
|
-
this.statsResults.internal[mediaType][sendrecvType].keyFramesEncoded =
|
|
910
|
+
this.statsResults.internal[mediaType][sendrecvType].keyFramesEncoded =
|
|
911
|
+
result.keyFramesEncoded;
|
|
717
912
|
}
|
|
718
913
|
|
|
719
|
-
const bytes =
|
|
914
|
+
const bytes =
|
|
915
|
+
result.bytesSent - this.statsResults.internal[mediaType][sendrecvType].prevBytesSent;
|
|
720
916
|
|
|
721
917
|
this.statsResults.internal[mediaType][sendrecvType].prevBytesSent = result.bytesSent;
|
|
722
918
|
|
|
@@ -725,15 +921,19 @@ export class StatsAnalyzer extends EventsScope {
|
|
|
725
921
|
this.statsResults[mediaType][sendrecvType].availableBandwidth = kilobytes.toFixed(1);
|
|
726
922
|
this.statsResults[mediaType].bytesSent = kilobytes;
|
|
727
923
|
|
|
728
|
-
this.statsResults[mediaType][sendrecvType].framesEncoded =
|
|
729
|
-
|
|
924
|
+
this.statsResults[mediaType][sendrecvType].framesEncoded =
|
|
925
|
+
result.framesEncoded - this.statsResults.internal[mediaType][sendrecvType].framesEncoded;
|
|
926
|
+
this.statsResults[mediaType][sendrecvType].keyFramesEncoded =
|
|
927
|
+
result.keyFramesEncoded -
|
|
928
|
+
this.statsResults.internal[mediaType][sendrecvType].keyFramesEncoded;
|
|
730
929
|
this.statsResults.internal[mediaType].outboundRtpId = result.id;
|
|
731
930
|
|
|
732
931
|
if (!this.statsResults.internal[mediaType][sendrecvType].packetsSent) {
|
|
733
932
|
this.statsResults.internal[mediaType][sendrecvType].packetsSent = result.packetsSent;
|
|
734
933
|
}
|
|
735
934
|
|
|
736
|
-
this.statsResults[mediaType][sendrecvType].packetsSent =
|
|
935
|
+
this.statsResults[mediaType][sendrecvType].packetsSent =
|
|
936
|
+
result.packetsSent - this.statsResults.internal[mediaType][sendrecvType].packetsSent;
|
|
737
937
|
this.statsResults.internal[mediaType][sendrecvType].packetsSent = result.packetsSent;
|
|
738
938
|
|
|
739
939
|
// Data saved to send MQA metrics
|
|
@@ -745,17 +945,21 @@ export class StatsAnalyzer extends EventsScope {
|
|
|
745
945
|
this.statsResults[mediaType][sendrecvType].totalFirCount = result.firCount;
|
|
746
946
|
this.statsResults[mediaType][sendrecvType].framesSent = result.framesSent;
|
|
747
947
|
this.statsResults[mediaType][sendrecvType].framesEncoded = result.framesEncoded;
|
|
748
|
-
this.statsResults[mediaType][sendrecvType].encoderImplementation =
|
|
749
|
-
|
|
750
|
-
this.statsResults[mediaType][sendrecvType].
|
|
751
|
-
|
|
948
|
+
this.statsResults[mediaType][sendrecvType].encoderImplementation =
|
|
949
|
+
result.encoderImplementation;
|
|
950
|
+
this.statsResults[mediaType][sendrecvType].qualityLimitationReason =
|
|
951
|
+
result.qualityLimitationReason;
|
|
952
|
+
this.statsResults[mediaType][sendrecvType].qualityLimitationResolutionChanges =
|
|
953
|
+
result.qualityLimitationResolutionChanges;
|
|
954
|
+
this.statsResults[mediaType][sendrecvType].retransmittedPacketsSent =
|
|
955
|
+
result.retransmittedPacketsSent;
|
|
752
956
|
this.statsResults[mediaType][sendrecvType].totalBytesSent = result.bytesSent;
|
|
753
957
|
this.statsResults[mediaType][sendrecvType].headerBytesSent = result.headerBytesSent;
|
|
754
|
-
this.statsResults[mediaType][sendrecvType].retransmittedBytesSent =
|
|
958
|
+
this.statsResults[mediaType][sendrecvType].retransmittedBytesSent =
|
|
959
|
+
result.retransmittedBytesSent;
|
|
755
960
|
}
|
|
756
961
|
}
|
|
757
962
|
|
|
758
|
-
|
|
759
963
|
/**
|
|
760
964
|
* Processes InboundRTP stats result and stores
|
|
761
965
|
* @private
|
|
@@ -771,7 +975,8 @@ export class StatsAnalyzer extends EventsScope {
|
|
|
771
975
|
let kilobytes = 0;
|
|
772
976
|
|
|
773
977
|
if (!this.statsResults.internal[mediaType][sendrecvType].prevBytesReceived) {
|
|
774
|
-
this.statsResults.internal[mediaType][sendrecvType].prevBytesReceived =
|
|
978
|
+
this.statsResults.internal[mediaType][sendrecvType].prevBytesReceived =
|
|
979
|
+
result.bytesReceived;
|
|
775
980
|
}
|
|
776
981
|
|
|
777
982
|
if (!this.statsResults.internal[mediaType][sendrecvType].pliCount) {
|
|
@@ -783,14 +988,18 @@ export class StatsAnalyzer extends EventsScope {
|
|
|
783
988
|
}
|
|
784
989
|
|
|
785
990
|
if (!this.statsResults.internal[mediaType][sendrecvType].totalPacketsReceived) {
|
|
786
|
-
this.statsResults.internal[mediaType][sendrecvType].totalPacketsReceived =
|
|
991
|
+
this.statsResults.internal[mediaType][sendrecvType].totalPacketsReceived =
|
|
992
|
+
result.packetsReceived;
|
|
787
993
|
}
|
|
788
994
|
|
|
789
995
|
if (!this.statsResults.internal[mediaType][sendrecvType].lastPacketReceivedTimestamp) {
|
|
790
|
-
this.statsResults.internal[mediaType][sendrecvType].lastPacketReceivedTimestamp =
|
|
996
|
+
this.statsResults.internal[mediaType][sendrecvType].lastPacketReceivedTimestamp =
|
|
997
|
+
result.lastPacketReceivedTimestamp;
|
|
791
998
|
}
|
|
792
999
|
|
|
793
|
-
const bytes =
|
|
1000
|
+
const bytes =
|
|
1001
|
+
result.bytesReceived -
|
|
1002
|
+
this.statsResults.internal[mediaType][sendrecvType].prevBytesReceived;
|
|
794
1003
|
|
|
795
1004
|
this.statsResults.internal[mediaType][sendrecvType].prevBytesReceived = result.bytesReceived;
|
|
796
1005
|
|
|
@@ -798,35 +1007,52 @@ export class StatsAnalyzer extends EventsScope {
|
|
|
798
1007
|
this.statsResults[mediaType][sendrecvType].availableBandwidth = kilobytes.toFixed(1);
|
|
799
1008
|
this.statsResults[mediaType].bytesReceived = kilobytes.toFixed(1);
|
|
800
1009
|
|
|
801
|
-
this.statsResults[mediaType][sendrecvType].pliCount =
|
|
802
|
-
|
|
1010
|
+
this.statsResults[mediaType][sendrecvType].pliCount =
|
|
1011
|
+
result.pliCount - this.statsResults.internal[mediaType][sendrecvType].pliCount;
|
|
1012
|
+
this.statsResults[mediaType][sendrecvType].currentPacketsLost =
|
|
1013
|
+
result.packetsLost - this.statsResults.internal[mediaType][sendrecvType].packetsLost;
|
|
803
1014
|
if (this.statsResults[mediaType][sendrecvType].currentPacketsLost < 0) {
|
|
804
1015
|
this.statsResults[mediaType][sendrecvType].currentPacketsLost = 0;
|
|
805
1016
|
}
|
|
806
1017
|
|
|
807
|
-
this.statsResults[mediaType][sendrecvType].packetsReceived =
|
|
808
|
-
|
|
1018
|
+
this.statsResults[mediaType][sendrecvType].packetsReceived =
|
|
1019
|
+
result.packetsReceived -
|
|
1020
|
+
this.statsResults.internal[mediaType][sendrecvType].totalPacketsReceived;
|
|
1021
|
+
this.statsResults.internal[mediaType][sendrecvType].totalPacketsReceived =
|
|
1022
|
+
result.packetsReceived;
|
|
809
1023
|
|
|
810
1024
|
if (this.statsResults[mediaType][sendrecvType].packetsReceived === 0) {
|
|
811
|
-
LoggerProxy.logger.info(
|
|
1025
|
+
LoggerProxy.logger.info(
|
|
1026
|
+
`StatsAnalyzer:index#processInboundRTPResult --> No packets received for ${mediaType} `,
|
|
1027
|
+
this.statsResults[mediaType][sendrecvType].packetsReceived
|
|
1028
|
+
);
|
|
812
1029
|
}
|
|
813
1030
|
|
|
814
1031
|
// Check the over all packet Lost ratio
|
|
815
|
-
this.statsResults[mediaType][sendrecvType].currentPacketLossRatio =
|
|
1032
|
+
this.statsResults[mediaType][sendrecvType].currentPacketLossRatio =
|
|
1033
|
+
this.statsResults[mediaType][sendrecvType].currentPacketsLost > 0
|
|
1034
|
+
? this.statsResults[mediaType][sendrecvType].currentPacketsLost /
|
|
1035
|
+
(this.statsResults[mediaType][sendrecvType].packetsReceived +
|
|
1036
|
+
this.statsResults[mediaType][sendrecvType].currentPacketsLost)
|
|
1037
|
+
: 0;
|
|
816
1038
|
if (this.statsResults[mediaType][sendrecvType].currentPacketLossRatio > 3) {
|
|
817
|
-
LoggerProxy.logger.info(
|
|
1039
|
+
LoggerProxy.logger.info(
|
|
1040
|
+
'StatsAnalyzer:index#processInboundRTPResult --> Packets getting lost from the receiver ',
|
|
1041
|
+
this.statsResults[mediaType][sendrecvType].currentPacketLossRatio
|
|
1042
|
+
);
|
|
818
1043
|
}
|
|
819
1044
|
|
|
820
1045
|
// TODO: check the packet loss value is negative values here
|
|
821
1046
|
|
|
822
1047
|
if (result.packetsLost) {
|
|
823
|
-
this.statsResults[mediaType][sendrecvType].totalPacketsLost =
|
|
824
|
-
|
|
825
|
-
else {
|
|
1048
|
+
this.statsResults[mediaType][sendrecvType].totalPacketsLost =
|
|
1049
|
+
result.packetsLost > 0 ? result.packetsLost : -result.packetsLost;
|
|
1050
|
+
} else {
|
|
826
1051
|
this.statsResults[mediaType][sendrecvType].totalPacketsLost = 0;
|
|
827
1052
|
}
|
|
828
1053
|
|
|
829
|
-
this.statsResults[mediaType][sendrecvType].lastPacketReceivedTimestamp =
|
|
1054
|
+
this.statsResults[mediaType][sendrecvType].lastPacketReceivedTimestamp =
|
|
1055
|
+
result.lastPacketReceivedTimestamp;
|
|
830
1056
|
|
|
831
1057
|
// From Thin
|
|
832
1058
|
this.statsResults[mediaType][sendrecvType].totalNackCount = result.nackCount;
|
|
@@ -834,10 +1060,10 @@ export class StatsAnalyzer extends EventsScope {
|
|
|
834
1060
|
this.statsResults[mediaType][sendrecvType].framesDecoded = result.framesDecoded;
|
|
835
1061
|
this.statsResults[mediaType][sendrecvType].keyFramesDecoded = result.keyFramesDecoded;
|
|
836
1062
|
|
|
837
|
-
this.statsResults[mediaType][sendrecvType].decoderImplementation =
|
|
1063
|
+
this.statsResults[mediaType][sendrecvType].decoderImplementation =
|
|
1064
|
+
result.decoderImplementation;
|
|
838
1065
|
this.statsResults[mediaType][sendrecvType].totalPacketsReceived = result.packetsReceived;
|
|
839
1066
|
|
|
840
|
-
|
|
841
1067
|
this.statsResults[mediaType][sendrecvType].fecPacketsDiscarded = result.fecPacketsDiscarded;
|
|
842
1068
|
this.statsResults[mediaType][sendrecvType].fecPacketsReceived = result.fecPacketsReceived;
|
|
843
1069
|
this.statsResults[mediaType][sendrecvType].totalBytesReceived = result.bytesReceived;
|
|
@@ -849,8 +1075,10 @@ export class StatsAnalyzer extends EventsScope {
|
|
|
849
1075
|
|
|
850
1076
|
this.statsResults[mediaType][sendrecvType].audioLevel = result.audioLevel;
|
|
851
1077
|
this.statsResults[mediaType][sendrecvType].totalAudioEnergy = result.totalAudioEnergy;
|
|
852
|
-
this.statsResults[mediaType][sendrecvType].totalSamplesReceived =
|
|
853
|
-
|
|
1078
|
+
this.statsResults[mediaType][sendrecvType].totalSamplesReceived =
|
|
1079
|
+
result.totalSamplesReceived || 0;
|
|
1080
|
+
this.statsResults[mediaType][sendrecvType].totalSamplesDecoded =
|
|
1081
|
+
result.totalSamplesDecoded || 0;
|
|
854
1082
|
this.statsResults[mediaType][sendrecvType].concealedSamples = result.concealedSamples || 0;
|
|
855
1083
|
}
|
|
856
1084
|
}
|
|
@@ -894,7 +1122,10 @@ export class StatsAnalyzer extends EventsScope {
|
|
|
894
1122
|
RemoteNetworkType[result.id] = [];
|
|
895
1123
|
}
|
|
896
1124
|
|
|
897
|
-
if (
|
|
1125
|
+
if (
|
|
1126
|
+
result.candidateType &&
|
|
1127
|
+
RemoteCandidateType[result.id].indexOf(result.candidateType) === -1
|
|
1128
|
+
) {
|
|
898
1129
|
RemoteCandidateType[result.id].push(result.candidateType);
|
|
899
1130
|
}
|
|
900
1131
|
|
|
@@ -902,7 +1133,10 @@ export class StatsAnalyzer extends EventsScope {
|
|
|
902
1133
|
RemoteTransport[result.id].push(result.protocol.toUpperCase());
|
|
903
1134
|
}
|
|
904
1135
|
|
|
905
|
-
if (
|
|
1136
|
+
if (
|
|
1137
|
+
result.ip &&
|
|
1138
|
+
RemoteIpAddress[result.id].indexOf(`${result.ip}:${result.portNumber}`) === -1
|
|
1139
|
+
) {
|
|
906
1140
|
RemoteIpAddress[result.id].push(`${result.ip}`); // TODO: Add ports
|
|
907
1141
|
}
|
|
908
1142
|
|
|
@@ -919,13 +1153,16 @@ export class StatsAnalyzer extends EventsScope {
|
|
|
919
1153
|
transport: RemoteTransport[result.id],
|
|
920
1154
|
timestamp: result.time,
|
|
921
1155
|
id: result.id,
|
|
922
|
-
type: result.type
|
|
1156
|
+
type: result.type,
|
|
923
1157
|
};
|
|
924
1158
|
|
|
925
1159
|
this.statsResults.connectionType[ipType].candidateType = RemoteCandidateType[result.id];
|
|
926
1160
|
this.statsResults.connectionType[ipType].ipAddress = RemoteIpAddress[result.id];
|
|
927
1161
|
|
|
928
|
-
this.statsResults.connectionType[ipType].networkType =
|
|
1162
|
+
this.statsResults.connectionType[ipType].networkType =
|
|
1163
|
+
RemoteNetworkType[result.id][0] === NETWORK_TYPE.VPN
|
|
1164
|
+
? NETWORK_TYPE.UNKNOWN
|
|
1165
|
+
: RemoteNetworkType[result.id][0];
|
|
929
1166
|
this.statsResults.connectionType[ipType].transport = RemoteTransport[result.id];
|
|
930
1167
|
|
|
931
1168
|
this.statsResults[type][sendRecvType].totalRoundTripTime = result.totalRoundTripTime;
|
|
@@ -946,7 +1183,8 @@ export class StatsAnalyzer extends EventsScope {
|
|
|
946
1183
|
}
|
|
947
1184
|
if (result.type !== 'track') return;
|
|
948
1185
|
|
|
949
|
-
const sendrecvType =
|
|
1186
|
+
const sendrecvType =
|
|
1187
|
+
result.remoteSource === true ? STATS.RECEIVE_DIRECTION : STATS.SEND_DIRECTION;
|
|
950
1188
|
|
|
951
1189
|
if (result.frameWidth && result.frameHeight) {
|
|
952
1190
|
this.statsResults.resolutions[mediaType][sendrecvType].width = result.frameWidth;
|
|
@@ -961,18 +1199,21 @@ export class StatsAnalyzer extends EventsScope {
|
|
|
961
1199
|
this.statsResults.resolutions[mediaType][sendrecvType].framesDropped = result.framesDropped;
|
|
962
1200
|
}
|
|
963
1201
|
|
|
964
|
-
|
|
965
1202
|
if (result.trackIdentifier && mediaType !== STATS.AUDIO_CORRELATE) {
|
|
966
|
-
this.statsResults.resolutions[mediaType][sendrecvType].trackIdentifier =
|
|
1203
|
+
this.statsResults.resolutions[mediaType][sendrecvType].trackIdentifier =
|
|
1204
|
+
result.trackIdentifier;
|
|
967
1205
|
|
|
968
1206
|
const jitterBufferDelay = result && result.jitterBufferDelay;
|
|
969
1207
|
const jitterBufferEmittedCount = result && result.jitterBufferEmittedCount;
|
|
970
1208
|
|
|
971
|
-
this.statsResults.resolutions[mediaType][sendrecvType].avgJitterDelay =
|
|
1209
|
+
this.statsResults.resolutions[mediaType][sendrecvType].avgJitterDelay =
|
|
1210
|
+
jitterBufferEmittedCount && +jitterBufferDelay / +jitterBufferEmittedCount;
|
|
972
1211
|
|
|
973
1212
|
// Used to calculate the jitter
|
|
974
|
-
this.statsResults.resolutions[mediaType][sendrecvType].jitterBufferDelay =
|
|
975
|
-
|
|
1213
|
+
this.statsResults.resolutions[mediaType][sendrecvType].jitterBufferDelay =
|
|
1214
|
+
result.jitterBufferDelay;
|
|
1215
|
+
this.statsResults.resolutions[mediaType][sendrecvType].jitterBufferEmittedCount =
|
|
1216
|
+
result.jitterBufferEmittedCount;
|
|
976
1217
|
}
|
|
977
1218
|
}
|
|
978
1219
|
|
|
@@ -991,9 +1232,12 @@ export class StatsAnalyzer extends EventsScope {
|
|
|
991
1232
|
|
|
992
1233
|
const mediaType = type;
|
|
993
1234
|
|
|
994
|
-
if (!this.statsResults.internal[mediaType].send.totalPacketsLostOnReceiver) {
|
|
1235
|
+
if (!this.statsResults.internal[mediaType].send.totalPacketsLostOnReceiver) {
|
|
1236
|
+
this.statsResults.internal[mediaType].send.totalPacketsLostOnReceiver = result.packetsLost;
|
|
1237
|
+
}
|
|
995
1238
|
|
|
996
|
-
const currentPacketLoss =
|
|
1239
|
+
const currentPacketLoss =
|
|
1240
|
+
result.packetsLost - this.statsResults.internal[mediaType].send.totalPacketsLostOnReceiver;
|
|
997
1241
|
|
|
998
1242
|
this.statsResults.internal[mediaType].send.totalPacketsLostOnReceiver = result.packetsLost;
|
|
999
1243
|
this.statsResults[mediaType].send.packetsLostOnReceiver = currentPacketLoss;
|
|
@@ -1007,18 +1251,31 @@ export class StatsAnalyzer extends EventsScope {
|
|
|
1007
1251
|
this.statsResults[mediaType].send.reportsReceived = result.reportsReceived;
|
|
1008
1252
|
|
|
1009
1253
|
// Total packloss ratio on this video section of the call
|
|
1010
|
-
this.statsResults[mediaType].send.overAllPacketLossRatio =
|
|
1011
|
-
|
|
1012
|
-
|
|
1013
|
-
|
|
1014
|
-
|
|
1254
|
+
this.statsResults[mediaType].send.overAllPacketLossRatio =
|
|
1255
|
+
this.statsResults[mediaType].send.totalPacketsLostOnReceiver > 0
|
|
1256
|
+
? this.statsResults[mediaType].send.totalPacketsLostOnReceiver /
|
|
1257
|
+
this.statsResults[mediaType].send.totalPacketsSent
|
|
1258
|
+
: 0;
|
|
1259
|
+
this.statsResults[mediaType].send.currentPacketLossRatio =
|
|
1260
|
+
this.statsResults[mediaType].send.packetsLostOnReceiver > 0
|
|
1261
|
+
? (this.statsResults[mediaType].send.packetsLostOnReceiver * 100) /
|
|
1262
|
+
(this.statsResults[mediaType].send.packetsSent +
|
|
1263
|
+
this.statsResults[mediaType].send.packetsLostOnReceiver)
|
|
1264
|
+
: 0;
|
|
1265
|
+
|
|
1266
|
+
if (
|
|
1267
|
+
this.statsResults[mediaType].send.maxPacketLossRatio <
|
|
1268
|
+
this.statsResults[mediaType].send.currentPacketLossRatio
|
|
1269
|
+
) {
|
|
1270
|
+
this.statsResults[mediaType].send.maxPacketLossRatio =
|
|
1271
|
+
this.statsResults[mediaType].send.currentPacketLossRatio;
|
|
1015
1272
|
}
|
|
1016
1273
|
|
|
1017
1274
|
if (result.type === 'remote-inbound-rtp') {
|
|
1018
1275
|
this.networkQualityMonitor.determineUplinkNetworkQuality({
|
|
1019
1276
|
mediaType,
|
|
1020
1277
|
remoteRtpResults: result,
|
|
1021
|
-
statsAnalyzerCurrentStats: this.statsResults
|
|
1278
|
+
statsAnalyzerCurrentStats: this.statsResults,
|
|
1022
1279
|
});
|
|
1023
1280
|
}
|
|
1024
1281
|
}
|