UNPKG

@observertc/client-monitor-js

Version:

ObserveRTC Client Integration Javascript Library

1 lines 6.41 kB
import{positiveDelta as t}from"../utils/common";export class OutboundRtpMonitor{_peerConnection;_visited=!0;timestamp;id;ssrc;kind;qualityLimitationDurations;transportId;codecId;packetsSent;bytesSent;mid;mediaSourceId;remoteId;rid;encodingIndex;headerBytesSent;retransmittedPacketsSent;retransmittedBytesSent;rtxSsrc;targetBitrate;totalEncodedBytesTarget;frameWidth;frameHeight;framesPerSecond;framesSent;hugeFramesSent;framesEncoded;keyFramesEncoded;qpSum;psnrSum;psnrMeasurements;totalEncodeTime;totalPacketSendDelay;qualityLimitationReason;qualityLimitationResolutionChanges;nackCount;firCount;pliCount;encoderImplementation;powerEfficientEncoder;active;scalabilityMode;packetsSentWithEct1;bitrate;payloadBitrate;packetRate;bitPerPixel;deltaPacketsSent;deltaBytesSent;deltaHeaderBytesSent;deltaRetransmittedPacketsSent;deltaRetransmittedBytesSent;deltaFramesSent;deltaFramesEncoded;deltaKeyFramesEncoded;deltaHugeFramesSent;deltaTotalEncodeTime;deltaTotalPacketSendDelay;deltaQpSum;deltaNackCount;deltaFirCount;deltaPliCount;encodeTimePerFrameInMs;retransmissionRatio;retransmittedPacketRatio;avgQpPerFrame;avgPacketSendDelayInMs;keyFrameRate;nackRate;pliRate;firRate;qualityLimitationDurationShares;attachments;appData;constructor(t,e){this._peerConnection=t,this.id=e.id,this.timestamp=e.timestamp,this.ssrc=e.ssrc,this.kind=e.kind,Object.assign(this,e)}get visited(){const t=this._visited;return this._visited=!1,t}get trackIdentifier(){return this.getMediaSource()?.trackIdentifier}getPeerConnection(){return this._peerConnection}getRemoteInboundRtp(){return this._peerConnection.mappedRemoteInboundRtpMonitors.get(this.ssrc)}getCodec(){return this._peerConnection.mappedCodecMonitors.get(this.codecId??"")}getMediaSource(){return this._peerConnection.mappedMediaSourceMonitors.get(this.mediaSourceId??"")}getTrack(){return this.getMediaSource()?.getTrack()??this._peerConnection.mappedOutboundTracks.get(this.trackIdentifier??"")}accept(e){this._visited=!0;const i=e.timestamp-this.timestamp;if(i<=0)return;const a=i/1e3;if(this.deltaPacketsSent=t(e.packetsSent,this.packetsSent),void 0!==this.deltaPacketsSent&&(this.packetRate=this.deltaPacketsSent/a),this.deltaBytesSent=t(e.bytesSent,this.bytesSent),this.deltaHeaderBytesSent=t(e.headerBytesSent,this.headerBytesSent),this.deltaRetransmittedBytesSent=t(e.retransmittedBytesSent,this.retransmittedBytesSent),this.deltaRetransmittedPacketsSent=t(e.retransmittedPacketsSent,this.retransmittedPacketsSent),void 0!==this.deltaBytesSent){if(this.bitrate=Math.max(0,8*this.deltaBytesSent/a),void 0!==this.deltaHeaderBytesSent){const t=this.deltaBytesSent-this.deltaHeaderBytesSent-(this.deltaRetransmittedBytesSent??0);this.payloadBitrate=Math.max(0,8*t/a)}this.retransmissionRatio=this.deltaBytesSent>0&&void 0!==this.deltaRetransmittedBytesSent?Math.min(1,this.deltaRetransmittedBytesSent/this.deltaBytesSent):0}void 0!==this.deltaPacketsSent&&void 0!==this.deltaRetransmittedPacketsSent&&(this.retransmittedPacketRatio=this.deltaPacketsSent>0?Math.min(1,this.deltaRetransmittedPacketsSent/this.deltaPacketsSent):0),this.deltaFramesSent=t(e.framesSent,this.framesSent),this.deltaFramesEncoded=t(e.framesEncoded,this.framesEncoded),this.deltaKeyFramesEncoded=t(e.keyFramesEncoded,this.keyFramesEncoded),this.deltaHugeFramesSent=t(e.hugeFramesSent,this.hugeFramesSent),this.deltaTotalEncodeTime=t(e.totalEncodeTime,this.totalEncodeTime),this.deltaTotalPacketSendDelay=t(e.totalPacketSendDelay,this.totalPacketSendDelay),this.deltaQpSum=t(e.qpSum,this.qpSum),this.deltaNackCount=t(e.nackCount,this.nackCount),this.deltaFirCount=t(e.firCount,this.firCount),this.deltaPliCount=t(e.pliCount,this.pliCount),void 0!==this.deltaFramesEncoded&&this.deltaFramesEncoded>0&&(void 0!==this.deltaTotalEncodeTime&&(this.encodeTimePerFrameInMs=1e3*this.deltaTotalEncodeTime/this.deltaFramesEncoded),void 0!==this.deltaQpSum&&(this.avgQpPerFrame=this.deltaQpSum/this.deltaFramesEncoded)),void 0!==this.deltaTotalPacketSendDelay&&void 0!==this.deltaPacketsSent&&this.deltaPacketsSent>0&&(this.avgPacketSendDelayInMs=1e3*this.deltaTotalPacketSendDelay/this.deltaPacketsSent),void 0!==this.deltaKeyFramesEncoded&&(this.keyFrameRate=this.deltaKeyFramesEncoded/a),void 0!==this.deltaNackCount&&(this.nackRate=this.deltaNackCount/a),void 0!==this.deltaPliCount&&(this.pliRate=this.deltaPliCount/a),void 0!==this.deltaFirCount&&(this.firRate=this.deltaFirCount/a),this.qualityLimitationDurationShares=this._calculateQualityLimitationShares(this.qualityLimitationDurations,e.qualityLimitationDurations),Object.assign(this,e),this.frameWidth&&this.frameHeight&&this.framesPerSecond&&this.bitrate&&(this.bitPerPixel=this.bitrate/(this.frameHeight*this.frameWidth*this.framesPerSecond))}_calculateQualityLimitationShares(t,e){if(!e)return;if(!t)return;const i=(t,e)=>Math.max(0,(t??0)-(e??0)),a=i(e.none,t.none),s=i(e.cpu,t.cpu),n=i(e.bandwidth,t.bandwidth),d=i(e.other,t.other),r=a+s+n+d;return r<=0?void 0:{none:a/r,cpu:s/r,bandwidth:n/r,other:d/r}}createSample(){return{timestamp:this.timestamp,id:this.id,ssrc:this.ssrc,kind:this.kind,qualityLimitationDurations:this.qualityLimitationDurations,transportId:this.transportId,codecId:this.codecId,packetsSent:this.packetsSent,bytesSent:this.bytesSent,mid:this.mid,mediaSourceId:this.mediaSourceId,remoteId:this.remoteId,rid:this.rid,encodingIndex:this.encodingIndex,headerBytesSent:this.headerBytesSent,retransmittedPacketsSent:this.retransmittedPacketsSent,retransmittedBytesSent:this.retransmittedBytesSent,rtxSsrc:this.rtxSsrc,targetBitrate:this.targetBitrate,totalEncodedBytesTarget:this.totalEncodedBytesTarget,frameWidth:this.frameWidth,frameHeight:this.frameHeight,framesPerSecond:this.framesPerSecond,framesSent:this.framesSent,hugeFramesSent:this.hugeFramesSent,framesEncoded:this.framesEncoded,keyFramesEncoded:this.keyFramesEncoded,qpSum:this.qpSum,psnrSum:this.psnrSum,psnrMeasurements:this.psnrMeasurements,totalEncodeTime:this.totalEncodeTime,totalPacketSendDelay:this.totalPacketSendDelay,qualityLimitationReason:this.qualityLimitationReason,qualityLimitationResolutionChanges:this.qualityLimitationResolutionChanges,nackCount:this.nackCount,firCount:this.firCount,pliCount:this.pliCount,encoderImplementation:this.encoderImplementation,powerEfficientEncoder:this.powerEfficientEncoder,active:this.active,scalabilityMode:this.scalabilityMode,packetsSentWithEct1:this.packetsSentWithEct1,attachments:this.attachments}}}