werift 0.21.7 → 0.21.8
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/webrtc/src/media/extension/rtpExtension.js +9 -9
- package/lib/webrtc/src/media/extension/rtpExtension.js.map +1 -1
- package/lib/webrtc/src/media/receiver/nack.d.ts +1 -1
- package/lib/webrtc/src/media/receiver/nack.js +7 -7
- package/lib/webrtc/src/media/receiver/nack.js.map +1 -1
- package/lib/webrtc/src/media/receiver/receiverTwcc.js +11 -11
- package/lib/webrtc/src/media/receiver/receiverTwcc.js.map +1 -1
- package/lib/webrtc/src/media/receiver/statistics.d.ts +1 -1
- package/lib/webrtc/src/media/receiver/statistics.js +3 -3
- package/lib/webrtc/src/media/receiver/statistics.js.map +1 -1
- package/lib/webrtc/src/media/router.d.ts +1 -1
- package/lib/webrtc/src/media/router.js +11 -11
- package/lib/webrtc/src/media/router.js.map +1 -1
- package/lib/webrtc/src/media/rtpReceiver.d.ts +3 -3
- package/lib/webrtc/src/media/rtpReceiver.js +16 -16
- package/lib/webrtc/src/media/rtpReceiver.js.map +1 -1
- package/lib/webrtc/src/media/rtpSender.d.ts +1 -1
- package/lib/webrtc/src/media/rtpSender.js +38 -37
- package/lib/webrtc/src/media/rtpSender.js.map +1 -1
- package/lib/webrtc/src/media/sender/cumulativeResult.js +3 -3
- package/lib/webrtc/src/media/sender/cumulativeResult.js.map +1 -1
- package/lib/webrtc/src/media/sender/senderBWE.d.ts +1 -1
- package/lib/webrtc/src/media/sender/senderBWE.js +3 -3
- package/lib/webrtc/src/media/sender/senderBWE.js.map +1 -1
- package/lib/webrtc/src/media/track.d.ts +1 -1
- package/lib/webrtc/src/media/track.js +2 -2
- package/lib/webrtc/src/media/track.js.map +1 -1
- package/lib/webrtc/src/nonstandard/index.d.ts +1 -1
- package/lib/webrtc/src/nonstandard/index.js +1 -1
- package/lib/webrtc/src/nonstandard/index.js.map +1 -1
- package/lib/webrtc/src/nonstandard/recorder/writer/index.d.ts +1 -1
- package/lib/webrtc/src/nonstandard/recorder/writer/index.js.map +1 -1
- package/lib/webrtc/src/nonstandard/recorder/writer/webm.d.ts +1 -1
- package/lib/webrtc/src/nonstandard/recorder/writer/webm.js +11 -11
- package/lib/webrtc/src/nonstandard/recorder/writer/webm.js.map +1 -1
- package/lib/webrtc/src/nonstandard/userMedia.js +5 -5
- package/lib/webrtc/src/nonstandard/userMedia.js.map +1 -1
- package/package.json +4 -8
- package/src/media/extension/rtpExtension.ts +1 -1
- package/src/media/receiver/nack.ts +2 -2
- package/src/media/receiver/receiverTwcc.ts +2 -2
- package/src/media/receiver/statistics.ts +2 -2
- package/src/media/router.ts +1 -1
- package/src/media/rtpReceiver.ts +9 -5
- package/src/media/rtpSender.ts +3 -2
- package/src/media/sender/cumulativeResult.ts +1 -1
- package/src/media/sender/senderBWE.ts +2 -2
- package/src/media/track.ts +2 -2
- package/src/nonstandard/index.ts +1 -1
- package/src/nonstandard/recorder/writer/index.ts +1 -1
- package/src/nonstandard/recorder/writer/webm.ts +1 -1
- package/src/nonstandard/userMedia.ts +2 -2
- package/lib/index.mjs +0 -49008
- package/lib/nonstandard/index.mjs +0 -49217
- package/lib/webrtc/src/imports/rtpExtra.d.ts +0 -1
- package/lib/webrtc/src/imports/rtpExtra.js +0 -18
- package/lib/webrtc/src/imports/rtpExtra.js.map +0 -1
- package/src/imports/rtpExtra.ts +0 -1
|
@@ -8,46 +8,46 @@ exports.useAbsSendTime = useAbsSendTime;
|
|
|
8
8
|
exports.useDependencyDescriptor = useDependencyDescriptor;
|
|
9
9
|
exports.useAudioLevelIndication = useAudioLevelIndication;
|
|
10
10
|
exports.useVideoOrientation = useVideoOrientation;
|
|
11
|
-
const
|
|
11
|
+
const src_1 = require("../../../../rtp/src");
|
|
12
12
|
const parameters_1 = require("../parameters");
|
|
13
13
|
function useSdesMid() {
|
|
14
14
|
return new parameters_1.RTCRtpHeaderExtensionParameters({
|
|
15
|
-
uri:
|
|
15
|
+
uri: src_1.RTP_EXTENSION_URI.sdesMid,
|
|
16
16
|
});
|
|
17
17
|
}
|
|
18
18
|
function useSdesRTPStreamId() {
|
|
19
19
|
return new parameters_1.RTCRtpHeaderExtensionParameters({
|
|
20
|
-
uri:
|
|
20
|
+
uri: src_1.RTP_EXTENSION_URI.sdesRTPStreamID,
|
|
21
21
|
});
|
|
22
22
|
}
|
|
23
23
|
function useRepairedRtpStreamId() {
|
|
24
24
|
return new parameters_1.RTCRtpHeaderExtensionParameters({
|
|
25
|
-
uri:
|
|
25
|
+
uri: src_1.RTP_EXTENSION_URI.repairedRtpStreamId,
|
|
26
26
|
});
|
|
27
27
|
}
|
|
28
28
|
function useTransportWideCC() {
|
|
29
29
|
return new parameters_1.RTCRtpHeaderExtensionParameters({
|
|
30
|
-
uri:
|
|
30
|
+
uri: src_1.RTP_EXTENSION_URI.transportWideCC,
|
|
31
31
|
});
|
|
32
32
|
}
|
|
33
33
|
function useAbsSendTime() {
|
|
34
34
|
return new parameters_1.RTCRtpHeaderExtensionParameters({
|
|
35
|
-
uri:
|
|
35
|
+
uri: src_1.RTP_EXTENSION_URI.absSendTime,
|
|
36
36
|
});
|
|
37
37
|
}
|
|
38
38
|
function useDependencyDescriptor() {
|
|
39
39
|
return new parameters_1.RTCRtpHeaderExtensionParameters({
|
|
40
|
-
uri:
|
|
40
|
+
uri: src_1.RTP_EXTENSION_URI.dependencyDescriptor,
|
|
41
41
|
});
|
|
42
42
|
}
|
|
43
43
|
function useAudioLevelIndication() {
|
|
44
44
|
return new parameters_1.RTCRtpHeaderExtensionParameters({
|
|
45
|
-
uri:
|
|
45
|
+
uri: src_1.RTP_EXTENSION_URI.audioLevelIndication,
|
|
46
46
|
});
|
|
47
47
|
}
|
|
48
48
|
function useVideoOrientation() {
|
|
49
49
|
return new parameters_1.RTCRtpHeaderExtensionParameters({
|
|
50
|
-
uri:
|
|
50
|
+
uri: src_1.RTP_EXTENSION_URI.videoOrientation,
|
|
51
51
|
});
|
|
52
52
|
}
|
|
53
53
|
//# sourceMappingURL=rtpExtension.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"rtpExtension.js","sourceRoot":"","sources":["../../../../../src/media/extension/rtpExtension.ts"],"names":[],"mappings":";;AAGA,gCAIC;AAED,gDAIC;AAED,wDAIC;AAED,gDAIC;AAED,wCAIC;AAED,0DAIC;AAED,0DAIC;AAED,kDAIC;AAjDD,
|
|
1
|
+
{"version":3,"file":"rtpExtension.js","sourceRoot":"","sources":["../../../../../src/media/extension/rtpExtension.ts"],"names":[],"mappings":";;AAGA,gCAIC;AAED,gDAIC;AAED,wDAIC;AAED,gDAIC;AAED,wCAIC;AAED,0DAIC;AAED,0DAIC;AAED,kDAIC;AAjDD,6CAAwD;AACxD,8CAAgE;AAEhE,SAAgB,UAAU;IACxB,OAAO,IAAI,4CAA+B,CAAC;QACzC,GAAG,EAAE,uBAAiB,CAAC,OAAO;KAC/B,CAAC,CAAC;AACL,CAAC;AAED,SAAgB,kBAAkB;IAChC,OAAO,IAAI,4CAA+B,CAAC;QACzC,GAAG,EAAE,uBAAiB,CAAC,eAAe;KACvC,CAAC,CAAC;AACL,CAAC;AAED,SAAgB,sBAAsB;IACpC,OAAO,IAAI,4CAA+B,CAAC;QACzC,GAAG,EAAE,uBAAiB,CAAC,mBAAmB;KAC3C,CAAC,CAAC;AACL,CAAC;AAED,SAAgB,kBAAkB;IAChC,OAAO,IAAI,4CAA+B,CAAC;QACzC,GAAG,EAAE,uBAAiB,CAAC,eAAe;KACvC,CAAC,CAAC;AACL,CAAC;AAED,SAAgB,cAAc;IAC5B,OAAO,IAAI,4CAA+B,CAAC;QACzC,GAAG,EAAE,uBAAiB,CAAC,WAAW;KACnC,CAAC,CAAC;AACL,CAAC;AAED,SAAgB,uBAAuB;IACrC,OAAO,IAAI,4CAA+B,CAAC;QACzC,GAAG,EAAE,uBAAiB,CAAC,oBAAoB;KAC5C,CAAC,CAAC;AACL,CAAC;AAED,SAAgB,uBAAuB;IACrC,OAAO,IAAI,4CAA+B,CAAC;QACzC,GAAG,EAAE,uBAAiB,CAAC,oBAAoB;KAC5C,CAAC,CAAC;AACL,CAAC;AAED,SAAgB,mBAAmB;IACjC,OAAO,IAAI,4CAA+B,CAAC;QACzC,GAAG,EAAE,uBAAiB,CAAC,gBAAgB;KACxC,CAAC,CAAC;AACL,CAAC","sourcesContent":["import { RTP_EXTENSION_URI } from \"../../../../rtp/src\";\nimport { RTCRtpHeaderExtensionParameters } from \"../parameters\";\n\nexport function useSdesMid() {\n return new RTCRtpHeaderExtensionParameters({\n uri: RTP_EXTENSION_URI.sdesMid,\n });\n}\n\nexport function useSdesRTPStreamId() {\n return new RTCRtpHeaderExtensionParameters({\n uri: RTP_EXTENSION_URI.sdesRTPStreamID,\n });\n}\n\nexport function useRepairedRtpStreamId() {\n return new RTCRtpHeaderExtensionParameters({\n uri: RTP_EXTENSION_URI.repairedRtpStreamId,\n });\n}\n\nexport function useTransportWideCC() {\n return new RTCRtpHeaderExtensionParameters({\n uri: RTP_EXTENSION_URI.transportWideCC,\n });\n}\n\nexport function useAbsSendTime() {\n return new RTCRtpHeaderExtensionParameters({\n uri: RTP_EXTENSION_URI.absSendTime,\n });\n}\n\nexport function useDependencyDescriptor() {\n return new RTCRtpHeaderExtensionParameters({\n uri: RTP_EXTENSION_URI.dependencyDescriptor,\n });\n}\n\nexport function useAudioLevelIndication() {\n return new RTCRtpHeaderExtensionParameters({\n uri: RTP_EXTENSION_URI.audioLevelIndication,\n });\n}\n\nexport function useVideoOrientation() {\n return new RTCRtpHeaderExtensionParameters({\n uri: RTP_EXTENSION_URI.videoOrientation,\n });\n}\n"]}
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import { Event } from "../../imports/common";
|
|
2
|
-
import { GenericNack, type RtpPacket } from "
|
|
2
|
+
import { GenericNack, type RtpPacket } from "../../../../rtp/src";
|
|
3
3
|
import type { RTCRtpReceiver } from "../rtpReceiver";
|
|
4
4
|
export declare class NackHandler {
|
|
5
5
|
private receiver;
|
|
@@ -7,8 +7,8 @@ exports.NackHandler = void 0;
|
|
|
7
7
|
const debug_1 = __importDefault(require("debug"));
|
|
8
8
|
const range_1 = __importDefault(require("lodash/range"));
|
|
9
9
|
const common_1 = require("../../imports/common");
|
|
10
|
-
const
|
|
11
|
-
const
|
|
10
|
+
const src_1 = require("../../../../common/src");
|
|
11
|
+
const src_2 = require("../../../../rtp/src");
|
|
12
12
|
const log = (0, debug_1.default)("werift:packages/webrtc/src/media/receiver/nack.ts");
|
|
13
13
|
const LOST_SIZE = 30 * 5;
|
|
14
14
|
class NackHandler {
|
|
@@ -67,12 +67,12 @@ class NackHandler {
|
|
|
67
67
|
writable: true,
|
|
68
68
|
value: () => new Promise((r, f) => {
|
|
69
69
|
if (this.lostSeqNumbers.length > 0 && this.mediaSourceSsrc) {
|
|
70
|
-
const nack = new
|
|
70
|
+
const nack = new src_2.GenericNack({
|
|
71
71
|
senderSsrc: this.receiver.rtcpSsrc,
|
|
72
72
|
mediaSourceSsrc: this.mediaSourceSsrc,
|
|
73
73
|
lost: this.lostSeqNumbers,
|
|
74
74
|
});
|
|
75
|
-
const rtcp = new
|
|
75
|
+
const rtcp = new src_2.RtcpTransportLayerFeedback({
|
|
76
76
|
feedback: nack,
|
|
77
77
|
});
|
|
78
78
|
this.receiver.dtlsTransport.sendRtcp([rtcp]).then(r).catch(f);
|
|
@@ -121,12 +121,12 @@ class NackHandler {
|
|
|
121
121
|
this.removeLost(sequenceNumber);
|
|
122
122
|
return;
|
|
123
123
|
}
|
|
124
|
-
if (sequenceNumber === (0,
|
|
124
|
+
if (sequenceNumber === (0, src_1.uint16Add)(this.newEstSeqNum, 1)) {
|
|
125
125
|
this.newEstSeqNum = sequenceNumber;
|
|
126
126
|
}
|
|
127
|
-
else if (sequenceNumber > (0,
|
|
127
|
+
else if (sequenceNumber > (0, src_1.uint16Add)(this.newEstSeqNum, 1)) {
|
|
128
128
|
// packet lost detected
|
|
129
|
-
(0, range_1.default)((0,
|
|
129
|
+
(0, range_1.default)((0, src_1.uint16Add)(this.newEstSeqNum, 1), sequenceNumber).forEach((seq) => {
|
|
130
130
|
this.setLost(seq, 1);
|
|
131
131
|
});
|
|
132
132
|
// this.receiver.sendRtcpPLI(this.mediaSourceSsrc);
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"nack.js","sourceRoot":"","sources":["../../../../../src/media/receiver/nack.ts"],"names":[],"mappings":";;;;;;AAAA,kDAA0B;AAC1B,yDAAiC;AACjC,iDAA6C;AAE7C,
|
|
1
|
+
{"version":3,"file":"nack.js","sourceRoot":"","sources":["../../../../../src/media/receiver/nack.ts"],"names":[],"mappings":"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","sourcesContent":["import debug from \"debug\";\nimport range from \"lodash/range\";\nimport { Event } from \"../../imports/common\";\n\nimport { uint16Add } from \"../../../../common/src\";\nimport {\n GenericNack,\n RtcpTransportLayerFeedback,\n type RtpPacket,\n} from \"../../../../rtp/src\";\nimport type { RTCRtpReceiver } from \"../rtpReceiver\";\n\nconst log = debug(\"werift:packages/webrtc/src/media/receiver/nack.ts\");\n\nconst LOST_SIZE = 30 * 5;\n\nexport class NackHandler {\n private newEstSeqNum = 0;\n private _lost: { [seqNum: number]: number } = {};\n private nackLoop: any;\n\n readonly onPacketLost = new Event<[GenericNack]>();\n mediaSourceSsrc?: number;\n retryCount = 10;\n closed = false;\n\n constructor(private receiver: RTCRtpReceiver) {}\n\n get lostSeqNumbers() {\n return Object.keys(this._lost).map(Number).sort();\n }\n\n private getLost(seq: number) {\n return this._lost[seq];\n }\n\n private setLost(seq: number, count: number) {\n this._lost[seq] = count;\n\n if (this.nackLoop || this.closed) {\n return;\n }\n this.nackLoop = setInterval(async () => {\n try {\n await this.sendNack();\n if (!Object.keys(this._lost).length) {\n clearInterval(this.nackLoop);\n this.nackLoop = undefined;\n }\n } catch (error) {\n log(\"failed to send nack\", error);\n }\n }, 5);\n }\n\n private removeLost(sequenceNumber: number) {\n delete this._lost[sequenceNumber];\n }\n\n addPacket(packet: RtpPacket) {\n const { sequenceNumber, ssrc } = packet.header;\n this.mediaSourceSsrc = ssrc;\n\n if (this.newEstSeqNum === 0) {\n this.newEstSeqNum = sequenceNumber;\n return;\n }\n\n if (this.getLost(sequenceNumber)) {\n // log(\"packetLoss resolved\", { sequenceNumber });\n this.removeLost(sequenceNumber);\n return;\n }\n\n if (sequenceNumber === uint16Add(this.newEstSeqNum, 1)) {\n this.newEstSeqNum = sequenceNumber;\n } else if (sequenceNumber > uint16Add(this.newEstSeqNum, 1)) {\n // packet lost detected\n range(uint16Add(this.newEstSeqNum, 1), sequenceNumber).forEach((seq) => {\n this.setLost(seq, 1);\n });\n // this.receiver.sendRtcpPLI(this.mediaSourceSsrc);\n\n this.newEstSeqNum = sequenceNumber;\n this.pruneLost();\n }\n }\n\n private pruneLost() {\n if (this.lostSeqNumbers.length > LOST_SIZE) {\n this._lost = Object.entries(this._lost)\n .slice(-LOST_SIZE)\n .reduce(\n (acc, [key, v]) => {\n acc[key] = v;\n return acc;\n },\n {} as { [seqNum: number]: number },\n );\n }\n }\n\n close() {\n this.closed = true;\n clearInterval(this.nackLoop);\n this._lost = {};\n }\n\n private updateRetryCount() {\n this.lostSeqNumbers.forEach((seq) => {\n const count = this._lost[seq]++;\n if (count > this.retryCount) {\n this.removeLost(seq);\n return seq;\n }\n });\n }\n\n private sendNack = () =>\n new Promise((r, f) => {\n if (this.lostSeqNumbers.length > 0 && this.mediaSourceSsrc) {\n const nack = new GenericNack({\n senderSsrc: this.receiver.rtcpSsrc,\n mediaSourceSsrc: this.mediaSourceSsrc,\n lost: this.lostSeqNumbers,\n });\n\n const rtcp = new RtcpTransportLayerFeedback({\n feedback: nack,\n });\n this.receiver.dtlsTransport.sendRtcp([rtcp]).then(r).catch(f);\n\n this.updateRetryCount();\n this.onPacketLost.execute(nack);\n }\n });\n}\n"]}
|
|
@@ -6,8 +6,8 @@ Object.defineProperty(exports, "__esModule", { value: true });
|
|
|
6
6
|
exports.ReceiverTWCC = void 0;
|
|
7
7
|
const debug_1 = __importDefault(require("debug"));
|
|
8
8
|
const promises_1 = require("timers/promises");
|
|
9
|
-
const
|
|
10
|
-
const
|
|
9
|
+
const src_1 = require("../../../../common/src");
|
|
10
|
+
const src_2 = require("../../../../rtp/src");
|
|
11
11
|
const utils_1 = require("../../utils");
|
|
12
12
|
const log = (0, debug_1.default)("werift:packages/webrtc/media/receiver/receiverTwcc");
|
|
13
13
|
class ReceiverTWCC {
|
|
@@ -80,7 +80,7 @@ class ReceiverTWCC {
|
|
|
80
80
|
const maxTSN = extensionsArr.slice(-1)[0].tsn;
|
|
81
81
|
const packetChunks = [];
|
|
82
82
|
const baseSequenceNumber = extensionsArr[0].tsn;
|
|
83
|
-
const packetStatusCount = (0,
|
|
83
|
+
const packetStatusCount = (0, src_1.uint16Add)(maxTSN - minTSN, 1);
|
|
84
84
|
/**micro sec */
|
|
85
85
|
let referenceTime;
|
|
86
86
|
let lastPacketStatus;
|
|
@@ -97,7 +97,7 @@ class ReceiverTWCC {
|
|
|
97
97
|
}
|
|
98
98
|
const delta = timestamp - this.lastTimestamp;
|
|
99
99
|
this.lastTimestamp = timestamp;
|
|
100
|
-
const recvDelta = new
|
|
100
|
+
const recvDelta = new src_2.RecvDelta({
|
|
101
101
|
delta: Number(delta),
|
|
102
102
|
});
|
|
103
103
|
recvDelta.parseDelta();
|
|
@@ -105,7 +105,7 @@ class ReceiverTWCC {
|
|
|
105
105
|
// when status changed
|
|
106
106
|
if (lastPacketStatus != undefined &&
|
|
107
107
|
lastPacketStatus.status !== recvDelta.type) {
|
|
108
|
-
packetChunks.push(new
|
|
108
|
+
packetChunks.push(new src_2.RunLengthChunk({
|
|
109
109
|
packetStatus: lastPacketStatus.status,
|
|
110
110
|
runLength: i - lastPacketStatus.minTSN,
|
|
111
111
|
}));
|
|
@@ -114,13 +114,13 @@ class ReceiverTWCC {
|
|
|
114
114
|
// last status
|
|
115
115
|
if (i === maxTSN) {
|
|
116
116
|
if (lastPacketStatus != undefined) {
|
|
117
|
-
packetChunks.push(new
|
|
117
|
+
packetChunks.push(new src_2.RunLengthChunk({
|
|
118
118
|
packetStatus: lastPacketStatus.status,
|
|
119
119
|
runLength: i - lastPacketStatus.minTSN + 1,
|
|
120
120
|
}));
|
|
121
121
|
}
|
|
122
122
|
else {
|
|
123
|
-
packetChunks.push(new
|
|
123
|
+
packetChunks.push(new src_2.RunLengthChunk({
|
|
124
124
|
packetStatus: recvDelta.type,
|
|
125
125
|
runLength: 1,
|
|
126
126
|
}));
|
|
@@ -134,13 +134,13 @@ class ReceiverTWCC {
|
|
|
134
134
|
if (!referenceTime) {
|
|
135
135
|
return;
|
|
136
136
|
}
|
|
137
|
-
const packet = new
|
|
138
|
-
feedback: new
|
|
137
|
+
const packet = new src_2.RtcpTransportLayerFeedback({
|
|
138
|
+
feedback: new src_2.TransportWideCC({
|
|
139
139
|
senderSsrc: this.rtcpSsrc,
|
|
140
140
|
mediaSourceSsrc: this.mediaSourceSsrc,
|
|
141
141
|
baseSequenceNumber,
|
|
142
142
|
packetStatusCount,
|
|
143
|
-
referenceTime: (0,
|
|
143
|
+
referenceTime: (0, src_1.uint24)(Math.floor(referenceTime / 1000 / 64)),
|
|
144
144
|
fbPktCount: this.fbPktCount,
|
|
145
145
|
recvDeltas,
|
|
146
146
|
packetChunks,
|
|
@@ -150,7 +150,7 @@ class ReceiverTWCC {
|
|
|
150
150
|
log(err);
|
|
151
151
|
});
|
|
152
152
|
this.extensionInfo = {};
|
|
153
|
-
this.fbPktCount = (0,
|
|
153
|
+
this.fbPktCount = (0, src_1.uint8Add)(this.fbPktCount, 1);
|
|
154
154
|
}
|
|
155
155
|
}
|
|
156
156
|
exports.ReceiverTWCC = ReceiverTWCC;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"receiverTwcc.js","sourceRoot":"","sources":["../../../../../src/media/receiver/receiverTwcc.ts"],"names":[],"mappings":";;;;;;AAAA,kDAA0B;AAC1B,8CAA6C;AAE7C,
|
|
1
|
+
{"version":3,"file":"receiverTwcc.js","sourceRoot":"","sources":["../../../../../src/media/receiver/receiverTwcc.ts"],"names":[],"mappings":";;;;;;AAAA,kDAA0B;AAC1B,8CAA6C;AAE7C,gDAAqE;AACrE,6CAO6B;AAE7B,uCAAwC;AAExC,MAAM,GAAG,GAAG,IAAA,eAAK,EAAC,oDAAoD,CAAC,CAAC;AAIxE,MAAa,YAAY;IASvB,YACU,aAA+B,EAC/B,QAAgB,EAChB,eAAuB;QAF/B;;;;mBAAQ,aAAa;WAAkB;QACvC;;;;mBAAQ,QAAQ;WAAQ;QACxB;;;;mBAAQ,eAAe;WAAQ;QAXjC;;;;mBAEI,EAAE;WAAC;QACP;;;;mBAAc,KAAK;WAAC;QACpB,YAAY;QACZ;;;;mBAAa,CAAC;WAAC;QACf;;;;;WAAuB;QAOrB,IAAI,CAAC,OAAO,EAAE,CAAC;IACjB,CAAC;IAED,UAAU,CAAC,uBAA+B;QACxC,IAAI,CAAC,aAAa,CAAC,uBAAuB,CAAC,GAAG;YAC5C,GAAG,EAAE,uBAAuB;YAC5B,SAAS,EAAE,IAAA,iBAAS,GAAE;SACvB,CAAC;QAEF,IAAI,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,aAAa,CAAC,CAAC,MAAM,GAAG,EAAE,EAAE,CAAC;YAChD,IAAI,CAAC,QAAQ,EAAE,CAAC;QAClB,CAAC;IACH,CAAC;IAEO,KAAK,CAAC,OAAO;QACnB,OAAO,IAAI,CAAC,WAAW,EAAE,CAAC;YACxB,IAAI,CAAC,QAAQ,EAAE,CAAC;YAChB,MAAM,IAAA,qBAAU,EAAC,GAAG,CAAC,CAAC;QACxB,CAAC;IACH,CAAC;IAEO,QAAQ;QACd,IAAI,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,aAAa,CAAC,CAAC,MAAM,KAAK,CAAC;YAAE,OAAO;QACzD,MAAM,aAAa,GAAG,MAAM,CAAC,MAAM,CAAC,IAAI,CAAC,aAAa,CAAC,CAAC,IAAI,CAC1D,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,GAAG,GAAG,CAAC,CAAC,GAAG,CACxB,CAAC;QAEF,MAAM,MAAM,GAAG,aAAa,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC;QACpC,MAAM,MAAM,GAAG,aAAa,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC;QAE9C,MAAM,YAAY,GAA2C,EAAE,CAAC;QAChE,MAAM,kBAAkB,GAAG,aAAa,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC;QAChD,MAAM,iBAAiB,GAAG,IAAA,eAAS,EAAC,MAAM,GAAG,MAAM,EAAE,CAAC,CAAC,CAAC;QACxD,eAAe;QACf,IAAI,aAAsB,CAAC;QAC3B,IAAI,gBAAsE,CAAC;QAC3E,MAAM,UAAU,GAAgB,EAAE,CAAC;QAEnC,KAAK,IAAI,CAAC,GAAG,MAAM,EAAE,CAAC,IAAI,MAAM,EAAE,CAAC,EAAE,EAAE,CAAC;YACtC,eAAe;YACf,MAAM,SAAS,GAAG,IAAI,CAAC,aAAa,CAAC,CAAC,CAAC,EAAE,SAAS,CAAC;YAEnD,IAAI,SAAS,EAAE,CAAC;gBACd,IAAI,CAAC,IAAI,CAAC,aAAa,EAAE,CAAC;oBACxB,IAAI,CAAC,aAAa,GAAG,SAAS,CAAC;gBACjC,CAAC;gBACD,IAAI,CAAC,aAAa,EAAE,CAAC;oBACnB,aAAa,GAAG,IAAI,CAAC,aAAa,CAAC;gBACrC,CAAC;gBAED,MAAM,KAAK,GAAG,SAAS,GAAG,IAAI,CAAC,aAAa,CAAC;gBAC7C,IAAI,CAAC,aAAa,GAAG,SAAS,CAAC;gBAE/B,MAAM,SAAS,GAAG,IAAI,eAAS,CAAC;oBAC9B,KAAK,EAAE,MAAM,CAAC,KAAK,CAAC;iBACrB,CAAC,CAAC;gBACH,SAAS,CAAC,UAAU,EAAE,CAAC;gBACvB,UAAU,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC;gBAE3B,sBAAsB;gBACtB,IACE,gBAAgB,IAAI,SAAS;oBAC7B,gBAAgB,CAAC,MAAM,KAAK,SAAS,CAAC,IAAI,EAC1C,CAAC;oBACD,YAAY,CAAC,IAAI,CACf,IAAI,oBAAc,CAAC;wBACjB,YAAY,EAAE,gBAAgB,CAAC,MAAM;wBACrC,SAAS,EAAE,CAAC,GAAG,gBAAgB,CAAC,MAAM;qBACvC,CAAC,CACH,CAAC;oBACF,gBAAgB,GAAG,EAAE,MAAM,EAAE,CAAC,EAAE,MAAM,EAAE,SAAS,CAAC,IAAK,EAAE,CAAC;gBAC5D,CAAC;gBACD,cAAc;gBACd,IAAI,CAAC,KAAK,MAAM,EAAE,CAAC;oBACjB,IAAI,gBAAgB,IAAI,SAAS,EAAE,CAAC;wBAClC,YAAY,CAAC,IAAI,CACf,IAAI,oBAAc,CAAC;4BACjB,YAAY,EAAE,gBAAgB,CAAC,MAAM;4BACrC,SAAS,EAAE,CAAC,GAAG,gBAAgB,CAAC,MAAM,GAAG,CAAC;yBAC3C,CAAC,CACH,CAAC;oBACJ,CAAC;yBAAM,CAAC;wBACN,YAAY,CAAC,IAAI,CACf,IAAI,oBAAc,CAAC;4BACjB,YAAY,EAAE,SAAS,CAAC,IAAI;4BAC5B,SAAS,EAAE,CAAC;yBACb,CAAC,CACH,CAAC;oBACJ,CAAC;gBACH,CAAC;gBAED,IAAI,gBAAgB,IAAI,SAAS,EAAE,CAAC;oBAClC,gBAAgB,GAAG,EAAE,MAAM,EAAE,CAAC,EAAE,MAAM,EAAE,SAAS,CAAC,IAAK,EAAE,CAAC;gBAC5D,CAAC;YACH,CAAC;QACH,CAAC;QAED,IAAI,CAAC,aAAa,EAAE,CAAC;YACnB,OAAO;QACT,CAAC;QAED,MAAM,MAAM,GAAG,IAAI,gCAA0B,CAAC;YAC5C,QAAQ,EAAE,IAAI,qBAAe,CAAC;gBAC5B,UAAU,EAAE,IAAI,CAAC,QAAQ;gBACzB,eAAe,EAAE,IAAI,CAAC,eAAe;gBACrC,kBAAkB;gBAClB,iBAAiB;gBACjB,aAAa,EAAE,IAAA,YAAM,EAAC,IAAI,CAAC,KAAK,CAAC,aAAa,GAAG,IAAI,GAAG,EAAE,CAAC,CAAC;gBAC5D,UAAU,EAAE,IAAI,CAAC,UAAU;gBAC3B,UAAU;gBACV,YAAY;aACb,CAAC;SACH,CAAC,CAAC;QAEH,IAAI,CAAC,aAAa,CAAC,QAAQ,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,GAAG,EAAE,EAAE;YAClD,GAAG,CAAC,GAAG,CAAC,CAAC;QACX,CAAC,CAAC,CAAC;QACH,IAAI,CAAC,aAAa,GAAG,EAAE,CAAC;QACxB,IAAI,CAAC,UAAU,GAAG,IAAA,cAAQ,EAAC,IAAI,CAAC,UAAU,EAAE,CAAC,CAAC,CAAC;IACjD,CAAC;CACF;AAtID,oCAsIC","sourcesContent":["import debug from \"debug\";\nimport { setTimeout } from \"timers/promises\";\n\nimport { uint8Add, uint16Add, uint24 } from \"../../../../common/src\";\nimport {\n type PacketStatus,\n RecvDelta,\n RtcpTransportLayerFeedback,\n RunLengthChunk,\n type StatusVectorChunk,\n TransportWideCC,\n} from \"../../../../rtp/src\";\nimport type { RTCDtlsTransport } from \"../../transport/dtls\";\nimport { microTime } from \"../../utils\";\n\nconst log = debug(\"werift:packages/webrtc/media/receiver/receiverTwcc\");\n\ntype ExtensionInfo = { tsn: number; timestamp: number };\n\nexport class ReceiverTWCC {\n extensionInfo: {\n [tsn: number]: ExtensionInfo;\n } = {};\n twccRunning = false;\n /** uint8 */\n fbPktCount = 0;\n lastTimestamp?: number;\n\n constructor(\n private dtlsTransport: RTCDtlsTransport,\n private rtcpSsrc: number,\n private mediaSourceSsrc: number,\n ) {\n this.runTWCC();\n }\n\n handleTWCC(transportSequenceNumber: number) {\n this.extensionInfo[transportSequenceNumber] = {\n tsn: transportSequenceNumber,\n timestamp: microTime(),\n };\n\n if (Object.keys(this.extensionInfo).length > 10) {\n this.sendTWCC();\n }\n }\n\n private async runTWCC() {\n while (this.twccRunning) {\n this.sendTWCC();\n await setTimeout(100);\n }\n }\n\n private sendTWCC() {\n if (Object.keys(this.extensionInfo).length === 0) return;\n const extensionsArr = Object.values(this.extensionInfo).sort(\n (a, b) => a.tsn - b.tsn,\n );\n\n const minTSN = extensionsArr[0].tsn;\n const maxTSN = extensionsArr.slice(-1)[0].tsn;\n\n const packetChunks: (RunLengthChunk | StatusVectorChunk)[] = [];\n const baseSequenceNumber = extensionsArr[0].tsn;\n const packetStatusCount = uint16Add(maxTSN - minTSN, 1);\n /**micro sec */\n let referenceTime!: number;\n let lastPacketStatus: { status: PacketStatus; minTSN: number } | undefined;\n const recvDeltas: RecvDelta[] = [];\n\n for (let i = minTSN; i <= maxTSN; i++) {\n /**micro sec */\n const timestamp = this.extensionInfo[i]?.timestamp;\n\n if (timestamp) {\n if (!this.lastTimestamp) {\n this.lastTimestamp = timestamp;\n }\n if (!referenceTime) {\n referenceTime = this.lastTimestamp;\n }\n\n const delta = timestamp - this.lastTimestamp;\n this.lastTimestamp = timestamp;\n\n const recvDelta = new RecvDelta({\n delta: Number(delta),\n });\n recvDelta.parseDelta();\n recvDeltas.push(recvDelta);\n\n // when status changed\n if (\n lastPacketStatus != undefined &&\n lastPacketStatus.status !== recvDelta.type\n ) {\n packetChunks.push(\n new RunLengthChunk({\n packetStatus: lastPacketStatus.status,\n runLength: i - lastPacketStatus.minTSN,\n }),\n );\n lastPacketStatus = { minTSN: i, status: recvDelta.type! };\n }\n // last status\n if (i === maxTSN) {\n if (lastPacketStatus != undefined) {\n packetChunks.push(\n new RunLengthChunk({\n packetStatus: lastPacketStatus.status,\n runLength: i - lastPacketStatus.minTSN + 1,\n }),\n );\n } else {\n packetChunks.push(\n new RunLengthChunk({\n packetStatus: recvDelta.type,\n runLength: 1,\n }),\n );\n }\n }\n\n if (lastPacketStatus == undefined) {\n lastPacketStatus = { minTSN: i, status: recvDelta.type! };\n }\n }\n }\n\n if (!referenceTime) {\n return;\n }\n\n const packet = new RtcpTransportLayerFeedback({\n feedback: new TransportWideCC({\n senderSsrc: this.rtcpSsrc,\n mediaSourceSsrc: this.mediaSourceSsrc,\n baseSequenceNumber,\n packetStatusCount,\n referenceTime: uint24(Math.floor(referenceTime / 1000 / 64)),\n fbPktCount: this.fbPktCount,\n recvDeltas,\n packetChunks,\n }),\n });\n\n this.dtlsTransport.sendRtcp([packet]).catch((err) => {\n log(err);\n });\n this.extensionInfo = {};\n this.fbPktCount = uint8Add(this.fbPktCount, 1);\n }\n}\n"]}
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
3
|
exports.StreamStatistics = void 0;
|
|
4
|
-
const
|
|
4
|
+
const src_1 = require("../../../../common/src");
|
|
5
5
|
// from aiortc
|
|
6
6
|
class StreamStatistics {
|
|
7
7
|
constructor(clockRate) {
|
|
@@ -71,13 +71,13 @@ class StreamStatistics {
|
|
|
71
71
|
}
|
|
72
72
|
add(packet, now = Date.now() / 1000) {
|
|
73
73
|
const inOrder = this.max_seq == undefined ||
|
|
74
|
-
(0,
|
|
74
|
+
(0, src_1.uint16Gt)(packet.header.sequenceNumber, this.max_seq);
|
|
75
75
|
this.packets_received++;
|
|
76
76
|
if (this.base_seq == undefined) {
|
|
77
77
|
this.base_seq = packet.header.sequenceNumber;
|
|
78
78
|
}
|
|
79
79
|
if (inOrder) {
|
|
80
|
-
const arrival = (0,
|
|
80
|
+
const arrival = (0, src_1.int)(now * this.clockRate);
|
|
81
81
|
if (this.max_seq != undefined &&
|
|
82
82
|
packet.header.sequenceNumber < this.max_seq) {
|
|
83
83
|
this.cycles += 1 << 16;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"statistics.js","sourceRoot":"","sources":["../../../../../src/media/receiver/statistics.ts"],"names":[],"mappings":";;;AAAA,
|
|
1
|
+
{"version":3,"file":"statistics.js","sourceRoot":"","sources":["../../../../../src/media/receiver/statistics.ts"],"names":[],"mappings":"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","sourcesContent":["import { int, uint16Gt } from \"../../../../common/src\";\nimport type { RtpPacket } from \"../../../../rtp/src\";\n\n// from aiortc\n\nexport class StreamStatistics {\n base_seq?: number;\n max_seq?: number;\n cycles = 0;\n packets_received = 0;\n\n // # jitter\n private clockRate: number;\n jitter_q4 = 0;\n private last_arrival?: number;\n private last_timestamp?: number;\n\n // # fraction lost\n expected_prior = 0;\n received_prior = 0;\n\n constructor(clockRate: number) {\n this.clockRate = clockRate;\n }\n\n add(packet: RtpPacket, now: number = Date.now() / 1000) {\n const inOrder =\n this.max_seq == undefined ||\n uint16Gt(packet.header.sequenceNumber, this.max_seq);\n this.packets_received++;\n\n if (this.base_seq == undefined) {\n this.base_seq = packet.header.sequenceNumber;\n }\n\n if (inOrder) {\n const arrival = int(now * this.clockRate);\n\n if (\n this.max_seq != undefined &&\n packet.header.sequenceNumber < this.max_seq\n ) {\n this.cycles += 1 << 16;\n }\n this.max_seq = packet.header.sequenceNumber;\n\n if (\n packet.header.timestamp !== this.last_timestamp &&\n this.packets_received > 1\n ) {\n const diff = Math.abs(\n arrival -\n (this.last_arrival ?? 0) -\n (packet.header.timestamp - (this.last_timestamp ?? 0)),\n );\n this.jitter_q4 += diff - ((this.jitter_q4 + 8) >> 4);\n }\n\n this.last_arrival = arrival;\n this.last_timestamp = packet.header.timestamp;\n }\n }\n\n get fraction_lost() {\n const expected_interval = this.packets_expected - this.expected_prior;\n this.expected_prior = this.packets_expected;\n const received_interval = this.packets_received - this.received_prior;\n this.received_prior = this.packets_received;\n const lost_interval = expected_interval - received_interval;\n if (expected_interval == 0 || lost_interval <= 0) {\n return 0;\n } else {\n return Math.floor((lost_interval << 8) / expected_interval);\n }\n }\n\n get jitter() {\n return this.jitter_q4 >> 4;\n }\n\n get packets_expected() {\n return this.cycles + (this.max_seq ?? 0) - (this.base_seq ?? 0) + 1;\n }\n\n get packets_lost() {\n const lost = this.packets_expected - this.packets_received;\n return lost < 0 ? 0 : lost;\n }\n}\n"]}
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { type RtcpPacket, type RtpPacket } from "
|
|
1
|
+
import { type RtcpPacket, type RtpPacket } from "../../../rtp/src";
|
|
2
2
|
import type { RTCRtpReceiveParameters, RTCRtpSimulcastParameters } from "./parameters";
|
|
3
3
|
import { RTCRtpReceiver } from "./rtpReceiver";
|
|
4
4
|
import type { RTCRtpSender } from "./rtpSender";
|
|
@@ -5,7 +5,7 @@ var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
|
5
5
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
6
6
|
exports.RtpRouter = void 0;
|
|
7
7
|
const debug_1 = __importDefault(require("debug"));
|
|
8
|
-
const
|
|
8
|
+
const src_1 = require("../../../rtp/src");
|
|
9
9
|
const rtpReceiver_1 = require("./rtpReceiver");
|
|
10
10
|
const track_1 = require("./track");
|
|
11
11
|
const log = (0, debug_1.default)("werift:packages/webrtc/src/media/router.ts");
|
|
@@ -34,9 +34,9 @@ class RtpRouter {
|
|
|
34
34
|
configurable: true,
|
|
35
35
|
writable: true,
|
|
36
36
|
value: (packet) => {
|
|
37
|
-
const extensions = (0,
|
|
37
|
+
const extensions = (0, src_1.rtpHeaderExtensionsParser)(packet.header.extensions, this.extIdUriMap);
|
|
38
38
|
let rtpReceiver = this.ssrcTable[packet.header.ssrc];
|
|
39
|
-
const rid = extensions[
|
|
39
|
+
const rid = extensions[src_1.RTP_EXTENSION_URI.sdesRTPStreamID];
|
|
40
40
|
if (typeof rid === "string") {
|
|
41
41
|
rtpReceiver = this.ridTable[rid];
|
|
42
42
|
rtpReceiver.latestRid = rid;
|
|
@@ -63,11 +63,11 @@ class RtpRouter {
|
|
|
63
63
|
log("ssrcReceiver not found");
|
|
64
64
|
return;
|
|
65
65
|
}
|
|
66
|
-
const sdesMid = extensions[
|
|
66
|
+
const sdesMid = extensions[src_1.RTP_EXTENSION_URI.sdesMid];
|
|
67
67
|
if (typeof sdesMid === "string") {
|
|
68
68
|
rtpReceiver.sdesMid = sdesMid;
|
|
69
69
|
}
|
|
70
|
-
const repairedRid = extensions[
|
|
70
|
+
const repairedRid = extensions[src_1.RTP_EXTENSION_URI.repairedRtpStreamId];
|
|
71
71
|
if (typeof repairedRid === "string") {
|
|
72
72
|
rtpReceiver.latestRepairedRid = repairedRid;
|
|
73
73
|
}
|
|
@@ -80,13 +80,13 @@ class RtpRouter {
|
|
|
80
80
|
value: (packet) => {
|
|
81
81
|
const recipients = [];
|
|
82
82
|
switch (packet.type) {
|
|
83
|
-
case
|
|
83
|
+
case src_1.RtcpSrPacket.type:
|
|
84
84
|
{
|
|
85
85
|
packet = packet;
|
|
86
86
|
recipients.push(this.ssrcTable[packet.ssrc]);
|
|
87
87
|
}
|
|
88
88
|
break;
|
|
89
|
-
case
|
|
89
|
+
case src_1.RtcpRrPacket.type:
|
|
90
90
|
{
|
|
91
91
|
packet = packet;
|
|
92
92
|
packet.reports.forEach((report) => {
|
|
@@ -94,13 +94,13 @@ class RtpRouter {
|
|
|
94
94
|
});
|
|
95
95
|
}
|
|
96
96
|
break;
|
|
97
|
-
case
|
|
97
|
+
case src_1.RtcpSourceDescriptionPacket.type:
|
|
98
98
|
{
|
|
99
99
|
const sdes = packet;
|
|
100
100
|
// log("sdes", JSON.stringify(sdes.chunks));
|
|
101
101
|
}
|
|
102
102
|
break;
|
|
103
|
-
case
|
|
103
|
+
case src_1.RtcpTransportLayerFeedback.type:
|
|
104
104
|
{
|
|
105
105
|
const rtpfb = packet;
|
|
106
106
|
if (rtpfb.feedback) {
|
|
@@ -108,11 +108,11 @@ class RtpRouter {
|
|
|
108
108
|
}
|
|
109
109
|
}
|
|
110
110
|
break;
|
|
111
|
-
case
|
|
111
|
+
case src_1.RtcpPayloadSpecificFeedback.type:
|
|
112
112
|
{
|
|
113
113
|
const psfb = packet;
|
|
114
114
|
switch (psfb.feedback.count) {
|
|
115
|
-
case
|
|
115
|
+
case src_1.ReceiverEstimatedMaxBitrate.count:
|
|
116
116
|
{
|
|
117
117
|
const remb = psfb.feedback;
|
|
118
118
|
recipients.push(this.ssrcTable[remb.ssrcFeedbacks[0]]);
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"router.js","sourceRoot":"","sources":["../../../../src/media/router.ts"],"names":[],"mappings":"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","sourcesContent":["import debug from \"debug\";\n\nimport {\n type Extensions,\n RTP_EXTENSION_URI,\n ReceiverEstimatedMaxBitrate,\n type RtcpPacket,\n RtcpPayloadSpecificFeedback,\n RtcpRrPacket,\n RtcpSourceDescriptionPacket,\n RtcpSrPacket,\n RtcpTransportLayerFeedback,\n type RtpPacket,\n rtpHeaderExtensionsParser,\n} from \"../imports/rtp\";\nimport type {\n RTCRtpReceiveParameters,\n RTCRtpSimulcastParameters,\n} from \"./parameters\";\nimport { RTCRtpReceiver } from \"./rtpReceiver\";\nimport type { RTCRtpSender } from \"./rtpSender\";\nimport type { RTCRtpTransceiver } from \"./rtpTransceiver\";\nimport { MediaStreamTrack } from \"./track\";\n\nconst log = debug(\"werift:packages/webrtc/src/media/router.ts\");\n\nexport class RtpRouter {\n ssrcTable: { [ssrc: number]: RTCRtpReceiver | RTCRtpSender } = {};\n ridTable: { [rid: string]: RTCRtpReceiver | RTCRtpSender } = {};\n extIdUriMap: { [id: number]: string } = {};\n\n constructor() {}\n\n registerRtpSender(sender: RTCRtpSender) {\n this.ssrcTable[sender.ssrc] = sender;\n }\n\n private registerRtpReceiver(receiver: RTCRtpReceiver, ssrc: number) {\n log(\"registerRtpReceiver\", ssrc);\n this.ssrcTable[ssrc] = receiver;\n }\n\n registerRtpReceiverBySsrc(\n transceiver: RTCRtpTransceiver,\n params: RTCRtpReceiveParameters,\n ) {\n log(\"registerRtpReceiverBySsrc\", params);\n\n params.encodings\n .filter((e) => e.ssrc != undefined) // todo fix\n .forEach((encode, i) => {\n this.registerRtpReceiver(transceiver.receiver, encode.ssrc);\n transceiver.addTrack(\n new MediaStreamTrack({\n ssrc: encode.ssrc,\n kind: transceiver.kind,\n id: transceiver.sender.trackId,\n remote: true,\n codec: params.codecs[i],\n }),\n );\n if (encode.rtx) {\n this.registerRtpReceiver(transceiver.receiver, encode.rtx.ssrc);\n }\n });\n\n params.headerExtensions.forEach((extension) => {\n this.extIdUriMap[extension.id] = extension.uri;\n });\n }\n\n registerRtpReceiverByRid(\n transceiver: RTCRtpTransceiver,\n param: RTCRtpSimulcastParameters,\n params: RTCRtpReceiveParameters,\n ) {\n // サイマルキャスト利用時のRTXをサポートしていないのでcodecs/encodingsは常に一つ\n const [codec] = params.codecs;\n\n log(\"registerRtpReceiverByRid\", param);\n transceiver.addTrack(\n new MediaStreamTrack({\n rid: param.rid,\n kind: transceiver.kind,\n id: transceiver.sender.trackId,\n remote: true,\n codec,\n }),\n );\n this.ridTable[param.rid] = transceiver.receiver;\n }\n\n routeRtp = (packet: RtpPacket) => {\n const extensions: Extensions = rtpHeaderExtensionsParser(\n packet.header.extensions,\n this.extIdUriMap,\n );\n\n let rtpReceiver: RTCRtpReceiver | undefined = this.ssrcTable[\n packet.header.ssrc\n ] as RTCRtpReceiver;\n\n const rid = extensions[RTP_EXTENSION_URI.sdesRTPStreamID];\n if (typeof rid === \"string\") {\n rtpReceiver = this.ridTable[rid] as RTCRtpReceiver;\n rtpReceiver.latestRid = rid;\n rtpReceiver.handleRtpByRid(packet, rid, extensions);\n } else if (rtpReceiver) {\n rtpReceiver.handleRtpBySsrc(packet, extensions);\n } else {\n // simulcast after send receiver report\n rtpReceiver = Object.values(this.ridTable)\n .filter((r): r is RTCRtpReceiver => r instanceof RTCRtpReceiver)\n .find((r) => r.trackBySSRC[packet.header.ssrc]);\n if (rtpReceiver) {\n log(\"simulcast register receiver by ssrc\", packet.header.ssrc);\n this.registerRtpReceiver(rtpReceiver, packet.header.ssrc);\n rtpReceiver.handleRtpBySsrc(packet, extensions);\n } else {\n // bug\n }\n }\n\n if (!rtpReceiver) {\n log(\"ssrcReceiver not found\");\n return;\n }\n\n const sdesMid = extensions[RTP_EXTENSION_URI.sdesMid];\n if (typeof sdesMid === \"string\") {\n rtpReceiver.sdesMid = sdesMid;\n }\n\n const repairedRid = extensions[\n RTP_EXTENSION_URI.repairedRtpStreamId\n ] as string;\n if (typeof repairedRid === \"string\") {\n rtpReceiver.latestRepairedRid = repairedRid;\n }\n };\n\n routeRtcp = (packet: RtcpPacket) => {\n const recipients: (RTCRtpReceiver | RTCRtpSender)[] = [];\n\n switch (packet.type) {\n case RtcpSrPacket.type:\n {\n packet = packet as RtcpSrPacket;\n recipients.push(this.ssrcTable[packet.ssrc]);\n }\n break;\n case RtcpRrPacket.type:\n {\n packet = packet as RtcpRrPacket;\n packet.reports.forEach((report) => {\n recipients.push(this.ssrcTable[report.ssrc]);\n });\n }\n break;\n case RtcpSourceDescriptionPacket.type:\n {\n const sdes = packet as RtcpSourceDescriptionPacket;\n // log(\"sdes\", JSON.stringify(sdes.chunks));\n }\n break;\n case RtcpTransportLayerFeedback.type:\n {\n const rtpfb = packet as RtcpTransportLayerFeedback;\n if (rtpfb.feedback) {\n recipients.push(this.ssrcTable[rtpfb.feedback.mediaSourceSsrc]);\n }\n }\n break;\n case RtcpPayloadSpecificFeedback.type:\n {\n const psfb = packet as RtcpPayloadSpecificFeedback;\n switch (psfb.feedback.count) {\n case ReceiverEstimatedMaxBitrate.count:\n {\n const remb = psfb.feedback as ReceiverEstimatedMaxBitrate;\n recipients.push(this.ssrcTable[remb.ssrcFeedbacks[0]]);\n }\n break;\n default:\n recipients.push(this.ssrcTable[psfb.feedback.senderSsrc]);\n }\n }\n break;\n }\n recipients\n .filter((v) => v) // todo simulcast\n .forEach((recipient) => recipient.handleRtcpPacket(packet));\n };\n}\n"]}
|
|
1
|
+
{"version":3,"file":"router.js","sourceRoot":"","sources":["../../../../src/media/router.ts"],"names":[],"mappings":"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","sourcesContent":["import debug from \"debug\";\n\nimport {\n type Extensions,\n RTP_EXTENSION_URI,\n ReceiverEstimatedMaxBitrate,\n type RtcpPacket,\n RtcpPayloadSpecificFeedback,\n RtcpRrPacket,\n RtcpSourceDescriptionPacket,\n RtcpSrPacket,\n RtcpTransportLayerFeedback,\n type RtpPacket,\n rtpHeaderExtensionsParser,\n} from \"../../../rtp/src\";\nimport type {\n RTCRtpReceiveParameters,\n RTCRtpSimulcastParameters,\n} from \"./parameters\";\nimport { RTCRtpReceiver } from \"./rtpReceiver\";\nimport type { RTCRtpSender } from \"./rtpSender\";\nimport type { RTCRtpTransceiver } from \"./rtpTransceiver\";\nimport { MediaStreamTrack } from \"./track\";\n\nconst log = debug(\"werift:packages/webrtc/src/media/router.ts\");\n\nexport class RtpRouter {\n ssrcTable: { [ssrc: number]: RTCRtpReceiver | RTCRtpSender } = {};\n ridTable: { [rid: string]: RTCRtpReceiver | RTCRtpSender } = {};\n extIdUriMap: { [id: number]: string } = {};\n\n constructor() {}\n\n registerRtpSender(sender: RTCRtpSender) {\n this.ssrcTable[sender.ssrc] = sender;\n }\n\n private registerRtpReceiver(receiver: RTCRtpReceiver, ssrc: number) {\n log(\"registerRtpReceiver\", ssrc);\n this.ssrcTable[ssrc] = receiver;\n }\n\n registerRtpReceiverBySsrc(\n transceiver: RTCRtpTransceiver,\n params: RTCRtpReceiveParameters,\n ) {\n log(\"registerRtpReceiverBySsrc\", params);\n\n params.encodings\n .filter((e) => e.ssrc != undefined) // todo fix\n .forEach((encode, i) => {\n this.registerRtpReceiver(transceiver.receiver, encode.ssrc);\n transceiver.addTrack(\n new MediaStreamTrack({\n ssrc: encode.ssrc,\n kind: transceiver.kind,\n id: transceiver.sender.trackId,\n remote: true,\n codec: params.codecs[i],\n }),\n );\n if (encode.rtx) {\n this.registerRtpReceiver(transceiver.receiver, encode.rtx.ssrc);\n }\n });\n\n params.headerExtensions.forEach((extension) => {\n this.extIdUriMap[extension.id] = extension.uri;\n });\n }\n\n registerRtpReceiverByRid(\n transceiver: RTCRtpTransceiver,\n param: RTCRtpSimulcastParameters,\n params: RTCRtpReceiveParameters,\n ) {\n // サイマルキャスト利用時のRTXをサポートしていないのでcodecs/encodingsは常に一つ\n const [codec] = params.codecs;\n\n log(\"registerRtpReceiverByRid\", param);\n transceiver.addTrack(\n new MediaStreamTrack({\n rid: param.rid,\n kind: transceiver.kind,\n id: transceiver.sender.trackId,\n remote: true,\n codec,\n }),\n );\n this.ridTable[param.rid] = transceiver.receiver;\n }\n\n routeRtp = (packet: RtpPacket) => {\n const extensions: Extensions = rtpHeaderExtensionsParser(\n packet.header.extensions,\n this.extIdUriMap,\n );\n\n let rtpReceiver: RTCRtpReceiver | undefined = this.ssrcTable[\n packet.header.ssrc\n ] as RTCRtpReceiver;\n\n const rid = extensions[RTP_EXTENSION_URI.sdesRTPStreamID];\n if (typeof rid === \"string\") {\n rtpReceiver = this.ridTable[rid] as RTCRtpReceiver;\n rtpReceiver.latestRid = rid;\n rtpReceiver.handleRtpByRid(packet, rid, extensions);\n } else if (rtpReceiver) {\n rtpReceiver.handleRtpBySsrc(packet, extensions);\n } else {\n // simulcast after send receiver report\n rtpReceiver = Object.values(this.ridTable)\n .filter((r): r is RTCRtpReceiver => r instanceof RTCRtpReceiver)\n .find((r) => r.trackBySSRC[packet.header.ssrc]);\n if (rtpReceiver) {\n log(\"simulcast register receiver by ssrc\", packet.header.ssrc);\n this.registerRtpReceiver(rtpReceiver, packet.header.ssrc);\n rtpReceiver.handleRtpBySsrc(packet, extensions);\n } else {\n // bug\n }\n }\n\n if (!rtpReceiver) {\n log(\"ssrcReceiver not found\");\n return;\n }\n\n const sdesMid = extensions[RTP_EXTENSION_URI.sdesMid];\n if (typeof sdesMid === \"string\") {\n rtpReceiver.sdesMid = sdesMid;\n }\n\n const repairedRid = extensions[\n RTP_EXTENSION_URI.repairedRtpStreamId\n ] as string;\n if (typeof repairedRid === \"string\") {\n rtpReceiver.latestRepairedRid = repairedRid;\n }\n };\n\n routeRtcp = (packet: RtcpPacket) => {\n const recipients: (RTCRtpReceiver | RTCRtpSender)[] = [];\n\n switch (packet.type) {\n case RtcpSrPacket.type:\n {\n packet = packet as RtcpSrPacket;\n recipients.push(this.ssrcTable[packet.ssrc]);\n }\n break;\n case RtcpRrPacket.type:\n {\n packet = packet as RtcpRrPacket;\n packet.reports.forEach((report) => {\n recipients.push(this.ssrcTable[report.ssrc]);\n });\n }\n break;\n case RtcpSourceDescriptionPacket.type:\n {\n const sdes = packet as RtcpSourceDescriptionPacket;\n // log(\"sdes\", JSON.stringify(sdes.chunks));\n }\n break;\n case RtcpTransportLayerFeedback.type:\n {\n const rtpfb = packet as RtcpTransportLayerFeedback;\n if (rtpfb.feedback) {\n recipients.push(this.ssrcTable[rtpfb.feedback.mediaSourceSsrc]);\n }\n }\n break;\n case RtcpPayloadSpecificFeedback.type:\n {\n const psfb = packet as RtcpPayloadSpecificFeedback;\n switch (psfb.feedback.count) {\n case ReceiverEstimatedMaxBitrate.count:\n {\n const remb = psfb.feedback as ReceiverEstimatedMaxBitrate;\n recipients.push(this.ssrcTable[remb.ssrcFeedbacks[0]]);\n }\n break;\n default:\n recipients.push(this.ssrcTable[psfb.feedback.senderSsrc]);\n }\n }\n break;\n }\n recipients\n .filter((v) => v) // todo simulcast\n .forEach((recipient) => recipient.handleRtcpPacket(packet));\n };\n}\n"]}
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import { Event } from "../imports/common";
|
|
2
|
-
import { type
|
|
3
|
-
import type
|
|
2
|
+
import { type PeerConfig } from "..";
|
|
3
|
+
import { type Extensions, type RtcpPacket, type RtpPacket } from "../../../rtp/src";
|
|
4
4
|
import type { RTCDtlsTransport } from "../transport/dtls";
|
|
5
5
|
import type { Kind } from "../types/domain";
|
|
6
6
|
import type { RTCRtpReceiveParameters } from "./parameters";
|
|
@@ -34,7 +34,7 @@ export declare class RTCRtpReceiver {
|
|
|
34
34
|
readonly receiveLastSRTimestamp: {
|
|
35
35
|
[ssrc: number]: number;
|
|
36
36
|
};
|
|
37
|
-
readonly onPacketLost: Event<[import("
|
|
37
|
+
readonly onPacketLost: Event<[import("..").GenericNack]>;
|
|
38
38
|
readonly onRtcp: Event<[RtcpPacket]>;
|
|
39
39
|
dtlsTransport: RTCDtlsTransport;
|
|
40
40
|
sdesMid?: string;
|
|
@@ -5,13 +5,13 @@ const debug_1 = require("debug");
|
|
|
5
5
|
const promises_1 = require("timers/promises");
|
|
6
6
|
const uuid_1 = require("uuid");
|
|
7
7
|
const common_1 = require("../imports/common");
|
|
8
|
-
const
|
|
8
|
+
const __1 = require("..");
|
|
9
|
+
const src_1 = require("../../../common/src");
|
|
10
|
+
const src_2 = require("../../../rtp/src");
|
|
9
11
|
const utils_1 = require("../utils");
|
|
10
12
|
const nack_1 = require("./receiver/nack");
|
|
11
13
|
const receiverTwcc_1 = require("./receiver/receiverTwcc");
|
|
12
14
|
const statistics_1 = require("./receiver/statistics");
|
|
13
|
-
const sdp_1 = require("../sdp");
|
|
14
|
-
const rtcpFeedback_1 = require("./extension/rtcpFeedback");
|
|
15
15
|
const track_1 = require("./track");
|
|
16
16
|
const log = (0, debug_1.debug)("werift:packages/webrtc/src/media/rtpReceiver.ts");
|
|
17
17
|
class RTCRtpReceiver {
|
|
@@ -59,7 +59,7 @@ class RTCRtpReceiver {
|
|
|
59
59
|
enumerable: true,
|
|
60
60
|
configurable: true,
|
|
61
61
|
writable: true,
|
|
62
|
-
value: new
|
|
62
|
+
value: new src_2.RedHandler()
|
|
63
63
|
});
|
|
64
64
|
Object.defineProperty(this, "type", {
|
|
65
65
|
enumerable: true,
|
|
@@ -218,10 +218,10 @@ class RTCRtpReceiver {
|
|
|
218
218
|
return this.codecArray[0]?.rtcpFeedback.find((f) => f.type === "nack");
|
|
219
219
|
}
|
|
220
220
|
get twccEnabled() {
|
|
221
|
-
return this.codecArray[0]?.rtcpFeedback.find((f) => f.type === (0,
|
|
221
|
+
return this.codecArray[0]?.rtcpFeedback.find((f) => f.type === (0, __1.useTWCC)().type);
|
|
222
222
|
}
|
|
223
223
|
get pliEnabled() {
|
|
224
|
-
return this.codecArray[0]?.rtcpFeedback.find((f) => f.type === (0,
|
|
224
|
+
return this.codecArray[0]?.rtcpFeedback.find((f) => f.type === (0, __1.usePLI)().type);
|
|
225
225
|
}
|
|
226
226
|
prepareReceive(params) {
|
|
227
227
|
params.codecs.forEach((c) => {
|
|
@@ -285,10 +285,10 @@ class RTCRtpReceiver {
|
|
|
285
285
|
lastSRtimestamp = this.lastSRtimestamp[ssrc];
|
|
286
286
|
const delaySeconds = (0, utils_1.timestampSeconds)() - this.receiveLastSRTimestamp[ssrc];
|
|
287
287
|
if (delaySeconds > 0 && delaySeconds < 65536) {
|
|
288
|
-
delaySinceLastSR = (0,
|
|
288
|
+
delaySinceLastSR = (0, src_1.int)(delaySeconds * 65536);
|
|
289
289
|
}
|
|
290
290
|
}
|
|
291
|
-
return new
|
|
291
|
+
return new src_2.RtcpReceiverInfo({
|
|
292
292
|
ssrc: Number(ssrc),
|
|
293
293
|
fractionLost: stream.fraction_lost,
|
|
294
294
|
packetsLost: stream.packets_lost,
|
|
@@ -298,7 +298,7 @@ class RTCRtpReceiver {
|
|
|
298
298
|
dlsr: delaySinceLastSR,
|
|
299
299
|
});
|
|
300
300
|
});
|
|
301
|
-
const packet = new
|
|
301
|
+
const packet = new src_2.RtcpRrPacket({ ssrc: this.rtcpSsrc, reports });
|
|
302
302
|
try {
|
|
303
303
|
if (this.config.debug.receiverReportDelay) {
|
|
304
304
|
await (0, promises_1.setTimeout)(this.config.debug.receiverReportDelay);
|
|
@@ -324,8 +324,8 @@ class RTCRtpReceiver {
|
|
|
324
324
|
return;
|
|
325
325
|
}
|
|
326
326
|
log("sendRtcpPLI", { mediaSsrc });
|
|
327
|
-
const packet = new
|
|
328
|
-
feedback: new
|
|
327
|
+
const packet = new src_2.RtcpPayloadSpecificFeedback({
|
|
328
|
+
feedback: new src_2.PictureLossIndication({
|
|
329
329
|
senderSsrc: this.rtcpSsrc,
|
|
330
330
|
mediaSsrc,
|
|
331
331
|
}),
|
|
@@ -339,7 +339,7 @@ class RTCRtpReceiver {
|
|
|
339
339
|
}
|
|
340
340
|
handleRtcpPacket(packet) {
|
|
341
341
|
switch (packet.type) {
|
|
342
|
-
case
|
|
342
|
+
case src_2.RtcpSrPacket.type:
|
|
343
343
|
{
|
|
344
344
|
const sr = packet;
|
|
345
345
|
this.lastSRtimestamp[sr.ssrc] = (0, utils_1.compactNtp)(sr.senderInfo.ntpTimestamp);
|
|
@@ -367,7 +367,7 @@ class RTCRtpReceiver {
|
|
|
367
367
|
new statistics_1.StreamStatistics(codec.clockRate);
|
|
368
368
|
this.remoteStreams[packet.header.ssrc].add(packet);
|
|
369
369
|
if (this.receiverTWCC) {
|
|
370
|
-
const transportSequenceNumber = extensions[
|
|
370
|
+
const transportSequenceNumber = extensions[src_2.RTP_EXTENSION_URI.transportWideCC];
|
|
371
371
|
if (!transportSequenceNumber == undefined) {
|
|
372
372
|
throw new Error("undefined");
|
|
373
373
|
}
|
|
@@ -378,16 +378,16 @@ class RTCRtpReceiver {
|
|
|
378
378
|
}
|
|
379
379
|
if (codec.name.toLowerCase() === "rtx") {
|
|
380
380
|
const originalSsrc = this.ssrcByRtx[packet.header.ssrc];
|
|
381
|
-
const codecParams = (0,
|
|
381
|
+
const codecParams = (0, __1.codecParametersFromString)(codec.parameters ?? "");
|
|
382
382
|
const rtxCodec = this.codecs[codecParams["apt"]];
|
|
383
383
|
if (packet.payload.length < 2)
|
|
384
384
|
return;
|
|
385
|
-
packet = (0,
|
|
385
|
+
packet = (0, src_2.unwrapRtx)(packet, rtxCodec.payloadType, originalSsrc);
|
|
386
386
|
track = this.trackBySSRC[originalSsrc];
|
|
387
387
|
}
|
|
388
388
|
let red;
|
|
389
389
|
if (codec.name.toLowerCase() === "red") {
|
|
390
|
-
red =
|
|
390
|
+
red = src_2.Red.deSerialize(packet.payload);
|
|
391
391
|
if (!Object.keys(this.codecs).includes(red.header.fields[0].blockPT.toString())) {
|
|
392
392
|
return;
|
|
393
393
|
}
|