rtp.js
Version:
RTP stack for Node.js and browser written in TypeScript
437 lines (436 loc) • 12.4 kB
JavaScript
"use strict";
Object.defineProperty(exports, "__esModule", { value: true });
exports.VmExtendedReport = void 0;
const ExtendedReport_1 = require("./ExtendedReport");
const bitOps_1 = require("../../../utils/bitOps");
const VM_EXTENDED_REPORT_LENGTH = ExtendedReport_1.COMMON_HEADER_LENGTH + 32;
/**
* VoIP Metrics Extended Report.
*
* ```text
* 0 1 2 3
* 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1
* +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
* | BT=7 | reserved | block length = 8 |
* +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
* | SSRC of source |
* +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
* | loss rate | discard rate | burst density | gap density |
* +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
* | burst duration | gap duration |
* +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
* | round trip delay | end system delay |
* +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
* | signal level | noise level | RERL | Gmin |
* +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
* | R factor | ext. R factor | MOS-LQ | MOS-CQ |
* +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
* | RX config | reserved | JB nominal |
* +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
* | JB maximum | JB abs max |
* +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
* ```
*
* @category RTCP Extended Reports
*
* @see
* - [RFC 3611 section 4.7](https://datatracker.ietf.org/doc/html/rfc3611#section-4.7)
*/
class VmExtendedReport extends ExtendedReport_1.ExtendedReport {
/**
* @param view - If given it will be parsed. Otherwise an empty VoIP Metrics
* Extended Report will be created.
*/
constructor(view) {
super(ExtendedReport_1.ExtendedReportType.VM, view);
if (!this.view) {
this.view = new DataView(new ArrayBuffer(VM_EXTENDED_REPORT_LENGTH));
// Write report type.
this.writeCommonHeader();
return;
}
if (this.view.byteLength !== VM_EXTENDED_REPORT_LENGTH) {
throw new TypeError('wrong byte length for a VoIP Metrics Extended Report');
}
}
/**
* Dump VoIP Metrics Extended Report info.
*/
dump() {
return {
...super.dump(),
ssrc: this.getSsrc(),
lossRate: this.getLossRate(),
discardRate: this.getDiscardRate(),
burstDensity: this.getBurstDensity(),
gapDensity: this.getGapDensity(),
burstDuration: this.getBurstDuration(),
gapDuration: this.getGapDuration(),
roundTripDelay: this.getRoundTripDelay(),
endSystemDelay: this.getEndSystemDelay(),
signalLevel: this.getSignalLevel(),
noiseLevel: this.getNoiseLevel(),
rerl: this.getResidualEchoReturnLoss(),
gmin: this.getGmin(),
rFactor: this.getRFactor(),
extRFactor: this.getExternalRFactor(),
mosLq: this.getMosLQ(),
mosCq: this.getMosCQ(),
plc: this.getPacketLossConcealment(),
jba: this.getJitterBufferAdaptive(),
jbRate: this.getJitterBufferRate(),
jbNominal: this.getJitterBufferNominalDelay(),
jbMax: this.getJitterBufferMaximumDelay(),
jbAbsMax: this.getJitterBufferAbsoluteMaximumDelay(),
};
}
/**
* @inheritDoc
*/
getByteLength() {
return VM_EXTENDED_REPORT_LENGTH;
}
/**
* @inheritDoc
*/
serialize(buffer, byteOffset) {
const view = this.serializeBase(buffer, byteOffset);
const uint8Array = new Uint8Array(view.buffer, view.byteOffset, view.byteLength);
// Position relative to the DataView byte offset.
let pos = 0;
// Move to the fixed header fields after the common header.
pos += ExtendedReport_1.COMMON_HEADER_LENGTH;
// Copy the rest of the Extended Report into the new buffer.
uint8Array.set(new Uint8Array(this.view.buffer, this.view.byteOffset + pos, VM_EXTENDED_REPORT_LENGTH - ExtendedReport_1.COMMON_HEADER_LENGTH), pos);
// Move to the end.
pos += VM_EXTENDED_REPORT_LENGTH - ExtendedReport_1.COMMON_HEADER_LENGTH;
if (pos !== view.byteLength) {
throw new RangeError(`filled length (${pos} bytes) does not match the available buffer size (${view.byteLength} bytes)`);
}
// Update DataView.
this.view = view;
this.setSerializationNeeded(false);
}
/**
* @inheritDoc
*/
clone(buffer, byteOffset, serializationBuffer, serializationByteOffset) {
const view = this.cloneInternal(buffer, byteOffset, serializationBuffer, serializationByteOffset);
return new VmExtendedReport(view);
}
/**
* Get SSRC of source.
*/
getSsrc() {
return this.view.getUint32(4);
}
/**
* Set SSRC of source.
*/
setSsrc(ssrc) {
this.view.setUint32(4, ssrc);
this.setSerializationNeeded(true);
}
/**
* Get loss rate.
*/
getLossRate() {
return this.view.getUint8(8);
}
/**
* Set loss rate.
*/
setLossRate(lossRate) {
this.view.setUint8(8, lossRate);
this.setSerializationNeeded(true);
}
/**
* Get discard rate.
*/
getDiscardRate() {
return this.view.getUint8(9);
}
/**
* Set discard rate.
*/
setDiscardRate(discardRate) {
this.view.setUint8(9, discardRate);
this.setSerializationNeeded(true);
}
/**
* Get burst density.
*/
getBurstDensity() {
return this.view.getUint8(10);
}
/**
* Set burst density.
*/
setBurstDensity(burstDensity) {
this.view.setUint8(10, burstDensity);
this.setSerializationNeeded(true);
}
/**
* Get gap density.
*/
getGapDensity() {
return this.view.getUint8(11);
}
/**
* Set gap density.
*/
setGapDensity(gapDensity) {
this.view.setUint8(11, gapDensity);
this.setSerializationNeeded(true);
}
/**
* Get burst duration.
*/
getBurstDuration() {
return this.view.getUint16(12);
}
/**
* Set burst duration.
*/
setBurstDuration(burstDuration) {
this.view.setUint16(12, burstDuration);
this.setSerializationNeeded(true);
}
/**
* Get gap duration.
*/
getGapDuration() {
return this.view.getUint16(14);
}
/**
* Set gap duration.
*/
setGapDuration(gapDuration) {
this.view.setUint16(14, gapDuration);
this.setSerializationNeeded(true);
}
/**
* Get round trip delay.
*/
getRoundTripDelay() {
return this.view.getUint16(16);
}
/**
* Set round trip delay.
*/
setRoundTripDelay(delay) {
this.view.setUint16(16, delay);
this.setSerializationNeeded(true);
}
/**
* Get end system delay.
*/
getEndSystemDelay() {
return this.view.getUint16(18);
}
/**
* Set end system delay.
*/
setEndSystemDelay(delay) {
this.view.setUint16(18, delay);
this.setSerializationNeeded(true);
}
/**
* Get signal level.
*/
getSignalLevel() {
return this.view.getUint8(20);
}
/**
* Set signal level.
*/
setSignalLevel(level) {
this.view.setUint8(20, level);
this.setSerializationNeeded(true);
}
/**
* Get noise level.
*/
getNoiseLevel() {
return this.view.getUint8(21);
}
/**
* Set noise level.
*/
setNoiseLevel(level) {
this.view.setUint8(21, level);
this.setSerializationNeeded(true);
}
/**
* Get residual echo return loss.
*/
getResidualEchoReturnLoss() {
return this.view.getUint8(22);
}
/**
* Set residual echo return loss.
*/
setResidualEchoReturnLoss(loss) {
this.view.setUint8(22, loss);
this.setSerializationNeeded(true);
}
/**
* Get Gmin.
*/
getGmin() {
return this.view.getUint8(23);
}
/**
* Set Gmin.
*/
setGmin(value) {
this.view.setUint8(23, value);
this.setSerializationNeeded(true);
}
/**
* Get R factor.
*/
getRFactor() {
return this.view.getUint8(24);
}
/**
* Set R factor.
*/
setRFactor(factor) {
this.view.setUint8(24, factor);
this.setSerializationNeeded(true);
}
/**
* Get external R factor.
*/
getExternalRFactor() {
return this.view.getUint8(25);
}
/**
* Set external R factor.
*/
setExternalRFactor(factor) {
this.view.setUint8(25, factor);
this.setSerializationNeeded(true);
}
/**
* Get MOS-LQ.
*/
getMosLQ() {
return this.view.getUint8(26);
}
/**
* Set MOS-LQ.
*/
setMosLQ(value) {
this.view.setUint8(26, value);
this.setSerializationNeeded(true);
}
/**
* Get MOS-CQ.
*/
getMosCQ() {
return this.view.getUint8(27);
}
/**
* Set MOS-CQ.
*/
setMosCQ(value) {
this.view.setUint8(27, value);
this.setSerializationNeeded(true);
}
/**
* Get packet loss concealment (PLC).
*/
getPacketLossConcealment() {
return (0, bitOps_1.readBitsInDataView)({ view: this.view, pos: 28, mask: 0b11000000 });
}
/**
* Set packet loss concealment (PLC).
*/
setPacketLossConcealment(value) {
(0, bitOps_1.writeBitsInDataView)({
view: this.view,
pos: 28,
mask: 0b11000000,
value: value,
});
this.setSerializationNeeded(true);
}
/**
* Get jitter buffer adaptive (JBA).
*/
getJitterBufferAdaptive() {
return (0, bitOps_1.readBitsInDataView)({ view: this.view, pos: 28, mask: 0b00110000 });
}
/**
* Set jitter buffer adaptive (JBA).
*/
setJitterBufferAdaptive(value) {
(0, bitOps_1.writeBitsInDataView)({
view: this.view,
pos: 28,
mask: 0b00110000,
value: value,
});
this.setSerializationNeeded(true);
}
/**
* Get jitter buffer rate (JB rate).
*/
getJitterBufferRate() {
return (0, bitOps_1.readBitsInDataView)({ view: this.view, pos: 28, mask: 0b00001111 });
}
/**
* Set jitter buffer rate (JB rate).
*/
setJitterBufferRate(value) {
(0, bitOps_1.writeBitsInDataView)({
view: this.view,
pos: 28,
mask: 0b00001111,
value: value,
});
this.setSerializationNeeded(true);
}
/**
* Get jitter buffer nominal delay.
*/
getJitterBufferNominalDelay() {
return this.view.getUint16(30);
}
/**
* Set jitter buffer nominal delay.
*/
setJitterBufferNominalDelay(delay) {
this.view.setUint16(30, delay);
this.setSerializationNeeded(true);
}
/**
* Get jitter buffer maximum delay.
*/
getJitterBufferMaximumDelay() {
return this.view.getUint16(32);
}
/**
* Set jitter buffer maximum delay.
*/
setJitterBufferMaximumDelay(delay) {
this.view.setUint16(32, delay);
this.setSerializationNeeded(true);
}
/**
* Get jitter buffer absolute maximum delay.
*/
getJitterBufferAbsoluteMaximumDelay() {
return this.view.getUint16(34);
}
/**
* Set jitter buffer absolute maximum delay.
*/
setJitterBufferAbsoluteMaximumDelay(delay) {
this.view.setUint16(34, delay);
this.setSerializationNeeded(true);
}
}
exports.VmExtendedReport = VmExtendedReport;