diff --git a/packages/node_modules/@webex/plugin-meetings/src/statsAnalyzer/index.js b/packages/node_modules/@webex/plugin-meetings/src/statsAnalyzer/index.js index 7ace53af894..0639fcdb52c 100644 --- a/packages/node_modules/@webex/plugin-meetings/src/statsAnalyzer/index.js +++ b/packages/node_modules/@webex/plugin-meetings/src/statsAnalyzer/index.js @@ -50,6 +50,7 @@ export default class StatsAnalyzer extends EventsScope { audio: {send: {}, recv: {}}, share: {send: {}, recv: {}} }; + this.lastPacketLoss = {video: {recv: [], send: []}}; } /** @@ -87,6 +88,13 @@ export default class StatsAnalyzer extends EventsScope { lastMqaDataSent: this.lastMqaDataSent }); + this.lastPacketLoss.video.send.push(videoSender.common.remoteLossRate); + this.lastPacketLoss.video.recv.push(videoReceiver.common.mediaHopByHopLost); + + console.log('remote packet loss TX ', videoSender.common.remoteLossRate); + console.log('remote packet loss RX ', videoReceiver.common.mediaHopByHopLost); + + this.mqaSentCount = this.mqaSentCount + 1; mqaData.intervals[0].intervalNumber = this.mqaSentCount; @@ -371,7 +379,7 @@ export default class StatsAnalyzer extends EventsScope { // Check the over all packet Lost ratio this.statsResults[mediaType][sendrecvType].avaragePacketsLostRatio = result.packetsLost / result.packetsReceived; - this.statsResults[mediaType][sendrecvType].currentPacketLossRatio = this.statsResults[mediaType][sendrecvType].currentPacketsLost / this.statsResults.internal[mediaType][sendrecvType].packetsReceived; + this.statsResults[mediaType][sendrecvType].currentPacketLossRatio = this.statsResults[mediaType][sendrecvType].currentPacketsLost / this.statsResults[mediaType][sendrecvType].packetsReceived; if (this.statsResults[mediaType][sendrecvType].currentPacketLossRatio > 3) { LoggerProxy.logger.log('StatsAnalyzer:index#processInboundRTPResult --> Packets getting lost from the receiver ', this.statsResults[mediaType][sendrecvType].currentPacketLossRatio); } @@ -502,7 +510,7 @@ export default class StatsAnalyzer extends EventsScope { this.statsResults.resolutions[mediaType][sendrecvType].hugeFramesSent = result.hugeFramesSent; } - if (result.framesReceived && result.framesDecoded && result.framesDropped) { + if (result.framesReceived || result.framesDecoded || result.framesDropped) { this.statsResults.resolutions[mediaType][sendrecvType].framesReceived = result.framesReceived; this.statsResults.resolutions[mediaType][sendrecvType].framesDecoded = result.framesDecoded; this.statsResults.resolutions[mediaType][sendrecvType].framesDropped = result.framesDropped; diff --git a/packages/node_modules/@webex/plugin-meetings/src/statsAnalyzer/mqaUtil.js b/packages/node_modules/@webex/plugin-meetings/src/statsAnalyzer/mqaUtil.js index f25106f3c11..fa59759f35a 100644 --- a/packages/node_modules/@webex/plugin-meetings/src/statsAnalyzer/mqaUtil.js +++ b/packages/node_modules/@webex/plugin-meetings/src/statsAnalyzer/mqaUtil.js @@ -8,11 +8,11 @@ export const getAudioReceiverMqa = ({audioReceiver, statsResults, lastMqaDataSen // Hop by hop are numbers and not percentage so we compare on what we sent the last min audioReceiver.common.mediaHopByHopLost = (statsResults[mediaType][sendrecvType].totalPacketsLost - lastMqaDataSent[mediaType][sendrecvType].totalPacketsLost) || 0; audioReceiver.common.rtpHopByHopLost = statsResults[mediaType][sendrecvType].totalPacketsLost - lastMqaDataSent[mediaType][sendrecvType].totalPacketsLost || 0; - audioReceiver.streams[0].common.rtpJitter = statsResults[mediaType][sendrecvType].rtpJitter; + audioReceiver.streams[0].common.rtpJitter = statsResults[mediaType][sendrecvType].jitter * 1000; audioReceiver.streams[0].common.endToEndLost = statsResults[mediaType][sendrecvType].totalPacketsLost - lastMqaDataSent[mediaType][sendrecvType].totalPacketsLost || 0; audioReceiver.streams[0].common.framesReceived = statsResults.resolutions[mediaType][sendrecvType].framesReceived - lastMqaDataSent.resolutions[mediaType][sendrecvType].framesReceived || 0; - audioReceiver.streams[0].common.receivedFrameRate = audioReceiver.streams[0].common.framesReceived / 60 || 0; + audioReceiver.streams[0].common.receivedFrameRate = audioReceiver.streams[0].common.framesReceived * 100 / 60 || 0; audioReceiver.streams[0].common.receivedBitrate = (statsResults[mediaType][sendrecvType].totalBytesReceived - lastMqaDataSent[mediaType][sendrecvType].totalBytesReceived) * 8 / 60 || 0; }; @@ -21,7 +21,7 @@ export const getAudioSenderMqa = ({audioSender, statsResults, lastMqaDataSent}) const mediaType = 'audio'; const sendrecvType = 'send'; - audioSender.common.remoteJitter = statsResults[mediaType][sendrecvType].remoteJitter; + audioSender.common.remoteJitter = statsResults[mediaType][sendrecvType].remoteJitter * 1000; audioSender.common.rtpPackets = statsResults[mediaType][sendrecvType].totalPacketsSent - lastMqaDataSent[mediaType][sendrecvType].totalPacketsSent || 0; // From candidate-pair @@ -30,7 +30,7 @@ export const getAudioSenderMqa = ({audioSender, statsResults, lastMqaDataSent}) const totalpacketsLostForaMin = statsResults[mediaType][sendrecvType].totalPacketsLostOnReceiver - lastMqaDataSent[mediaType][sendrecvType].totalPacketsLostOnReceiver; - audioSender.common.remoteLossRate = totalpacketsLostForaMin > 0 ? (totalpacketsLostForaMin) * 100 / audioSender.common.rtpPackets : 0; // This is the packets sent with in last min || 0; + audioSender.common.remoteLossRate = totalpacketsLostForaMin > 0 ? (totalpacketsLostForaMin * 100 / audioSender.common.rtpPackets) : 0; // This is the packets sent with in last min || 0; audioSender.common.roundTripTime = statsResults[mediaType][sendrecvType].roundTripTime * 1000 || 0; audioSender.streams[0].common.rtpPackets = statsResults[mediaType][sendrecvType].totalPacketsSent - lastMqaDataSent[mediaType][sendrecvType].totalPacketsSent || 0; @@ -50,28 +50,43 @@ export const getVideoReceiverMqa = ({videoReceiver, statsResults, lastMqaDataSen // collect the packets received for the last min videoReceiver.streams[0].common.rtpPackets = statsResults[mediaType][sendrecvType].totalPacketsReceived - lastMqaDataSent[mediaType][sendrecvType].totalPacketsReceived || 0; + + const totalPacketLoss = (statsResults[mediaType][sendrecvType].totalPacketsLost - lastMqaDataSent[mediaType][sendrecvType].totalPacketsLost) || 0; + // Hope by hop are numbers and not percentage so we compare on what we sent the last min - videoReceiver.common.mediaHopByHopLost = (statsResults[mediaType][sendrecvType].totalPacketsLost - lastMqaDataSent[mediaType][sendrecvType].totalPacketsLost) || 0; // TODO: calculate the value - videoReceiver.common.rtpHopByHopLost = statsResults[mediaType][sendrecvType].totalPacketsLost - lastMqaDataSent[mediaType][sendrecvType].totalPacketsLost || 0; // TODO: calculate the value - videoReceiver.streams[0].common.rtpJitter = statsResults[mediaType][sendrecvType].rtpJitter; - videoReceiver.streams[0].common.endToEndLost = statsResults[mediaType][sendrecvType].totalPacketsLost - lastMqaDataSent[mediaType][sendrecvType].totalPacketsLost || 0;// TODO: calculate the value - videoReceiver.streams[0].common.framesReceived = statsResults.resolutions[mediaType][sendrecvType].framesReceived - lastMqaDataSent.resolutions[mediaType][sendrecvType].framesReceived || 0; - videoReceiver.streams[0].common.receivedFrameRate = videoReceiver.streams[0].common.framesReceived / 60 || 0; - videoReceiver.streams[0].common.receivedBitrate = (statsResults[mediaType][sendrecvType].totalBytesReceived - lastMqaDataSent[mediaType][sendrecvType].totalBytesReceived) * 8 / 60 || 0; + videoReceiver.common.mediaHopByHopLost = totalPacketLoss; // TODO: calculate the value + videoReceiver.common.rtpHopByHopLost = totalPacketLoss; // TODO: calculate the value + videoReceiver.streams[0].common.rtpJitter = statsResults[mediaType][sendrecvType].jitter * 1000; + videoReceiver.streams[0].common.endToEndLost = totalPacketLoss;// TODO: calculate the value + + // Calculate the outgoing bitrate + const totalBytesReceivedInaMin = statsResults[mediaType][sendrecvType].totalBytesReceived - lastMqaDataSent[mediaType][sendrecvType].totalBytesReceived; + + videoReceiver.streams[0].common.transmittedBitrate = totalBytesReceivedInaMin ? (totalBytesReceivedInaMin) * 8 / 60 : 0; + // From tracks //TODO: calculate a proper one + const totalFrameReceivedInaMin = statsResults.resolutions[mediaType][sendrecvType].framesReceived - lastMqaDataSent.resolutions[mediaType][sendrecvType].framesReceived; + + videoReceiver.streams[0].common.receivedFrameRate = totalFrameReceivedInaMin ? totalFrameReceivedInaMin * 100 / 60 : 0; + + videoReceiver.streams[0].receivedHeight = statsResults.resolutions[mediaType][sendrecvType].height; + videoReceiver.streams[0].receivedWidth = statsResults.resolutions[mediaType][sendrecvType].width; }; export const getVideoSenderMqa = ({videoSender, statsResults, lastMqaDataSent}) => { const mediaType = 'video'; const sendrecvType = 'send'; - videoSender.common.remoteJitter = statsResults[mediaType][sendrecvType].remoteJitter; + videoSender.common.remoteJitter = statsResults[mediaType][sendrecvType].remoteJitter * 1000; videoSender.common.rtpPackets = statsResults[mediaType][sendrecvType].totalPacketsSent - lastMqaDataSent[mediaType][sendrecvType].totalPacketsSent || 0; videoSender.common.availableBitRate = statsResults[mediaType][sendrecvType].availableOutgoingBitrate || 0; // Calculate based on how much packets lost of received compated to how to the client sent const totalpacketsLostForaMin = statsResults[mediaType][sendrecvType].totalPacketsLostOnReceiver - lastMqaDataSent[mediaType][sendrecvType].totalPacketsLostOnReceiver; - videoSender.common.remoteLossRate = totalpacketsLostForaMin > 0 ? (totalpacketsLostForaMin) * 100 / videoSender.common.rtpPackets : 0; // This is the packets sent with in last min || 0; + videoSender.common.remoteLossRate = totalpacketsLostForaMin > 0 ? (totalpacketsLostForaMin) * 100 / (videoSender.common.rtpPackets + totalpacketsLostForaMin) : 0; // This is the packets sent with in last min || 0; + + console.log('Packets send ', videoSender.common.rtpPackets); + console.log('Total packets lost ', totalpacketsLostForaMin); videoSender.common.roundTripTime = statsResults[mediaType][sendrecvType].roundTripTime * 1000 || 0; videoSender.streams[0].common.rtpPackets = statsResults[mediaType][sendrecvType].totalPacketsSent - lastMqaDataSent[mediaType][sendrecvType].totalPacketsSent; @@ -83,9 +98,9 @@ export const getVideoSenderMqa = ({videoSender, statsResults, lastMqaDataSent}) videoSender.streams[0].requestedKeyFrames = statsResults[mediaType][sendrecvType].totalFirCount - lastMqaDataSent[mediaType][sendrecvType].totalFirCount || 0; // From tracks //TODO: calculate a proper one - const totalFrameSentInaMin = statsResults.resolutions[mediaType][sendrecvType].framesSent - lastMqaDataSent.resolutions[mediaType][sendrecvType].framesSent; + const totalFrameSentInaMin = statsResults.resolutions[mediaType][sendrecvType].framesSent - (lastMqaDataSent.resolutions[mediaType][sendrecvType].framesSent || 0); - videoSender.streams[0].common.transmittedFrameRate = totalFrameSentInaMin ? totalFrameSentInaMin / 60 : 0; + videoSender.streams[0].common.transmittedFrameRate = totalFrameSentInaMin ? totalFrameSentInaMin * 100 / 60 : 0; videoSender.streams[0].transmittedHeight = statsResults.resolutions[mediaType][sendrecvType].height; videoSender.streams[0].transmittedWidth = statsResults.resolutions[mediaType][sendrecvType].width; };