werift 0.18.12 → 0.18.14
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/lib/common/src/index.d.ts +0 -1
- package/lib/common/src/index.js +0 -1
- package/lib/common/src/index.js.map +1 -1
- package/lib/ice/src/ice.js +6 -2
- package/lib/ice/src/ice.js.map +1 -1
- package/lib/ice/src/stun/transaction.js +3 -1
- package/lib/ice/src/stun/transaction.js.map +1 -1
- package/lib/ice/src/turn/protocol.d.ts +1 -1
- package/lib/ice/src/turn/protocol.js +6 -3
- package/lib/ice/src/turn/protocol.js.map +1 -1
- package/lib/ice/src/types/model.d.ts +1 -1
- package/lib/ice/src/types/model.js.map +1 -1
- package/lib/rtp/src/container/index.d.ts +2 -1
- package/lib/rtp/src/container/index.js +2 -1
- package/lib/rtp/src/container/index.js.map +1 -1
- package/lib/rtp/src/container/mp4/container.d.ts +66 -0
- package/lib/rtp/src/container/mp4/container.js +262 -0
- package/lib/rtp/src/container/mp4/container.js.map +1 -0
- package/lib/rtp/src/container/mp4/exp-golomb.d.ts +20 -0
- package/lib/rtp/src/container/mp4/exp-golomb.js +144 -0
- package/lib/rtp/src/container/mp4/exp-golomb.js.map +1 -0
- package/lib/rtp/src/container/mp4/h264.d.ts +42 -0
- package/lib/rtp/src/container/mp4/h264.js +240 -0
- package/lib/rtp/src/container/mp4/h264.js.map +1 -0
- package/lib/rtp/src/container/mp4/index.d.ts +2 -0
- package/lib/rtp/src/container/mp4/index.js +19 -0
- package/lib/rtp/src/container/mp4/index.js.map +1 -0
- package/lib/rtp/src/container/mp4/mp4box.d.ts +5 -0
- package/lib/rtp/src/container/mp4/mp4box.js +32 -0
- package/lib/rtp/src/container/mp4/mp4box.js.map +1 -0
- package/lib/rtp/src/container/mp4/sps-parser.d.ts +40 -0
- package/lib/rtp/src/container/mp4/sps-parser.js +291 -0
- package/lib/rtp/src/container/mp4/sps-parser.js.map +1 -0
- package/lib/rtp/src/container/ogg/index.d.ts +1 -0
- package/lib/rtp/src/container/ogg/index.js +18 -0
- package/lib/rtp/src/container/ogg/index.js.map +1 -0
- package/lib/rtp/src/container/ogg/parser.d.ts +12 -0
- package/lib/rtp/src/container/ogg/parser.js +100 -0
- package/lib/rtp/src/container/ogg/parser.js.map +1 -0
- package/lib/rtp/src/container/{webm.d.ts → webm/container.d.ts} +1 -1
- package/lib/rtp/src/container/{webm.js → webm/container.js} +6 -6
- package/lib/rtp/src/container/webm/container.js.map +1 -0
- package/lib/rtp/src/container/webm/ebml/ebml.js.map +1 -0
- package/lib/rtp/src/container/webm/ebml/id.js.map +1 -0
- package/lib/rtp/src/container/webm/ebml/index.js.map +1 -0
- package/lib/rtp/src/container/webm/ebml/typedArrayUtils.js.map +1 -0
- package/lib/rtp/src/container/webm/index.d.ts +2 -0
- package/lib/rtp/src/container/webm/index.js +19 -0
- package/lib/rtp/src/container/webm/index.js.map +1 -0
- package/lib/rtp/src/processor/index.d.ts +2 -0
- package/lib/rtp/src/processor/index.js +2 -0
- package/lib/rtp/src/processor/index.js.map +1 -1
- package/lib/rtp/src/processor/mp4.d.ts +50 -0
- package/lib/rtp/src/processor/mp4.js +162 -0
- package/lib/rtp/src/processor/mp4.js.map +1 -0
- package/lib/rtp/src/processor/mp4Callback.d.ts +12 -0
- package/lib/rtp/src/processor/mp4Callback.js +83 -0
- package/lib/rtp/src/processor/mp4Callback.js.map +1 -0
- package/lib/rtp/src/processor/mute.js +6 -3
- package/lib/rtp/src/processor/mute.js.map +1 -1
- package/lib/rtp/src/processor/nack.js +2 -3
- package/lib/rtp/src/processor/nack.js.map +1 -1
- package/lib/rtp/src/processor/webm.d.ts +1 -1
- package/lib/rtp/src/processor/webm.js +1 -1
- package/lib/rtp/src/processor/webm.js.map +1 -1
- package/lib/rtp/src/processor/webmCallback.d.ts +1 -1
- package/lib/rtp/src/processor/webmCallback.js.map +1 -1
- package/lib/rtp/src/processor/webmStream.d.ts +1 -1
- package/lib/rtp/src/processor/webmStream.js.map +1 -1
- package/lib/rtp/src/rtcp/rr.js +2 -6
- package/lib/rtp/src/rtcp/rr.js.map +1 -1
- package/lib/rtp/src/rtcp/rtpfb/nack.js +5 -12
- package/lib/rtp/src/rtcp/rtpfb/nack.js.map +1 -1
- package/lib/rtp/src/rtcp/rtpfb/twcc.js +11 -7
- package/lib/rtp/src/rtcp/rtpfb/twcc.js.map +1 -1
- package/lib/rtp/src/rtcp/sr.js +1 -5
- package/lib/rtp/src/rtcp/sr.js.map +1 -1
- package/lib/rtp/src/rtp/headerExtension.d.ts +5 -0
- package/lib/rtp/src/rtp/headerExtension.js +35 -9
- package/lib/rtp/src/rtp/headerExtension.js.map +1 -1
- package/lib/webrtc/src/nonstandard/recorder/writer/webm.js.map +1 -1
- package/lib/webrtc/src/utils.d.ts +1 -0
- package/lib/webrtc/src/utils.js +9 -1
- package/lib/webrtc/src/utils.js.map +1 -1
- package/package.json +1 -1
- package/src/nonstandard/recorder/writer/webm.ts +1 -1
- package/src/utils.ts +9 -0
- package/lib/common/src/array.d.ts +0 -1
- package/lib/common/src/array.js +0 -15
- package/lib/common/src/array.js.map +0 -1
- package/lib/rtp/src/container/ebml/ebml.js.map +0 -1
- package/lib/rtp/src/container/ebml/id.js.map +0 -1
- package/lib/rtp/src/container/ebml/index.js.map +0 -1
- package/lib/rtp/src/container/ebml/typedArrayUtils.js.map +0 -1
- package/lib/rtp/src/container/webm.js.map +0 -1
- /package/lib/rtp/src/container/{ebml → webm/ebml}/ebml.d.ts +0 -0
- /package/lib/rtp/src/container/{ebml → webm/ebml}/ebml.js +0 -0
- /package/lib/rtp/src/container/{ebml → webm/ebml}/id.d.ts +0 -0
- /package/lib/rtp/src/container/{ebml → webm/ebml}/id.js +0 -0
- /package/lib/rtp/src/container/{ebml → webm/ebml}/index.d.ts +0 -0
- /package/lib/rtp/src/container/{ebml → webm/ebml}/index.js +0 -0
- /package/lib/rtp/src/container/{ebml → webm/ebml}/typedArrayUtils.d.ts +0 -0
- /package/lib/rtp/src/container/{ebml → webm/ebml}/typedArrayUtils.js +0 -0
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"rr.js","sourceRoot":"","sources":["../../../../../rtp/src/rtcp/rr.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"rr.js","sourceRoot":"","sources":["../../../../../rtp/src/rtcp/rr.ts"],"names":[],"mappings":"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","sourcesContent":["import { bufferReader, bufferWriter } from \"../../../common/src\";\nimport { RtcpPacketConverter } from \"./rtcp\";\n\nexport class RtcpRrPacket {\n ssrc: number = 0;\n reports: RtcpReceiverInfo[] = [];\n static readonly type = 201;\n readonly type = RtcpRrPacket.type;\n\n constructor(props: Partial<RtcpRrPacket> = {}) {\n Object.assign(this, props);\n }\n\n serialize() {\n let payload = bufferWriter([4], [this.ssrc]);\n payload = Buffer.concat([\n payload,\n ...this.reports.map((report) => report.serialize()),\n ]);\n return RtcpPacketConverter.serialize(\n RtcpRrPacket.type,\n this.reports.length,\n payload,\n Math.floor(payload.length / 4)\n );\n }\n\n static deSerialize(data: Buffer, count: number) {\n const [ssrc] = bufferReader(data, [4]);\n let pos = 4;\n const reports: RtcpReceiverInfo[] = [];\n for (let _ = 0; _ < count; _++) {\n reports.push(RtcpReceiverInfo.deSerialize(data.slice(pos, pos + 24)));\n pos += 24;\n }\n return new RtcpRrPacket({ ssrc, reports });\n }\n}\n\nexport class RtcpReceiverInfo {\n ssrc!: number;\n fractionLost!: number;\n packetsLost!: number;\n highestSequence!: number;\n jitter!: number;\n /**last SR */\n lsr!: number;\n /**delay since last SR */\n dlsr!: number;\n\n constructor(props: Partial<RtcpReceiverInfo> = {}) {\n Object.assign(this, props);\n }\n\n toJSON() {\n return {\n ssrc: this.ssrc,\n fractionLost: this.fractionLost,\n packetsLost: this.packetsLost,\n highestSequence: this.highestSequence,\n jitter: this.jitter,\n lsr: this.lsr,\n dlsr: this.dlsr,\n };\n }\n\n serialize() {\n return bufferWriter(\n [4, 1, 3, 4, 4, 4, 4],\n [\n this.ssrc,\n this.fractionLost,\n this.packetsLost,\n this.highestSequence,\n this.jitter,\n this.lsr,\n this.dlsr,\n ]\n );\n }\n\n static deSerialize(data: Buffer) {\n const [\n ssrc,\n fractionLost,\n packetsLost,\n highestSequence,\n jitter,\n lsr,\n dlsr,\n ] = bufferReader(data, [4, 1, 3, 4, 4, 4, 4]);\n\n return new RtcpReceiverInfo({\n ssrc,\n fractionLost,\n packetsLost,\n highestSequence,\n jitter,\n lsr,\n dlsr,\n });\n }\n}\n"]}
|
|
@@ -1,10 +1,6 @@
|
|
|
1
1
|
"use strict";
|
|
2
|
-
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
3
|
-
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
4
|
-
};
|
|
5
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
6
3
|
exports.GenericNack = void 0;
|
|
7
|
-
const range_1 = __importDefault(require("lodash/range"));
|
|
8
4
|
const src_1 = require("../../../../common/src");
|
|
9
5
|
const header_1 = require("../header");
|
|
10
6
|
const _1 = require(".");
|
|
@@ -65,19 +61,16 @@ class GenericNack {
|
|
|
65
61
|
}
|
|
66
62
|
static deSerialize(data, header) {
|
|
67
63
|
const [senderSsrc, mediaSourceSsrc] = (0, src_1.bufferReader)(data, [4, 4]);
|
|
68
|
-
const lost =
|
|
69
|
-
|
|
70
|
-
const lost = [];
|
|
64
|
+
const lost = [];
|
|
65
|
+
for (let pos = 8; pos < data.length; pos += 4) {
|
|
71
66
|
const [pid, blp] = (0, src_1.bufferReader)(data.subarray(pos), [2, 2]);
|
|
72
67
|
lost.push(pid);
|
|
73
|
-
(
|
|
68
|
+
for (let diff = 0; diff < 16; diff++) {
|
|
74
69
|
if ((blp >> diff) & 1) {
|
|
75
70
|
lost.push(pid + diff + 1);
|
|
76
71
|
}
|
|
77
|
-
}
|
|
78
|
-
|
|
79
|
-
})
|
|
80
|
-
.flatMap((v) => v);
|
|
72
|
+
}
|
|
73
|
+
}
|
|
81
74
|
return new GenericNack({
|
|
82
75
|
header,
|
|
83
76
|
senderSsrc,
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"nack.js","sourceRoot":"","sources":["../../../../../../rtp/src/rtcp/rtpfb/nack.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"nack.js","sourceRoot":"","sources":["../../../../../../rtp/src/rtcp/rtpfb/nack.ts"],"names":[],"mappings":"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","sourcesContent":["import { bufferReader, bufferWriter } from \"../../../../common/src\";\nimport { RtcpHeader } from \"../header\";\nimport { RtcpTransportLayerFeedback } from \".\";\n\n// 0 1 2 3\n// 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\n// +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+\n// | PID | BLP |\n// +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+\n\n// Packet ID (PID)\n// bitmask of following lost packets (BLP):\n\nexport class GenericNack {\n static count = 1;\n readonly count = GenericNack.count;\n header!: RtcpHeader;\n senderSsrc!: number;\n mediaSourceSsrc!: number;\n lost: number[] = [];\n\n toJSON() {\n return {\n lost: this.lost,\n senderSsrc: this.senderSsrc,\n mediaSourceSsrc: this.mediaSourceSsrc,\n };\n }\n\n constructor(props: Partial<GenericNack> = {}) {\n Object.assign(this, props);\n if (!this.header) {\n this.header = new RtcpHeader({\n type: RtcpTransportLayerFeedback.type,\n count: this.count,\n version: 2,\n });\n }\n }\n\n static deSerialize(data: Buffer, header: RtcpHeader) {\n const [senderSsrc, mediaSourceSsrc] = bufferReader(data, [4, 4]);\n\n const lost: number[] = [];\n for (let pos = 8; pos < data.length; pos += 4) {\n const [pid, blp] = bufferReader(data.subarray(pos), [2, 2]);\n lost.push(pid);\n for (let diff = 0; diff < 16; diff++) {\n if ((blp >> diff) & 1) {\n lost.push(pid + diff + 1);\n }\n }\n }\n\n return new GenericNack({\n header,\n senderSsrc,\n mediaSourceSsrc,\n lost,\n });\n }\n\n serialize() {\n const ssrcPair = bufferWriter(\n [4, 4],\n [this.senderSsrc, this.mediaSourceSsrc]\n );\n\n const fci: Buffer[] = [];\n if (this.lost.length > 0) {\n let headPid = this.lost[0],\n blp = 0;\n this.lost.slice(1).forEach((pid) => {\n const diff = pid - headPid - 1;\n if (diff >= 0 && diff < 16) {\n blp |= 1 << diff;\n } else {\n fci.push(bufferWriter([2, 2], [headPid, blp]));\n headPid = pid;\n blp = 0;\n }\n });\n fci.push(bufferWriter([2, 2], [headPid, blp]));\n }\n const buf = Buffer.concat([ssrcPair, Buffer.concat(fci)]);\n this.header.length = buf.length / 4;\n return Buffer.concat([this.header.serialize(), buf]);\n }\n}\n"]}
|
|
@@ -5,7 +5,6 @@ var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
|
5
5
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
6
6
|
exports.PacketResult = exports.PacketStatus = exports.PacketChunk = exports.RecvDelta = exports.StatusVectorChunk = exports.RunLengthChunk = exports.TransportWideCC = void 0;
|
|
7
7
|
const debug_1 = __importDefault(require("debug"));
|
|
8
|
-
const range_1 = __importDefault(require("lodash/range"));
|
|
9
8
|
const src_1 = require("../../../../common/src");
|
|
10
9
|
const header_1 = require("../header");
|
|
11
10
|
const log = (0, debug_1.default)("werift/rtp/rtcp/rtpfb/twcc");
|
|
@@ -134,9 +133,9 @@ class TransportWideCC {
|
|
|
134
133
|
PacketStatus.TypeTCCPacketReceivedSmallDelta ||
|
|
135
134
|
packetStatus.packetStatus ===
|
|
136
135
|
PacketStatus.TypeTCCPacketReceivedLargeDelta) {
|
|
137
|
-
(0
|
|
136
|
+
for (let _ = 0; _ < packetNumberToProcess; _++) {
|
|
138
137
|
recvDeltas.push(new RecvDelta({ type: packetStatus.packetStatus }));
|
|
139
|
-
}
|
|
138
|
+
}
|
|
140
139
|
}
|
|
141
140
|
processedPacketNum += packetNumberToProcess;
|
|
142
141
|
}
|
|
@@ -338,14 +337,19 @@ class StatusVectorChunk {
|
|
|
338
337
|
const type = PacketChunk.TypeTCCStatusVectorChunk;
|
|
339
338
|
let symbolSize = (0, src_1.getBit)(data[0], 1, 1);
|
|
340
339
|
const symbolList = [];
|
|
340
|
+
function range(n, cb) {
|
|
341
|
+
for (let i = 0; i < n; i++) {
|
|
342
|
+
cb(i);
|
|
343
|
+
}
|
|
344
|
+
}
|
|
341
345
|
switch (symbolSize) {
|
|
342
346
|
case 0:
|
|
343
|
-
(
|
|
344
|
-
(
|
|
347
|
+
range(6, (i) => symbolList.push((0, src_1.getBit)(data[0], 2 + i, 1)));
|
|
348
|
+
range(8, (i) => symbolList.push((0, src_1.getBit)(data[1], i, 1)));
|
|
345
349
|
break;
|
|
346
350
|
case 1:
|
|
347
|
-
(
|
|
348
|
-
(
|
|
351
|
+
range(3, (i) => symbolList.push((0, src_1.getBit)(data[0], 2 + i * 2, 2)));
|
|
352
|
+
range(4, (i) => symbolList.push((0, src_1.getBit)(data[1], i * 2, 2)));
|
|
349
353
|
break;
|
|
350
354
|
default:
|
|
351
355
|
symbolSize = ((0, src_1.getBit)(data[0], 2, 6) << 8) + data[1];
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"twcc.js","sourceRoot":"","sources":["../../../../../../rtp/src/rtcp/rtpfb/twcc.ts"],"names":[],"mappings":"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","sourcesContent":["import debug from \"debug\";\nimport range from \"lodash/range\";\n\nimport {\n BitWriter2,\n bufferReader,\n bufferWriter,\n getBit,\n} from \"../../../../common/src\";\nimport { RtcpHeader } from \"../header\";\n\nconst log = debug(\"werift/rtp/rtcp/rtpfb/twcc\");\n\n/* RTP Extensions for Transport-wide Congestion Control\n * draft-holmer-rmcat-transport-wide-cc-extensions-01\n\n 0 1 2 3\n 0 1 2 3 4 5 6 7 0 1 2 3 4 5 6 7 0 1 2 3 4 5 6 7 0 1 2 3 4 5 6 7\n +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+\n |V=2|P| FMT=15 | PT=205 | length |\n +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+\n | SSRC of packet sender |\n +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+\n | SSRC of media source |\n +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+\n | base sequence number | packet status count |\n +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+\n | reference time | fb pkt. count |\n +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+\n | packet chunk | packet chunk |\n +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+\n . .\n . .\n +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+\n | packet chunk | recv delta | recv delta |\n +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+\n . .\n . .\n +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+\n | recv delta | recv delta | zero padding |\n +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+\n */\n\nexport class TransportWideCC {\n static count = 15;\n count = TransportWideCC.count;\n length = 2;\n\n senderSsrc!: number;\n mediaSourceSsrc!: number;\n baseSequenceNumber!: number;\n packetStatusCount!: number;\n /** 24bit multiples of 64ms */\n referenceTime!: number;\n fbPktCount!: number;\n packetChunks: (RunLengthChunk | StatusVectorChunk)[] = [];\n recvDeltas: RecvDelta[] = [];\n header!: RtcpHeader;\n\n constructor(props: Partial<TransportWideCC> = {}) {\n Object.assign(this, props);\n if (!this.header) {\n this.header = new RtcpHeader({\n type: 205,\n count: this.count,\n version: 2,\n });\n }\n }\n\n static deSerialize(data: Buffer, header: RtcpHeader) {\n const [\n senderSsrc,\n mediaSsrc,\n baseSequenceNumber,\n packetStatusCount,\n referenceTime,\n fbPktCount,\n ] = bufferReader(data, [4, 4, 2, 2, 3, 1]);\n const packetChunks: (RunLengthChunk | StatusVectorChunk)[] = [];\n const recvDeltas: RecvDelta[] = [];\n\n let packetStatusPos = 16;\n for (let processedPacketNum = 0; processedPacketNum < packetStatusCount; ) {\n const type = getBit(\n data.slice(packetStatusPos, packetStatusPos + 1)[0],\n 0,\n 1\n );\n let iPacketStatus: RunLengthChunk | StatusVectorChunk | undefined;\n switch (type) {\n case PacketChunk.TypeTCCRunLengthChunk:\n {\n const packetStatus = RunLengthChunk.deSerialize(\n data.slice(packetStatusPos, packetStatusPos + 2)\n );\n iPacketStatus = packetStatus;\n const packetNumberToProcess = Math.min(\n packetStatusCount - processedPacketNum,\n packetStatus.runLength\n );\n if (\n packetStatus.packetStatus ===\n PacketStatus.TypeTCCPacketReceivedSmallDelta ||\n packetStatus.packetStatus ===\n PacketStatus.TypeTCCPacketReceivedLargeDelta\n ) {\n range(packetNumberToProcess).forEach(() => {\n recvDeltas.push(\n new RecvDelta({ type: packetStatus.packetStatus as any })\n );\n });\n }\n processedPacketNum += packetNumberToProcess;\n }\n break;\n case PacketChunk.TypeTCCStatusVectorChunk:\n {\n const packetStatus = StatusVectorChunk.deSerialize(\n data.slice(packetStatusPos, packetStatusPos + 2)\n );\n iPacketStatus = packetStatus;\n if (packetStatus.symbolSize === 0) {\n packetStatus.symbolList.forEach((v) => {\n if (v === PacketStatus.TypeTCCPacketReceivedSmallDelta) {\n recvDeltas.push(\n new RecvDelta({\n type: PacketStatus.TypeTCCPacketReceivedSmallDelta,\n })\n );\n }\n });\n }\n if (packetStatus.symbolSize === 1) {\n packetStatus.symbolList.forEach((v) => {\n if (\n v === PacketStatus.TypeTCCPacketReceivedSmallDelta ||\n v === PacketStatus.TypeTCCPacketReceivedLargeDelta\n ) {\n recvDeltas.push(\n new RecvDelta({\n type: v,\n })\n );\n }\n });\n }\n processedPacketNum += packetStatus.symbolList.length;\n }\n break;\n }\n if (!iPacketStatus) throw new Error();\n packetStatusPos += 2;\n packetChunks.push(iPacketStatus);\n }\n\n let recvDeltaPos = packetStatusPos;\n recvDeltas.forEach((delta) => {\n if (delta.type === PacketStatus.TypeTCCPacketReceivedSmallDelta) {\n delta.deSerialize(data.slice(recvDeltaPos, recvDeltaPos + 1));\n recvDeltaPos++;\n }\n if (delta.type === PacketStatus.TypeTCCPacketReceivedLargeDelta) {\n delta.deSerialize(data.slice(recvDeltaPos, recvDeltaPos + 2));\n recvDeltaPos += 2;\n }\n });\n\n return new TransportWideCC({\n senderSsrc,\n mediaSourceSsrc: mediaSsrc,\n baseSequenceNumber,\n packetStatusCount,\n referenceTime,\n fbPktCount,\n recvDeltas,\n packetChunks,\n header,\n });\n }\n\n serialize() {\n const constBuf = bufferWriter(\n [4, 4, 2, 2, 3, 1],\n [\n this.senderSsrc,\n this.mediaSourceSsrc,\n this.baseSequenceNumber,\n this.packetStatusCount,\n this.referenceTime,\n this.fbPktCount,\n ]\n );\n\n const chunks = Buffer.concat(\n this.packetChunks.map((chunk) => chunk.serialize())\n );\n\n const deltas = Buffer.concat(\n this.recvDeltas\n .map((delta) => {\n try {\n return delta.serialize();\n } catch (error: any) {\n log(error?.message);\n return undefined;\n }\n })\n .filter((v) => v) as Buffer[]\n );\n\n const buf = Buffer.concat([constBuf, chunks, deltas]);\n\n if (this.header.padding && buf.length % 4 !== 0) {\n const rest = 4 - (buf.length % 4);\n const padding = Buffer.alloc(rest);\n padding[padding.length - 1] = padding.length;\n\n this.header.length = Math.floor((buf.length + padding.length) / 4);\n return Buffer.concat([this.header.serialize(), buf, padding]);\n }\n\n this.header.length = Math.floor(buf.length / 4);\n return Buffer.concat([this.header.serialize(), buf]);\n }\n\n get packetResults(): PacketResult[] {\n const currentSequenceNumber = this.baseSequenceNumber - 1;\n const results = this.packetChunks\n .filter((v) => v instanceof RunLengthChunk)\n .map((chunk) => (chunk as RunLengthChunk).results(currentSequenceNumber))\n .flatMap((v) => v);\n\n let deltaIdx = 0;\n const referenceTime = BigInt(this.referenceTime) * 64n;\n let currentReceivedAtMs = referenceTime;\n\n for (const result of results) {\n const recvDelta = this.recvDeltas[deltaIdx];\n if (!result.received || !recvDelta) {\n continue;\n }\n currentReceivedAtMs += BigInt(recvDelta.delta) / 1000n;\n result.delta = recvDelta.delta;\n result.receivedAtMs = Number(currentReceivedAtMs);\n deltaIdx++;\n }\n return results;\n }\n}\n\n// 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5\n// +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+\n// |T| S | Run Length |\n// +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+\nexport class RunLengthChunk {\n type!: PacketChunk.TypeTCCRunLengthChunk;\n packetStatus!: PacketStatus;\n /** 13bit */\n runLength!: number;\n\n constructor(props: Partial<RunLengthChunk> = {}) {\n Object.assign(this, props);\n this.type = PacketChunk.TypeTCCRunLengthChunk;\n }\n\n static deSerialize(data: Buffer) {\n const packetStatus = getBit(data[0], 1, 2);\n const runLength = (getBit(data[0], 3, 5) << 8) + data[1];\n\n return new RunLengthChunk({ type: 0, packetStatus, runLength });\n }\n\n serialize() {\n const buf = new BitWriter2(16)\n .set(0)\n .set(this.packetStatus, 2)\n .set(this.runLength, 13).buffer;\n\n return buf;\n }\n\n results(currentSequenceNumber: number) {\n const received =\n this.packetStatus === PacketStatus.TypeTCCPacketReceivedSmallDelta ||\n this.packetStatus === PacketStatus.TypeTCCPacketReceivedLargeDelta;\n\n const results: PacketResult[] = [];\n for (let i = 0; i <= this.runLength; ++i) {\n results.push(\n new PacketResult({ sequenceNumber: ++currentSequenceNumber, received })\n );\n }\n return results;\n }\n}\n\n// 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5\n// +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+\n// |T|S| symbol list |\n// +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+\nexport class StatusVectorChunk {\n type!: number;\n symbolSize!: number;\n symbolList: number[] = [];\n\n constructor(props: Partial<StatusVectorChunk> = {}) {\n Object.assign(this, props);\n }\n\n static deSerialize(data: Buffer) {\n const type = PacketChunk.TypeTCCStatusVectorChunk;\n let symbolSize = getBit(data[0], 1, 1);\n const symbolList: number[] = [];\n\n switch (symbolSize) {\n case 0:\n range(6).forEach((_, i) => symbolList.push(getBit(data[0], 2 + i, 1)));\n range(8).forEach((_, i) => symbolList.push(getBit(data[1], i, 1)));\n break;\n case 1:\n range(3).forEach((i) => symbolList.push(getBit(data[0], 2 + i * 2, 2)));\n range(4).forEach((i) => symbolList.push(getBit(data[1], i * 2, 2)));\n break;\n default:\n symbolSize = (getBit(data[0], 2, 6) << 8) + data[1];\n }\n\n return new StatusVectorChunk({ type, symbolSize, symbolList });\n }\n\n serialize() {\n const buf = Buffer.alloc(2);\n\n const writer = new BitWriter2(16).set(1).set(this.symbolSize);\n const bits = this.symbolSize === 0 ? 1 : 2;\n\n this.symbolList.forEach((v) => {\n writer.set(v, bits);\n });\n buf.writeUInt16BE(writer.value);\n return buf;\n }\n}\n\nexport class RecvDelta {\n /**optional (If undefined, it will be set automatically.)*/\n type?:\n | PacketStatus.TypeTCCPacketReceivedSmallDelta\n | PacketStatus.TypeTCCPacketReceivedLargeDelta;\n /**micro sec */\n delta!: number;\n\n constructor(props: Partial<RecvDelta> = {}) {\n Object.assign(this, props);\n }\n\n static deSerialize(data: Buffer) {\n let type: number | undefined;\n let delta: number | undefined;\n\n if (data.length === 1) {\n type = PacketStatus.TypeTCCPacketReceivedSmallDelta;\n delta = 250 * data[0];\n } else if (data.length === 2) {\n type = PacketStatus.TypeTCCPacketReceivedLargeDelta;\n delta = 250 * data.readInt16BE();\n }\n\n if (type === undefined || delta === undefined) throw new Error();\n\n return new RecvDelta({ type, delta });\n }\n\n deSerialize(data: Buffer) {\n const res = RecvDelta.deSerialize(data);\n this.delta = res.delta;\n }\n\n parsed = false; // todo refactor\n parseDelta() {\n this.delta = Math.floor(this.delta / 250);\n\n if (this.delta < 0 || this.delta > 255) {\n if (this.delta > 32767) this.delta = 32767; // maxInt16\n if (this.delta < -32768) this.delta = -32768; // minInt16\n if (!this.type) this.type = PacketStatus.TypeTCCPacketReceivedLargeDelta;\n } else {\n if (!this.type) this.type = PacketStatus.TypeTCCPacketReceivedSmallDelta;\n }\n this.parsed = true;\n }\n\n serialize() {\n if (!this.parsed) this.parseDelta();\n if (this.type === PacketStatus.TypeTCCPacketReceivedSmallDelta) {\n const buf = Buffer.alloc(1);\n buf.writeUInt8(this.delta);\n return buf;\n } else if (this.type === PacketStatus.TypeTCCPacketReceivedLargeDelta) {\n const buf = Buffer.alloc(2);\n buf.writeInt16BE(this.delta);\n return buf;\n }\n\n throw new Error(\"errDeltaExceedLimit \" + this.delta + \" \" + this.type);\n }\n}\n\nexport enum PacketChunk {\n TypeTCCRunLengthChunk,\n TypeTCCStatusVectorChunk,\n packetStatusChunkLength,\n}\n\nexport enum PacketStatus {\n TypeTCCPacketNotReceived,\n TypeTCCPacketReceivedSmallDelta,\n TypeTCCPacketReceivedLargeDelta,\n TypeTCCPacketReceivedWithoutDelta,\n}\n\nexport class PacketResult {\n sequenceNumber = 0;\n delta = 0;\n received = false;\n receivedAtMs = 0;\n constructor(props: Partial<PacketResult>) {\n Object.assign(this, props);\n }\n}\n"]}
|
|
1
|
+
{"version":3,"file":"twcc.js","sourceRoot":"","sources":["../../../../../../rtp/src/rtcp/rtpfb/twcc.ts"],"names":[],"mappings":"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","sourcesContent":["import debug from \"debug\";\n\nimport {\n BitWriter2,\n bufferReader,\n bufferWriter,\n getBit,\n} from \"../../../../common/src\";\nimport { RtcpHeader } from \"../header\";\n\nconst log = debug(\"werift/rtp/rtcp/rtpfb/twcc\");\n\n/* RTP Extensions for Transport-wide Congestion Control\n * draft-holmer-rmcat-transport-wide-cc-extensions-01\n\n 0 1 2 3\n 0 1 2 3 4 5 6 7 0 1 2 3 4 5 6 7 0 1 2 3 4 5 6 7 0 1 2 3 4 5 6 7\n +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+\n |V=2|P| FMT=15 | PT=205 | length |\n +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+\n | SSRC of packet sender |\n +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+\n | SSRC of media source |\n +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+\n | base sequence number | packet status count |\n +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+\n | reference time | fb pkt. count |\n +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+\n | packet chunk | packet chunk |\n +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+\n . .\n . .\n +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+\n | packet chunk | recv delta | recv delta |\n +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+\n . .\n . .\n +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+\n | recv delta | recv delta | zero padding |\n +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+\n */\n\nexport class TransportWideCC {\n static count = 15;\n count = TransportWideCC.count;\n length = 2;\n\n senderSsrc!: number;\n mediaSourceSsrc!: number;\n baseSequenceNumber!: number;\n packetStatusCount!: number;\n /** 24bit multiples of 64ms */\n referenceTime!: number;\n fbPktCount!: number;\n packetChunks: (RunLengthChunk | StatusVectorChunk)[] = [];\n recvDeltas: RecvDelta[] = [];\n header!: RtcpHeader;\n\n constructor(props: Partial<TransportWideCC> = {}) {\n Object.assign(this, props);\n if (!this.header) {\n this.header = new RtcpHeader({\n type: 205,\n count: this.count,\n version: 2,\n });\n }\n }\n\n static deSerialize(data: Buffer, header: RtcpHeader) {\n const [\n senderSsrc,\n mediaSsrc,\n baseSequenceNumber,\n packetStatusCount,\n referenceTime,\n fbPktCount,\n ] = bufferReader(data, [4, 4, 2, 2, 3, 1]);\n const packetChunks: (RunLengthChunk | StatusVectorChunk)[] = [];\n const recvDeltas: RecvDelta[] = [];\n\n let packetStatusPos = 16;\n for (let processedPacketNum = 0; processedPacketNum < packetStatusCount; ) {\n const type = getBit(\n data.slice(packetStatusPos, packetStatusPos + 1)[0],\n 0,\n 1\n );\n let iPacketStatus: RunLengthChunk | StatusVectorChunk | undefined;\n switch (type) {\n case PacketChunk.TypeTCCRunLengthChunk:\n {\n const packetStatus = RunLengthChunk.deSerialize(\n data.slice(packetStatusPos, packetStatusPos + 2)\n );\n iPacketStatus = packetStatus;\n const packetNumberToProcess = Math.min(\n packetStatusCount - processedPacketNum,\n packetStatus.runLength\n );\n if (\n packetStatus.packetStatus ===\n PacketStatus.TypeTCCPacketReceivedSmallDelta ||\n packetStatus.packetStatus ===\n PacketStatus.TypeTCCPacketReceivedLargeDelta\n ) {\n for (let _ = 0; _ < packetNumberToProcess; _++) {\n recvDeltas.push(\n new RecvDelta({ type: packetStatus.packetStatus as any })\n );\n }\n }\n processedPacketNum += packetNumberToProcess;\n }\n break;\n case PacketChunk.TypeTCCStatusVectorChunk:\n {\n const packetStatus = StatusVectorChunk.deSerialize(\n data.slice(packetStatusPos, packetStatusPos + 2)\n );\n iPacketStatus = packetStatus;\n if (packetStatus.symbolSize === 0) {\n packetStatus.symbolList.forEach((v) => {\n if (v === PacketStatus.TypeTCCPacketReceivedSmallDelta) {\n recvDeltas.push(\n new RecvDelta({\n type: PacketStatus.TypeTCCPacketReceivedSmallDelta,\n })\n );\n }\n });\n }\n if (packetStatus.symbolSize === 1) {\n packetStatus.symbolList.forEach((v) => {\n if (\n v === PacketStatus.TypeTCCPacketReceivedSmallDelta ||\n v === PacketStatus.TypeTCCPacketReceivedLargeDelta\n ) {\n recvDeltas.push(\n new RecvDelta({\n type: v,\n })\n );\n }\n });\n }\n processedPacketNum += packetStatus.symbolList.length;\n }\n break;\n }\n if (!iPacketStatus) throw new Error();\n packetStatusPos += 2;\n packetChunks.push(iPacketStatus);\n }\n\n let recvDeltaPos = packetStatusPos;\n recvDeltas.forEach((delta) => {\n if (delta.type === PacketStatus.TypeTCCPacketReceivedSmallDelta) {\n delta.deSerialize(data.slice(recvDeltaPos, recvDeltaPos + 1));\n recvDeltaPos++;\n }\n if (delta.type === PacketStatus.TypeTCCPacketReceivedLargeDelta) {\n delta.deSerialize(data.slice(recvDeltaPos, recvDeltaPos + 2));\n recvDeltaPos += 2;\n }\n });\n\n return new TransportWideCC({\n senderSsrc,\n mediaSourceSsrc: mediaSsrc,\n baseSequenceNumber,\n packetStatusCount,\n referenceTime,\n fbPktCount,\n recvDeltas,\n packetChunks,\n header,\n });\n }\n\n serialize() {\n const constBuf = bufferWriter(\n [4, 4, 2, 2, 3, 1],\n [\n this.senderSsrc,\n this.mediaSourceSsrc,\n this.baseSequenceNumber,\n this.packetStatusCount,\n this.referenceTime,\n this.fbPktCount,\n ]\n );\n\n const chunks = Buffer.concat(\n this.packetChunks.map((chunk) => chunk.serialize())\n );\n\n const deltas = Buffer.concat(\n this.recvDeltas\n .map((delta) => {\n try {\n return delta.serialize();\n } catch (error: any) {\n log(error?.message);\n return undefined;\n }\n })\n .filter((v) => v) as Buffer[]\n );\n\n const buf = Buffer.concat([constBuf, chunks, deltas]);\n\n if (this.header.padding && buf.length % 4 !== 0) {\n const rest = 4 - (buf.length % 4);\n const padding = Buffer.alloc(rest);\n padding[padding.length - 1] = padding.length;\n\n this.header.length = Math.floor((buf.length + padding.length) / 4);\n return Buffer.concat([this.header.serialize(), buf, padding]);\n }\n\n this.header.length = Math.floor(buf.length / 4);\n return Buffer.concat([this.header.serialize(), buf]);\n }\n\n get packetResults(): PacketResult[] {\n const currentSequenceNumber = this.baseSequenceNumber - 1;\n const results = this.packetChunks\n .filter((v) => v instanceof RunLengthChunk)\n .map((chunk) => (chunk as RunLengthChunk).results(currentSequenceNumber))\n .flatMap((v) => v);\n\n let deltaIdx = 0;\n const referenceTime = BigInt(this.referenceTime) * 64n;\n let currentReceivedAtMs = referenceTime;\n\n for (const result of results) {\n const recvDelta = this.recvDeltas[deltaIdx];\n if (!result.received || !recvDelta) {\n continue;\n }\n currentReceivedAtMs += BigInt(recvDelta.delta) / 1000n;\n result.delta = recvDelta.delta;\n result.receivedAtMs = Number(currentReceivedAtMs);\n deltaIdx++;\n }\n return results;\n }\n}\n\n// 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5\n// +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+\n// |T| S | Run Length |\n// +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+\nexport class RunLengthChunk {\n type!: PacketChunk.TypeTCCRunLengthChunk;\n packetStatus!: PacketStatus;\n /** 13bit */\n runLength!: number;\n\n constructor(props: Partial<RunLengthChunk> = {}) {\n Object.assign(this, props);\n this.type = PacketChunk.TypeTCCRunLengthChunk;\n }\n\n static deSerialize(data: Buffer) {\n const packetStatus = getBit(data[0], 1, 2);\n const runLength = (getBit(data[0], 3, 5) << 8) + data[1];\n\n return new RunLengthChunk({ type: 0, packetStatus, runLength });\n }\n\n serialize() {\n const buf = new BitWriter2(16)\n .set(0)\n .set(this.packetStatus, 2)\n .set(this.runLength, 13).buffer;\n\n return buf;\n }\n\n results(currentSequenceNumber: number) {\n const received =\n this.packetStatus === PacketStatus.TypeTCCPacketReceivedSmallDelta ||\n this.packetStatus === PacketStatus.TypeTCCPacketReceivedLargeDelta;\n\n const results: PacketResult[] = [];\n for (let i = 0; i <= this.runLength; ++i) {\n results.push(\n new PacketResult({ sequenceNumber: ++currentSequenceNumber, received })\n );\n }\n return results;\n }\n}\n\n// 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5\n// +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+\n// |T|S| symbol list |\n// +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+\nexport class StatusVectorChunk {\n type!: number;\n symbolSize!: number;\n symbolList: number[] = [];\n\n constructor(props: Partial<StatusVectorChunk> = {}) {\n Object.assign(this, props);\n }\n\n static deSerialize(data: Buffer) {\n const type = PacketChunk.TypeTCCStatusVectorChunk;\n let symbolSize = getBit(data[0], 1, 1);\n const symbolList: number[] = [];\n\n function range(n: number, cb: (i: number) => void) {\n for (let i = 0; i < n; i++) {\n cb(i);\n }\n }\n\n switch (symbolSize) {\n case 0:\n range(6, (i) => symbolList.push(getBit(data[0], 2 + i, 1)));\n range(8, (i) => symbolList.push(getBit(data[1], i, 1)));\n break;\n case 1:\n range(3, (i) => symbolList.push(getBit(data[0], 2 + i * 2, 2)));\n range(4, (i) => symbolList.push(getBit(data[1], i * 2, 2)));\n break;\n default:\n symbolSize = (getBit(data[0], 2, 6) << 8) + data[1];\n }\n\n return new StatusVectorChunk({ type, symbolSize, symbolList });\n }\n\n serialize() {\n const buf = Buffer.alloc(2);\n\n const writer = new BitWriter2(16).set(1).set(this.symbolSize);\n const bits = this.symbolSize === 0 ? 1 : 2;\n\n this.symbolList.forEach((v) => {\n writer.set(v, bits);\n });\n buf.writeUInt16BE(writer.value);\n return buf;\n }\n}\n\nexport class RecvDelta {\n /**optional (If undefined, it will be set automatically.)*/\n type?:\n | PacketStatus.TypeTCCPacketReceivedSmallDelta\n | PacketStatus.TypeTCCPacketReceivedLargeDelta;\n /**micro sec */\n delta!: number;\n\n constructor(props: Partial<RecvDelta> = {}) {\n Object.assign(this, props);\n }\n\n static deSerialize(data: Buffer) {\n let type: number | undefined;\n let delta: number | undefined;\n\n if (data.length === 1) {\n type = PacketStatus.TypeTCCPacketReceivedSmallDelta;\n delta = 250 * data[0];\n } else if (data.length === 2) {\n type = PacketStatus.TypeTCCPacketReceivedLargeDelta;\n delta = 250 * data.readInt16BE();\n }\n\n if (type === undefined || delta === undefined) throw new Error();\n\n return new RecvDelta({ type, delta });\n }\n\n deSerialize(data: Buffer) {\n const res = RecvDelta.deSerialize(data);\n this.delta = res.delta;\n }\n\n parsed = false; // todo refactor\n parseDelta() {\n this.delta = Math.floor(this.delta / 250);\n\n if (this.delta < 0 || this.delta > 255) {\n if (this.delta > 32767) this.delta = 32767; // maxInt16\n if (this.delta < -32768) this.delta = -32768; // minInt16\n if (!this.type) this.type = PacketStatus.TypeTCCPacketReceivedLargeDelta;\n } else {\n if (!this.type) this.type = PacketStatus.TypeTCCPacketReceivedSmallDelta;\n }\n this.parsed = true;\n }\n\n serialize() {\n if (!this.parsed) this.parseDelta();\n if (this.type === PacketStatus.TypeTCCPacketReceivedSmallDelta) {\n const buf = Buffer.alloc(1);\n buf.writeUInt8(this.delta);\n return buf;\n } else if (this.type === PacketStatus.TypeTCCPacketReceivedLargeDelta) {\n const buf = Buffer.alloc(2);\n buf.writeInt16BE(this.delta);\n return buf;\n }\n\n throw new Error(\"errDeltaExceedLimit \" + this.delta + \" \" + this.type);\n }\n}\n\nexport enum PacketChunk {\n TypeTCCRunLengthChunk,\n TypeTCCStatusVectorChunk,\n packetStatusChunkLength,\n}\n\nexport enum PacketStatus {\n TypeTCCPacketNotReceived,\n TypeTCCPacketReceivedSmallDelta,\n TypeTCCPacketReceivedLargeDelta,\n TypeTCCPacketReceivedWithoutDelta,\n}\n\nexport class PacketResult {\n sequenceNumber = 0;\n delta = 0;\n received = false;\n receivedAtMs = 0;\n constructor(props: Partial<PacketResult>) {\n Object.assign(this, props);\n }\n}\n"]}
|
package/lib/rtp/src/rtcp/sr.js
CHANGED
|
@@ -1,10 +1,6 @@
|
|
|
1
1
|
"use strict";
|
|
2
|
-
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
3
|
-
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
4
|
-
};
|
|
5
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
6
3
|
exports.ntpTime2Sec = exports.RtcpSenderInfo = exports.RtcpSrPacket = void 0;
|
|
7
|
-
const range_1 = __importDefault(require("lodash/range"));
|
|
8
4
|
const src_1 = require("../../../common/src");
|
|
9
5
|
const rr_1 = require("./rr");
|
|
10
6
|
const rtcp_1 = require("./rtcp");
|
|
@@ -94,7 +90,7 @@ class RtcpSrPacket {
|
|
|
94
90
|
const senderInfo = RtcpSenderInfo.deSerialize(payload.subarray(4, 24));
|
|
95
91
|
let pos = 24;
|
|
96
92
|
const reports = [];
|
|
97
|
-
for (
|
|
93
|
+
for (let _ = 0; _ < count; _++) {
|
|
98
94
|
reports.push(rr_1.RtcpReceiverInfo.deSerialize(payload.subarray(pos, pos + 24)));
|
|
99
95
|
pos += 24;
|
|
100
96
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"sr.js","sourceRoot":"","sources":["../../../../../rtp/src/rtcp/sr.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"sr.js","sourceRoot":"","sources":["../../../../../rtp/src/rtcp/sr.ts"],"names":[],"mappings":"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","sourcesContent":["import { bufferReader, bufferWriter } from \"../../../common/src\";\nimport { RtcpReceiverInfo } from \"./rr\";\nimport { RtcpPacketConverter } from \"./rtcp\";\n\n// https://datatracker.ietf.org/doc/html/rfc3550#section-6.4.1\n// 0 1 2 3\n// 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\n// +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+\n// header |V=2|P| RC | PT=SR=200 | length |\n// +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+\n// | SSRC of sender |\n// +=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+\n// sender | NTP timestamp, most significant word |\n// info +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+\n// | NTP timestamp, least significant word |\n// +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+\n// | RTP timestamp |\n// +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+\n// | sender's packet count |\n// +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+\n// | sender's octet count |\n// +=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+\n// report | SSRC_1 (SSRC of first source) |\n// block +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+\n// 1 | fraction lost | cumulative number of packets lost |\n// +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+\n// | extended highest sequence number received |\n// +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+\n// | interarrival jitter |\n// +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+\n// | last SR (LSR) |\n// +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+\n// | delay since last SR (DLSR) |\n// +=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+\n// report | SSRC_2 (SSRC of second source) |\n// block +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+\n// 2 : ... :\n// +=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+\n// | profile-specific extensions |\n// +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+\n\nexport class RtcpSrPacket {\n ssrc: number = 0;\n senderInfo!: RtcpSenderInfo;\n reports: RtcpReceiverInfo[] = [];\n static readonly type = 200;\n readonly type = RtcpSrPacket.type;\n\n constructor(props: Pick<RtcpSrPacket, \"senderInfo\"> & Partial<RtcpSrPacket>) {\n Object.assign(this, props);\n }\n\n toJSON() {\n return {\n ssrc: this.ssrc,\n senderInfo: this.senderInfo.toJSON(),\n reports: this.reports.map((r) => r.toJSON()),\n };\n }\n\n serialize() {\n let payload = Buffer.alloc(4);\n payload.writeUInt32BE(this.ssrc);\n payload = Buffer.concat([payload, this.senderInfo.serialize()]);\n payload = Buffer.concat([\n payload,\n ...this.reports.map((report) => report.serialize()),\n ]);\n return RtcpPacketConverter.serialize(\n RtcpSrPacket.type,\n this.reports.length,\n payload,\n Math.floor(payload.length / 4)\n );\n }\n\n static deSerialize(payload: Buffer, count: number) {\n const ssrc = payload.readUInt32BE();\n const senderInfo = RtcpSenderInfo.deSerialize(payload.subarray(4, 24));\n let pos = 24;\n const reports: RtcpReceiverInfo[] = [];\n for (let _ = 0; _ < count; _++) {\n reports.push(\n RtcpReceiverInfo.deSerialize(payload.subarray(pos, pos + 24))\n );\n pos += 24;\n }\n const packet = new RtcpSrPacket({ ssrc, senderInfo, reports });\n return packet;\n }\n}\n\nexport class RtcpSenderInfo {\n ntpTimestamp!: bigint;\n rtpTimestamp!: number;\n packetCount!: number;\n octetCount!: number;\n\n constructor(props: Partial<RtcpSenderInfo> = {}) {\n Object.assign(this, props);\n }\n\n toJSON() {\n return {\n ntpTimestamp: ntpTime2Sec(this.ntpTimestamp),\n rtpTimestamp: this.rtpTimestamp,\n };\n }\n\n serialize() {\n return bufferWriter(\n [8, 4, 4, 4],\n [this.ntpTimestamp, this.rtpTimestamp, this.packetCount, this.octetCount]\n );\n }\n\n static deSerialize(data: Buffer) {\n const [ntpTimestamp, rtpTimestamp, packetCount, octetCount] = bufferReader(\n data,\n [8, 4, 4, 4]\n );\n\n return new RtcpSenderInfo({\n ntpTimestamp,\n rtpTimestamp,\n packetCount,\n octetCount,\n });\n }\n}\n\nexport const ntpTime2Sec = (ntp: bigint) => {\n const [ntpSec, ntpMsec] = bufferReader(bufferWriter([8], [ntp]), [4, 4]);\n\n return Number(`${ntpSec}.${ntpMsec}`);\n};\n"]}
|
|
@@ -24,3 +24,8 @@ export declare function serializeSdesRTPStreamID(id: string): Buffer;
|
|
|
24
24
|
export declare function serializeRepairedRtpStreamId(id: string): Buffer;
|
|
25
25
|
export declare function serializeTransportWideCC(transportSequenceNumber: number): Buffer;
|
|
26
26
|
export declare function serializeAbsSendTime(ntpTime: bigint): Buffer;
|
|
27
|
+
export declare function serializeAudioLevelIndication(level: number): Buffer;
|
|
28
|
+
export declare function deserializeString(buf: Buffer): string;
|
|
29
|
+
export declare function deserializeUint16BE(buf: Buffer): number;
|
|
30
|
+
export declare function deserializeAbsSendTime(buf: Buffer): any;
|
|
31
|
+
export declare function deserializeAudioLevelIndication(buf: Buffer): AudioLevelIndicationPayload;
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
-
exports.serializeAbsSendTime = exports.serializeTransportWideCC = exports.serializeRepairedRtpStreamId = exports.serializeSdesRTPStreamID = exports.serializeSdesMid = exports.rtpHeaderExtensionsParser = exports.RTP_EXTENSION_URI = void 0;
|
|
3
|
+
exports.deserializeAudioLevelIndication = exports.deserializeAbsSendTime = exports.deserializeUint16BE = exports.deserializeString = exports.serializeAudioLevelIndication = exports.serializeAbsSendTime = exports.serializeTransportWideCC = exports.serializeRepairedRtpStreamId = exports.serializeSdesRTPStreamID = exports.serializeSdesMid = exports.rtpHeaderExtensionsParser = exports.RTP_EXTENSION_URI = void 0;
|
|
4
4
|
const src_1 = require("../../../common/src");
|
|
5
5
|
exports.RTP_EXTENSION_URI = {
|
|
6
6
|
sdesMid: "urn:ietf:params:rtp-hdrext:sdes:mid",
|
|
@@ -19,21 +19,19 @@ function rtpHeaderExtensionsParser(extensions, extIdUriMap) {
|
|
|
19
19
|
case exports.RTP_EXTENSION_URI.sdesMid:
|
|
20
20
|
case exports.RTP_EXTENSION_URI.sdesRTPStreamID:
|
|
21
21
|
case exports.RTP_EXTENSION_URI.repairedRtpStreamId:
|
|
22
|
-
return { uri, value: extension.payload
|
|
22
|
+
return { uri, value: deserializeString(extension.payload) };
|
|
23
23
|
case exports.RTP_EXTENSION_URI.transportWideCC:
|
|
24
|
-
return { uri, value: extension.payload
|
|
24
|
+
return { uri, value: deserializeUint16BE(extension.payload) };
|
|
25
25
|
case exports.RTP_EXTENSION_URI.absSendTime:
|
|
26
26
|
return {
|
|
27
27
|
uri,
|
|
28
|
-
value: (
|
|
28
|
+
value: deserializeAbsSendTime(extension.payload),
|
|
29
29
|
};
|
|
30
30
|
case exports.RTP_EXTENSION_URI.audioLevelIndication: {
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
level: stream.readBits(7),
|
|
31
|
+
return {
|
|
32
|
+
uri,
|
|
33
|
+
value: deserializeAudioLevelIndication(extension.payload),
|
|
35
34
|
};
|
|
36
|
-
return { uri, value };
|
|
37
35
|
}
|
|
38
36
|
default:
|
|
39
37
|
return { uri, value: 0 };
|
|
@@ -69,4 +67,32 @@ function serializeAbsSendTime(ntpTime) {
|
|
|
69
67
|
return buf;
|
|
70
68
|
}
|
|
71
69
|
exports.serializeAbsSendTime = serializeAbsSendTime;
|
|
70
|
+
function serializeAudioLevelIndication(level) {
|
|
71
|
+
const stream = new src_1.BitStream(Buffer.alloc(1));
|
|
72
|
+
stream.writeBits(1, 1);
|
|
73
|
+
stream.writeBits(level, 7);
|
|
74
|
+
return stream.uint8Array;
|
|
75
|
+
}
|
|
76
|
+
exports.serializeAudioLevelIndication = serializeAudioLevelIndication;
|
|
77
|
+
function deserializeString(buf) {
|
|
78
|
+
return buf.toString();
|
|
79
|
+
}
|
|
80
|
+
exports.deserializeString = deserializeString;
|
|
81
|
+
function deserializeUint16BE(buf) {
|
|
82
|
+
return buf.readUInt16BE();
|
|
83
|
+
}
|
|
84
|
+
exports.deserializeUint16BE = deserializeUint16BE;
|
|
85
|
+
function deserializeAbsSendTime(buf) {
|
|
86
|
+
return (0, src_1.bufferReader)(buf, [3])[0];
|
|
87
|
+
}
|
|
88
|
+
exports.deserializeAbsSendTime = deserializeAbsSendTime;
|
|
89
|
+
function deserializeAudioLevelIndication(buf) {
|
|
90
|
+
const stream = new src_1.BitStream(buf);
|
|
91
|
+
const value = {
|
|
92
|
+
v: stream.readBits(1) === 1,
|
|
93
|
+
level: stream.readBits(7),
|
|
94
|
+
};
|
|
95
|
+
return value;
|
|
96
|
+
}
|
|
97
|
+
exports.deserializeAudioLevelIndication = deserializeAudioLevelIndication;
|
|
72
98
|
//# sourceMappingURL=headerExtension.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"headerExtension.js","sourceRoot":"","sources":["../../../../../rtp/src/rtp/headerExtension.ts"],"names":[],"mappings":";;;AAAA,6CAA4E;AAG/D,QAAA,iBAAiB,GAAG;IAC/B,OAAO,EAAE,qCAAqC;IAC9C,eAAe,EAAE,+CAA+C;IAChE,mBAAmB,EAAE,wDAAwD;IAC7E,eAAe,EACb,2EAA2E;IAC7E,WAAW,EAAE,4DAA4D;IACzE,oBAAoB,EAClB,yFAAyF;IAC3F,oBAAoB,EAAE,6CAA6C;CAC3D,CAAC;AAMX,SAAgB,yBAAyB,CACvC,UAAuB,EACvB,WAAqC;IAErC,OAAO,UAAU;SACd,GAAG,CAAC,CAAC,SAAS,EAAE,EAAE;QACjB,MAAM,GAAG,GAAG,WAAW,CAAC,SAAS,CAAC,EAAE,CAAC,CAAC;QACtC,QAAQ,GAAG,EAAE;YACX,KAAK,yBAAiB,CAAC,OAAO,CAAC;YAC/B,KAAK,yBAAiB,CAAC,eAAe,CAAC;YACvC,KAAK,yBAAiB,CAAC,mBAAmB;gBACxC,OAAO,EAAE,GAAG,EAAE,KAAK,EAAE,SAAS,CAAC,OAAO,CAAC,
|
|
1
|
+
{"version":3,"file":"headerExtension.js","sourceRoot":"","sources":["../../../../../rtp/src/rtp/headerExtension.ts"],"names":[],"mappings":"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","sourcesContent":["import { BitStream, bufferReader, bufferWriter } from \"../../../common/src\";\nimport { Extension } from \"./rtp\";\n\nexport const RTP_EXTENSION_URI = {\n sdesMid: \"urn:ietf:params:rtp-hdrext:sdes:mid\",\n sdesRTPStreamID: \"urn:ietf:params:rtp-hdrext:sdes:rtp-stream-id\",\n repairedRtpStreamId: \"urn:ietf:params:rtp-hdrext:sdes:repaired-rtp-stream-id\",\n transportWideCC:\n \"http://www.ietf.org/id/draft-holmer-rmcat-transport-wide-cc-extensions-01\",\n absSendTime: \"http://www.webrtc.org/experiments/rtp-hdrext/abs-send-time\",\n dependencyDescriptor:\n \"https://aomediacodec.github.io/av1-rtp-spec/#dependency-descriptor-rtp-header-extension\",\n audioLevelIndication: \"urn:ietf:params:rtp-hdrext:ssrc-audio-level\",\n} as const;\n\nexport type TransportWideCCPayload = number;\n\nexport type AudioLevelIndicationPayload = { v: boolean; level: number };\n\nexport function rtpHeaderExtensionsParser(\n extensions: Extension[],\n extIdUriMap: { [id: number]: string }\n): { [uri: string]: any } {\n return extensions\n .map((extension) => {\n const uri = extIdUriMap[extension.id];\n switch (uri) {\n case RTP_EXTENSION_URI.sdesMid:\n case RTP_EXTENSION_URI.sdesRTPStreamID:\n case RTP_EXTENSION_URI.repairedRtpStreamId:\n return { uri, value: deserializeString(extension.payload) };\n case RTP_EXTENSION_URI.transportWideCC:\n return { uri, value: deserializeUint16BE(extension.payload) };\n case RTP_EXTENSION_URI.absSendTime:\n return {\n uri,\n value: deserializeAbsSendTime(extension.payload),\n };\n case RTP_EXTENSION_URI.audioLevelIndication: {\n return {\n uri,\n value: deserializeAudioLevelIndication(extension.payload),\n };\n }\n default:\n return { uri, value: 0 };\n }\n })\n .reduce((acc: { [uri: string]: any }, cur) => {\n if (cur) acc[cur.uri] = cur.value;\n return acc;\n }, {});\n}\n\nexport function serializeSdesMid(id: string) {\n return Buffer.from(id);\n}\n\nexport function serializeSdesRTPStreamID(id: string) {\n return Buffer.from(id);\n}\n\nexport function serializeRepairedRtpStreamId(id: string) {\n return Buffer.from(id);\n}\n\nexport function serializeTransportWideCC(transportSequenceNumber: number) {\n return bufferWriter([2], [transportSequenceNumber]);\n}\n\nexport function serializeAbsSendTime(ntpTime: bigint) {\n const buf = Buffer.alloc(3);\n const time = (ntpTime >> 14n) & 0x00ffffffn;\n buf.writeUIntBE(Number(time), 0, 3);\n return buf;\n}\n\nexport function serializeAudioLevelIndication(level: number) {\n const stream = new BitStream(Buffer.alloc(1));\n stream.writeBits(1, 1);\n stream.writeBits(level, 7);\n\n return stream.uint8Array;\n}\n\nexport function deserializeString(buf: Buffer) {\n return buf.toString();\n}\n\nexport function deserializeUint16BE(buf: Buffer) {\n return buf.readUInt16BE();\n}\n\nexport function deserializeAbsSendTime(buf: Buffer) {\n return bufferReader(buf, [3])[0];\n}\n\nexport function deserializeAudioLevelIndication(buf: Buffer) {\n const stream = new BitStream(buf);\n const value: AudioLevelIndicationPayload = {\n v: stream.readBits(1) === 1,\n level: stream.readBits(7),\n };\n return value;\n}\n"]}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"webm.js","sourceRoot":"","sources":["../../../../../../src/nonstandard/recorder/writer/webm.ts"],"names":[],"mappings":"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","sourcesContent":["import { unlink } from \"fs/promises\";\nimport { EventDisposer } from \"rx.mini\";\n\nimport { SupportedCodec } from \"../../../../../rtp/src/container/webm\";\nimport {\n DepacketizeCallback,\n JitterBufferCallback,\n LipsyncCallback,\n MediaStreamTrack,\n NtpTimeCallback,\n RtcpSourceCallback,\n RtpSourceCallback,\n saveToFileSystem,\n WebmCallback,\n WeriftError,\n} from \"../../..\";\nimport { MediaWriter } from \".\";\n\nconst sourcePath = \"packages/webrtc/src/nonstandard/recorder/writer/webm.ts\";\n\nexport class WebmFactory extends MediaWriter {\n rtpSources: RtpSourceCallback[] = [];\n\n unSubscribers = new EventDisposer();\n\n async start(tracks: MediaStreamTrack[]) {\n await unlink(this.path).catch((e) => e);\n\n const inputTracks = tracks.map((track, i) => {\n const trackNumber = i + 1;\n const payloadType = track.codec!.payloadType;\n\n if (track.kind === \"video\") {\n const codec = ((): SupportedCodec => {\n switch (track.codec?.name.toLowerCase() as SupportedVideoCodec) {\n case \"vp8\":\n return \"VP8\";\n case \"vp9\":\n return \"VP9\";\n case \"h264\":\n return \"MPEG4/ISO/AVC\";\n case \"av1x\":\n return \"AV1\";\n default:\n throw new WeriftError({\n message: \"unsupported codec\",\n payload: { track, path: sourcePath },\n });\n }\n })();\n return {\n kind: \"video\" as const,\n codec,\n clockRate: 90000,\n trackNumber,\n width: this.options.width,\n height: this.options.height,\n payloadType,\n track,\n };\n } else {\n return {\n kind: \"audio\" as const,\n codec: \"OPUS\" as const,\n clockRate: 48000,\n trackNumber,\n payloadType,\n track,\n };\n }\n });\n\n const webm = new WebmCallback(inputTracks, {\n duration: this.options.defaultDuration ?? 1000 * 60 * 60 * 24,\n });\n const lipsync = new LipsyncCallback();\n\n this.rtpSources = inputTracks.map(({ track, clockRate, codec }) => {\n const rtpSource = new RtpSourceCallback();\n const rtcpSource = new RtcpSourceCallback();\n track.onReceiveRtp\n .subscribe((rtp) => {\n rtpSource.input(rtp.clone());\n })\n .disposer(this.unSubscribers);\n track.onReceiveRtcp\n .subscribe((rtcp) => {\n rtcpSource.input(rtcp);\n })\n .disposer(this.unSubscribers);\n const ntpTime = new NtpTimeCallback(clockRate);\n\n if (track.kind === \"video\") {\n const depacketizer = new DepacketizeCallback(codec, {\n isFinalPacketInSequence: (h) => h.marker,\n });\n const jitterBuffer = new JitterBufferCallback(clockRate);\n\n rtpSource.pipe(jitterBuffer.input);\n rtcpSource.pipe(ntpTime.input);\n\n jitterBuffer.pipe(ntpTime.input);\n ntpTime.pipe(depacketizer.input);\n depacketizer.pipe(lipsync.inputVideo);\n lipsync.pipeVideo(webm.inputVideo);\n } else {\n const depacketizer = new DepacketizeCallback(codec);\n\n rtpSource.pipe(ntpTime.input);\n rtcpSource.pipe(ntpTime.input);\n\n ntpTime.pipe(depacketizer.input);\n depacketizer.pipe(lipsync.inputAudio);\n lipsync.pipeAudio(webm.inputAudio);\n }\n\n return rtpSource;\n });\n webm.pipe(saveToFileSystem(this.path));\n }\n\n async stop() {\n await Promise.all(this.rtpSources.map((r) => r.stop()));\n this.unSubscribers.dispose();\n }\n}\n\nconst supportedVideoCodecs = [\"h264\", \"vp8\", \"vp9\", \"av1x\"] as const;\ntype SupportedVideoCodec = typeof supportedVideoCodecs[number];\n"]}
|
|
1
|
+
{"version":3,"file":"webm.js","sourceRoot":"","sources":["../../../../../../src/nonstandard/recorder/writer/webm.ts"],"names":[],"mappings":"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","sourcesContent":["import { unlink } from \"fs/promises\";\nimport { EventDisposer } from \"rx.mini\";\n\nimport { SupportedCodec } from \"../../../../../rtp/src/container/webm/container\";\nimport {\n DepacketizeCallback,\n JitterBufferCallback,\n LipsyncCallback,\n MediaStreamTrack,\n NtpTimeCallback,\n RtcpSourceCallback,\n RtpSourceCallback,\n saveToFileSystem,\n WebmCallback,\n WeriftError,\n} from \"../../..\";\nimport { MediaWriter } from \".\";\n\nconst sourcePath = \"packages/webrtc/src/nonstandard/recorder/writer/webm.ts\";\n\nexport class WebmFactory extends MediaWriter {\n rtpSources: RtpSourceCallback[] = [];\n\n unSubscribers = new EventDisposer();\n\n async start(tracks: MediaStreamTrack[]) {\n await unlink(this.path).catch((e) => e);\n\n const inputTracks = tracks.map((track, i) => {\n const trackNumber = i + 1;\n const payloadType = track.codec!.payloadType;\n\n if (track.kind === \"video\") {\n const codec = ((): SupportedCodec => {\n switch (track.codec?.name.toLowerCase() as SupportedVideoCodec) {\n case \"vp8\":\n return \"VP8\";\n case \"vp9\":\n return \"VP9\";\n case \"h264\":\n return \"MPEG4/ISO/AVC\";\n case \"av1x\":\n return \"AV1\";\n default:\n throw new WeriftError({\n message: \"unsupported codec\",\n payload: { track, path: sourcePath },\n });\n }\n })();\n return {\n kind: \"video\" as const,\n codec,\n clockRate: 90000,\n trackNumber,\n width: this.options.width,\n height: this.options.height,\n payloadType,\n track,\n };\n } else {\n return {\n kind: \"audio\" as const,\n codec: \"OPUS\" as const,\n clockRate: 48000,\n trackNumber,\n payloadType,\n track,\n };\n }\n });\n\n const webm = new WebmCallback(inputTracks, {\n duration: this.options.defaultDuration ?? 1000 * 60 * 60 * 24,\n });\n const lipsync = new LipsyncCallback();\n\n this.rtpSources = inputTracks.map(({ track, clockRate, codec }) => {\n const rtpSource = new RtpSourceCallback();\n const rtcpSource = new RtcpSourceCallback();\n track.onReceiveRtp\n .subscribe((rtp) => {\n rtpSource.input(rtp.clone());\n })\n .disposer(this.unSubscribers);\n track.onReceiveRtcp\n .subscribe((rtcp) => {\n rtcpSource.input(rtcp);\n })\n .disposer(this.unSubscribers);\n const ntpTime = new NtpTimeCallback(clockRate);\n\n if (track.kind === \"video\") {\n const depacketizer = new DepacketizeCallback(codec, {\n isFinalPacketInSequence: (h) => h.marker,\n });\n const jitterBuffer = new JitterBufferCallback(clockRate);\n\n rtpSource.pipe(jitterBuffer.input);\n rtcpSource.pipe(ntpTime.input);\n\n jitterBuffer.pipe(ntpTime.input);\n ntpTime.pipe(depacketizer.input);\n depacketizer.pipe(lipsync.inputVideo);\n lipsync.pipeVideo(webm.inputVideo);\n } else {\n const depacketizer = new DepacketizeCallback(codec);\n\n rtpSource.pipe(ntpTime.input);\n rtcpSource.pipe(ntpTime.input);\n\n ntpTime.pipe(depacketizer.input);\n depacketizer.pipe(lipsync.inputAudio);\n lipsync.pipeAudio(webm.inputAudio);\n }\n\n return rtpSource;\n });\n webm.pipe(saveToFileSystem(this.path));\n }\n\n async stop() {\n await Promise.all(this.rtpSources.map((r) => r.stop()));\n this.unSubscribers.dispose();\n }\n}\n\nconst supportedVideoCodecs = [\"h264\", \"vp8\", \"vp9\", \"av1x\"] as const;\ntype SupportedVideoCodec = typeof supportedVideoCodecs[number];\n"]}
|
package/lib/webrtc/src/utils.js
CHANGED
|
@@ -3,11 +3,12 @@ var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
|
3
3
|
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
4
4
|
};
|
|
5
5
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
6
|
-
exports.MediaStreamTrackFactory = exports.createSelfSignedCertificate = exports.parseIceServers = exports.compactNtp = exports.ntpTime = exports.timestampSeconds = exports.milliTime = exports.microTime = exports.reverseDirection = exports.andDirection = exports.reverseSimulcastDirection = exports.isDtls = exports.fingerprint = void 0;
|
|
6
|
+
exports.deepMerge = exports.MediaStreamTrackFactory = exports.createSelfSignedCertificate = exports.parseIceServers = exports.compactNtp = exports.ntpTime = exports.timestampSeconds = exports.milliTime = exports.microTime = exports.reverseDirection = exports.andDirection = exports.reverseSimulcastDirection = exports.isDtls = exports.fingerprint = void 0;
|
|
7
7
|
/* eslint-disable prefer-const */
|
|
8
8
|
const crypto_1 = require("crypto");
|
|
9
9
|
const debug_1 = __importDefault(require("debug"));
|
|
10
10
|
const dgram_1 = require("dgram");
|
|
11
|
+
const mergeWith_1 = __importDefault(require("lodash/mergeWith"));
|
|
11
12
|
const perf_hooks_1 = require("perf_hooks");
|
|
12
13
|
const src_1 = require("../../common/src");
|
|
13
14
|
const cipher_1 = require("../../dtls/src/context/cipher");
|
|
@@ -113,4 +114,11 @@ class MediaStreamTrackFactory {
|
|
|
113
114
|
}
|
|
114
115
|
}
|
|
115
116
|
exports.MediaStreamTrackFactory = MediaStreamTrackFactory;
|
|
117
|
+
const deepMerge = (dst, src) => (0, mergeWith_1.default)(dst, src, (obj, src) => {
|
|
118
|
+
if (!(src == undefined)) {
|
|
119
|
+
return src;
|
|
120
|
+
}
|
|
121
|
+
return obj;
|
|
122
|
+
});
|
|
123
|
+
exports.deepMerge = deepMerge;
|
|
116
124
|
//# sourceMappingURL=utils.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"utils.js","sourceRoot":"","sources":["../../../src/utils.ts"],"names":[],"mappings":"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","sourcesContent":["/* eslint-disable prefer-const */\nimport { createHash } from \"crypto\";\nimport debug from \"debug\";\nimport { createSocket, RemoteInfo } from \"dgram\";\nimport { performance } from \"perf_hooks\";\n\nimport { bufferReader, bufferWriter, randomPort } from \"../../common/src\";\nimport { CipherContext } from \"../../dtls/src/context/cipher\";\nimport { Address } from \"../../ice/src\";\nimport { Direction, Directions } from \"./media/rtpTransceiver\";\nimport { MediaStreamTrack } from \"./media/track\";\nimport { RTCIceServer } from \"./peerConnection\";\nconst now = require(\"nano-time\");\n\nconst log = debug(\"werift:packages/webrtc/src/utils.ts\");\n\nexport function fingerprint(file: Buffer, hashName: string) {\n const upper = (s: string) => s.toUpperCase();\n const colon = (s: any) => s.match(/(.{2})/g).join(\":\");\n\n const hash = createHash(hashName).update(file).digest(\"hex\");\n\n return colon(upper(hash));\n}\n\nexport function isDtls(buf: Buffer) {\n const firstByte = buf[0];\n return firstByte > 19 && firstByte < 64;\n}\n\nexport function reverseSimulcastDirection(dir: \"recv\" | \"send\") {\n if (dir === \"recv\") return \"send\";\n return \"recv\";\n}\n\nexport const andDirection = (a: Direction, b: Direction) =>\n Directions[Directions.indexOf(a) & Directions.indexOf(b)];\n\nexport function reverseDirection(dir: Direction): Direction {\n if (dir === \"sendonly\") return \"recvonly\";\n if (dir === \"recvonly\") return \"sendonly\";\n return dir;\n}\n\nexport const microTime = () => now.micro() as number;\n\nexport const milliTime = () => new Date().getTime();\n\nexport const timestampSeconds = () => Date.now() / 1000;\n\n/**https://datatracker.ietf.org/doc/html/rfc3550#section-4 */\nexport const ntpTime = () => {\n const now = performance.timeOrigin + performance.now() - Date.UTC(1900, 0, 1);\n\n const seconds = now / 1000;\n const [sec, msec] = seconds.toString().split(\".\").map(Number);\n\n const buf = bufferWriter([4, 4], [sec, msec]);\n\n return buf.readBigUInt64BE();\n};\n\n/**\n * https://datatracker.ietf.org/doc/html/rfc3550#section-4\n * @param ntp\n * @returns 32bit\n */\nexport const compactNtp = (ntp: bigint) => {\n const buf = bufferWriter([8], [ntp]);\n const [, sec, msec] = bufferReader(buf, [2, 2, 2, 2]);\n return bufferWriter([2, 2], [sec, msec]).readUInt32BE();\n};\n\nexport function parseIceServers(iceServers: RTCIceServer[]) {\n const url2Address = (url?: string) => {\n if (!url) return;\n const [address, port] = url.split(\":\");\n return [address, parseInt(port)] as Address;\n };\n\n const stunServer = url2Address(\n iceServers.find(({ urls }) => urls.includes(\"stun:\"))?.urls.slice(5)\n );\n const turnServer = url2Address(\n iceServers.find(({ urls }) => urls.includes(\"turn:\"))?.urls.slice(5)\n );\n const { credential, username } =\n iceServers.find(({ urls }) => urls.includes(\"turn:\")) || {};\n\n const options = {\n stunServer,\n turnServer,\n turnUsername: username,\n turnPassword: credential,\n };\n log(\"iceOptions\", options);\n return options;\n}\n\n/**\n *\n * @param signatureHash\n * @param namedCurveAlgorithm necessary when use ecdsa\n */\nexport const createSelfSignedCertificate =\n CipherContext.createSelfSignedCertificateWithKey;\n\nexport class MediaStreamTrackFactory {\n static async rtpSource({\n port,\n kind,\n }: {\n port?: number;\n kind: \"audio\" | \"video\";\n }) {\n port ??= await randomPort();\n const track = new MediaStreamTrack({ kind });\n\n const udp = createSocket(\"udp4\");\n udp.bind(port);\n const onMessage = (msg: Buffer, rinfo: RemoteInfo) => {\n track.writeRtp(msg);\n };\n udp.addListener(\"message\", onMessage);\n\n const dispose = () => {\n udp.removeListener(\"message\", onMessage);\n udp.close();\n };\n\n return [track, port, dispose] as const;\n }\n}\n"]}
|
|
1
|
+
{"version":3,"file":"utils.js","sourceRoot":"","sources":["../../../src/utils.ts"],"names":[],"mappings":"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","sourcesContent":["/* eslint-disable prefer-const */\nimport { createHash } from \"crypto\";\nimport debug from \"debug\";\nimport { createSocket, RemoteInfo } from \"dgram\";\nimport mergeWith from \"lodash/mergeWith\";\nimport { performance } from \"perf_hooks\";\n\nimport { bufferReader, bufferWriter, randomPort } from \"../../common/src\";\nimport { CipherContext } from \"../../dtls/src/context/cipher\";\nimport { Address } from \"../../ice/src\";\nimport { Direction, Directions } from \"./media/rtpTransceiver\";\nimport { MediaStreamTrack } from \"./media/track\";\nimport { RTCIceServer } from \"./peerConnection\";\nconst now = require(\"nano-time\");\n\nconst log = debug(\"werift:packages/webrtc/src/utils.ts\");\n\nexport function fingerprint(file: Buffer, hashName: string) {\n const upper = (s: string) => s.toUpperCase();\n const colon = (s: any) => s.match(/(.{2})/g).join(\":\");\n\n const hash = createHash(hashName).update(file).digest(\"hex\");\n\n return colon(upper(hash));\n}\n\nexport function isDtls(buf: Buffer) {\n const firstByte = buf[0];\n return firstByte > 19 && firstByte < 64;\n}\n\nexport function reverseSimulcastDirection(dir: \"recv\" | \"send\") {\n if (dir === \"recv\") return \"send\";\n return \"recv\";\n}\n\nexport const andDirection = (a: Direction, b: Direction) =>\n Directions[Directions.indexOf(a) & Directions.indexOf(b)];\n\nexport function reverseDirection(dir: Direction): Direction {\n if (dir === \"sendonly\") return \"recvonly\";\n if (dir === \"recvonly\") return \"sendonly\";\n return dir;\n}\n\nexport const microTime = () => now.micro() as number;\n\nexport const milliTime = () => new Date().getTime();\n\nexport const timestampSeconds = () => Date.now() / 1000;\n\n/**https://datatracker.ietf.org/doc/html/rfc3550#section-4 */\nexport const ntpTime = () => {\n const now = performance.timeOrigin + performance.now() - Date.UTC(1900, 0, 1);\n\n const seconds = now / 1000;\n const [sec, msec] = seconds.toString().split(\".\").map(Number);\n\n const buf = bufferWriter([4, 4], [sec, msec]);\n\n return buf.readBigUInt64BE();\n};\n\n/**\n * https://datatracker.ietf.org/doc/html/rfc3550#section-4\n * @param ntp\n * @returns 32bit\n */\nexport const compactNtp = (ntp: bigint) => {\n const buf = bufferWriter([8], [ntp]);\n const [, sec, msec] = bufferReader(buf, [2, 2, 2, 2]);\n return bufferWriter([2, 2], [sec, msec]).readUInt32BE();\n};\n\nexport function parseIceServers(iceServers: RTCIceServer[]) {\n const url2Address = (url?: string) => {\n if (!url) return;\n const [address, port] = url.split(\":\");\n return [address, parseInt(port)] as Address;\n };\n\n const stunServer = url2Address(\n iceServers.find(({ urls }) => urls.includes(\"stun:\"))?.urls.slice(5)\n );\n const turnServer = url2Address(\n iceServers.find(({ urls }) => urls.includes(\"turn:\"))?.urls.slice(5)\n );\n const { credential, username } =\n iceServers.find(({ urls }) => urls.includes(\"turn:\")) || {};\n\n const options = {\n stunServer,\n turnServer,\n turnUsername: username,\n turnPassword: credential,\n };\n log(\"iceOptions\", options);\n return options;\n}\n\n/**\n *\n * @param signatureHash\n * @param namedCurveAlgorithm necessary when use ecdsa\n */\nexport const createSelfSignedCertificate =\n CipherContext.createSelfSignedCertificateWithKey;\n\nexport class MediaStreamTrackFactory {\n static async rtpSource({\n port,\n kind,\n }: {\n port?: number;\n kind: \"audio\" | \"video\";\n }) {\n port ??= await randomPort();\n const track = new MediaStreamTrack({ kind });\n\n const udp = createSocket(\"udp4\");\n udp.bind(port);\n const onMessage = (msg: Buffer, rinfo: RemoteInfo) => {\n track.writeRtp(msg);\n };\n udp.addListener(\"message\", onMessage);\n\n const dispose = () => {\n udp.removeListener(\"message\", onMessage);\n udp.close();\n };\n\n return [track, port, dispose] as const;\n }\n}\n\nexport const deepMerge = <T>(dst: T, src: T) =>\n mergeWith(dst, src, (obj, src) => {\n if (!(src == undefined)) {\n return src;\n }\n return obj;\n });\n"]}
|
package/package.json
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
import { unlink } from "fs/promises";
|
|
2
2
|
import { EventDisposer } from "rx.mini";
|
|
3
3
|
|
|
4
|
-
import { SupportedCodec } from "../../../../../rtp/src/container/webm";
|
|
4
|
+
import { SupportedCodec } from "../../../../../rtp/src/container/webm/container";
|
|
5
5
|
import {
|
|
6
6
|
DepacketizeCallback,
|
|
7
7
|
JitterBufferCallback,
|
package/src/utils.ts
CHANGED
|
@@ -2,6 +2,7 @@
|
|
|
2
2
|
import { createHash } from "crypto";
|
|
3
3
|
import debug from "debug";
|
|
4
4
|
import { createSocket, RemoteInfo } from "dgram";
|
|
5
|
+
import mergeWith from "lodash/mergeWith";
|
|
5
6
|
import { performance } from "perf_hooks";
|
|
6
7
|
|
|
7
8
|
import { bufferReader, bufferWriter, randomPort } from "../../common/src";
|
|
@@ -131,3 +132,11 @@ export class MediaStreamTrackFactory {
|
|
|
131
132
|
return [track, port, dispose] as const;
|
|
132
133
|
}
|
|
133
134
|
}
|
|
135
|
+
|
|
136
|
+
export const deepMerge = <T>(dst: T, src: T) =>
|
|
137
|
+
mergeWith(dst, src, (obj, src) => {
|
|
138
|
+
if (!(src == undefined)) {
|
|
139
|
+
return src;
|
|
140
|
+
}
|
|
141
|
+
return obj;
|
|
142
|
+
});
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
export declare const deepMerge: <T>(dst: T, src: T) => T;
|