UNPKG

rtp.js

Version:

RTP stack for Node.js and browser written in TypeScript

191 lines (190 loc) 6.1 kB
"use strict"; Object.defineProperty(exports, "__esModule", { value: true }); exports.EcnExtendedReport = void 0; const ExtendedReport_1 = require("./ExtendedReport"); const ECN_EXTENDED_REPORT_LENGTH = ExtendedReport_1.COMMON_HEADER_LENGTH + 20; /** * ECN Summary 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=13 | reserved | block length = 5 | * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ * | SSRC of Media Sender | * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ * | ECT (0) Counter | * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ * | ECT (1) Counter | * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ * | ECN-CE Counter | not-ECT Counter | * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ * | Lost Packets Counter | Duplication Counter | * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ * ``` * * @category RTCP Extended Reports * * @see * - [RFC 6679 section 5.2](https://datatracker.ietf.org/doc/html/rfc6679#section-5.2) */ class EcnExtendedReport extends ExtendedReport_1.ExtendedReport { /** * @param view - If given it will be parsed. Otherwise an empty ECN Summary * Extended Report will be created. */ constructor(view) { super(ExtendedReport_1.ExtendedReportType.ECN, view); if (!this.view) { this.view = new DataView(new ArrayBuffer(ECN_EXTENDED_REPORT_LENGTH)); // Write report type. this.writeCommonHeader(); return; } if (this.view.byteLength !== ECN_EXTENDED_REPORT_LENGTH) { throw new TypeError('wrong byte length for a ECN Summary Extended Report'); } } /** * Dump ECN Summary Extended Report info. */ dump() { return { ...super.dump(), ssrc: this.getSsrc(), ect0Counter: this.getEct0Counter(), ect1Counter: this.getEct1Counter(), ecnCeCounter: this.getEcnCeCounter(), nonEctCounter: this.getNonEctCounter(), lostPacketsCounter: this.getLostPacketsCounter(), duplicationCounter: this.getDuplicationCounter(), }; } /** * @inheritDoc */ getByteLength() { return ECN_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, ECN_EXTENDED_REPORT_LENGTH - ExtendedReport_1.COMMON_HEADER_LENGTH), pos); // Move to the end. pos += ECN_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 EcnExtendedReport(view); } /** * Get SSRC of media sender. */ getSsrc() { return this.view.getUint32(4); } /** * Set SSRC of media sender. */ setSsrc(ssrc) { this.view.setUint32(4, ssrc); this.setSerializationNeeded(true); } /** * Get ECT (0) Counter. */ getEct0Counter() { return this.view.getUint32(8); } /** * Set ECT (0) Counter. */ setEct0Counter(counter) { this.view.setUint32(8, counter); this.setSerializationNeeded(true); } /** * Get ECT (1) Counter. */ getEct1Counter() { return this.view.getUint32(12); } /** * Set ECT (1) Counter. */ setEct1Counter(counter) { this.view.setUint32(12, counter); this.setSerializationNeeded(true); } /** * Get ECN-CE Counter. */ getEcnCeCounter() { return this.view.getUint16(16); } /** * Set ECN-CE Counter. */ setEcnCeCounter(counter) { this.view.setUint16(16, counter); this.setSerializationNeeded(true); } /** * Get not-ECT Counter. */ getNonEctCounter() { return this.view.getUint16(18); } /** * Set not-ECT Counter. */ setNonEctCounter(counter) { this.view.setUint16(18, counter); this.setSerializationNeeded(true); } /** * Get Lost Packets Counter. */ getLostPacketsCounter() { return this.view.getUint16(20); } /** * Set Lost Packets Counter. */ setLostPacketsCounter(counter) { this.view.setUint16(20, counter); this.setSerializationNeeded(true); } /** * Get Duplication Counter. */ getDuplicationCounter() { return this.view.getUint16(22); } /** * Set Duplication Counter. */ setDuplicationCounter(counter) { this.view.setUint16(22, counter); this.setSerializationNeeded(true); } } exports.EcnExtendedReport = EcnExtendedReport;