@webex/internal-media-core 2.18.4 → 2.19.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/cjs/index.js +190 -112
- package/dist/esm/index.js +190 -113
- package/dist/types/MediaConnection/roap.typegen.d.ts +1 -2
- package/dist/types/MediaConnection/roap.typegen.d.ts.map +1 -1
- package/dist/types/StatsAnalyzer/StatsAnalyzer.d.ts +4 -1
- package/dist/types/StatsAnalyzer/StatsAnalyzer.d.ts.map +1 -1
- package/dist/types/StatsAnalyzer/StatsMonitor.d.ts +13 -0
- package/dist/types/StatsAnalyzer/StatsMonitor.d.ts.map +1 -0
- package/dist/types/StatsAnalyzer/StatsMonitor.test.d.ts +2 -0
- package/dist/types/StatsAnalyzer/StatsMonitor.test.d.ts.map +1 -0
- package/dist/types/StatsAnalyzer/eventTypes.d.ts +13 -0
- package/dist/types/StatsAnalyzer/eventTypes.d.ts.map +1 -1
- package/dist/types/StatsAnalyzer/index.d.ts +1 -0
- package/dist/types/StatsAnalyzer/index.d.ts.map +1 -1
- package/package.json +2 -2
package/dist/cjs/index.js
CHANGED
|
@@ -3427,7 +3427,7 @@ if(context.level===Logger.WARN&&console.warn){hdlr=console.warn;}else if(context
|
|
|
3427
3427
|
// `options` hash can be used to configure the default logLevel and provide a custom message formatter.
|
|
3428
3428
|
Logger.useDefaults=function(options){Logger.setLevel(options&&options.defaultLevel||Logger.DEBUG);Logger.setHandler(Logger.createDefaultHandler(options));};// Createa an alias to useDefaults to avoid reaking a react-hooks rule.
|
|
3429
3429
|
Logger.setDefaults=Logger.useDefaults;// Export to popular environments boilerplate.
|
|
3430
|
-
if(module.exports){module.exports=Logger;}else {Logger._prevLogger=global.Logger;Logger.noConflict=function(){global.Logger=Logger._prevLogger;return Logger;};global.Logger=Logger;}})(commonjsGlobal$1);})(logger$1);var Logger=logger$1.exports;var DEFAULT_LOGGER_NAME='web-client-media-engine';var logger=Logger.get(DEFAULT_LOGGER_NAME);logger.setLevel(Logger.DEBUG);function logErrorAndThrow(errorType,message){logger.error(message);throw new WcmeError(errorType,message);}function setLogHandler(logHandler){Logger.setHandler(logHandler);Logger$1.setHandler(logHandler);Logger$2.setHandler(logHandler);}var MediaCodecMimeType;(function(MediaCodecMimeType){MediaCodecMimeType["H264"]="video/H264";MediaCodecMimeType["AV1"]="video/AV1";MediaCodecMimeType["OPUS"]="audio/opus";})(MediaCodecMimeType||(MediaCodecMimeType={}));var defaultMaxVideoEncodeFrameSize=8160;var defaultMaxVideoEncodeMbps=244800;var defaultStartBitrateKbps=3000;exports.RecommendedOpusBitrates = void 0;(function(RecommendedOpusBitrates){RecommendedOpusBitrates[RecommendedOpusBitrates["NB"]=12000]="NB";RecommendedOpusBitrates[RecommendedOpusBitrates["WB"]=20000]="WB";RecommendedOpusBitrates[RecommendedOpusBitrates["FB"]=40000]="FB";RecommendedOpusBitrates[RecommendedOpusBitrates["FB_MONO_MUSIC"]=64000]="FB_MONO_MUSIC";RecommendedOpusBitrates[RecommendedOpusBitrates["FB_STEREO_MUSIC"]=128000]="FB_STEREO_MUSIC";})(exports.RecommendedOpusBitrates||(exports.RecommendedOpusBitrates={}));var maxFrameSizeToMaxBitrateMap=new Map([[60,99000],[240,199000],[576,300000],[920,640000],[1296,720000],[
|
|
3430
|
+
if(module.exports){module.exports=Logger;}else {Logger._prevLogger=global.Logger;Logger.noConflict=function(){global.Logger=Logger._prevLogger;return Logger;};global.Logger=Logger;}})(commonjsGlobal$1);})(logger$1);var Logger=logger$1.exports;var DEFAULT_LOGGER_NAME='web-client-media-engine';var logger=Logger.get(DEFAULT_LOGGER_NAME);logger.setLevel(Logger.DEBUG);function logErrorAndThrow(errorType,message){logger.error(message);throw new WcmeError(errorType,message);}function setLogHandler(logHandler){Logger.setHandler(logHandler);Logger$1.setHandler(logHandler);Logger$2.setHandler(logHandler);}var MediaCodecMimeType;(function(MediaCodecMimeType){MediaCodecMimeType["H264"]="video/H264";MediaCodecMimeType["AV1"]="video/AV1";MediaCodecMimeType["OPUS"]="audio/opus";})(MediaCodecMimeType||(MediaCodecMimeType={}));var defaultMaxVideoEncodeFrameSize=8160;var defaultMaxVideoEncodeMbps=244800;var defaultStartBitrateKbps=3000;exports.RecommendedOpusBitrates = void 0;(function(RecommendedOpusBitrates){RecommendedOpusBitrates[RecommendedOpusBitrates["NB"]=12000]="NB";RecommendedOpusBitrates[RecommendedOpusBitrates["WB"]=20000]="WB";RecommendedOpusBitrates[RecommendedOpusBitrates["FB"]=40000]="FB";RecommendedOpusBitrates[RecommendedOpusBitrates["FB_MONO_MUSIC"]=64000]="FB_MONO_MUSIC";RecommendedOpusBitrates[RecommendedOpusBitrates["FB_STEREO_MUSIC"]=128000]="FB_STEREO_MUSIC";})(exports.RecommendedOpusBitrates||(exports.RecommendedOpusBitrates={}));var maxFrameSizeToMaxBitrateMap=new Map([[60,99000],[240,199000],[576,300000],[920,640000],[1296,720000],[2040,880000],[3600,2500000],[8160,4000000]]);var defaultVideoMainRtxTime='300';var defaultVideoSlidesRtxTime='1000';function areProfileLevelIdsCompatible(senderProfileLevelId,receiverProfileLevelId,levelAsymmetryAllowed){var senderProfile=Number.parseInt("0x".concat(senderProfileLevelId),16);var recvProfile=Number.parseInt("0x".concat(receiverProfileLevelId),16);var senderProfileIdc=senderProfile>>16;var recvProfileIdc=recvProfile>>16;var senderProfileIop=(senderProfile&0x00ff00)>>8;var recvProfileIop=(recvProfile&0x00ff00)>>8;var senderLevelIdc=senderProfile&0x0000ff;var recvLevelIdc=recvProfile&0x0000ff;var areProfileCompatible=senderProfileIdc===recvProfileIdc&&senderProfileIop===recvProfileIop||senderProfileIdc===0x42&&recvProfileIdc===0x42&&(senderProfileIop&0x40)===(recvProfileIop&0x40);var isLevelIdcCompatible=levelAsymmetryAllowed?true:senderLevelIdc<=recvLevelIdc;return areProfileCompatible&&isLevelIdcCompatible;}function areCodecsCompatible(senderCodec,receiverCodec){return Object.keys(receiverCodec).every(key=>{if(key==='clockRate'||key==='name'){return senderCodec[key]===receiverCodec[key];}if(key==='fmtParams'){var fmtpForSender=senderCodec[key];var fmtpForReceiver=receiverCodec[key];var levelAsymmetryAllowed=[...fmtpForSender.keys()].some(senderFmtpParamKey=>{return senderFmtpParamKey==='level-asymmetry-allowed'&&fmtpForReceiver.get(senderFmtpParamKey)==='1'&&fmtpForSender.get(senderFmtpParamKey)==='1';});return [...fmtpForSender.keys()].every(senderFmtpParamKey=>{if(fmtpForReceiver.get(senderFmtpParamKey)){if(senderFmtpParamKey==='profile-level-id'){return areProfileLevelIdsCompatible(fmtpForSender.get(senderFmtpParamKey),fmtpForReceiver.get(senderFmtpParamKey),levelAsymmetryAllowed);}}if(senderFmtpParamKey==='packetization-mode'){return fmtpForSender.get(senderFmtpParamKey)===fmtpForReceiver.get(senderFmtpParamKey);}return true;});}return true;});}function gcd(a,b){return b===0?a:gcd(b,a%b);}function getFrameHeightByMaxFs(sourceAspectRatio,requestedMaxFs){var _gcd=gcd(sourceAspectRatio[0],sourceAspectRatio[1]);var minNumberRatiosForWidth=sourceAspectRatio[0]/_gcd;var minNumberRatiosForHeight=sourceAspectRatio[1]/_gcd;var macroBlockSize=16*16;var minRatioNumberByMaxFs=Math.sqrt(requestedMaxFs*macroBlockSize/(minNumberRatiosForWidth*minNumberRatiosForHeight));var roundedMinRatioNumberByMaxFs=Math.max(Math.floor(minRatioNumberByMaxFs),1.0);return roundedMinRatioNumberByMaxFs*minNumberRatiosForHeight;}function getScaleDownRatio(sourceWidth,sourceHeight,maxFs,maxWidth,maxHeight){if(!sourceWidth||!sourceHeight||!maxFs){return undefined;}var scaleDownRatio=Math.max(sourceHeight/getFrameHeightByMaxFs([sourceWidth,sourceHeight],maxFs),1.0);if(maxWidth&&maxHeight){scaleDownRatio=Math.max(sourceWidth/maxWidth,sourceHeight/maxHeight,scaleDownRatio);}return scaleDownRatio;}function getRecommendedMaxBitrateForFrameSize(requestedMaxFs){if(requestedMaxFs<60){logErrorAndThrow(exports.WcmeErrorType.GET_MAX_BITRATE_FAILED,"Requested max video frame size cannot be less than 60.");}var expectedHeight=[...maxFrameSizeToMaxBitrateMap.keys()].sort((a,b)=>b-a).find(h=>requestedMaxFs>=h);return maxFrameSizeToMaxBitrateMap.get(expectedHeight);}/******************************************************************************
|
|
3431
3431
|
Copyright (c) Microsoft Corporation.
|
|
3432
3432
|
|
|
3433
3433
|
Permission to use, copy, modify, and/or distribute this software for any
|
|
@@ -18703,6 +18703,15 @@ exports.NetworkQualityEventNames = void 0;
|
|
|
18703
18703
|
(function (NetworkQualityEventNames) {
|
|
18704
18704
|
NetworkQualityEventNames["NETWORK_QUALITY"] = "NETWORK_QUALITY";
|
|
18705
18705
|
})(exports.NetworkQualityEventNames || (exports.NetworkQualityEventNames = {}));
|
|
18706
|
+
exports.StatsMonitorEventNames = void 0;
|
|
18707
|
+
(function (StatsMonitorEventNames) {
|
|
18708
|
+
StatsMonitorEventNames["INBOUND_AUDIO_ISSUE"] = "INBOUND_AUDIO_ISSUE";
|
|
18709
|
+
})(exports.StatsMonitorEventNames || (exports.StatsMonitorEventNames = {}));
|
|
18710
|
+
exports.InboundAudioIssueSubTypes = void 0;
|
|
18711
|
+
(function (InboundAudioIssueSubTypes) {
|
|
18712
|
+
InboundAudioIssueSubTypes["DECODE_RESULTS_IN_ZERO_AUDIO_LEVEL"] = "DECODE_RESULTS_IN_ZERO_AUDIO_LEVEL";
|
|
18713
|
+
InboundAudioIssueSubTypes["ALL_PACKETS_DISCARDED"] = "ALL_PACKETS_DISCARDED";
|
|
18714
|
+
})(exports.InboundAudioIssueSubTypes || (exports.InboundAudioIssueSubTypes = {}));
|
|
18706
18715
|
|
|
18707
18716
|
function ownKeys(object, enumerableOnly) { var keys = Object.keys(object); if (Object.getOwnPropertySymbols) { var symbols = Object.getOwnPropertySymbols(object); enumerableOnly && (symbols = symbols.filter(function (sym) { return Object.getOwnPropertyDescriptor(object, sym).enumerable; })), keys.push.apply(keys, symbols); } return keys; }
|
|
18708
18717
|
function _objectSpread(target) { for (var i = 1; i < arguments.length; i++) { var source = null != arguments[i] ? arguments[i] : {}; i % 2 ? ownKeys(Object(source), !0).forEach(function (key) { _defineProperty(target, key, source[key]); }) : Object.getOwnPropertyDescriptors ? Object.defineProperties(target, Object.getOwnPropertyDescriptors(source)) : ownKeys(Object(source)).forEach(function (key) { Object.defineProperty(target, key, Object.getOwnPropertyDescriptor(source, key)); }); } return target; }
|
|
@@ -18711,6 +18720,7 @@ class StatsAnalyzer extends EventEmitter$5 {
|
|
|
18711
18720
|
var {
|
|
18712
18721
|
config,
|
|
18713
18722
|
networkQualityMonitor,
|
|
18723
|
+
statsMonitor,
|
|
18714
18724
|
isMultistream = false
|
|
18715
18725
|
} = _ref;
|
|
18716
18726
|
super();
|
|
@@ -18722,6 +18732,7 @@ class StatsAnalyzer extends EventEmitter$5 {
|
|
|
18722
18732
|
_defineProperty(this, "mqeInterval", void 0);
|
|
18723
18733
|
_defineProperty(this, "mqeSentCount", 0);
|
|
18724
18734
|
_defineProperty(this, "networkQualityMonitor", void 0);
|
|
18735
|
+
_defineProperty(this, "statsMonitor", void 0);
|
|
18725
18736
|
_defineProperty(this, "mediaConnection", null);
|
|
18726
18737
|
_defineProperty(this, "statsStarted", false);
|
|
18727
18738
|
_defineProperty(this, "mqeIntervalSessionReceiveAudioMainBuilder", void 0);
|
|
@@ -18763,6 +18774,7 @@ class StatsAnalyzer extends EventEmitter$5 {
|
|
|
18763
18774
|
});
|
|
18764
18775
|
this.config = config;
|
|
18765
18776
|
this.networkQualityMonitor = networkQualityMonitor;
|
|
18777
|
+
this.statsMonitor = statsMonitor;
|
|
18766
18778
|
this.mqeIntervalSessionReceiveAudioMainBuilder = new MqeIntervalSessionReceiveAudioBuilder({
|
|
18767
18779
|
isMain: true,
|
|
18768
18780
|
multistreamEnabled: isMultistream
|
|
@@ -18981,7 +18993,7 @@ class StatsAnalyzer extends EventEmitter$5 {
|
|
|
18981
18993
|
})();
|
|
18982
18994
|
}
|
|
18983
18995
|
monitorStats(transceiverStats) {
|
|
18984
|
-
var _this$meetingMediaSta3, _this$meetingMediaSta4, _this$meetingMediaSta5, _this$meetingMediaSta6, _this$meetingMediaSta7, _this$previousTransce, _this$previousTransce2, _this$previousTransce3, _this$previousTransce4, _this$previousTransce5, _this$previousTransce6, _this$previousTransce7, _this$previousTransce8, _this$previousTransce9, _this$previousTransce10, _this$previousTransce11, _this$previousTransce12;
|
|
18996
|
+
var _this$meetingMediaSta3, _this$meetingMediaSta4, _this$meetingMediaSta5, _this$meetingMediaSta6, _this$meetingMediaSta7, _this$meetingMediaSta8, _this$previousTransce, _this$previousTransce2, _this$previousTransce3, _this$previousTransce4, _this$previousTransce5, _this$previousTransce6, _this$previousTransce7, _this$previousTransce8, _this$previousTransce9, _this$previousTransce10, _this$previousTransce11, _this$previousTransce12;
|
|
18985
18997
|
var emitNetworkQualityEvents = (mediaType, intervalStats) => {
|
|
18986
18998
|
var roundTripTimeArray = getPropertyFromStatsByTypeInArray(intervalStats, 'remote-inbound-rtp', 'roundTripTime');
|
|
18987
18999
|
var jitterArray = getPropertyFromStatsByTypeInArray(intervalStats, 'remote-inbound-rtp', 'jitter');
|
|
@@ -18997,129 +19009,45 @@ class StatsAnalyzer extends EventEmitter$5 {
|
|
|
18997
19009
|
var current = convertToStatsMap(transceiverStats.audio.senders);
|
|
18998
19010
|
if (this.previousTransceiverStats) {
|
|
18999
19011
|
var previous = convertToStatsMap(this.previousTransceiverStats.audio.senders);
|
|
19000
|
-
|
|
19001
|
-
var previousPacketsSent = getSumFromStatsByType(previous, 'outbound-rtp', 'packetsSent');
|
|
19002
|
-
if (currentPacketsSent === previousPacketsSent) {
|
|
19003
|
-
getLogger().info("StatsAnalyzer#monitorStats --> No audio packets sent, last packets sent count: ".concat(currentPacketsSent, "."));
|
|
19004
|
-
}
|
|
19005
|
-
var totalAudioEnergyExists = getPropertyFromStatsByType(current, 'media-source', 'totalAudioEnergy') !== undefined;
|
|
19006
|
-
if (totalAudioEnergyExists) {
|
|
19007
|
-
var currentTotalAudioEnergy = getSumFromStatsByType(current, 'media-source', 'totalAudioEnergy');
|
|
19008
|
-
var previousTotalAudioEnergy = getSumFromStatsByType(previous, 'media-source', 'totalAudioEnergy');
|
|
19009
|
-
if (currentTotalAudioEnergy === previousTotalAudioEnergy) {
|
|
19010
|
-
getLogger().info("StatsAnalyzer#monitorStats --> No audio energy, last total audio energy: ".concat(currentTotalAudioEnergy, "."));
|
|
19011
|
-
}
|
|
19012
|
-
}
|
|
19013
|
-
var audioLevelExists = getPropertyFromStatsByType(current, 'media-source', 'audioLevel') !== undefined;
|
|
19014
|
-
if (audioLevelExists) {
|
|
19015
|
-
var currentAudioLevel = getSumFromStatsByType(current, 'media-source', 'audioLevel');
|
|
19016
|
-
if (currentAudioLevel === 0) {
|
|
19017
|
-
getLogger().info("StatsAnalyzer#monitorStats --> Audio level is 0.");
|
|
19018
|
-
}
|
|
19019
|
-
}
|
|
19012
|
+
this.statsMonitor.checkOutboundAudio(previous, current);
|
|
19020
19013
|
}
|
|
19021
19014
|
emitNetworkQualityEvents('audio', current);
|
|
19022
19015
|
}
|
|
19023
|
-
if ((_this$meetingMediaSta4 = this.meetingMediaStatus) !== null && _this$meetingMediaSta4 !== void 0 && _this$meetingMediaSta4.expected.
|
|
19024
|
-
var _current = convertToStatsMap(transceiverStats.
|
|
19016
|
+
if ((_this$meetingMediaSta4 = this.meetingMediaStatus) !== null && _this$meetingMediaSta4 !== void 0 && _this$meetingMediaSta4.expected.receiveAudio) {
|
|
19017
|
+
var _current = convertToStatsMap(transceiverStats.audio.receivers);
|
|
19025
19018
|
if (this.previousTransceiverStats) {
|
|
19026
|
-
var _previous = convertToStatsMap(this.previousTransceiverStats.
|
|
19027
|
-
|
|
19028
|
-
var _previousPacketsSent = getSumFromStatsByType(_previous, 'outbound-rtp', 'packetsSent');
|
|
19029
|
-
if (_currentPacketsSent === _previousPacketsSent) {
|
|
19030
|
-
getLogger().info("StatsAnalyzer#monitorStats --> No video packets sent, last packets sent count: ".concat(_currentPacketsSent, "."));
|
|
19031
|
-
}
|
|
19032
|
-
var currentFramesEncoded = getSumFromStatsByType(_current, 'outbound-rtp', 'framesEncoded');
|
|
19033
|
-
var previousFramesEncoded = getSumFromStatsByType(_previous, 'outbound-rtp', 'framesEncoded');
|
|
19034
|
-
if (currentFramesEncoded === previousFramesEncoded) {
|
|
19035
|
-
getLogger().info("StatsAnalyzer#monitorStats --> No video frames encoded, last frames encoded count: ".concat(currentFramesEncoded, "."));
|
|
19036
|
-
}
|
|
19037
|
-
var currentFramesSent = getSumFromStatsByType(_current, 'outbound-rtp', 'framesSent');
|
|
19038
|
-
var previousFramesSent = getSumFromStatsByType(_previous, 'outbound-rtp', 'framesSent');
|
|
19039
|
-
if (currentFramesSent === previousFramesSent) {
|
|
19040
|
-
getLogger().info("StatsAnalyzer#monitorStats --> No video frames sent, last frames sent count: ".concat(currentFramesSent, "."));
|
|
19041
|
-
}
|
|
19019
|
+
var _previous = convertToStatsMap(this.previousTransceiverStats.audio.receivers);
|
|
19020
|
+
this.statsMonitor.checkInboundAudio(_previous, _current);
|
|
19042
19021
|
}
|
|
19043
|
-
emitNetworkQualityEvents('video', _current);
|
|
19044
19022
|
}
|
|
19045
|
-
if ((_this$meetingMediaSta5 = this.meetingMediaStatus) !== null && _this$meetingMediaSta5 !== void 0 && _this$meetingMediaSta5.expected.
|
|
19046
|
-
var _current2 = convertToStatsMap(transceiverStats.video.
|
|
19023
|
+
if ((_this$meetingMediaSta5 = this.meetingMediaStatus) !== null && _this$meetingMediaSta5 !== void 0 && _this$meetingMediaSta5.expected.sendVideo) {
|
|
19024
|
+
var _current2 = convertToStatsMap(transceiverStats.video.senders);
|
|
19047
19025
|
if (this.previousTransceiverStats) {
|
|
19048
|
-
var
|
|
19049
|
-
|
|
19050
|
-
var _previous2 = convertToStatsMap(this.previousTransceiverStats.video.receivers);
|
|
19051
|
-
var currentPacketsReceived = getSumFromStatsByType(_current2, 'inbound-rtp', 'packetsReceived');
|
|
19052
|
-
var previousPacketsReceived = getSumFromStatsByType(_previous2, 'inbound-rtp', 'packetsReceived');
|
|
19053
|
-
if (currentPacketsReceived === previousPacketsReceived) {
|
|
19054
|
-
getLogger().info("StatsAnalyzer#monitorStats --> No video packets received, last packets received count: ".concat(currentPacketsReceived, "."));
|
|
19055
|
-
}
|
|
19056
|
-
var currentFramesDecoded = getSumFromStatsByType(_current2, 'inbound-rtp', 'framesDecoded');
|
|
19057
|
-
var previousFramesDecoded = getSumFromStatsByType(_previous2, 'inbound-rtp', 'framesDecoded');
|
|
19058
|
-
if (currentFramesDecoded === previousFramesDecoded) {
|
|
19059
|
-
getLogger().info("StatsAnalyzer#monitorStats --> No video frames decoded, last frames decoded count: ".concat(currentFramesDecoded, "."));
|
|
19060
|
-
}
|
|
19061
|
-
var currentFramesReceived = getSumFromStatsByType(_current2, 'inbound-rtp', 'framesReceived');
|
|
19062
|
-
var previousFramesReceived = getSumFromStatsByType(_previous2, 'inbound-rtp', 'framesReceived');
|
|
19063
|
-
if (currentFramesReceived === previousFramesReceived) {
|
|
19064
|
-
getLogger().info("StatsAnalyzer#monitorStats --> No video frames received, last frames received count: ".concat(currentFramesReceived, "."));
|
|
19065
|
-
}
|
|
19066
|
-
var currentFramesDropped = getSumFromStatsByType(_current2, 'inbound-rtp', 'framesDropped');
|
|
19067
|
-
var previousFramesDropped = getSumFromStatsByType(_previous2, 'inbound-rtp', 'framesDropped');
|
|
19068
|
-
if (currentFramesDropped - previousFramesDropped > 10) {
|
|
19069
|
-
getLogger().info("StatsAnalyzer#monitorStats --> Too many video frames dropped, total frames dropped count: ".concat(currentFramesDropped, "."));
|
|
19070
|
-
}
|
|
19071
|
-
}
|
|
19026
|
+
var _previous2 = convertToStatsMap(this.previousTransceiverStats.video.senders);
|
|
19027
|
+
this.statsMonitor.checkOutboundVideo(_previous2, _current2);
|
|
19072
19028
|
}
|
|
19029
|
+
emitNetworkQualityEvents('video', _current2);
|
|
19073
19030
|
}
|
|
19074
|
-
if ((_this$meetingMediaSta6 = this.meetingMediaStatus) !== null && _this$meetingMediaSta6 !== void 0 && _this$meetingMediaSta6.expected.
|
|
19075
|
-
var _current3 = convertToStatsMap(transceiverStats.
|
|
19031
|
+
if ((_this$meetingMediaSta6 = this.meetingMediaStatus) !== null && _this$meetingMediaSta6 !== void 0 && _this$meetingMediaSta6.expected.receiveVideo) {
|
|
19032
|
+
var _current3 = convertToStatsMap(transceiverStats.video.receivers);
|
|
19076
19033
|
if (this.previousTransceiverStats) {
|
|
19077
|
-
var _previous3 = convertToStatsMap(this.previousTransceiverStats.
|
|
19078
|
-
|
|
19079
|
-
var _previousPacketsSent2 = getSumFromStatsByType(_previous3, 'outbound-rtp', 'packetsSent');
|
|
19080
|
-
if (_currentPacketsSent2 === _previousPacketsSent2) {
|
|
19081
|
-
getLogger().info("StatsAnalyzer#monitorStats --> No share packets sent, last packets sent count: ".concat(_currentPacketsSent2, "."));
|
|
19082
|
-
}
|
|
19083
|
-
var _currentFramesEncoded = getSumFromStatsByType(_current3, 'outbound-rtp', 'framesEncoded');
|
|
19084
|
-
var _previousFramesEncoded = getSumFromStatsByType(_previous3, 'outbound-rtp', 'framesEncoded');
|
|
19085
|
-
if (_currentFramesEncoded === _previousFramesEncoded) {
|
|
19086
|
-
getLogger().info("StatsAnalyzer#monitorStats --> No share frames encoded, last frames encoded count: ".concat(_currentFramesEncoded, "."));
|
|
19087
|
-
}
|
|
19088
|
-
var _currentFramesSent = getSumFromStatsByType(_current3, 'outbound-rtp', 'framesSent');
|
|
19089
|
-
var _previousFramesSent = getSumFromStatsByType(_previous3, 'outbound-rtp', 'framesSent');
|
|
19090
|
-
if (_currentFramesSent === _previousFramesSent) {
|
|
19091
|
-
getLogger().info("StatsAnalyzer#monitorStats --> No share frames sent, last frames sent count: ".concat(_currentFramesSent, "."));
|
|
19092
|
-
}
|
|
19034
|
+
var _previous3 = convertToStatsMap(this.previousTransceiverStats.video.receivers);
|
|
19035
|
+
this.statsMonitor.checkInboundVideo(_previous3, _current3);
|
|
19093
19036
|
}
|
|
19094
|
-
emitNetworkQualityEvents('share', _current3);
|
|
19095
19037
|
}
|
|
19096
|
-
if ((_this$meetingMediaSta7 = this.meetingMediaStatus) !== null && _this$meetingMediaSta7 !== void 0 && _this$meetingMediaSta7.expected.
|
|
19097
|
-
var _current4 = convertToStatsMap(transceiverStats.screenShareVideo.
|
|
19038
|
+
if ((_this$meetingMediaSta7 = this.meetingMediaStatus) !== null && _this$meetingMediaSta7 !== void 0 && _this$meetingMediaSta7.expected.sendShare) {
|
|
19039
|
+
var _current4 = convertToStatsMap(transceiverStats.screenShareVideo.senders);
|
|
19098
19040
|
if (this.previousTransceiverStats) {
|
|
19099
|
-
var
|
|
19100
|
-
|
|
19101
|
-
|
|
19102
|
-
|
|
19103
|
-
|
|
19104
|
-
|
|
19105
|
-
|
|
19106
|
-
|
|
19107
|
-
|
|
19108
|
-
|
|
19109
|
-
if (_currentFramesDecoded === _previousFramesDecoded) {
|
|
19110
|
-
getLogger().info("StatsAnalyzer#monitorStats --> No share frames decoded, last frames decoded count: ".concat(_currentFramesDecoded, "."));
|
|
19111
|
-
}
|
|
19112
|
-
var _currentFramesReceived = getSumFromStatsByType(_current4, 'inbound-rtp', 'framesReceived');
|
|
19113
|
-
var _previousFramesReceived = getSumFromStatsByType(_previous4, 'inbound-rtp', 'framesReceived');
|
|
19114
|
-
if (_currentFramesReceived === _previousFramesReceived) {
|
|
19115
|
-
getLogger().info("StatsAnalyzer#monitorStats --> No share frames received, last frames received count: ".concat(_currentFramesReceived, "."));
|
|
19116
|
-
}
|
|
19117
|
-
var _currentFramesDropped = getSumFromStatsByType(_current4, 'inbound-rtp', 'framesDropped');
|
|
19118
|
-
var _previousFramesDropped = getSumFromStatsByType(_previous4, 'inbound-rtp', 'framesDropped');
|
|
19119
|
-
if (_currentFramesDropped - _previousFramesDropped > 10) {
|
|
19120
|
-
getLogger().info("StatsAnalyzer#monitorStats --> Too many share frames dropped, total frames dropped count: ".concat(_currentFramesDropped, "."));
|
|
19121
|
-
}
|
|
19122
|
-
}
|
|
19041
|
+
var _previous4 = convertToStatsMap(this.previousTransceiverStats.screenShareVideo.senders);
|
|
19042
|
+
this.statsMonitor.checkOutboundShare(_previous4, _current4);
|
|
19043
|
+
}
|
|
19044
|
+
emitNetworkQualityEvents('share', _current4);
|
|
19045
|
+
}
|
|
19046
|
+
if ((_this$meetingMediaSta8 = this.meetingMediaStatus) !== null && _this$meetingMediaSta8 !== void 0 && _this$meetingMediaSta8.expected.receiveShare) {
|
|
19047
|
+
var _current5 = convertToStatsMap(transceiverStats.screenShareVideo.receivers);
|
|
19048
|
+
if (this.previousTransceiverStats) {
|
|
19049
|
+
var _previous5 = convertToStatsMap(this.previousTransceiverStats.screenShareVideo.receivers);
|
|
19050
|
+
this.statsMonitor.checkInboundShare(_previous5, _current5);
|
|
19123
19051
|
}
|
|
19124
19052
|
}
|
|
19125
19053
|
this.emitStartStopEvents('audio', getSumFromStatsByType(convertToStatsMap((_this$previousTransce = (_this$previousTransce2 = this.previousTransceiverStats) === null || _this$previousTransce2 === void 0 ? void 0 : _this$previousTransce2.audio.senders) !== null && _this$previousTransce !== void 0 ? _this$previousTransce : []), 'outbound-rtp', 'packetsSent'), getSumFromStatsByType(convertToStatsMap(transceiverStats.audio.senders), 'outbound-rtp', 'packetsSent'), true);
|
|
@@ -19232,6 +19160,155 @@ class NetworkQualityMonitor extends EventEmitter$5 {
|
|
|
19232
19160
|
}
|
|
19233
19161
|
}
|
|
19234
19162
|
|
|
19163
|
+
var MIN_AUDIO_PACKETS_RECEIVER_THRESHOLD = 500;
|
|
19164
|
+
var InboundAudioThresholds = {
|
|
19165
|
+
DecodeResultsInZeroAudioLevel: {
|
|
19166
|
+
concealedRatio: 0.7,
|
|
19167
|
+
lossRatio: 0.2,
|
|
19168
|
+
discardedRatio: 0.5
|
|
19169
|
+
},
|
|
19170
|
+
AllPacketsDiscarded: {
|
|
19171
|
+
discardedRatio: 0.9
|
|
19172
|
+
}
|
|
19173
|
+
};
|
|
19174
|
+
class StatsMonitor extends EventEmitter$5 {
|
|
19175
|
+
hasAudioDecodeIssue(totalAudioEnergy, totalSamplesReceived, concealedRatio, lossRatio, discardedRatio) {
|
|
19176
|
+
var thresholds = InboundAudioThresholds.DecodeResultsInZeroAudioLevel;
|
|
19177
|
+
return totalAudioEnergy === 0 && totalSamplesReceived > 0 && concealedRatio < thresholds.concealedRatio && lossRatio < thresholds.lossRatio && discardedRatio < thresholds.discardedRatio;
|
|
19178
|
+
}
|
|
19179
|
+
checkInboundAudio(previous, current) {
|
|
19180
|
+
var previousPacketsReceived = getSumFromStatsByType(previous, 'inbound-rtp', 'packetsReceived');
|
|
19181
|
+
var packetsReceived = getSumFromStatsByType(current, 'inbound-rtp', 'packetsReceived');
|
|
19182
|
+
var totalSamplesReceived = getSumFromStatsByType(current, 'inbound-rtp', 'totalSamplesReceived');
|
|
19183
|
+
var totalAudioEnergy = getSumFromStatsByType(current, 'inbound-rtp', 'totalAudioEnergy');
|
|
19184
|
+
var packetsDiscarded = getSumFromStatsByType(current, 'inbound-rtp', 'packetsDiscarded');
|
|
19185
|
+
var concealedSamples = getSumFromStatsByType(current, 'inbound-rtp', 'concealedSamples');
|
|
19186
|
+
var packetsLost = getSumFromStatsByType(current, 'inbound-rtp', 'packetsLost');
|
|
19187
|
+
var concealedRatio = totalSamplesReceived > 0 ? concealedSamples / totalSamplesReceived : 0;
|
|
19188
|
+
var lossRatio = packetsReceived + packetsLost > 0 ? packetsLost / (packetsReceived + packetsLost) : 0;
|
|
19189
|
+
var discardedRatio = packetsReceived > 0 ? packetsDiscarded / packetsReceived : 0;
|
|
19190
|
+
if (packetsReceived > MIN_AUDIO_PACKETS_RECEIVER_THRESHOLD && packetsReceived > previousPacketsReceived) {
|
|
19191
|
+
if (this.hasAudioDecodeIssue(totalAudioEnergy, totalSamplesReceived, concealedRatio, lossRatio, discardedRatio)) {
|
|
19192
|
+
getLogger().info("StatsMonitor#checkInboundAudio --> Incoming audio from all streams is not being decoded correctly, totalAudioEnergy: ".concat(totalAudioEnergy, ", totalSamplesReceived: ").concat(totalSamplesReceived, ", packetsReceived: ").concat(packetsReceived, ", concealedRatio: ").concat(concealedRatio, ", lossRatio: ").concat(lossRatio, ", discardedRatio: ").concat(discardedRatio, "."));
|
|
19193
|
+
this.emit(exports.StatsMonitorEventNames.INBOUND_AUDIO_ISSUE, {
|
|
19194
|
+
issueSubType: exports.InboundAudioIssueSubTypes.DECODE_RESULTS_IN_ZERO_AUDIO_LEVEL
|
|
19195
|
+
});
|
|
19196
|
+
} else if (discardedRatio >= InboundAudioThresholds.AllPacketsDiscarded.discardedRatio) {
|
|
19197
|
+
getLogger().info("StatsMonitor#checkInboundAudio --> Incoming audio packets from all streams are being discarded, packetsReceived: ".concat(packetsReceived, ", packetsDiscarded: ").concat(packetsDiscarded, ", discardedRatio: ").concat(discardedRatio, "."));
|
|
19198
|
+
this.emit(exports.StatsMonitorEventNames.INBOUND_AUDIO_ISSUE, {
|
|
19199
|
+
issueSubType: exports.InboundAudioIssueSubTypes.ALL_PACKETS_DISCARDED
|
|
19200
|
+
});
|
|
19201
|
+
}
|
|
19202
|
+
}
|
|
19203
|
+
}
|
|
19204
|
+
checkOutboundAudio(previous, current) {
|
|
19205
|
+
var currentPacketsSent = getSumFromStatsByType(current, 'outbound-rtp', 'packetsSent');
|
|
19206
|
+
var previousPacketsSent = getSumFromStatsByType(previous, 'outbound-rtp', 'packetsSent');
|
|
19207
|
+
if (currentPacketsSent === previousPacketsSent) {
|
|
19208
|
+
getLogger().info("StatsMonitor#checkOutboundAudio --> No audio packets sent, last packets sent count: ".concat(currentPacketsSent, "."));
|
|
19209
|
+
}
|
|
19210
|
+
var totalAudioEnergyExists = getPropertyFromStatsByType(current, 'media-source', 'totalAudioEnergy') !== undefined;
|
|
19211
|
+
if (totalAudioEnergyExists) {
|
|
19212
|
+
var currentTotalAudioEnergy = getSumFromStatsByType(current, 'media-source', 'totalAudioEnergy');
|
|
19213
|
+
var previousTotalAudioEnergy = getSumFromStatsByType(previous, 'media-source', 'totalAudioEnergy');
|
|
19214
|
+
if (currentTotalAudioEnergy === previousTotalAudioEnergy) {
|
|
19215
|
+
getLogger().info("StatsMonitor#checkOutboundAudio --> No audio energy from local audio source, last total audio energy: ".concat(currentTotalAudioEnergy, "."));
|
|
19216
|
+
}
|
|
19217
|
+
}
|
|
19218
|
+
var audioLevelExists = getPropertyFromStatsByType(current, 'media-source', 'audioLevel') !== undefined;
|
|
19219
|
+
if (audioLevelExists) {
|
|
19220
|
+
var currentAudioLevel = getSumFromStatsByType(current, 'media-source', 'audioLevel');
|
|
19221
|
+
if (currentAudioLevel === 0) {
|
|
19222
|
+
getLogger().info("StatsMonitor#checkOutboundAudio --> Audio level in local audio source is 0.");
|
|
19223
|
+
}
|
|
19224
|
+
}
|
|
19225
|
+
}
|
|
19226
|
+
checkInboundVideo(previous, current) {
|
|
19227
|
+
var currentSourceStateArray = getPropertyFromStatsByTypeInArray(current, 'inbound-rtp', 'sourceState');
|
|
19228
|
+
if (currentSourceStateArray.includes('live')) {
|
|
19229
|
+
var currentPacketsReceived = getSumFromStatsByType(current, 'inbound-rtp', 'packetsReceived');
|
|
19230
|
+
var previousPacketsReceived = getSumFromStatsByType(previous, 'inbound-rtp', 'packetsReceived');
|
|
19231
|
+
if (currentPacketsReceived === previousPacketsReceived) {
|
|
19232
|
+
getLogger().info("StatsMonitor#checkInboundVideo --> No video packets received, last packets received count: ".concat(currentPacketsReceived, "."));
|
|
19233
|
+
}
|
|
19234
|
+
var currentFramesDecoded = getSumFromStatsByType(current, 'inbound-rtp', 'framesDecoded');
|
|
19235
|
+
var previousFramesDecoded = getSumFromStatsByType(previous, 'inbound-rtp', 'framesDecoded');
|
|
19236
|
+
if (currentFramesDecoded === previousFramesDecoded) {
|
|
19237
|
+
getLogger().info("StatsMonitor#checkInboundVideo --> No video frames decoded, last frames decoded count: ".concat(currentFramesDecoded, "."));
|
|
19238
|
+
}
|
|
19239
|
+
var currentFramesReceived = getSumFromStatsByType(current, 'inbound-rtp', 'framesReceived');
|
|
19240
|
+
var previousFramesReceived = getSumFromStatsByType(previous, 'inbound-rtp', 'framesReceived');
|
|
19241
|
+
if (currentFramesReceived === previousFramesReceived) {
|
|
19242
|
+
getLogger().info("StatsMonitor#checkInboundVideo --> No video frames received, last frames received count: ".concat(currentFramesReceived, "."));
|
|
19243
|
+
}
|
|
19244
|
+
var currentFramesDropped = getSumFromStatsByType(current, 'inbound-rtp', 'framesDropped');
|
|
19245
|
+
var previousFramesDropped = getSumFromStatsByType(previous, 'inbound-rtp', 'framesDropped');
|
|
19246
|
+
if (currentFramesDropped - previousFramesDropped > 10) {
|
|
19247
|
+
getLogger().info("StatsMonitor#checkInboundVideo --> Too many inbound video frames dropped, total frames dropped count: ".concat(currentFramesDropped, "."));
|
|
19248
|
+
}
|
|
19249
|
+
}
|
|
19250
|
+
}
|
|
19251
|
+
checkOutboundVideo(previous, current) {
|
|
19252
|
+
var currentPacketsSent = getSumFromStatsByType(current, 'outbound-rtp', 'packetsSent');
|
|
19253
|
+
var previousPacketsSent = getSumFromStatsByType(previous, 'outbound-rtp', 'packetsSent');
|
|
19254
|
+
if (currentPacketsSent === previousPacketsSent) {
|
|
19255
|
+
getLogger().info("StatsMonitor#checkOutboundVideo --> No video packets sent, last packets sent count: ".concat(currentPacketsSent, "."));
|
|
19256
|
+
}
|
|
19257
|
+
var currentFramesEncoded = getSumFromStatsByType(current, 'outbound-rtp', 'framesEncoded');
|
|
19258
|
+
var previousFramesEncoded = getSumFromStatsByType(previous, 'outbound-rtp', 'framesEncoded');
|
|
19259
|
+
if (currentFramesEncoded === previousFramesEncoded) {
|
|
19260
|
+
getLogger().info("StatsMonitor#checkOutboundVideo --> No video frames encoded, last frames encoded count: ".concat(currentFramesEncoded, "."));
|
|
19261
|
+
}
|
|
19262
|
+
var currentFramesSent = getSumFromStatsByType(current, 'outbound-rtp', 'framesSent');
|
|
19263
|
+
var previousFramesSent = getSumFromStatsByType(previous, 'outbound-rtp', 'framesSent');
|
|
19264
|
+
if (currentFramesSent === previousFramesSent) {
|
|
19265
|
+
getLogger().info("StatsMonitor#checkOutboundVideo --> No video frames sent, last frames sent count: ".concat(currentFramesSent, "."));
|
|
19266
|
+
}
|
|
19267
|
+
}
|
|
19268
|
+
checkInboundShare(previous, current) {
|
|
19269
|
+
var currentSourceStateArray = getPropertyFromStatsByTypeInArray(current, 'inbound-rtp', 'sourceState');
|
|
19270
|
+
if (currentSourceStateArray.includes('live')) {
|
|
19271
|
+
var currentPacketsReceived = getSumFromStatsByType(current, 'inbound-rtp', 'packetsReceived');
|
|
19272
|
+
var previousPacketsReceived = getSumFromStatsByType(previous, 'inbound-rtp', 'packetsReceived');
|
|
19273
|
+
if (currentPacketsReceived === previousPacketsReceived) {
|
|
19274
|
+
getLogger().info("StatsMonitor#checkInboundShare --> No share packets received, last packets received count: ".concat(currentPacketsReceived, "."));
|
|
19275
|
+
}
|
|
19276
|
+
var currentFramesDecoded = getSumFromStatsByType(current, 'inbound-rtp', 'framesDecoded');
|
|
19277
|
+
var previousFramesDecoded = getSumFromStatsByType(previous, 'inbound-rtp', 'framesDecoded');
|
|
19278
|
+
if (currentFramesDecoded === previousFramesDecoded) {
|
|
19279
|
+
getLogger().info("StatsMonitor#checkInboundShare --> No share frames decoded, last frames decoded count: ".concat(currentFramesDecoded, "."));
|
|
19280
|
+
}
|
|
19281
|
+
var currentFramesReceived = getSumFromStatsByType(current, 'inbound-rtp', 'framesReceived');
|
|
19282
|
+
var previousFramesReceived = getSumFromStatsByType(previous, 'inbound-rtp', 'framesReceived');
|
|
19283
|
+
if (currentFramesReceived === previousFramesReceived) {
|
|
19284
|
+
getLogger().info("StatsMonitor#checkInboundShare --> No share frames received, last frames received count: ".concat(currentFramesReceived, "."));
|
|
19285
|
+
}
|
|
19286
|
+
var currentFramesDropped = getSumFromStatsByType(current, 'inbound-rtp', 'framesDropped');
|
|
19287
|
+
var previousFramesDropped = getSumFromStatsByType(previous, 'inbound-rtp', 'framesDropped');
|
|
19288
|
+
if (currentFramesDropped - previousFramesDropped > 10) {
|
|
19289
|
+
getLogger().info("StatsMonitor#checkInboundShare --> Too many inbound share frames dropped, total frames dropped count: ".concat(currentFramesDropped, "."));
|
|
19290
|
+
}
|
|
19291
|
+
}
|
|
19292
|
+
}
|
|
19293
|
+
checkOutboundShare(previous, current) {
|
|
19294
|
+
var currentPacketsSent = getSumFromStatsByType(current, 'outbound-rtp', 'packetsSent');
|
|
19295
|
+
var previousPacketsSent = getSumFromStatsByType(previous, 'outbound-rtp', 'packetsSent');
|
|
19296
|
+
if (currentPacketsSent === previousPacketsSent) {
|
|
19297
|
+
getLogger().info("StatsMonitor#checkOutboundShare --> No share packets sent, last packets sent count: ".concat(currentPacketsSent, "."));
|
|
19298
|
+
}
|
|
19299
|
+
var currentFramesEncoded = getSumFromStatsByType(current, 'outbound-rtp', 'framesEncoded');
|
|
19300
|
+
var previousFramesEncoded = getSumFromStatsByType(previous, 'outbound-rtp', 'framesEncoded');
|
|
19301
|
+
if (currentFramesEncoded === previousFramesEncoded) {
|
|
19302
|
+
getLogger().info("StatsMonitor#checkOutboundShare --> No share frames encoded, last frames encoded count: ".concat(currentFramesEncoded, "."));
|
|
19303
|
+
}
|
|
19304
|
+
var currentFramesSent = getSumFromStatsByType(current, 'outbound-rtp', 'framesSent');
|
|
19305
|
+
var previousFramesSent = getSumFromStatsByType(previous, 'outbound-rtp', 'framesSent');
|
|
19306
|
+
if (currentFramesSent === previousFramesSent) {
|
|
19307
|
+
getLogger().info("StatsMonitor#checkOutboundShare --> No share frames sent, last frames sent count: ".concat(currentFramesSent, "."));
|
|
19308
|
+
}
|
|
19309
|
+
}
|
|
19310
|
+
}
|
|
19311
|
+
|
|
19235
19312
|
var Media = {
|
|
19236
19313
|
createAudioTrack: createAudioTrack,
|
|
19237
19314
|
createVideoTrack: createVideoTrack,
|
|
@@ -19268,6 +19345,7 @@ exports.RemoteStream = RemoteStream;
|
|
|
19268
19345
|
exports.RoapMediaConnection = RoapMediaConnection;
|
|
19269
19346
|
exports.SendSlot = SendSlot;
|
|
19270
19347
|
exports.StatsAnalyzer = StatsAnalyzer;
|
|
19348
|
+
exports.StatsMonitor = StatsMonitor;
|
|
19271
19349
|
exports.StreamRequest = StreamRequest;
|
|
19272
19350
|
exports.WcmeError = WcmeError;
|
|
19273
19351
|
exports.configureWcmeLogger = configureWcmeLogger;
|
package/dist/esm/index.js
CHANGED
|
@@ -3423,7 +3423,7 @@ if(context.level===Logger.WARN&&console.warn){hdlr=console.warn;}else if(context
|
|
|
3423
3423
|
// `options` hash can be used to configure the default logLevel and provide a custom message formatter.
|
|
3424
3424
|
Logger.useDefaults=function(options){Logger.setLevel(options&&options.defaultLevel||Logger.DEBUG);Logger.setHandler(Logger.createDefaultHandler(options));};// Createa an alias to useDefaults to avoid reaking a react-hooks rule.
|
|
3425
3425
|
Logger.setDefaults=Logger.useDefaults;// Export to popular environments boilerplate.
|
|
3426
|
-
if(module.exports){module.exports=Logger;}else {Logger._prevLogger=global.Logger;Logger.noConflict=function(){global.Logger=Logger._prevLogger;return Logger;};global.Logger=Logger;}})(commonjsGlobal$1);})(logger$1);var Logger=logger$1.exports;var DEFAULT_LOGGER_NAME='web-client-media-engine';var logger=Logger.get(DEFAULT_LOGGER_NAME);logger.setLevel(Logger.DEBUG);function logErrorAndThrow(errorType,message){logger.error(message);throw new WcmeError(errorType,message);}function setLogHandler(logHandler){Logger.setHandler(logHandler);Logger$1.setHandler(logHandler);Logger$2.setHandler(logHandler);}var MediaCodecMimeType;(function(MediaCodecMimeType){MediaCodecMimeType["H264"]="video/H264";MediaCodecMimeType["AV1"]="video/AV1";MediaCodecMimeType["OPUS"]="audio/opus";})(MediaCodecMimeType||(MediaCodecMimeType={}));var defaultMaxVideoEncodeFrameSize=8160;var defaultMaxVideoEncodeMbps=244800;var defaultStartBitrateKbps=3000;var RecommendedOpusBitrates;(function(RecommendedOpusBitrates){RecommendedOpusBitrates[RecommendedOpusBitrates["NB"]=12000]="NB";RecommendedOpusBitrates[RecommendedOpusBitrates["WB"]=20000]="WB";RecommendedOpusBitrates[RecommendedOpusBitrates["FB"]=40000]="FB";RecommendedOpusBitrates[RecommendedOpusBitrates["FB_MONO_MUSIC"]=64000]="FB_MONO_MUSIC";RecommendedOpusBitrates[RecommendedOpusBitrates["FB_STEREO_MUSIC"]=128000]="FB_STEREO_MUSIC";})(RecommendedOpusBitrates||(RecommendedOpusBitrates={}));var maxFrameSizeToMaxBitrateMap=new Map([[60,99000],[240,199000],[576,300000],[920,640000],[1296,720000],[
|
|
3426
|
+
if(module.exports){module.exports=Logger;}else {Logger._prevLogger=global.Logger;Logger.noConflict=function(){global.Logger=Logger._prevLogger;return Logger;};global.Logger=Logger;}})(commonjsGlobal$1);})(logger$1);var Logger=logger$1.exports;var DEFAULT_LOGGER_NAME='web-client-media-engine';var logger=Logger.get(DEFAULT_LOGGER_NAME);logger.setLevel(Logger.DEBUG);function logErrorAndThrow(errorType,message){logger.error(message);throw new WcmeError(errorType,message);}function setLogHandler(logHandler){Logger.setHandler(logHandler);Logger$1.setHandler(logHandler);Logger$2.setHandler(logHandler);}var MediaCodecMimeType;(function(MediaCodecMimeType){MediaCodecMimeType["H264"]="video/H264";MediaCodecMimeType["AV1"]="video/AV1";MediaCodecMimeType["OPUS"]="audio/opus";})(MediaCodecMimeType||(MediaCodecMimeType={}));var defaultMaxVideoEncodeFrameSize=8160;var defaultMaxVideoEncodeMbps=244800;var defaultStartBitrateKbps=3000;var RecommendedOpusBitrates;(function(RecommendedOpusBitrates){RecommendedOpusBitrates[RecommendedOpusBitrates["NB"]=12000]="NB";RecommendedOpusBitrates[RecommendedOpusBitrates["WB"]=20000]="WB";RecommendedOpusBitrates[RecommendedOpusBitrates["FB"]=40000]="FB";RecommendedOpusBitrates[RecommendedOpusBitrates["FB_MONO_MUSIC"]=64000]="FB_MONO_MUSIC";RecommendedOpusBitrates[RecommendedOpusBitrates["FB_STEREO_MUSIC"]=128000]="FB_STEREO_MUSIC";})(RecommendedOpusBitrates||(RecommendedOpusBitrates={}));var maxFrameSizeToMaxBitrateMap=new Map([[60,99000],[240,199000],[576,300000],[920,640000],[1296,720000],[2040,880000],[3600,2500000],[8160,4000000]]);var defaultVideoMainRtxTime='300';var defaultVideoSlidesRtxTime='1000';function areProfileLevelIdsCompatible(senderProfileLevelId,receiverProfileLevelId,levelAsymmetryAllowed){var senderProfile=Number.parseInt("0x".concat(senderProfileLevelId),16);var recvProfile=Number.parseInt("0x".concat(receiverProfileLevelId),16);var senderProfileIdc=senderProfile>>16;var recvProfileIdc=recvProfile>>16;var senderProfileIop=(senderProfile&0x00ff00)>>8;var recvProfileIop=(recvProfile&0x00ff00)>>8;var senderLevelIdc=senderProfile&0x0000ff;var recvLevelIdc=recvProfile&0x0000ff;var areProfileCompatible=senderProfileIdc===recvProfileIdc&&senderProfileIop===recvProfileIop||senderProfileIdc===0x42&&recvProfileIdc===0x42&&(senderProfileIop&0x40)===(recvProfileIop&0x40);var isLevelIdcCompatible=levelAsymmetryAllowed?true:senderLevelIdc<=recvLevelIdc;return areProfileCompatible&&isLevelIdcCompatible;}function areCodecsCompatible(senderCodec,receiverCodec){return Object.keys(receiverCodec).every(key=>{if(key==='clockRate'||key==='name'){return senderCodec[key]===receiverCodec[key];}if(key==='fmtParams'){var fmtpForSender=senderCodec[key];var fmtpForReceiver=receiverCodec[key];var levelAsymmetryAllowed=[...fmtpForSender.keys()].some(senderFmtpParamKey=>{return senderFmtpParamKey==='level-asymmetry-allowed'&&fmtpForReceiver.get(senderFmtpParamKey)==='1'&&fmtpForSender.get(senderFmtpParamKey)==='1';});return [...fmtpForSender.keys()].every(senderFmtpParamKey=>{if(fmtpForReceiver.get(senderFmtpParamKey)){if(senderFmtpParamKey==='profile-level-id'){return areProfileLevelIdsCompatible(fmtpForSender.get(senderFmtpParamKey),fmtpForReceiver.get(senderFmtpParamKey),levelAsymmetryAllowed);}}if(senderFmtpParamKey==='packetization-mode'){return fmtpForSender.get(senderFmtpParamKey)===fmtpForReceiver.get(senderFmtpParamKey);}return true;});}return true;});}function gcd(a,b){return b===0?a:gcd(b,a%b);}function getFrameHeightByMaxFs(sourceAspectRatio,requestedMaxFs){var _gcd=gcd(sourceAspectRatio[0],sourceAspectRatio[1]);var minNumberRatiosForWidth=sourceAspectRatio[0]/_gcd;var minNumberRatiosForHeight=sourceAspectRatio[1]/_gcd;var macroBlockSize=16*16;var minRatioNumberByMaxFs=Math.sqrt(requestedMaxFs*macroBlockSize/(minNumberRatiosForWidth*minNumberRatiosForHeight));var roundedMinRatioNumberByMaxFs=Math.max(Math.floor(minRatioNumberByMaxFs),1.0);return roundedMinRatioNumberByMaxFs*minNumberRatiosForHeight;}function getScaleDownRatio(sourceWidth,sourceHeight,maxFs,maxWidth,maxHeight){if(!sourceWidth||!sourceHeight||!maxFs){return undefined;}var scaleDownRatio=Math.max(sourceHeight/getFrameHeightByMaxFs([sourceWidth,sourceHeight],maxFs),1.0);if(maxWidth&&maxHeight){scaleDownRatio=Math.max(sourceWidth/maxWidth,sourceHeight/maxHeight,scaleDownRatio);}return scaleDownRatio;}function getRecommendedMaxBitrateForFrameSize(requestedMaxFs){if(requestedMaxFs<60){logErrorAndThrow(WcmeErrorType.GET_MAX_BITRATE_FAILED,"Requested max video frame size cannot be less than 60.");}var expectedHeight=[...maxFrameSizeToMaxBitrateMap.keys()].sort((a,b)=>b-a).find(h=>requestedMaxFs>=h);return maxFrameSizeToMaxBitrateMap.get(expectedHeight);}/******************************************************************************
|
|
3427
3427
|
Copyright (c) Microsoft Corporation.
|
|
3428
3428
|
|
|
3429
3429
|
Permission to use, copy, modify, and/or distribute this software for any
|
|
@@ -18699,6 +18699,15 @@ var NetworkQualityEventNames;
|
|
|
18699
18699
|
(function (NetworkQualityEventNames) {
|
|
18700
18700
|
NetworkQualityEventNames["NETWORK_QUALITY"] = "NETWORK_QUALITY";
|
|
18701
18701
|
})(NetworkQualityEventNames || (NetworkQualityEventNames = {}));
|
|
18702
|
+
var StatsMonitorEventNames;
|
|
18703
|
+
(function (StatsMonitorEventNames) {
|
|
18704
|
+
StatsMonitorEventNames["INBOUND_AUDIO_ISSUE"] = "INBOUND_AUDIO_ISSUE";
|
|
18705
|
+
})(StatsMonitorEventNames || (StatsMonitorEventNames = {}));
|
|
18706
|
+
var InboundAudioIssueSubTypes;
|
|
18707
|
+
(function (InboundAudioIssueSubTypes) {
|
|
18708
|
+
InboundAudioIssueSubTypes["DECODE_RESULTS_IN_ZERO_AUDIO_LEVEL"] = "DECODE_RESULTS_IN_ZERO_AUDIO_LEVEL";
|
|
18709
|
+
InboundAudioIssueSubTypes["ALL_PACKETS_DISCARDED"] = "ALL_PACKETS_DISCARDED";
|
|
18710
|
+
})(InboundAudioIssueSubTypes || (InboundAudioIssueSubTypes = {}));
|
|
18702
18711
|
|
|
18703
18712
|
function ownKeys(object, enumerableOnly) { var keys = Object.keys(object); if (Object.getOwnPropertySymbols) { var symbols = Object.getOwnPropertySymbols(object); enumerableOnly && (symbols = symbols.filter(function (sym) { return Object.getOwnPropertyDescriptor(object, sym).enumerable; })), keys.push.apply(keys, symbols); } return keys; }
|
|
18704
18713
|
function _objectSpread(target) { for (var i = 1; i < arguments.length; i++) { var source = null != arguments[i] ? arguments[i] : {}; i % 2 ? ownKeys(Object(source), !0).forEach(function (key) { _defineProperty(target, key, source[key]); }) : Object.getOwnPropertyDescriptors ? Object.defineProperties(target, Object.getOwnPropertyDescriptors(source)) : ownKeys(Object(source)).forEach(function (key) { Object.defineProperty(target, key, Object.getOwnPropertyDescriptor(source, key)); }); } return target; }
|
|
@@ -18707,6 +18716,7 @@ class StatsAnalyzer extends EventEmitter$5 {
|
|
|
18707
18716
|
var {
|
|
18708
18717
|
config,
|
|
18709
18718
|
networkQualityMonitor,
|
|
18719
|
+
statsMonitor,
|
|
18710
18720
|
isMultistream = false
|
|
18711
18721
|
} = _ref;
|
|
18712
18722
|
super();
|
|
@@ -18718,6 +18728,7 @@ class StatsAnalyzer extends EventEmitter$5 {
|
|
|
18718
18728
|
_defineProperty(this, "mqeInterval", void 0);
|
|
18719
18729
|
_defineProperty(this, "mqeSentCount", 0);
|
|
18720
18730
|
_defineProperty(this, "networkQualityMonitor", void 0);
|
|
18731
|
+
_defineProperty(this, "statsMonitor", void 0);
|
|
18721
18732
|
_defineProperty(this, "mediaConnection", null);
|
|
18722
18733
|
_defineProperty(this, "statsStarted", false);
|
|
18723
18734
|
_defineProperty(this, "mqeIntervalSessionReceiveAudioMainBuilder", void 0);
|
|
@@ -18759,6 +18770,7 @@ class StatsAnalyzer extends EventEmitter$5 {
|
|
|
18759
18770
|
});
|
|
18760
18771
|
this.config = config;
|
|
18761
18772
|
this.networkQualityMonitor = networkQualityMonitor;
|
|
18773
|
+
this.statsMonitor = statsMonitor;
|
|
18762
18774
|
this.mqeIntervalSessionReceiveAudioMainBuilder = new MqeIntervalSessionReceiveAudioBuilder({
|
|
18763
18775
|
isMain: true,
|
|
18764
18776
|
multistreamEnabled: isMultistream
|
|
@@ -18977,7 +18989,7 @@ class StatsAnalyzer extends EventEmitter$5 {
|
|
|
18977
18989
|
})();
|
|
18978
18990
|
}
|
|
18979
18991
|
monitorStats(transceiverStats) {
|
|
18980
|
-
var _this$meetingMediaSta3, _this$meetingMediaSta4, _this$meetingMediaSta5, _this$meetingMediaSta6, _this$meetingMediaSta7, _this$previousTransce, _this$previousTransce2, _this$previousTransce3, _this$previousTransce4, _this$previousTransce5, _this$previousTransce6, _this$previousTransce7, _this$previousTransce8, _this$previousTransce9, _this$previousTransce10, _this$previousTransce11, _this$previousTransce12;
|
|
18992
|
+
var _this$meetingMediaSta3, _this$meetingMediaSta4, _this$meetingMediaSta5, _this$meetingMediaSta6, _this$meetingMediaSta7, _this$meetingMediaSta8, _this$previousTransce, _this$previousTransce2, _this$previousTransce3, _this$previousTransce4, _this$previousTransce5, _this$previousTransce6, _this$previousTransce7, _this$previousTransce8, _this$previousTransce9, _this$previousTransce10, _this$previousTransce11, _this$previousTransce12;
|
|
18981
18993
|
var emitNetworkQualityEvents = (mediaType, intervalStats) => {
|
|
18982
18994
|
var roundTripTimeArray = getPropertyFromStatsByTypeInArray(intervalStats, 'remote-inbound-rtp', 'roundTripTime');
|
|
18983
18995
|
var jitterArray = getPropertyFromStatsByTypeInArray(intervalStats, 'remote-inbound-rtp', 'jitter');
|
|
@@ -18993,129 +19005,45 @@ class StatsAnalyzer extends EventEmitter$5 {
|
|
|
18993
19005
|
var current = convertToStatsMap(transceiverStats.audio.senders);
|
|
18994
19006
|
if (this.previousTransceiverStats) {
|
|
18995
19007
|
var previous = convertToStatsMap(this.previousTransceiverStats.audio.senders);
|
|
18996
|
-
|
|
18997
|
-
var previousPacketsSent = getSumFromStatsByType(previous, 'outbound-rtp', 'packetsSent');
|
|
18998
|
-
if (currentPacketsSent === previousPacketsSent) {
|
|
18999
|
-
getLogger().info("StatsAnalyzer#monitorStats --> No audio packets sent, last packets sent count: ".concat(currentPacketsSent, "."));
|
|
19000
|
-
}
|
|
19001
|
-
var totalAudioEnergyExists = getPropertyFromStatsByType(current, 'media-source', 'totalAudioEnergy') !== undefined;
|
|
19002
|
-
if (totalAudioEnergyExists) {
|
|
19003
|
-
var currentTotalAudioEnergy = getSumFromStatsByType(current, 'media-source', 'totalAudioEnergy');
|
|
19004
|
-
var previousTotalAudioEnergy = getSumFromStatsByType(previous, 'media-source', 'totalAudioEnergy');
|
|
19005
|
-
if (currentTotalAudioEnergy === previousTotalAudioEnergy) {
|
|
19006
|
-
getLogger().info("StatsAnalyzer#monitorStats --> No audio energy, last total audio energy: ".concat(currentTotalAudioEnergy, "."));
|
|
19007
|
-
}
|
|
19008
|
-
}
|
|
19009
|
-
var audioLevelExists = getPropertyFromStatsByType(current, 'media-source', 'audioLevel') !== undefined;
|
|
19010
|
-
if (audioLevelExists) {
|
|
19011
|
-
var currentAudioLevel = getSumFromStatsByType(current, 'media-source', 'audioLevel');
|
|
19012
|
-
if (currentAudioLevel === 0) {
|
|
19013
|
-
getLogger().info("StatsAnalyzer#monitorStats --> Audio level is 0.");
|
|
19014
|
-
}
|
|
19015
|
-
}
|
|
19008
|
+
this.statsMonitor.checkOutboundAudio(previous, current);
|
|
19016
19009
|
}
|
|
19017
19010
|
emitNetworkQualityEvents('audio', current);
|
|
19018
19011
|
}
|
|
19019
|
-
if ((_this$meetingMediaSta4 = this.meetingMediaStatus) !== null && _this$meetingMediaSta4 !== void 0 && _this$meetingMediaSta4.expected.
|
|
19020
|
-
var _current = convertToStatsMap(transceiverStats.
|
|
19012
|
+
if ((_this$meetingMediaSta4 = this.meetingMediaStatus) !== null && _this$meetingMediaSta4 !== void 0 && _this$meetingMediaSta4.expected.receiveAudio) {
|
|
19013
|
+
var _current = convertToStatsMap(transceiverStats.audio.receivers);
|
|
19021
19014
|
if (this.previousTransceiverStats) {
|
|
19022
|
-
var _previous = convertToStatsMap(this.previousTransceiverStats.
|
|
19023
|
-
|
|
19024
|
-
var _previousPacketsSent = getSumFromStatsByType(_previous, 'outbound-rtp', 'packetsSent');
|
|
19025
|
-
if (_currentPacketsSent === _previousPacketsSent) {
|
|
19026
|
-
getLogger().info("StatsAnalyzer#monitorStats --> No video packets sent, last packets sent count: ".concat(_currentPacketsSent, "."));
|
|
19027
|
-
}
|
|
19028
|
-
var currentFramesEncoded = getSumFromStatsByType(_current, 'outbound-rtp', 'framesEncoded');
|
|
19029
|
-
var previousFramesEncoded = getSumFromStatsByType(_previous, 'outbound-rtp', 'framesEncoded');
|
|
19030
|
-
if (currentFramesEncoded === previousFramesEncoded) {
|
|
19031
|
-
getLogger().info("StatsAnalyzer#monitorStats --> No video frames encoded, last frames encoded count: ".concat(currentFramesEncoded, "."));
|
|
19032
|
-
}
|
|
19033
|
-
var currentFramesSent = getSumFromStatsByType(_current, 'outbound-rtp', 'framesSent');
|
|
19034
|
-
var previousFramesSent = getSumFromStatsByType(_previous, 'outbound-rtp', 'framesSent');
|
|
19035
|
-
if (currentFramesSent === previousFramesSent) {
|
|
19036
|
-
getLogger().info("StatsAnalyzer#monitorStats --> No video frames sent, last frames sent count: ".concat(currentFramesSent, "."));
|
|
19037
|
-
}
|
|
19015
|
+
var _previous = convertToStatsMap(this.previousTransceiverStats.audio.receivers);
|
|
19016
|
+
this.statsMonitor.checkInboundAudio(_previous, _current);
|
|
19038
19017
|
}
|
|
19039
|
-
emitNetworkQualityEvents('video', _current);
|
|
19040
19018
|
}
|
|
19041
|
-
if ((_this$meetingMediaSta5 = this.meetingMediaStatus) !== null && _this$meetingMediaSta5 !== void 0 && _this$meetingMediaSta5.expected.
|
|
19042
|
-
var _current2 = convertToStatsMap(transceiverStats.video.
|
|
19019
|
+
if ((_this$meetingMediaSta5 = this.meetingMediaStatus) !== null && _this$meetingMediaSta5 !== void 0 && _this$meetingMediaSta5.expected.sendVideo) {
|
|
19020
|
+
var _current2 = convertToStatsMap(transceiverStats.video.senders);
|
|
19043
19021
|
if (this.previousTransceiverStats) {
|
|
19044
|
-
var
|
|
19045
|
-
|
|
19046
|
-
var _previous2 = convertToStatsMap(this.previousTransceiverStats.video.receivers);
|
|
19047
|
-
var currentPacketsReceived = getSumFromStatsByType(_current2, 'inbound-rtp', 'packetsReceived');
|
|
19048
|
-
var previousPacketsReceived = getSumFromStatsByType(_previous2, 'inbound-rtp', 'packetsReceived');
|
|
19049
|
-
if (currentPacketsReceived === previousPacketsReceived) {
|
|
19050
|
-
getLogger().info("StatsAnalyzer#monitorStats --> No video packets received, last packets received count: ".concat(currentPacketsReceived, "."));
|
|
19051
|
-
}
|
|
19052
|
-
var currentFramesDecoded = getSumFromStatsByType(_current2, 'inbound-rtp', 'framesDecoded');
|
|
19053
|
-
var previousFramesDecoded = getSumFromStatsByType(_previous2, 'inbound-rtp', 'framesDecoded');
|
|
19054
|
-
if (currentFramesDecoded === previousFramesDecoded) {
|
|
19055
|
-
getLogger().info("StatsAnalyzer#monitorStats --> No video frames decoded, last frames decoded count: ".concat(currentFramesDecoded, "."));
|
|
19056
|
-
}
|
|
19057
|
-
var currentFramesReceived = getSumFromStatsByType(_current2, 'inbound-rtp', 'framesReceived');
|
|
19058
|
-
var previousFramesReceived = getSumFromStatsByType(_previous2, 'inbound-rtp', 'framesReceived');
|
|
19059
|
-
if (currentFramesReceived === previousFramesReceived) {
|
|
19060
|
-
getLogger().info("StatsAnalyzer#monitorStats --> No video frames received, last frames received count: ".concat(currentFramesReceived, "."));
|
|
19061
|
-
}
|
|
19062
|
-
var currentFramesDropped = getSumFromStatsByType(_current2, 'inbound-rtp', 'framesDropped');
|
|
19063
|
-
var previousFramesDropped = getSumFromStatsByType(_previous2, 'inbound-rtp', 'framesDropped');
|
|
19064
|
-
if (currentFramesDropped - previousFramesDropped > 10) {
|
|
19065
|
-
getLogger().info("StatsAnalyzer#monitorStats --> Too many video frames dropped, total frames dropped count: ".concat(currentFramesDropped, "."));
|
|
19066
|
-
}
|
|
19067
|
-
}
|
|
19022
|
+
var _previous2 = convertToStatsMap(this.previousTransceiverStats.video.senders);
|
|
19023
|
+
this.statsMonitor.checkOutboundVideo(_previous2, _current2);
|
|
19068
19024
|
}
|
|
19025
|
+
emitNetworkQualityEvents('video', _current2);
|
|
19069
19026
|
}
|
|
19070
|
-
if ((_this$meetingMediaSta6 = this.meetingMediaStatus) !== null && _this$meetingMediaSta6 !== void 0 && _this$meetingMediaSta6.expected.
|
|
19071
|
-
var _current3 = convertToStatsMap(transceiverStats.
|
|
19027
|
+
if ((_this$meetingMediaSta6 = this.meetingMediaStatus) !== null && _this$meetingMediaSta6 !== void 0 && _this$meetingMediaSta6.expected.receiveVideo) {
|
|
19028
|
+
var _current3 = convertToStatsMap(transceiverStats.video.receivers);
|
|
19072
19029
|
if (this.previousTransceiverStats) {
|
|
19073
|
-
var _previous3 = convertToStatsMap(this.previousTransceiverStats.
|
|
19074
|
-
|
|
19075
|
-
var _previousPacketsSent2 = getSumFromStatsByType(_previous3, 'outbound-rtp', 'packetsSent');
|
|
19076
|
-
if (_currentPacketsSent2 === _previousPacketsSent2) {
|
|
19077
|
-
getLogger().info("StatsAnalyzer#monitorStats --> No share packets sent, last packets sent count: ".concat(_currentPacketsSent2, "."));
|
|
19078
|
-
}
|
|
19079
|
-
var _currentFramesEncoded = getSumFromStatsByType(_current3, 'outbound-rtp', 'framesEncoded');
|
|
19080
|
-
var _previousFramesEncoded = getSumFromStatsByType(_previous3, 'outbound-rtp', 'framesEncoded');
|
|
19081
|
-
if (_currentFramesEncoded === _previousFramesEncoded) {
|
|
19082
|
-
getLogger().info("StatsAnalyzer#monitorStats --> No share frames encoded, last frames encoded count: ".concat(_currentFramesEncoded, "."));
|
|
19083
|
-
}
|
|
19084
|
-
var _currentFramesSent = getSumFromStatsByType(_current3, 'outbound-rtp', 'framesSent');
|
|
19085
|
-
var _previousFramesSent = getSumFromStatsByType(_previous3, 'outbound-rtp', 'framesSent');
|
|
19086
|
-
if (_currentFramesSent === _previousFramesSent) {
|
|
19087
|
-
getLogger().info("StatsAnalyzer#monitorStats --> No share frames sent, last frames sent count: ".concat(_currentFramesSent, "."));
|
|
19088
|
-
}
|
|
19030
|
+
var _previous3 = convertToStatsMap(this.previousTransceiverStats.video.receivers);
|
|
19031
|
+
this.statsMonitor.checkInboundVideo(_previous3, _current3);
|
|
19089
19032
|
}
|
|
19090
|
-
emitNetworkQualityEvents('share', _current3);
|
|
19091
19033
|
}
|
|
19092
|
-
if ((_this$meetingMediaSta7 = this.meetingMediaStatus) !== null && _this$meetingMediaSta7 !== void 0 && _this$meetingMediaSta7.expected.
|
|
19093
|
-
var _current4 = convertToStatsMap(transceiverStats.screenShareVideo.
|
|
19034
|
+
if ((_this$meetingMediaSta7 = this.meetingMediaStatus) !== null && _this$meetingMediaSta7 !== void 0 && _this$meetingMediaSta7.expected.sendShare) {
|
|
19035
|
+
var _current4 = convertToStatsMap(transceiverStats.screenShareVideo.senders);
|
|
19094
19036
|
if (this.previousTransceiverStats) {
|
|
19095
|
-
var
|
|
19096
|
-
|
|
19097
|
-
|
|
19098
|
-
|
|
19099
|
-
|
|
19100
|
-
|
|
19101
|
-
|
|
19102
|
-
|
|
19103
|
-
|
|
19104
|
-
|
|
19105
|
-
if (_currentFramesDecoded === _previousFramesDecoded) {
|
|
19106
|
-
getLogger().info("StatsAnalyzer#monitorStats --> No share frames decoded, last frames decoded count: ".concat(_currentFramesDecoded, "."));
|
|
19107
|
-
}
|
|
19108
|
-
var _currentFramesReceived = getSumFromStatsByType(_current4, 'inbound-rtp', 'framesReceived');
|
|
19109
|
-
var _previousFramesReceived = getSumFromStatsByType(_previous4, 'inbound-rtp', 'framesReceived');
|
|
19110
|
-
if (_currentFramesReceived === _previousFramesReceived) {
|
|
19111
|
-
getLogger().info("StatsAnalyzer#monitorStats --> No share frames received, last frames received count: ".concat(_currentFramesReceived, "."));
|
|
19112
|
-
}
|
|
19113
|
-
var _currentFramesDropped = getSumFromStatsByType(_current4, 'inbound-rtp', 'framesDropped');
|
|
19114
|
-
var _previousFramesDropped = getSumFromStatsByType(_previous4, 'inbound-rtp', 'framesDropped');
|
|
19115
|
-
if (_currentFramesDropped - _previousFramesDropped > 10) {
|
|
19116
|
-
getLogger().info("StatsAnalyzer#monitorStats --> Too many share frames dropped, total frames dropped count: ".concat(_currentFramesDropped, "."));
|
|
19117
|
-
}
|
|
19118
|
-
}
|
|
19037
|
+
var _previous4 = convertToStatsMap(this.previousTransceiverStats.screenShareVideo.senders);
|
|
19038
|
+
this.statsMonitor.checkOutboundShare(_previous4, _current4);
|
|
19039
|
+
}
|
|
19040
|
+
emitNetworkQualityEvents('share', _current4);
|
|
19041
|
+
}
|
|
19042
|
+
if ((_this$meetingMediaSta8 = this.meetingMediaStatus) !== null && _this$meetingMediaSta8 !== void 0 && _this$meetingMediaSta8.expected.receiveShare) {
|
|
19043
|
+
var _current5 = convertToStatsMap(transceiverStats.screenShareVideo.receivers);
|
|
19044
|
+
if (this.previousTransceiverStats) {
|
|
19045
|
+
var _previous5 = convertToStatsMap(this.previousTransceiverStats.screenShareVideo.receivers);
|
|
19046
|
+
this.statsMonitor.checkInboundShare(_previous5, _current5);
|
|
19119
19047
|
}
|
|
19120
19048
|
}
|
|
19121
19049
|
this.emitStartStopEvents('audio', getSumFromStatsByType(convertToStatsMap((_this$previousTransce = (_this$previousTransce2 = this.previousTransceiverStats) === null || _this$previousTransce2 === void 0 ? void 0 : _this$previousTransce2.audio.senders) !== null && _this$previousTransce !== void 0 ? _this$previousTransce : []), 'outbound-rtp', 'packetsSent'), getSumFromStatsByType(convertToStatsMap(transceiverStats.audio.senders), 'outbound-rtp', 'packetsSent'), true);
|
|
@@ -19228,6 +19156,155 @@ class NetworkQualityMonitor extends EventEmitter$5 {
|
|
|
19228
19156
|
}
|
|
19229
19157
|
}
|
|
19230
19158
|
|
|
19159
|
+
var MIN_AUDIO_PACKETS_RECEIVER_THRESHOLD = 500;
|
|
19160
|
+
var InboundAudioThresholds = {
|
|
19161
|
+
DecodeResultsInZeroAudioLevel: {
|
|
19162
|
+
concealedRatio: 0.7,
|
|
19163
|
+
lossRatio: 0.2,
|
|
19164
|
+
discardedRatio: 0.5
|
|
19165
|
+
},
|
|
19166
|
+
AllPacketsDiscarded: {
|
|
19167
|
+
discardedRatio: 0.9
|
|
19168
|
+
}
|
|
19169
|
+
};
|
|
19170
|
+
class StatsMonitor extends EventEmitter$5 {
|
|
19171
|
+
hasAudioDecodeIssue(totalAudioEnergy, totalSamplesReceived, concealedRatio, lossRatio, discardedRatio) {
|
|
19172
|
+
var thresholds = InboundAudioThresholds.DecodeResultsInZeroAudioLevel;
|
|
19173
|
+
return totalAudioEnergy === 0 && totalSamplesReceived > 0 && concealedRatio < thresholds.concealedRatio && lossRatio < thresholds.lossRatio && discardedRatio < thresholds.discardedRatio;
|
|
19174
|
+
}
|
|
19175
|
+
checkInboundAudio(previous, current) {
|
|
19176
|
+
var previousPacketsReceived = getSumFromStatsByType(previous, 'inbound-rtp', 'packetsReceived');
|
|
19177
|
+
var packetsReceived = getSumFromStatsByType(current, 'inbound-rtp', 'packetsReceived');
|
|
19178
|
+
var totalSamplesReceived = getSumFromStatsByType(current, 'inbound-rtp', 'totalSamplesReceived');
|
|
19179
|
+
var totalAudioEnergy = getSumFromStatsByType(current, 'inbound-rtp', 'totalAudioEnergy');
|
|
19180
|
+
var packetsDiscarded = getSumFromStatsByType(current, 'inbound-rtp', 'packetsDiscarded');
|
|
19181
|
+
var concealedSamples = getSumFromStatsByType(current, 'inbound-rtp', 'concealedSamples');
|
|
19182
|
+
var packetsLost = getSumFromStatsByType(current, 'inbound-rtp', 'packetsLost');
|
|
19183
|
+
var concealedRatio = totalSamplesReceived > 0 ? concealedSamples / totalSamplesReceived : 0;
|
|
19184
|
+
var lossRatio = packetsReceived + packetsLost > 0 ? packetsLost / (packetsReceived + packetsLost) : 0;
|
|
19185
|
+
var discardedRatio = packetsReceived > 0 ? packetsDiscarded / packetsReceived : 0;
|
|
19186
|
+
if (packetsReceived > MIN_AUDIO_PACKETS_RECEIVER_THRESHOLD && packetsReceived > previousPacketsReceived) {
|
|
19187
|
+
if (this.hasAudioDecodeIssue(totalAudioEnergy, totalSamplesReceived, concealedRatio, lossRatio, discardedRatio)) {
|
|
19188
|
+
getLogger().info("StatsMonitor#checkInboundAudio --> Incoming audio from all streams is not being decoded correctly, totalAudioEnergy: ".concat(totalAudioEnergy, ", totalSamplesReceived: ").concat(totalSamplesReceived, ", packetsReceived: ").concat(packetsReceived, ", concealedRatio: ").concat(concealedRatio, ", lossRatio: ").concat(lossRatio, ", discardedRatio: ").concat(discardedRatio, "."));
|
|
19189
|
+
this.emit(StatsMonitorEventNames.INBOUND_AUDIO_ISSUE, {
|
|
19190
|
+
issueSubType: InboundAudioIssueSubTypes.DECODE_RESULTS_IN_ZERO_AUDIO_LEVEL
|
|
19191
|
+
});
|
|
19192
|
+
} else if (discardedRatio >= InboundAudioThresholds.AllPacketsDiscarded.discardedRatio) {
|
|
19193
|
+
getLogger().info("StatsMonitor#checkInboundAudio --> Incoming audio packets from all streams are being discarded, packetsReceived: ".concat(packetsReceived, ", packetsDiscarded: ").concat(packetsDiscarded, ", discardedRatio: ").concat(discardedRatio, "."));
|
|
19194
|
+
this.emit(StatsMonitorEventNames.INBOUND_AUDIO_ISSUE, {
|
|
19195
|
+
issueSubType: InboundAudioIssueSubTypes.ALL_PACKETS_DISCARDED
|
|
19196
|
+
});
|
|
19197
|
+
}
|
|
19198
|
+
}
|
|
19199
|
+
}
|
|
19200
|
+
checkOutboundAudio(previous, current) {
|
|
19201
|
+
var currentPacketsSent = getSumFromStatsByType(current, 'outbound-rtp', 'packetsSent');
|
|
19202
|
+
var previousPacketsSent = getSumFromStatsByType(previous, 'outbound-rtp', 'packetsSent');
|
|
19203
|
+
if (currentPacketsSent === previousPacketsSent) {
|
|
19204
|
+
getLogger().info("StatsMonitor#checkOutboundAudio --> No audio packets sent, last packets sent count: ".concat(currentPacketsSent, "."));
|
|
19205
|
+
}
|
|
19206
|
+
var totalAudioEnergyExists = getPropertyFromStatsByType(current, 'media-source', 'totalAudioEnergy') !== undefined;
|
|
19207
|
+
if (totalAudioEnergyExists) {
|
|
19208
|
+
var currentTotalAudioEnergy = getSumFromStatsByType(current, 'media-source', 'totalAudioEnergy');
|
|
19209
|
+
var previousTotalAudioEnergy = getSumFromStatsByType(previous, 'media-source', 'totalAudioEnergy');
|
|
19210
|
+
if (currentTotalAudioEnergy === previousTotalAudioEnergy) {
|
|
19211
|
+
getLogger().info("StatsMonitor#checkOutboundAudio --> No audio energy from local audio source, last total audio energy: ".concat(currentTotalAudioEnergy, "."));
|
|
19212
|
+
}
|
|
19213
|
+
}
|
|
19214
|
+
var audioLevelExists = getPropertyFromStatsByType(current, 'media-source', 'audioLevel') !== undefined;
|
|
19215
|
+
if (audioLevelExists) {
|
|
19216
|
+
var currentAudioLevel = getSumFromStatsByType(current, 'media-source', 'audioLevel');
|
|
19217
|
+
if (currentAudioLevel === 0) {
|
|
19218
|
+
getLogger().info("StatsMonitor#checkOutboundAudio --> Audio level in local audio source is 0.");
|
|
19219
|
+
}
|
|
19220
|
+
}
|
|
19221
|
+
}
|
|
19222
|
+
checkInboundVideo(previous, current) {
|
|
19223
|
+
var currentSourceStateArray = getPropertyFromStatsByTypeInArray(current, 'inbound-rtp', 'sourceState');
|
|
19224
|
+
if (currentSourceStateArray.includes('live')) {
|
|
19225
|
+
var currentPacketsReceived = getSumFromStatsByType(current, 'inbound-rtp', 'packetsReceived');
|
|
19226
|
+
var previousPacketsReceived = getSumFromStatsByType(previous, 'inbound-rtp', 'packetsReceived');
|
|
19227
|
+
if (currentPacketsReceived === previousPacketsReceived) {
|
|
19228
|
+
getLogger().info("StatsMonitor#checkInboundVideo --> No video packets received, last packets received count: ".concat(currentPacketsReceived, "."));
|
|
19229
|
+
}
|
|
19230
|
+
var currentFramesDecoded = getSumFromStatsByType(current, 'inbound-rtp', 'framesDecoded');
|
|
19231
|
+
var previousFramesDecoded = getSumFromStatsByType(previous, 'inbound-rtp', 'framesDecoded');
|
|
19232
|
+
if (currentFramesDecoded === previousFramesDecoded) {
|
|
19233
|
+
getLogger().info("StatsMonitor#checkInboundVideo --> No video frames decoded, last frames decoded count: ".concat(currentFramesDecoded, "."));
|
|
19234
|
+
}
|
|
19235
|
+
var currentFramesReceived = getSumFromStatsByType(current, 'inbound-rtp', 'framesReceived');
|
|
19236
|
+
var previousFramesReceived = getSumFromStatsByType(previous, 'inbound-rtp', 'framesReceived');
|
|
19237
|
+
if (currentFramesReceived === previousFramesReceived) {
|
|
19238
|
+
getLogger().info("StatsMonitor#checkInboundVideo --> No video frames received, last frames received count: ".concat(currentFramesReceived, "."));
|
|
19239
|
+
}
|
|
19240
|
+
var currentFramesDropped = getSumFromStatsByType(current, 'inbound-rtp', 'framesDropped');
|
|
19241
|
+
var previousFramesDropped = getSumFromStatsByType(previous, 'inbound-rtp', 'framesDropped');
|
|
19242
|
+
if (currentFramesDropped - previousFramesDropped > 10) {
|
|
19243
|
+
getLogger().info("StatsMonitor#checkInboundVideo --> Too many inbound video frames dropped, total frames dropped count: ".concat(currentFramesDropped, "."));
|
|
19244
|
+
}
|
|
19245
|
+
}
|
|
19246
|
+
}
|
|
19247
|
+
checkOutboundVideo(previous, current) {
|
|
19248
|
+
var currentPacketsSent = getSumFromStatsByType(current, 'outbound-rtp', 'packetsSent');
|
|
19249
|
+
var previousPacketsSent = getSumFromStatsByType(previous, 'outbound-rtp', 'packetsSent');
|
|
19250
|
+
if (currentPacketsSent === previousPacketsSent) {
|
|
19251
|
+
getLogger().info("StatsMonitor#checkOutboundVideo --> No video packets sent, last packets sent count: ".concat(currentPacketsSent, "."));
|
|
19252
|
+
}
|
|
19253
|
+
var currentFramesEncoded = getSumFromStatsByType(current, 'outbound-rtp', 'framesEncoded');
|
|
19254
|
+
var previousFramesEncoded = getSumFromStatsByType(previous, 'outbound-rtp', 'framesEncoded');
|
|
19255
|
+
if (currentFramesEncoded === previousFramesEncoded) {
|
|
19256
|
+
getLogger().info("StatsMonitor#checkOutboundVideo --> No video frames encoded, last frames encoded count: ".concat(currentFramesEncoded, "."));
|
|
19257
|
+
}
|
|
19258
|
+
var currentFramesSent = getSumFromStatsByType(current, 'outbound-rtp', 'framesSent');
|
|
19259
|
+
var previousFramesSent = getSumFromStatsByType(previous, 'outbound-rtp', 'framesSent');
|
|
19260
|
+
if (currentFramesSent === previousFramesSent) {
|
|
19261
|
+
getLogger().info("StatsMonitor#checkOutboundVideo --> No video frames sent, last frames sent count: ".concat(currentFramesSent, "."));
|
|
19262
|
+
}
|
|
19263
|
+
}
|
|
19264
|
+
checkInboundShare(previous, current) {
|
|
19265
|
+
var currentSourceStateArray = getPropertyFromStatsByTypeInArray(current, 'inbound-rtp', 'sourceState');
|
|
19266
|
+
if (currentSourceStateArray.includes('live')) {
|
|
19267
|
+
var currentPacketsReceived = getSumFromStatsByType(current, 'inbound-rtp', 'packetsReceived');
|
|
19268
|
+
var previousPacketsReceived = getSumFromStatsByType(previous, 'inbound-rtp', 'packetsReceived');
|
|
19269
|
+
if (currentPacketsReceived === previousPacketsReceived) {
|
|
19270
|
+
getLogger().info("StatsMonitor#checkInboundShare --> No share packets received, last packets received count: ".concat(currentPacketsReceived, "."));
|
|
19271
|
+
}
|
|
19272
|
+
var currentFramesDecoded = getSumFromStatsByType(current, 'inbound-rtp', 'framesDecoded');
|
|
19273
|
+
var previousFramesDecoded = getSumFromStatsByType(previous, 'inbound-rtp', 'framesDecoded');
|
|
19274
|
+
if (currentFramesDecoded === previousFramesDecoded) {
|
|
19275
|
+
getLogger().info("StatsMonitor#checkInboundShare --> No share frames decoded, last frames decoded count: ".concat(currentFramesDecoded, "."));
|
|
19276
|
+
}
|
|
19277
|
+
var currentFramesReceived = getSumFromStatsByType(current, 'inbound-rtp', 'framesReceived');
|
|
19278
|
+
var previousFramesReceived = getSumFromStatsByType(previous, 'inbound-rtp', 'framesReceived');
|
|
19279
|
+
if (currentFramesReceived === previousFramesReceived) {
|
|
19280
|
+
getLogger().info("StatsMonitor#checkInboundShare --> No share frames received, last frames received count: ".concat(currentFramesReceived, "."));
|
|
19281
|
+
}
|
|
19282
|
+
var currentFramesDropped = getSumFromStatsByType(current, 'inbound-rtp', 'framesDropped');
|
|
19283
|
+
var previousFramesDropped = getSumFromStatsByType(previous, 'inbound-rtp', 'framesDropped');
|
|
19284
|
+
if (currentFramesDropped - previousFramesDropped > 10) {
|
|
19285
|
+
getLogger().info("StatsMonitor#checkInboundShare --> Too many inbound share frames dropped, total frames dropped count: ".concat(currentFramesDropped, "."));
|
|
19286
|
+
}
|
|
19287
|
+
}
|
|
19288
|
+
}
|
|
19289
|
+
checkOutboundShare(previous, current) {
|
|
19290
|
+
var currentPacketsSent = getSumFromStatsByType(current, 'outbound-rtp', 'packetsSent');
|
|
19291
|
+
var previousPacketsSent = getSumFromStatsByType(previous, 'outbound-rtp', 'packetsSent');
|
|
19292
|
+
if (currentPacketsSent === previousPacketsSent) {
|
|
19293
|
+
getLogger().info("StatsMonitor#checkOutboundShare --> No share packets sent, last packets sent count: ".concat(currentPacketsSent, "."));
|
|
19294
|
+
}
|
|
19295
|
+
var currentFramesEncoded = getSumFromStatsByType(current, 'outbound-rtp', 'framesEncoded');
|
|
19296
|
+
var previousFramesEncoded = getSumFromStatsByType(previous, 'outbound-rtp', 'framesEncoded');
|
|
19297
|
+
if (currentFramesEncoded === previousFramesEncoded) {
|
|
19298
|
+
getLogger().info("StatsMonitor#checkOutboundShare --> No share frames encoded, last frames encoded count: ".concat(currentFramesEncoded, "."));
|
|
19299
|
+
}
|
|
19300
|
+
var currentFramesSent = getSumFromStatsByType(current, 'outbound-rtp', 'framesSent');
|
|
19301
|
+
var previousFramesSent = getSumFromStatsByType(previous, 'outbound-rtp', 'framesSent');
|
|
19302
|
+
if (currentFramesSent === previousFramesSent) {
|
|
19303
|
+
getLogger().info("StatsMonitor#checkOutboundShare --> No share frames sent, last frames sent count: ".concat(currentFramesSent, "."));
|
|
19304
|
+
}
|
|
19305
|
+
}
|
|
19306
|
+
}
|
|
19307
|
+
|
|
19231
19308
|
var Media = {
|
|
19232
19309
|
createAudioTrack: createAudioTrack,
|
|
19233
19310
|
createVideoTrack: createVideoTrack,
|
|
@@ -19245,4 +19322,4 @@ var Media = {
|
|
|
19245
19322
|
}
|
|
19246
19323
|
};
|
|
19247
19324
|
|
|
19248
|
-
export { ActiveSpeakerInfo, CodecInfo$1 as CodecInfo, ConnectionState, ErrorType, Errors, H264Codec, LocalCameraStream, LocalDisplayStream, LocalMicrophoneStream, LocalStream, LocalStreamEventNames, LocalSystemAudioStream, Media, MediaConnectionEventNames, MediaContent, MediaFamily, MediaStreamTrackKind, MediaType, MultistreamRoapMediaConnection, NetworkQualityEventNames, NetworkQualityMonitor, PeerConnection, Policy, ReceiveSlot, ReceiveSlotEvents, ReceiverSelectedInfo, RecommendedOpusBitrates, RemoteStream, RemoteStreamEventNames, RemoteTrackType, RoapMediaConnection, SendSlot, StatsAnalyzer, StatsAnalyzerEventNames, StreamEventNames, StreamRequest, WcmeError, WcmeErrorType, configureWcmeLogger, createCameraAndMicrophoneStreams, createCameraStream, createDisplayMedia, createDisplayStream, createDisplayStreamWithAudio, createMicrophoneStream, getAudioInputDevices, getAudioOutputDevices, getDevices, getErrorDescription, getLogger, getMediaFamily, getRecommendedMaxBitrateForFrameSize, getVideoInputDevices, setLogger, setOnDeviceChangeHandler };
|
|
19325
|
+
export { ActiveSpeakerInfo, CodecInfo$1 as CodecInfo, ConnectionState, ErrorType, Errors, H264Codec, InboundAudioIssueSubTypes, LocalCameraStream, LocalDisplayStream, LocalMicrophoneStream, LocalStream, LocalStreamEventNames, LocalSystemAudioStream, Media, MediaConnectionEventNames, MediaContent, MediaFamily, MediaStreamTrackKind, MediaType, MultistreamRoapMediaConnection, NetworkQualityEventNames, NetworkQualityMonitor, PeerConnection, Policy, ReceiveSlot, ReceiveSlotEvents, ReceiverSelectedInfo, RecommendedOpusBitrates, RemoteStream, RemoteStreamEventNames, RemoteTrackType, RoapMediaConnection, SendSlot, StatsAnalyzer, StatsAnalyzerEventNames, StatsMonitor, StatsMonitorEventNames, StreamEventNames, StreamRequest, WcmeError, WcmeErrorType, configureWcmeLogger, createCameraAndMicrophoneStreams, createCameraStream, createDisplayMedia, createDisplayStream, createDisplayStreamWithAudio, createMicrophoneStream, getAudioInputDevices, getAudioOutputDevices, getDevices, getErrorDescription, getLogger, getMediaFamily, getRecommendedMaxBitrateForFrameSize, getVideoInputDevices, setLogger, setOnDeviceChangeHandler };
|
|
@@ -80,8 +80,7 @@ export interface Typegen0 {
|
|
|
80
80
|
};
|
|
81
81
|
eventsCausingGuards: {
|
|
82
82
|
isHandlingOfferRequest: 'REMOTE_OFFER_REQUEST_ARRIVED' | 'done.invoke.roap.creatingLocalOffer:invocation[0]';
|
|
83
|
-
isOkInTransaction: 'done.invoke.roap.settingRemoteAnswer:invocation[0]';
|
|
84
|
-
isOkNotInTransaction: 'REMOTE_OFFER_ARRIVED' | 'REMOTE_OFFER_REQUEST_ARRIVED';
|
|
83
|
+
isOkInTransaction: 'REMOTE_OFFER_ARRIVED' | 'REMOTE_OFFER_REQUEST_ARRIVED' | 'done.invoke.roap.settingRemoteAnswer:invocation[0]';
|
|
85
84
|
isPendingLocalOffer: '' | 'done.invoke.roap.creatingLocalOffer:invocation[0]';
|
|
86
85
|
isSameSeq: 'ERROR_ARRIVED' | 'REMOTE_ANSWER_ARRIVED' | 'REMOTE_OFFER_ARRIVED' | 'REMOTE_OFFER_REQUEST_ARRIVED';
|
|
87
86
|
shouldErrorTriggerOfferRetry: 'ERROR_ARRIVED';
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"roap.typegen.d.ts","sourceRoot":"","sources":["../../../src/MediaConnection/roap.typegen.ts"],"names":[],"mappings":"AAEA,MAAM,WAAW,QAAQ;IACvB,kBAAkB,EAAE,IAAI,CAAC;IACzB,cAAc,EAAE;QACd,EAAE,EAAE;
|
|
1
|
+
{"version":3,"file":"roap.typegen.d.ts","sourceRoot":"","sources":["../../../src/MediaConnection/roap.typegen.ts"],"names":[],"mappings":"AAEA,MAAM,WAAW,QAAQ;IACvB,kBAAkB,EAAE,IAAI,CAAC;IACzB,cAAc,EAAE;QACd,EAAE,EAAE;YAAE,IAAI,EAAE,EAAE,CAAA;SAAE,CAAC;QACjB,mDAAmD,EAAE;YACnD,IAAI,EAAE,mDAAmD,CAAC;YAC1D,IAAI,EAAE,OAAO,CAAC;YACd,KAAK,EAAE,4DAA4D,CAAC;SACrE,CAAC;QACF,oDAAoD,EAAE;YACpD,IAAI,EAAE,oDAAoD,CAAC;YAC3D,IAAI,EAAE,OAAO,CAAC;YACd,KAAK,EAAE,4DAA4D,CAAC;SACrE,CAAC;QACF,mDAAmD,EAAE;YACnD,IAAI,EAAE,mDAAmD,CAAC;YAC1D,IAAI,EAAE,OAAO,CAAC;YACd,KAAK,EAAE,4DAA4D,CAAC;SACrE,CAAC;QACF,sDAAsD,EAAE;YACtD,IAAI,EAAE,sDAAsD,CAAC;YAC7D,IAAI,EAAE,OAAO,CAAC;SACf,CAAC;QACF,uDAAuD,EAAE;YACvD,IAAI,EAAE,uDAAuD,CAAC;YAC9D,IAAI,EAAE,OAAO,CAAC;SACf,CAAC;QACF,sDAAsD,EAAE;YACtD,IAAI,EAAE,sDAAsD,CAAC;YAC7D,IAAI,EAAE,OAAO,CAAC;SACf,CAAC;QACF,aAAa,EAAE;YAAE,IAAI,EAAE,aAAa,CAAA;SAAE,CAAC;KACxC,CAAC;IACF,gBAAgB,EAAE;QAChB,gBAAgB,EAAE,mDAAmD,CAAC;QACtE,kBAAkB,EAAE,oDAAoD,CAAC;QACzE,iBAAiB,EAAE,mDAAmD,CAAC;KACxE,CAAC;IACF,sBAAsB,EAAE;QACtB,OAAO,EAAE,KAAK,CAAC;QACf,QAAQ,EAAE,KAAK,CAAC;QAChB,MAAM,EAAE,KAAK,CAAC;QACd,MAAM,EAAE,KAAK,CAAC;KACf,CAAC;IACF,oBAAoB,EAAE;QACpB,uBAAuB,EAAE,gBAAgB,CAAC;QAC1C,WAAW,EAAE,sBAAsB,GAAG,8BAA8B,CAAC;QACrE,eAAe,EACX,uBAAuB,GACvB,sBAAsB,GACtB,8BAA8B,CAAC;QACnC,oBAAoB,EAAE,eAAe,CAAC;QACtC,WAAW,EAAE,EAAE,GAAG,eAAe,GAAG,gBAAgB,CAAC;QACrD,kCAAkC,EAAE,sDAAsD,CAAC;QAC3F,qBAAqB,EAAE,oDAAoD,CAAC;QAC5E,oBAAoB,EAAE,mDAAmD,CAAC;QAC1E,sBAAsB,EAClB,EAAE,GACF,eAAe,GACf,gBAAgB,GAChB,8BAA8B,GAC9B,mDAAmD,CAAC;QACxD,iBAAiB,EAAE,uBAAuB,CAAC;QAC3C,mCAAmC,EAAE,mDAAmD,CAAC;QACzF,aAAa,EAAE,mBAAmB,GAAG,oDAAoD,CAAC;QAC1F,gBAAgB,EACZ,uDAAuD,GACvD,sDAAsD,CAAC;QAC3D,qBAAqB,EACjB,uBAAuB,GACvB,sBAAsB,GACtB,8BAA8B,GAC9B,mBAAmB,CAAC;QACxB,mBAAmB,EAAE,sBAAsB,GAAG,8BAA8B,CAAC;QAC7E,mBAAmB,EAAE,sBAAsB,CAAC;QAC5C,mBAAmB,EAAE,sBAAsB,GAAG,8BAA8B,CAAC;QAC7E,qBAAqB,EAAE,mDAAmD,CAAC;QAC3E,iBAAiB,EACb,uBAAuB,GACvB,oDAAoD,CAAC;QACzD,oBAAoB,EAAE,mDAAmD,CAAC;QAC1E,4BAA4B,EAAE,mDAAmD,CAAC;QAClF,gBAAgB,EACZ,EAAE,GACF,gBAAgB,GAChB,sBAAsB,GACtB,8BAA8B,CAAC;QACnC,mBAAmB,EAAE,8BAA8B,CAAC;QACpD,uBAAuB,EAAE,uBAAuB,CAAC;QACjD,SAAS,EACL,uBAAuB,GACvB,sBAAsB,GACtB,8BAA8B,GAC9B,mBAAmB,CAAC;KACzB,CAAC;IACF,qBAAqB,EAAE;QACrB,gBAAgB,EACZ,EAAE,GACF,eAAe,GACf,gBAAgB,GAChB,8BAA8B,GAC9B,mDAAmD,CAAC;QACxD,kBAAkB,EAAE,uBAAuB,CAAC;QAC5C,iBAAiB,EAAE,sBAAsB,CAAC;KAC3C,CAAC;IACF,mBAAmB,EAAE;QACnB,sBAAsB,EAClB,8BAA8B,GAC9B,mDAAmD,CAAC;QACxD,iBAAiB,EACb,sBAAsB,GACtB,8BAA8B,GAC9B,oDAAoD,CAAC;QACzD,mBAAmB,EAAE,EAAE,GAAG,mDAAmD,CAAC;QAC9E,SAAS,EACL,eAAe,GACf,uBAAuB,GACvB,sBAAsB,GACtB,8BAA8B,CAAC;QACnC,4BAA4B,EAAE,eAAe,CAAC;KAC/C,CAAC;IACF,mBAAmB,EAAE,EAAE,CAAC;IACxB,aAAa,EACT,cAAc,GACd,oBAAoB,GACpB,MAAM,GACN,aAAa,GACb,qBAAqB,GACrB,oBAAoB,GACpB,kBAAkB,GAClB,cAAc,CAAC;IACnB,IAAI,EAAE,KAAK,CAAC;CACb"}
|
|
@@ -3,6 +3,7 @@ import { MultistreamRoapMediaConnection, RoapMediaConnection } from '../MediaCon
|
|
|
3
3
|
import { NetworkQualityMonitor } from './NetworkQualityMonitor';
|
|
4
4
|
import { StatsAnalyzerEvents } from './eventTypes';
|
|
5
5
|
import { ActualExpectedMediaStatus, StatsAnalyzerConfig } from './types';
|
|
6
|
+
import { StatsMonitor } from './StatsMonitor';
|
|
6
7
|
export declare class StatsAnalyzer extends EventEmitter<StatsAnalyzerEvents> {
|
|
7
8
|
private config;
|
|
8
9
|
private lastEmittedStartStopEvents;
|
|
@@ -12,6 +13,7 @@ export declare class StatsAnalyzer extends EventEmitter<StatsAnalyzerEvents> {
|
|
|
12
13
|
private mqeInterval?;
|
|
13
14
|
private mqeSentCount;
|
|
14
15
|
private networkQualityMonitor;
|
|
16
|
+
private statsMonitor;
|
|
15
17
|
private mediaConnection;
|
|
16
18
|
private statsStarted;
|
|
17
19
|
private mqeIntervalSessionReceiveAudioMainBuilder;
|
|
@@ -23,9 +25,10 @@ export declare class StatsAnalyzer extends EventEmitter<StatsAnalyzerEvents> {
|
|
|
23
25
|
private mqeIntervalSessionTransmitVideoMainBuilder;
|
|
24
26
|
private mqeIntervalSessionTransmitVideoSlidesBuilder;
|
|
25
27
|
private intervalMetadata;
|
|
26
|
-
constructor({ config, networkQualityMonitor, isMultistream, }: {
|
|
28
|
+
constructor({ config, networkQualityMonitor, statsMonitor, isMultistream, }: {
|
|
27
29
|
config: StatsAnalyzerConfig;
|
|
28
30
|
networkQualityMonitor: NetworkQualityMonitor;
|
|
31
|
+
statsMonitor: StatsMonitor;
|
|
29
32
|
isMultistream?: boolean;
|
|
30
33
|
});
|
|
31
34
|
private get builders();
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"StatsAnalyzer.d.ts","sourceRoot":"","sources":["../../../src/StatsAnalyzer/StatsAnalyzer.ts"],"names":[],"mappings":"AAGA,OAAO,EAAE,YAAY,EAAE,MAAM,iBAAiB,CAAC;AAE/C,OAAO,EAAE,8BAA8B,EAAE,mBAAmB,EAAE,MAAM,oBAAoB,CAAC;AAQzF,OAAO,EAAE,qBAAqB,EAAE,MAAM,yBAAyB,CAAC;AAChE,OAAO,EAGL,mBAAmB,EAEpB,MAAM,cAAc,CAAC;AACtB,OAAO,EAAE,yBAAyB,EAAE,mBAAmB,EAAkB,MAAM,SAAS,CAAC;
|
|
1
|
+
{"version":3,"file":"StatsAnalyzer.d.ts","sourceRoot":"","sources":["../../../src/StatsAnalyzer/StatsAnalyzer.ts"],"names":[],"mappings":"AAGA,OAAO,EAAE,YAAY,EAAE,MAAM,iBAAiB,CAAC;AAE/C,OAAO,EAAE,8BAA8B,EAAE,mBAAmB,EAAE,MAAM,oBAAoB,CAAC;AAQzF,OAAO,EAAE,qBAAqB,EAAE,MAAM,yBAAyB,CAAC;AAChE,OAAO,EAGL,mBAAmB,EAEpB,MAAM,cAAc,CAAC;AACtB,OAAO,EAAE,yBAAyB,EAAE,mBAAmB,EAAkB,MAAM,SAAS,CAAC;AAczF,OAAO,EAAE,YAAY,EAAE,MAAM,gBAAgB,CAAC;AAK9C,qBAAa,aAAc,SAAQ,YAAY,CAAC,mBAAmB,CAAC;IAClE,OAAO,CAAC,MAAM,CAAsB;IAEpC,OAAO,CAAC,0BAA0B,CAAkC;IAEpE,OAAO,CAAC,wBAAwB,CAAC,CAAmB;IAEpD,OAAO,CAAC,kBAAkB,CAAC,CAA4B;IAEvD,OAAO,CAAC,aAAa,CAAC,CAAgC;IAEtD,OAAO,CAAC,WAAW,CAAC,CAAgC;IAEpD,OAAO,CAAC,YAAY,CAAK;IAEzB,OAAO,CAAC,qBAAqB,CAAwB;IAErD,OAAO,CAAC,YAAY,CAAe;IAEnC,OAAO,CAAC,eAAe,CAAqE;IAE5F,OAAO,CAAC,YAAY,CAAS;IAE7B,OAAO,CAAC,yCAAyC,CAAwC;IAEzF,OAAO,CAAC,2CAA2C,CAAwC;IAE3F,OAAO,CAAC,0CAA0C,CAAyC;IAE3F,OAAO,CAAC,4CAA4C,CAAyC;IAE7F,OAAO,CAAC,yCAAyC,CAAwC;IAEzF,OAAO,CAAC,2CAA2C,CAAwC;IAE3F,OAAO,CAAC,0CAA0C,CAAyC;IAE3F,OAAO,CAAC,4CAA4C,CAAyC;IAG7F,OAAO,CAAC,gBAAgB,CAItB;gBAUU,EACV,MAAM,EACN,qBAAqB,EACrB,YAAY,EACZ,aAAqB,GACtB,EAAE;QACD,MAAM,EAAE,mBAAmB,CAAC;QAC5B,qBAAqB,EAAE,qBAAqB,CAAC;QAC7C,YAAY,EAAE,YAAY,CAAC;QAC3B,aAAa,CAAC,EAAE,OAAO,CAAC;KACzB;IA8CD,OAAO,KAAK,QAAQ,GAWnB;IAeM,iBAAiB,IAAI,MAAM,GAAG,SAAS;IAqEvC,cAAc,IAAI,MAAM,GAAG,SAAS;IA0B3C,IAAI,+BAA+B,IAAI,MAAM,GAAG,SAAS,CAQxD;IAQD,OAAO,KAAK,eAAe,GAY1B;IASD,OAAO,KAAK,aAAa,GAmBxB;IAOM,iBAAiB,CAAC,MAAM,EAAE,OAAO,CAAC,yBAAyB,CAAC;IAsBnE,OAAO,CAAC,WAAW;IAuFN,aAAa,CACxB,eAAe,EAAE,8BAA8B,GAAG,mBAAmB;IA6B1D,YAAY;IAkCzB,OAAO,CAAC,mBAAmB,CAkDzB;YAKY,iBAAiB;IAiE/B,OAAO,CAAC,YAAY;CA6LrB"}
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
import { StatsMap } from './types';
|
|
2
|
+
import { StatsMonitorEvents } from './eventTypes';
|
|
3
|
+
import { EventEmitter } from '../EventEmitter';
|
|
4
|
+
export declare class StatsMonitor extends EventEmitter<StatsMonitorEvents> {
|
|
5
|
+
private hasAudioDecodeIssue;
|
|
6
|
+
checkInboundAudio(previous: StatsMap, current: StatsMap): void;
|
|
7
|
+
checkOutboundAudio(previous: StatsMap, current: StatsMap): void;
|
|
8
|
+
checkInboundVideo(previous: StatsMap, current: StatsMap): void;
|
|
9
|
+
checkOutboundVideo(previous: StatsMap, current: StatsMap): void;
|
|
10
|
+
checkInboundShare(previous: StatsMap, current: StatsMap): void;
|
|
11
|
+
checkOutboundShare(previous: StatsMap, current: StatsMap): void;
|
|
12
|
+
}
|
|
13
|
+
//# sourceMappingURL=StatsMonitor.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"StatsMonitor.d.ts","sourceRoot":"","sources":["../../../src/StatsAnalyzer/StatsMonitor.ts"],"names":[],"mappings":"AAOA,OAAO,EAAE,QAAQ,EAAE,MAAM,SAAS,CAAC;AACnC,OAAO,EAGL,kBAAkB,EACnB,MAAM,cAAc,CAAC;AACtB,OAAO,EAAE,YAAY,EAAE,MAAM,iBAAiB,CAAC;AAe/C,qBAAa,YAAa,SAAQ,YAAY,CAAC,kBAAkB,CAAC;IAChE,OAAO,CAAC,mBAAmB;IAuB3B,iBAAiB,CAAC,QAAQ,EAAE,QAAQ,EAAE,OAAO,EAAE,QAAQ;IA0DvD,kBAAkB,CAAC,QAAQ,EAAE,QAAQ,EAAE,OAAO,EAAE,QAAQ;IAwDxD,iBAAiB,CAAC,QAAQ,EAAE,QAAQ,EAAE,OAAO,EAAE,QAAQ;IAoEvD,kBAAkB,CAAC,QAAQ,EAAE,QAAQ,EAAE,OAAO,EAAE,QAAQ;IAqCxD,iBAAiB,CAAC,QAAQ,EAAE,QAAQ,EAAE,OAAO,EAAE,QAAQ;IAoEvD,kBAAkB,CAAC,QAAQ,EAAE,QAAQ,EAAE,OAAO,EAAE,QAAQ;CA+BzD"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"StatsMonitor.test.d.ts","sourceRoot":"","sources":["../../../src/StatsAnalyzer/StatsMonitor.test.ts"],"names":[],"mappings":""}
|
|
@@ -40,5 +40,18 @@ interface NetworkQualityEvent {
|
|
|
40
40
|
export interface NetworkQualityMonitorEvents extends EventMap {
|
|
41
41
|
[NetworkQualityEventNames.NETWORK_QUALITY]: (event: NetworkQualityEvent) => void;
|
|
42
42
|
}
|
|
43
|
+
export declare enum StatsMonitorEventNames {
|
|
44
|
+
INBOUND_AUDIO_ISSUE = "INBOUND_AUDIO_ISSUE"
|
|
45
|
+
}
|
|
46
|
+
export declare enum InboundAudioIssueSubTypes {
|
|
47
|
+
DECODE_RESULTS_IN_ZERO_AUDIO_LEVEL = "DECODE_RESULTS_IN_ZERO_AUDIO_LEVEL",
|
|
48
|
+
ALL_PACKETS_DISCARDED = "ALL_PACKETS_DISCARDED"
|
|
49
|
+
}
|
|
50
|
+
export interface InboundAudioIssueEvent {
|
|
51
|
+
issueSubType: InboundAudioIssueSubTypes;
|
|
52
|
+
}
|
|
53
|
+
export interface StatsMonitorEvents extends EventMap {
|
|
54
|
+
[StatsMonitorEventNames.INBOUND_AUDIO_ISSUE]: (event: InboundAudioIssueEvent) => void;
|
|
55
|
+
}
|
|
43
56
|
export {};
|
|
44
57
|
//# sourceMappingURL=eventTypes.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"eventTypes.d.ts","sourceRoot":"","sources":["../../../src/StatsAnalyzer/eventTypes.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,MAAM,eAAe,CAAC;AACzC,OAAO,EAAE,cAAc,EAAE,MAAM,SAAS,CAAC;AACzC,OAAO,EAAE,WAAW,EAAE,MAAM,YAAY,CAAC;AAEzC,oBAAY,uBAAuB;IACjC,aAAa,kBAAkB;IAC/B,mBAAmB,wBAAwB;IAC3C,mBAAmB,wBAAwB;IAC3C,oBAAoB,yBAAyB;IAC7C,oBAAoB,yBAAyB;CAC9C;
|
|
1
|
+
{"version":3,"file":"eventTypes.d.ts","sourceRoot":"","sources":["../../../src/StatsAnalyzer/eventTypes.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,MAAM,eAAe,CAAC;AACzC,OAAO,EAAE,cAAc,EAAE,MAAM,SAAS,CAAC;AACzC,OAAO,EAAE,WAAW,EAAE,MAAM,YAAY,CAAC;AAEzC,oBAAY,uBAAuB;IACjC,aAAa,kBAAkB;IAC/B,mBAAmB,wBAAwB;IAC3C,mBAAmB,wBAAwB;IAC3C,oBAAoB,yBAAyB;IAC7C,oBAAoB,yBAAyB;CAC9C;AACD,MAAM,WAAW,iBAAiB;IAChC,IAAI,EAAE,WAAW,CAAC;CACnB;AAED,MAAM,WAAW,mBAAmB;IAClC,SAAS,EAAE,cAAc,CAAC;CAC3B;AAED,MAAM,WAAW,mBAAoB,SAAQ,QAAQ;IACnD,CAAC,uBAAuB,CAAC,aAAa,CAAC,EAAE,CAAC,KAAK,EAAE,iBAAiB,KAAK,IAAI,CAAC;IAC5E,CAAC,uBAAuB,CAAC,mBAAmB,CAAC,EAAE,CAAC,KAAK,EAAE,mBAAmB,KAAK,IAAI,CAAC;IACpF,CAAC,uBAAuB,CAAC,mBAAmB,CAAC,EAAE,CAAC,KAAK,EAAE,mBAAmB,KAAK,IAAI,CAAC;IACpF,CAAC,uBAAuB,CAAC,oBAAoB,CAAC,EAAE,CAAC,KAAK,EAAE,mBAAmB,KAAK,IAAI,CAAC;IACrF,CAAC,uBAAuB,CAAC,oBAAoB,CAAC,EAAE,CAAC,KAAK,EAAE,mBAAmB,KAAK,IAAI,CAAC;CACtF;AAED,oBAAY,8BAA8B,GAAG;IAC3C,KAAK,EAAE,uBAAuB,CAAC,mBAAmB,GAAG,uBAAuB,CAAC,mBAAmB,CAAC;IACjG,MAAM,EACF,uBAAuB,CAAC,oBAAoB,GAC5C,uBAAuB,CAAC,oBAAoB,CAAC;CAClD,CAAC;AAEF,oBAAY,0BAA0B,GAAG,OAAO,CAAC;IAC/C,KAAK,EAAE,OAAO,CAAC,8BAA8B,CAAC,CAAC;IAC/C,KAAK,EAAE,OAAO,CAAC,8BAA8B,CAAC,CAAC;IAC/C,KAAK,EAAE,OAAO,CAAC,8BAA8B,CAAC,CAAC;CAChD,CAAC,CAAC;AAEH,oBAAY,wBAAwB;IAClC,eAAe,oBAAoB;CACpC;AAED,UAAU,mBAAmB;IAC3B,SAAS,EAAE,MAAM,CAAC;IAClB,mBAAmB,EAAE,MAAM,CAAC;CAC7B;AAED,MAAM,WAAW,2BAA4B,SAAQ,QAAQ;IAC3D,CAAC,wBAAwB,CAAC,eAAe,CAAC,EAAE,CAAC,KAAK,EAAE,mBAAmB,KAAK,IAAI,CAAC;CAClF;AAED,oBAAY,sBAAsB;IAChC,mBAAmB,wBAAwB;CAC5C;AAED,oBAAY,yBAAyB;IACnC,kCAAkC,uCAAuC;IACzE,qBAAqB,0BAA0B;CAChD;AAED,MAAM,WAAW,sBAAsB;IACrC,YAAY,EAAE,yBAAyB,CAAC;CACzC;AAED,MAAM,WAAW,kBAAmB,SAAQ,QAAQ;IAClD,CAAC,sBAAsB,CAAC,mBAAmB,CAAC,EAAE,CAAC,KAAK,EAAE,sBAAsB,KAAK,IAAI,CAAC;CACvF"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/StatsAnalyzer/index.ts"],"names":[],"mappings":"AAAA,cAAc,iBAAiB,CAAC;AAChC,cAAc,yBAAyB,CAAC;AACxC,cAAc,cAAc,CAAC;AAC7B,OAAO,EAAE,yBAAyB,EAAE,MAAM,SAAS,CAAC"}
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/StatsAnalyzer/index.ts"],"names":[],"mappings":"AAAA,cAAc,iBAAiB,CAAC;AAChC,cAAc,yBAAyB,CAAC;AACxC,cAAc,cAAc,CAAC;AAC7B,cAAc,gBAAgB,CAAC;AAC/B,OAAO,EAAE,yBAAyB,EAAE,MAAM,SAAS,CAAC"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@webex/internal-media-core",
|
|
3
|
-
"version": "2.
|
|
3
|
+
"version": "2.19.0",
|
|
4
4
|
"files": [
|
|
5
5
|
"dist/cjs",
|
|
6
6
|
"dist/esm",
|
|
@@ -60,7 +60,7 @@
|
|
|
60
60
|
"@webex/rtcstats": "^1.5.5",
|
|
61
61
|
"@webex/ts-sdp": "1.8.2",
|
|
62
62
|
"@webex/web-capabilities": "^1.6.1",
|
|
63
|
-
"@webex/web-client-media-engine": "3.
|
|
63
|
+
"@webex/web-client-media-engine": "3.34.0",
|
|
64
64
|
"events": "^3.3.0",
|
|
65
65
|
"ip-anonymize": "^0.1.0",
|
|
66
66
|
"typed-emitter": "^2.1.0",
|