mediasoup-client 3.7.1 → 3.7.2
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/README.md +85 -112
- package/lib/Consumer.d.ts +1 -1
- package/lib/Consumer.d.ts.map +1 -1
- package/lib/Consumer.js +1 -1
- package/lib/DataConsumer.d.ts +1 -1
- package/lib/DataConsumer.d.ts.map +1 -1
- package/lib/DataConsumer.js +1 -1
- package/lib/DataProducer.d.ts +1 -1
- package/lib/DataProducer.d.ts.map +1 -1
- package/lib/DataProducer.js +1 -1
- package/lib/Device.d.ts +3 -3
- package/lib/Device.d.ts.map +1 -1
- package/lib/Device.js +66 -89
- package/lib/EnhancedEventEmitter.d.ts.map +1 -1
- package/lib/Logger.d.ts.map +1 -1
- package/lib/Producer.d.ts +5 -15
- package/lib/Producer.d.ts.map +1 -1
- package/lib/Producer.js +2 -2
- package/lib/RtpParameters.d.ts.map +1 -1
- package/lib/SctpParameters.d.ts.map +1 -1
- package/lib/Transport.d.ts +14 -10
- package/lib/Transport.d.ts.map +1 -1
- package/lib/Transport.js +71 -53
- package/lib/errors.d.ts.map +1 -1
- package/lib/errors.js +6 -6
- package/lib/handlers/Chrome111.d.ts +4 -4
- package/lib/handlers/Chrome111.d.ts.map +1 -1
- package/lib/handlers/Chrome111.js +74 -77
- package/lib/handlers/Chrome55.d.ts +4 -4
- package/lib/handlers/Chrome55.d.ts.map +1 -1
- package/lib/handlers/Chrome55.js +83 -80
- package/lib/handlers/Chrome67.d.ts +4 -4
- package/lib/handlers/Chrome67.d.ts.map +1 -1
- package/lib/handlers/Chrome67.js +85 -83
- package/lib/handlers/Chrome70.d.ts +4 -4
- package/lib/handlers/Chrome70.d.ts.map +1 -1
- package/lib/handlers/Chrome70.js +76 -78
- package/lib/handlers/Chrome74.d.ts +4 -4
- package/lib/handlers/Chrome74.d.ts.map +1 -1
- package/lib/handlers/Chrome74.js +75 -78
- package/lib/handlers/Edge11.d.ts +1 -1
- package/lib/handlers/Edge11.d.ts.map +1 -1
- package/lib/handlers/Edge11.js +63 -77
- package/lib/handlers/FakeHandler.d.ts +3 -3
- package/lib/handlers/FakeHandler.d.ts.map +1 -1
- package/lib/handlers/FakeHandler.js +19 -22
- package/lib/handlers/Firefox60.d.ts +4 -4
- package/lib/handlers/Firefox60.d.ts.map +1 -1
- package/lib/handlers/Firefox60.js +75 -72
- package/lib/handlers/HandlerInterface.d.ts.map +1 -1
- package/lib/handlers/ReactNative.d.ts +4 -4
- package/lib/handlers/ReactNative.d.ts.map +1 -1
- package/lib/handlers/ReactNative.js +84 -82
- package/lib/handlers/ReactNativeUnifiedPlan.d.ts +4 -4
- package/lib/handlers/ReactNativeUnifiedPlan.d.ts.map +1 -1
- package/lib/handlers/ReactNativeUnifiedPlan.js +75 -78
- package/lib/handlers/Safari11.d.ts +4 -4
- package/lib/handlers/Safari11.d.ts.map +1 -1
- package/lib/handlers/Safari11.js +84 -81
- package/lib/handlers/Safari12.d.ts +4 -4
- package/lib/handlers/Safari12.d.ts.map +1 -1
- package/lib/handlers/Safari12.js +75 -77
- package/lib/handlers/ortc/edgeUtils.d.ts.map +1 -1
- package/lib/handlers/ortc/utils.d.ts.map +1 -1
- package/lib/handlers/ortc/utils.js +2 -2
- package/lib/handlers/sdp/MediaSection.d.ts +5 -5
- package/lib/handlers/sdp/MediaSection.d.ts.map +1 -1
- package/lib/handlers/sdp/MediaSection.js +293 -317
- package/lib/handlers/sdp/RemoteSdp.d.ts +5 -5
- package/lib/handlers/sdp/RemoteSdp.d.ts.map +1 -1
- package/lib/handlers/sdp/RemoteSdp.js +28 -30
- package/lib/handlers/sdp/commonUtils.d.ts +4 -4
- package/lib/handlers/sdp/commonUtils.d.ts.map +1 -1
- package/lib/handlers/sdp/commonUtils.js +47 -58
- package/lib/handlers/sdp/plainRtpUtils.d.ts +2 -2
- package/lib/handlers/sdp/plainRtpUtils.d.ts.map +1 -1
- package/lib/handlers/sdp/plainRtpUtils.js +5 -7
- package/lib/handlers/sdp/planBUtils.d.ts +2 -2
- package/lib/handlers/sdp/planBUtils.d.ts.map +1 -1
- package/lib/handlers/sdp/planBUtils.js +11 -14
- package/lib/handlers/sdp/unifiedPlanUtils.d.ts +2 -2
- package/lib/handlers/sdp/unifiedPlanUtils.d.ts.map +1 -1
- package/lib/handlers/sdp/unifiedPlanUtils.js +11 -14
- package/lib/index.d.ts +1 -1
- package/lib/index.js +1 -1
- package/lib/ortc.d.ts.map +1 -1
- package/lib/ortc.js +98 -108
- package/lib/scalabilityModes.d.ts.map +1 -1
- package/lib/scalabilityModes.js +2 -2
- package/lib/{tests → test}/fakeParameters.d.ts +2 -2
- package/lib/test/fakeParameters.d.ts.map +1 -0
- package/lib/test/fakeParameters.js +645 -0
- package/lib/{tests → test}/test.d.ts.map +1 -1
- package/lib/{tests → test}/test.js +466 -495
- package/lib/test/uaTestCases.d.ts.map +1 -0
- package/lib/{tests → test}/uaTestCases.js +17 -17
- package/lib/types.d.ts.map +1 -1
- package/lib/utils.d.ts.map +1 -1
- package/npm-scripts.mjs +72 -98
- package/package.json +93 -90
- package/lib/tests/fakeParameters.d.ts.map +0 -1
- package/lib/tests/fakeParameters.js +0 -662
- package/lib/tests/uaTestCases.d.ts.map +0 -1
- /package/lib/{tests → test}/test.d.ts +0 -0
- /package/lib/{tests → test}/uaTestCases.d.ts +0 -0
|
@@ -27,7 +27,7 @@ exports.OfferMediaSection = exports.AnswerMediaSection = exports.MediaSection =
|
|
|
27
27
|
const sdpTransform = __importStar(require("sdp-transform"));
|
|
28
28
|
const utils = __importStar(require("../../utils"));
|
|
29
29
|
class MediaSection {
|
|
30
|
-
constructor({ iceParameters, iceCandidates, dtlsParameters, planB = false }) {
|
|
30
|
+
constructor({ iceParameters, iceCandidates, dtlsParameters, planB = false, }) {
|
|
31
31
|
this._mediaObject = {};
|
|
32
32
|
this._planB = planB;
|
|
33
33
|
if (iceParameters) {
|
|
@@ -91,7 +91,7 @@ class MediaSection {
|
|
|
91
91
|
}
|
|
92
92
|
exports.MediaSection = MediaSection;
|
|
93
93
|
class AnswerMediaSection extends MediaSection {
|
|
94
|
-
constructor({ iceParameters, iceCandidates, dtlsParameters, sctpParameters, plainRtpParameters, planB = false, offerMediaObject, offerRtpParameters, answerRtpParameters, codecOptions, extmapAllowMixed = false }) {
|
|
94
|
+
constructor({ iceParameters, iceCandidates, dtlsParameters, sctpParameters, plainRtpParameters, planB = false, offerMediaObject, offerRtpParameters, answerRtpParameters, codecOptions, extmapAllowMixed = false, }) {
|
|
95
95
|
super({ iceParameters, iceCandidates, dtlsParameters, planB });
|
|
96
96
|
this._mediaObject.mid = String(offerMediaObject.mid);
|
|
97
97
|
this._mediaObject.type = offerMediaObject.type;
|
|
@@ -101,217 +101,204 @@ class AnswerMediaSection extends MediaSection {
|
|
|
101
101
|
this._mediaObject.port = 7;
|
|
102
102
|
}
|
|
103
103
|
else {
|
|
104
|
-
this._mediaObject.connection =
|
|
105
|
-
|
|
106
|
-
|
|
107
|
-
|
|
108
|
-
};
|
|
104
|
+
this._mediaObject.connection = {
|
|
105
|
+
ip: plainRtpParameters.ip,
|
|
106
|
+
version: plainRtpParameters.ipVersion,
|
|
107
|
+
};
|
|
109
108
|
this._mediaObject.port = plainRtpParameters.port;
|
|
110
109
|
}
|
|
111
110
|
switch (offerMediaObject.type) {
|
|
112
111
|
case 'audio':
|
|
113
|
-
case 'video':
|
|
114
|
-
|
|
115
|
-
|
|
116
|
-
|
|
117
|
-
|
|
118
|
-
|
|
119
|
-
|
|
120
|
-
|
|
121
|
-
|
|
122
|
-
|
|
123
|
-
|
|
124
|
-
|
|
125
|
-
|
|
126
|
-
|
|
127
|
-
|
|
128
|
-
|
|
129
|
-
|
|
130
|
-
|
|
131
|
-
|
|
132
|
-
|
|
133
|
-
|
|
134
|
-
|
|
135
|
-
|
|
136
|
-
|
|
137
|
-
|
|
138
|
-
|
|
139
|
-
|
|
140
|
-
|
|
141
|
-
|
|
142
|
-
|
|
143
|
-
|
|
144
|
-
|
|
145
|
-
|
|
146
|
-
|
|
147
|
-
|
|
148
|
-
|
|
149
|
-
|
|
150
|
-
|
|
151
|
-
|
|
152
|
-
|
|
153
|
-
|
|
154
|
-
|
|
155
|
-
|
|
156
|
-
|
|
157
|
-
|
|
158
|
-
|
|
159
|
-
|
|
160
|
-
|
|
161
|
-
|
|
162
|
-
|
|
163
|
-
|
|
164
|
-
|
|
165
|
-
|
|
166
|
-
.rtcpFeedback
|
|
167
|
-
.filter((fb) => fb.type !== 'nack' || fb.parameter);
|
|
168
|
-
codecRtcpFeedback = codecRtcpFeedback
|
|
169
|
-
.filter((fb) => fb.type !== 'nack' || fb.parameter);
|
|
170
|
-
}
|
|
171
|
-
break;
|
|
172
|
-
}
|
|
173
|
-
case 'video/vp8':
|
|
174
|
-
case 'video/vp9':
|
|
175
|
-
case 'video/h264':
|
|
176
|
-
case 'video/h265':
|
|
177
|
-
{
|
|
178
|
-
if (videoGoogleStartBitrate !== undefined) {
|
|
179
|
-
codecParameters['x-google-start-bitrate'] = videoGoogleStartBitrate;
|
|
180
|
-
}
|
|
181
|
-
if (videoGoogleMaxBitrate !== undefined) {
|
|
182
|
-
codecParameters['x-google-max-bitrate'] = videoGoogleMaxBitrate;
|
|
183
|
-
}
|
|
184
|
-
if (videoGoogleMinBitrate !== undefined) {
|
|
185
|
-
codecParameters['x-google-min-bitrate'] = videoGoogleMinBitrate;
|
|
186
|
-
}
|
|
187
|
-
break;
|
|
188
|
-
}
|
|
112
|
+
case 'video': {
|
|
113
|
+
this._mediaObject.direction = 'recvonly';
|
|
114
|
+
this._mediaObject.rtp = [];
|
|
115
|
+
this._mediaObject.rtcpFb = [];
|
|
116
|
+
this._mediaObject.fmtp = [];
|
|
117
|
+
for (const codec of answerRtpParameters.codecs) {
|
|
118
|
+
const rtp = {
|
|
119
|
+
payload: codec.payloadType,
|
|
120
|
+
codec: getCodecName(codec),
|
|
121
|
+
rate: codec.clockRate,
|
|
122
|
+
};
|
|
123
|
+
if (codec.channels > 1) {
|
|
124
|
+
rtp.encoding = codec.channels;
|
|
125
|
+
}
|
|
126
|
+
this._mediaObject.rtp.push(rtp);
|
|
127
|
+
const codecParameters = utils.clone(codec.parameters) ?? {};
|
|
128
|
+
let codecRtcpFeedback = utils.clone(codec.rtcpFeedback) ?? [];
|
|
129
|
+
if (codecOptions) {
|
|
130
|
+
const { opusStereo, opusFec, opusDtx, opusMaxPlaybackRate, opusMaxAverageBitrate, opusPtime, opusNack, videoGoogleStartBitrate, videoGoogleMaxBitrate, videoGoogleMinBitrate, } = codecOptions;
|
|
131
|
+
const offerCodec = offerRtpParameters.codecs.find((c) => c.payloadType === codec.payloadType);
|
|
132
|
+
switch (codec.mimeType.toLowerCase()) {
|
|
133
|
+
case 'audio/opus':
|
|
134
|
+
case 'audio/multiopus': {
|
|
135
|
+
if (opusStereo !== undefined) {
|
|
136
|
+
offerCodec.parameters['sprop-stereo'] = opusStereo ? 1 : 0;
|
|
137
|
+
codecParameters.stereo = opusStereo ? 1 : 0;
|
|
138
|
+
}
|
|
139
|
+
if (opusFec !== undefined) {
|
|
140
|
+
offerCodec.parameters.useinbandfec = opusFec ? 1 : 0;
|
|
141
|
+
codecParameters.useinbandfec = opusFec ? 1 : 0;
|
|
142
|
+
}
|
|
143
|
+
if (opusDtx !== undefined) {
|
|
144
|
+
offerCodec.parameters.usedtx = opusDtx ? 1 : 0;
|
|
145
|
+
codecParameters.usedtx = opusDtx ? 1 : 0;
|
|
146
|
+
}
|
|
147
|
+
if (opusMaxPlaybackRate !== undefined) {
|
|
148
|
+
codecParameters.maxplaybackrate = opusMaxPlaybackRate;
|
|
149
|
+
}
|
|
150
|
+
if (opusMaxAverageBitrate !== undefined) {
|
|
151
|
+
codecParameters.maxaveragebitrate = opusMaxAverageBitrate;
|
|
152
|
+
}
|
|
153
|
+
if (opusPtime !== undefined) {
|
|
154
|
+
offerCodec.parameters.ptime = opusPtime;
|
|
155
|
+
codecParameters.ptime = opusPtime;
|
|
156
|
+
}
|
|
157
|
+
// If opusNack is not set, we must remove NACK support for OPUS.
|
|
158
|
+
// Otherwise it would be enabled for those handlers that artificially
|
|
159
|
+
// announce it in their RTP capabilities.
|
|
160
|
+
if (!opusNack) {
|
|
161
|
+
offerCodec.rtcpFeedback = offerCodec.rtcpFeedback.filter(fb => fb.type !== 'nack' || fb.parameter);
|
|
162
|
+
codecRtcpFeedback = codecRtcpFeedback.filter(fb => fb.type !== 'nack' || fb.parameter);
|
|
163
|
+
}
|
|
164
|
+
break;
|
|
189
165
|
}
|
|
190
|
-
|
|
191
|
-
|
|
192
|
-
|
|
193
|
-
|
|
194
|
-
|
|
195
|
-
|
|
196
|
-
|
|
197
|
-
|
|
166
|
+
case 'video/vp8':
|
|
167
|
+
case 'video/vp9':
|
|
168
|
+
case 'video/h264':
|
|
169
|
+
case 'video/h265': {
|
|
170
|
+
if (videoGoogleStartBitrate !== undefined) {
|
|
171
|
+
codecParameters['x-google-start-bitrate'] =
|
|
172
|
+
videoGoogleStartBitrate;
|
|
173
|
+
}
|
|
174
|
+
if (videoGoogleMaxBitrate !== undefined) {
|
|
175
|
+
codecParameters['x-google-max-bitrate'] =
|
|
176
|
+
videoGoogleMaxBitrate;
|
|
177
|
+
}
|
|
178
|
+
if (videoGoogleMinBitrate !== undefined) {
|
|
179
|
+
codecParameters['x-google-min-bitrate'] =
|
|
180
|
+
videoGoogleMinBitrate;
|
|
181
|
+
}
|
|
182
|
+
break;
|
|
198
183
|
}
|
|
199
|
-
fmtp.config += `${key}=${codecParameters[key]}`;
|
|
200
184
|
}
|
|
185
|
+
}
|
|
186
|
+
const fmtp = {
|
|
187
|
+
payload: codec.payloadType,
|
|
188
|
+
config: '',
|
|
189
|
+
};
|
|
190
|
+
for (const key of Object.keys(codecParameters)) {
|
|
201
191
|
if (fmtp.config) {
|
|
202
|
-
|
|
203
|
-
}
|
|
204
|
-
for (const fb of codecRtcpFeedback) {
|
|
205
|
-
this._mediaObject.rtcpFb.push({
|
|
206
|
-
payload: codec.payloadType,
|
|
207
|
-
type: fb.type,
|
|
208
|
-
subtype: fb.parameter
|
|
209
|
-
});
|
|
192
|
+
fmtp.config += ';';
|
|
210
193
|
}
|
|
194
|
+
fmtp.config += `${key}=${codecParameters[key]}`;
|
|
211
195
|
}
|
|
212
|
-
|
|
213
|
-
.
|
|
214
|
-
|
|
215
|
-
|
|
216
|
-
|
|
217
|
-
|
|
218
|
-
|
|
219
|
-
|
|
220
|
-
if (!found) {
|
|
221
|
-
continue;
|
|
222
|
-
}
|
|
223
|
-
this._mediaObject.ext.push({
|
|
224
|
-
uri: ext.uri,
|
|
225
|
-
value: ext.id
|
|
196
|
+
if (fmtp.config) {
|
|
197
|
+
this._mediaObject.fmtp.push(fmtp);
|
|
198
|
+
}
|
|
199
|
+
for (const fb of codecRtcpFeedback) {
|
|
200
|
+
this._mediaObject.rtcpFb.push({
|
|
201
|
+
payload: codec.payloadType,
|
|
202
|
+
type: fb.type,
|
|
203
|
+
subtype: fb.parameter,
|
|
226
204
|
});
|
|
227
205
|
}
|
|
228
|
-
|
|
229
|
-
|
|
230
|
-
|
|
231
|
-
|
|
206
|
+
}
|
|
207
|
+
this._mediaObject.payloads = answerRtpParameters.codecs
|
|
208
|
+
.map((codec) => codec.payloadType)
|
|
209
|
+
.join(' ');
|
|
210
|
+
this._mediaObject.ext = [];
|
|
211
|
+
for (const ext of answerRtpParameters.headerExtensions) {
|
|
212
|
+
// Don't add a header extension if not present in the offer.
|
|
213
|
+
const found = (offerMediaObject.ext || []).some((localExt) => localExt.uri === ext.uri);
|
|
214
|
+
if (!found) {
|
|
215
|
+
continue;
|
|
232
216
|
}
|
|
233
|
-
|
|
234
|
-
|
|
235
|
-
|
|
236
|
-
|
|
237
|
-
|
|
238
|
-
|
|
239
|
-
|
|
240
|
-
|
|
241
|
-
|
|
242
|
-
|
|
243
|
-
|
|
244
|
-
|
|
245
|
-
|
|
246
|
-
|
|
247
|
-
|
|
248
|
-
|
|
217
|
+
this._mediaObject.ext.push({
|
|
218
|
+
uri: ext.uri,
|
|
219
|
+
value: ext.id,
|
|
220
|
+
});
|
|
221
|
+
}
|
|
222
|
+
// Allow both 1 byte and 2 bytes length header extensions.
|
|
223
|
+
if (extmapAllowMixed &&
|
|
224
|
+
offerMediaObject.extmapAllowMixed === 'extmap-allow-mixed') {
|
|
225
|
+
this._mediaObject.extmapAllowMixed = 'extmap-allow-mixed';
|
|
226
|
+
}
|
|
227
|
+
// Simulcast.
|
|
228
|
+
if (offerMediaObject.simulcast) {
|
|
229
|
+
this._mediaObject.simulcast = {
|
|
230
|
+
dir1: 'recv',
|
|
231
|
+
list1: offerMediaObject.simulcast.list1,
|
|
232
|
+
};
|
|
233
|
+
this._mediaObject.rids = [];
|
|
234
|
+
for (const rid of offerMediaObject.rids || []) {
|
|
235
|
+
if (rid.direction !== 'send') {
|
|
236
|
+
continue;
|
|
249
237
|
}
|
|
238
|
+
this._mediaObject.rids.push({
|
|
239
|
+
id: rid.id,
|
|
240
|
+
direction: 'recv',
|
|
241
|
+
});
|
|
250
242
|
}
|
|
251
|
-
|
|
252
|
-
|
|
253
|
-
|
|
254
|
-
|
|
255
|
-
|
|
256
|
-
|
|
257
|
-
|
|
258
|
-
|
|
259
|
-
|
|
260
|
-
|
|
261
|
-
|
|
262
|
-
}
|
|
263
|
-
this._mediaObject.rids.push({
|
|
264
|
-
id: rid.id,
|
|
265
|
-
direction: 'recv'
|
|
266
|
-
});
|
|
243
|
+
}
|
|
244
|
+
// Simulcast (draft version 03).
|
|
245
|
+
else if (offerMediaObject.simulcast_03) {
|
|
246
|
+
// eslint-disable-next-line camelcase
|
|
247
|
+
this._mediaObject.simulcast_03 = {
|
|
248
|
+
value: offerMediaObject.simulcast_03.value.replace(/send/g, 'recv'),
|
|
249
|
+
};
|
|
250
|
+
this._mediaObject.rids = [];
|
|
251
|
+
for (const rid of offerMediaObject.rids || []) {
|
|
252
|
+
if (rid.direction !== 'send') {
|
|
253
|
+
continue;
|
|
267
254
|
}
|
|
255
|
+
this._mediaObject.rids.push({
|
|
256
|
+
id: rid.id,
|
|
257
|
+
direction: 'recv',
|
|
258
|
+
});
|
|
268
259
|
}
|
|
269
|
-
this._mediaObject.rtcpMux = 'rtcp-mux';
|
|
270
|
-
this._mediaObject.rtcpRsize = 'rtcp-rsize';
|
|
271
|
-
if (this._planB && this._mediaObject.type === 'video') {
|
|
272
|
-
this._mediaObject.xGoogleFlag = 'conference';
|
|
273
|
-
}
|
|
274
|
-
break;
|
|
275
260
|
}
|
|
276
|
-
|
|
277
|
-
|
|
278
|
-
|
|
279
|
-
|
|
280
|
-
this._mediaObject.payloads = 'webrtc-datachannel';
|
|
281
|
-
this._mediaObject.sctpPort = sctpParameters.port;
|
|
282
|
-
this._mediaObject.maxMessageSize = sctpParameters.maxMessageSize;
|
|
283
|
-
}
|
|
284
|
-
// Old spec.
|
|
285
|
-
else if (offerMediaObject.sctpmap) {
|
|
286
|
-
this._mediaObject.payloads = sctpParameters.port;
|
|
287
|
-
this._mediaObject.sctpmap =
|
|
288
|
-
{
|
|
289
|
-
app: 'webrtc-datachannel',
|
|
290
|
-
sctpmapNumber: sctpParameters.port,
|
|
291
|
-
maxMessageSize: sctpParameters.maxMessageSize
|
|
292
|
-
};
|
|
293
|
-
}
|
|
294
|
-
break;
|
|
261
|
+
this._mediaObject.rtcpMux = 'rtcp-mux';
|
|
262
|
+
this._mediaObject.rtcpRsize = 'rtcp-rsize';
|
|
263
|
+
if (this._planB && this._mediaObject.type === 'video') {
|
|
264
|
+
this._mediaObject.xGoogleFlag = 'conference';
|
|
295
265
|
}
|
|
266
|
+
break;
|
|
267
|
+
}
|
|
268
|
+
case 'application': {
|
|
269
|
+
// New spec.
|
|
270
|
+
if (typeof offerMediaObject.sctpPort === 'number') {
|
|
271
|
+
this._mediaObject.payloads = 'webrtc-datachannel';
|
|
272
|
+
this._mediaObject.sctpPort = sctpParameters.port;
|
|
273
|
+
this._mediaObject.maxMessageSize = sctpParameters.maxMessageSize;
|
|
274
|
+
}
|
|
275
|
+
// Old spec.
|
|
276
|
+
else if (offerMediaObject.sctpmap) {
|
|
277
|
+
this._mediaObject.payloads = sctpParameters.port;
|
|
278
|
+
this._mediaObject.sctpmap = {
|
|
279
|
+
app: 'webrtc-datachannel',
|
|
280
|
+
sctpmapNumber: sctpParameters.port,
|
|
281
|
+
maxMessageSize: sctpParameters.maxMessageSize,
|
|
282
|
+
};
|
|
283
|
+
}
|
|
284
|
+
break;
|
|
285
|
+
}
|
|
296
286
|
}
|
|
297
287
|
}
|
|
298
288
|
setDtlsRole(role) {
|
|
299
289
|
switch (role) {
|
|
300
|
-
case 'client':
|
|
301
|
-
|
|
302
|
-
|
|
303
|
-
|
|
304
|
-
|
|
305
|
-
|
|
306
|
-
|
|
307
|
-
|
|
308
|
-
|
|
309
|
-
|
|
310
|
-
|
|
311
|
-
|
|
312
|
-
this._mediaObject.setup = 'actpass';
|
|
313
|
-
break;
|
|
314
|
-
}
|
|
290
|
+
case 'client': {
|
|
291
|
+
this._mediaObject.setup = 'active';
|
|
292
|
+
break;
|
|
293
|
+
}
|
|
294
|
+
case 'server': {
|
|
295
|
+
this._mediaObject.setup = 'passive';
|
|
296
|
+
break;
|
|
297
|
+
}
|
|
298
|
+
case 'auto': {
|
|
299
|
+
this._mediaObject.setup = 'actpass';
|
|
300
|
+
break;
|
|
301
|
+
}
|
|
315
302
|
}
|
|
316
303
|
}
|
|
317
304
|
resume() {
|
|
@@ -334,12 +321,14 @@ class AnswerMediaSection extends MediaSection {
|
|
|
334
321
|
simulcastFormat.paused = !layers[simulcastFormat.scid]?.active;
|
|
335
322
|
}
|
|
336
323
|
}
|
|
337
|
-
this._mediaObject.simulcast.list1 = simulcastStreams
|
|
324
|
+
this._mediaObject.simulcast.list1 = simulcastStreams
|
|
325
|
+
.map(simulcastFormats => simulcastFormats.map(f => `${f.paused ? '~' : ''}${f.scid}`).join(','))
|
|
326
|
+
.join(';');
|
|
338
327
|
}
|
|
339
328
|
}
|
|
340
329
|
exports.AnswerMediaSection = AnswerMediaSection;
|
|
341
330
|
class OfferMediaSection extends MediaSection {
|
|
342
|
-
constructor({ iceParameters, iceCandidates, dtlsParameters, sctpParameters, plainRtpParameters, planB = false, mid, kind, offerRtpParameters, streamId, trackId, oldDataChannelSpec = false }) {
|
|
331
|
+
constructor({ iceParameters, iceCandidates, dtlsParameters, sctpParameters, plainRtpParameters, planB = false, mid, kind, offerRtpParameters, streamId, trackId, oldDataChannelSpec = false, }) {
|
|
343
332
|
super({ iceParameters, iceCandidates, dtlsParameters, planB });
|
|
344
333
|
this._mediaObject.mid = String(mid);
|
|
345
334
|
this._mediaObject.type = kind;
|
|
@@ -354,132 +343,126 @@ class OfferMediaSection extends MediaSection {
|
|
|
354
343
|
this._mediaObject.port = 7;
|
|
355
344
|
}
|
|
356
345
|
else {
|
|
357
|
-
this._mediaObject.connection =
|
|
358
|
-
|
|
359
|
-
|
|
360
|
-
|
|
361
|
-
};
|
|
346
|
+
this._mediaObject.connection = {
|
|
347
|
+
ip: plainRtpParameters.ip,
|
|
348
|
+
version: plainRtpParameters.ipVersion,
|
|
349
|
+
};
|
|
362
350
|
this._mediaObject.protocol = 'RTP/AVP';
|
|
363
351
|
this._mediaObject.port = plainRtpParameters.port;
|
|
364
352
|
}
|
|
365
353
|
switch (kind) {
|
|
366
354
|
case 'audio':
|
|
367
|
-
case 'video':
|
|
368
|
-
|
|
369
|
-
|
|
370
|
-
|
|
371
|
-
|
|
372
|
-
|
|
373
|
-
|
|
374
|
-
|
|
355
|
+
case 'video': {
|
|
356
|
+
this._mediaObject.direction = 'sendonly';
|
|
357
|
+
this._mediaObject.rtp = [];
|
|
358
|
+
this._mediaObject.rtcpFb = [];
|
|
359
|
+
this._mediaObject.fmtp = [];
|
|
360
|
+
if (!this._planB) {
|
|
361
|
+
this._mediaObject.msid = `${streamId || '-'} ${trackId}`;
|
|
362
|
+
}
|
|
363
|
+
for (const codec of offerRtpParameters.codecs) {
|
|
364
|
+
const rtp = {
|
|
365
|
+
payload: codec.payloadType,
|
|
366
|
+
codec: getCodecName(codec),
|
|
367
|
+
rate: codec.clockRate,
|
|
368
|
+
};
|
|
369
|
+
if (codec.channels > 1) {
|
|
370
|
+
rtp.encoding = codec.channels;
|
|
375
371
|
}
|
|
376
|
-
|
|
377
|
-
|
|
378
|
-
|
|
379
|
-
|
|
380
|
-
|
|
381
|
-
|
|
382
|
-
if (codec.channels > 1) {
|
|
383
|
-
rtp.encoding = codec.channels;
|
|
384
|
-
}
|
|
385
|
-
this._mediaObject.rtp.push(rtp);
|
|
386
|
-
const fmtp = {
|
|
387
|
-
payload: codec.payloadType,
|
|
388
|
-
config: ''
|
|
389
|
-
};
|
|
390
|
-
for (const key of Object.keys(codec.parameters)) {
|
|
391
|
-
if (fmtp.config) {
|
|
392
|
-
fmtp.config += ';';
|
|
393
|
-
}
|
|
394
|
-
fmtp.config += `${key}=${codec.parameters[key]}`;
|
|
395
|
-
}
|
|
372
|
+
this._mediaObject.rtp.push(rtp);
|
|
373
|
+
const fmtp = {
|
|
374
|
+
payload: codec.payloadType,
|
|
375
|
+
config: '',
|
|
376
|
+
};
|
|
377
|
+
for (const key of Object.keys(codec.parameters)) {
|
|
396
378
|
if (fmtp.config) {
|
|
397
|
-
|
|
398
|
-
}
|
|
399
|
-
for (const fb of codec.rtcpFeedback) {
|
|
400
|
-
this._mediaObject.rtcpFb.push({
|
|
401
|
-
payload: codec.payloadType,
|
|
402
|
-
type: fb.type,
|
|
403
|
-
subtype: fb.parameter
|
|
404
|
-
});
|
|
379
|
+
fmtp.config += ';';
|
|
405
380
|
}
|
|
381
|
+
fmtp.config += `${key}=${codec.parameters[key]}`;
|
|
382
|
+
}
|
|
383
|
+
if (fmtp.config) {
|
|
384
|
+
this._mediaObject.fmtp.push(fmtp);
|
|
406
385
|
}
|
|
407
|
-
|
|
408
|
-
.
|
|
409
|
-
|
|
410
|
-
|
|
411
|
-
|
|
412
|
-
this._mediaObject.ext.push({
|
|
413
|
-
uri: ext.uri,
|
|
414
|
-
value: ext.id
|
|
386
|
+
for (const fb of codec.rtcpFeedback) {
|
|
387
|
+
this._mediaObject.rtcpFb.push({
|
|
388
|
+
payload: codec.payloadType,
|
|
389
|
+
type: fb.type,
|
|
390
|
+
subtype: fb.parameter,
|
|
415
391
|
});
|
|
416
392
|
}
|
|
417
|
-
|
|
418
|
-
|
|
419
|
-
|
|
420
|
-
|
|
421
|
-
|
|
422
|
-
|
|
423
|
-
|
|
424
|
-
|
|
425
|
-
|
|
393
|
+
}
|
|
394
|
+
this._mediaObject.payloads = offerRtpParameters.codecs
|
|
395
|
+
.map((codec) => codec.payloadType)
|
|
396
|
+
.join(' ');
|
|
397
|
+
this._mediaObject.ext = [];
|
|
398
|
+
for (const ext of offerRtpParameters.headerExtensions) {
|
|
399
|
+
this._mediaObject.ext.push({
|
|
400
|
+
uri: ext.uri,
|
|
401
|
+
value: ext.id,
|
|
402
|
+
});
|
|
403
|
+
}
|
|
404
|
+
this._mediaObject.rtcpMux = 'rtcp-mux';
|
|
405
|
+
this._mediaObject.rtcpRsize = 'rtcp-rsize';
|
|
406
|
+
const encoding = offerRtpParameters.encodings[0];
|
|
407
|
+
const ssrc = encoding.ssrc;
|
|
408
|
+
const rtxSsrc = encoding.rtx && encoding.rtx.ssrc ? encoding.rtx.ssrc : undefined;
|
|
409
|
+
this._mediaObject.ssrcs = [];
|
|
410
|
+
this._mediaObject.ssrcGroups = [];
|
|
411
|
+
if (offerRtpParameters.rtcp.cname) {
|
|
412
|
+
this._mediaObject.ssrcs.push({
|
|
413
|
+
id: ssrc,
|
|
414
|
+
attribute: 'cname',
|
|
415
|
+
value: offerRtpParameters.rtcp.cname,
|
|
416
|
+
});
|
|
417
|
+
}
|
|
418
|
+
if (this._planB) {
|
|
419
|
+
this._mediaObject.ssrcs.push({
|
|
420
|
+
id: ssrc,
|
|
421
|
+
attribute: 'msid',
|
|
422
|
+
value: `${streamId || '-'} ${trackId}`,
|
|
423
|
+
});
|
|
424
|
+
}
|
|
425
|
+
if (rtxSsrc) {
|
|
426
426
|
if (offerRtpParameters.rtcp.cname) {
|
|
427
427
|
this._mediaObject.ssrcs.push({
|
|
428
|
-
id:
|
|
428
|
+
id: rtxSsrc,
|
|
429
429
|
attribute: 'cname',
|
|
430
|
-
value: offerRtpParameters.rtcp.cname
|
|
430
|
+
value: offerRtpParameters.rtcp.cname,
|
|
431
431
|
});
|
|
432
432
|
}
|
|
433
433
|
if (this._planB) {
|
|
434
434
|
this._mediaObject.ssrcs.push({
|
|
435
|
-
id:
|
|
435
|
+
id: rtxSsrc,
|
|
436
436
|
attribute: 'msid',
|
|
437
|
-
value: `${streamId || '-'} ${trackId}
|
|
438
|
-
});
|
|
439
|
-
}
|
|
440
|
-
if (rtxSsrc) {
|
|
441
|
-
if (offerRtpParameters.rtcp.cname) {
|
|
442
|
-
this._mediaObject.ssrcs.push({
|
|
443
|
-
id: rtxSsrc,
|
|
444
|
-
attribute: 'cname',
|
|
445
|
-
value: offerRtpParameters.rtcp.cname
|
|
446
|
-
});
|
|
447
|
-
}
|
|
448
|
-
if (this._planB) {
|
|
449
|
-
this._mediaObject.ssrcs.push({
|
|
450
|
-
id: rtxSsrc,
|
|
451
|
-
attribute: 'msid',
|
|
452
|
-
value: `${streamId || '-'} ${trackId}`
|
|
453
|
-
});
|
|
454
|
-
}
|
|
455
|
-
// Associate original and retransmission SSRCs.
|
|
456
|
-
this._mediaObject.ssrcGroups.push({
|
|
457
|
-
semantics: 'FID',
|
|
458
|
-
ssrcs: `${ssrc} ${rtxSsrc}`
|
|
437
|
+
value: `${streamId || '-'} ${trackId}`,
|
|
459
438
|
});
|
|
460
439
|
}
|
|
461
|
-
|
|
440
|
+
// Associate original and retransmission SSRCs.
|
|
441
|
+
this._mediaObject.ssrcGroups.push({
|
|
442
|
+
semantics: 'FID',
|
|
443
|
+
ssrcs: `${ssrc} ${rtxSsrc}`,
|
|
444
|
+
});
|
|
462
445
|
}
|
|
463
|
-
|
|
464
|
-
|
|
465
|
-
|
|
466
|
-
|
|
467
|
-
|
|
468
|
-
|
|
469
|
-
|
|
470
|
-
|
|
471
|
-
|
|
472
|
-
|
|
473
|
-
|
|
474
|
-
|
|
475
|
-
|
|
476
|
-
|
|
477
|
-
|
|
478
|
-
|
|
479
|
-
|
|
480
|
-
}
|
|
481
|
-
break;
|
|
446
|
+
break;
|
|
447
|
+
}
|
|
448
|
+
case 'application': {
|
|
449
|
+
// New spec.
|
|
450
|
+
if (!oldDataChannelSpec) {
|
|
451
|
+
this._mediaObject.payloads = 'webrtc-datachannel';
|
|
452
|
+
this._mediaObject.sctpPort = sctpParameters.port;
|
|
453
|
+
this._mediaObject.maxMessageSize = sctpParameters.maxMessageSize;
|
|
454
|
+
}
|
|
455
|
+
// Old spec.
|
|
456
|
+
else {
|
|
457
|
+
this._mediaObject.payloads = sctpParameters.port;
|
|
458
|
+
this._mediaObject.sctpmap = {
|
|
459
|
+
app: 'webrtc-datachannel',
|
|
460
|
+
sctpmapNumber: sctpParameters.port,
|
|
461
|
+
maxMessageSize: sctpParameters.maxMessageSize,
|
|
462
|
+
};
|
|
482
463
|
}
|
|
464
|
+
break;
|
|
465
|
+
}
|
|
483
466
|
}
|
|
484
467
|
}
|
|
485
468
|
// eslint-disable-next-line @typescript-eslint/no-unused-vars
|
|
@@ -490,12 +473,10 @@ class OfferMediaSection extends MediaSection {
|
|
|
490
473
|
resume() {
|
|
491
474
|
this._mediaObject.direction = 'sendonly';
|
|
492
475
|
}
|
|
493
|
-
planBReceive({ offerRtpParameters, streamId, trackId }) {
|
|
476
|
+
planBReceive({ offerRtpParameters, streamId, trackId, }) {
|
|
494
477
|
const encoding = offerRtpParameters.encodings[0];
|
|
495
478
|
const ssrc = encoding.ssrc;
|
|
496
|
-
const rtxSsrc =
|
|
497
|
-
? encoding.rtx.ssrc
|
|
498
|
-
: undefined;
|
|
479
|
+
const rtxSsrc = encoding.rtx && encoding.rtx.ssrc ? encoding.rtx.ssrc : undefined;
|
|
499
480
|
const payloads = this._mediaObject.payloads.split(' ');
|
|
500
481
|
for (const codec of offerRtpParameters.codecs) {
|
|
501
482
|
if (payloads.includes(String(codec.payloadType))) {
|
|
@@ -504,7 +485,7 @@ class OfferMediaSection extends MediaSection {
|
|
|
504
485
|
const rtp = {
|
|
505
486
|
payload: codec.payloadType,
|
|
506
487
|
codec: getCodecName(codec),
|
|
507
|
-
rate: codec.clockRate
|
|
488
|
+
rate: codec.clockRate,
|
|
508
489
|
};
|
|
509
490
|
if (codec.channels > 1) {
|
|
510
491
|
rtp.encoding = codec.channels;
|
|
@@ -512,7 +493,7 @@ class OfferMediaSection extends MediaSection {
|
|
|
512
493
|
this._mediaObject.rtp.push(rtp);
|
|
513
494
|
const fmtp = {
|
|
514
495
|
payload: codec.payloadType,
|
|
515
|
-
config: ''
|
|
496
|
+
config: '',
|
|
516
497
|
};
|
|
517
498
|
for (const key of Object.keys(codec.parameters)) {
|
|
518
499
|
if (fmtp.config) {
|
|
@@ -527,12 +508,11 @@ class OfferMediaSection extends MediaSection {
|
|
|
527
508
|
this._mediaObject.rtcpFb.push({
|
|
528
509
|
payload: codec.payloadType,
|
|
529
510
|
type: fb.type,
|
|
530
|
-
subtype: fb.parameter
|
|
511
|
+
subtype: fb.parameter,
|
|
531
512
|
});
|
|
532
513
|
}
|
|
533
514
|
}
|
|
534
|
-
this._mediaObject.payloads += ` ${offerRtpParameters
|
|
535
|
-
.codecs
|
|
515
|
+
this._mediaObject.payloads += ` ${offerRtpParameters.codecs
|
|
536
516
|
.filter((codec) => !this._mediaObject.payloads.includes(codec.payloadType))
|
|
537
517
|
.map((codec) => codec.payloadType)
|
|
538
518
|
.join(' ')}`;
|
|
@@ -541,45 +521,41 @@ class OfferMediaSection extends MediaSection {
|
|
|
541
521
|
this._mediaObject.ssrcs.push({
|
|
542
522
|
id: ssrc,
|
|
543
523
|
attribute: 'cname',
|
|
544
|
-
value: offerRtpParameters.rtcp.cname
|
|
524
|
+
value: offerRtpParameters.rtcp.cname,
|
|
545
525
|
});
|
|
546
526
|
}
|
|
547
527
|
this._mediaObject.ssrcs.push({
|
|
548
528
|
id: ssrc,
|
|
549
529
|
attribute: 'msid',
|
|
550
|
-
value: `${streamId || '-'} ${trackId}
|
|
530
|
+
value: `${streamId || '-'} ${trackId}`,
|
|
551
531
|
});
|
|
552
532
|
if (rtxSsrc) {
|
|
553
533
|
if (offerRtpParameters.rtcp.cname) {
|
|
554
534
|
this._mediaObject.ssrcs.push({
|
|
555
535
|
id: rtxSsrc,
|
|
556
536
|
attribute: 'cname',
|
|
557
|
-
value: offerRtpParameters.rtcp.cname
|
|
537
|
+
value: offerRtpParameters.rtcp.cname,
|
|
558
538
|
});
|
|
559
539
|
}
|
|
560
540
|
this._mediaObject.ssrcs.push({
|
|
561
541
|
id: rtxSsrc,
|
|
562
542
|
attribute: 'msid',
|
|
563
|
-
value: `${streamId || '-'} ${trackId}
|
|
543
|
+
value: `${streamId || '-'} ${trackId}`,
|
|
564
544
|
});
|
|
565
545
|
// Associate original and retransmission SSRCs.
|
|
566
546
|
this._mediaObject.ssrcGroups.push({
|
|
567
547
|
semantics: 'FID',
|
|
568
|
-
ssrcs: `${ssrc} ${rtxSsrc}
|
|
548
|
+
ssrcs: `${ssrc} ${rtxSsrc}`,
|
|
569
549
|
});
|
|
570
550
|
}
|
|
571
551
|
}
|
|
572
|
-
planBStopReceiving({ offerRtpParameters }) {
|
|
552
|
+
planBStopReceiving({ offerRtpParameters, }) {
|
|
573
553
|
const encoding = offerRtpParameters.encodings[0];
|
|
574
554
|
const ssrc = encoding.ssrc;
|
|
575
|
-
const rtxSsrc =
|
|
576
|
-
|
|
577
|
-
: undefined;
|
|
578
|
-
this._mediaObject.ssrcs = this._mediaObject.ssrcs
|
|
579
|
-
.filter((s) => s.id !== ssrc && s.id !== rtxSsrc);
|
|
555
|
+
const rtxSsrc = encoding.rtx && encoding.rtx.ssrc ? encoding.rtx.ssrc : undefined;
|
|
556
|
+
this._mediaObject.ssrcs = this._mediaObject.ssrcs.filter((s) => s.id !== ssrc && s.id !== rtxSsrc);
|
|
580
557
|
if (rtxSsrc) {
|
|
581
|
-
this._mediaObject.ssrcGroups = this._mediaObject.ssrcGroups
|
|
582
|
-
.filter((group) => group.ssrcs !== `${ssrc} ${rtxSsrc}`);
|
|
558
|
+
this._mediaObject.ssrcGroups = this._mediaObject.ssrcGroups.filter((group) => group.ssrcs !== `${ssrc} ${rtxSsrc}`);
|
|
583
559
|
}
|
|
584
560
|
}
|
|
585
561
|
}
|