mediasoup-client 3.6.80 → 3.6.81
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/Consumer.d.ts.map +1 -1
- package/lib/Consumer.js +6 -3
- package/lib/DataConsumer.d.ts.map +1 -1
- package/lib/DataConsumer.js +14 -7
- package/lib/DataProducer.d.ts.map +1 -1
- package/lib/DataProducer.js +18 -9
- package/lib/Device.d.ts.map +1 -1
- package/lib/Device.js +24 -12
- package/lib/Producer.d.ts +1 -0
- package/lib/Producer.d.ts.map +1 -1
- package/lib/Producer.js +28 -14
- package/lib/handlers/Chrome111.d.ts.map +1 -1
- package/lib/handlers/Chrome111.js +33 -15
- package/lib/handlers/Chrome55.d.ts.map +1 -1
- package/lib/handlers/Chrome55.js +12 -6
- package/lib/handlers/Chrome67.d.ts.map +1 -1
- package/lib/handlers/Chrome67.js +32 -16
- package/lib/handlers/Chrome70.d.ts.map +1 -1
- package/lib/handlers/Chrome70.js +28 -14
- package/lib/handlers/Chrome74.d.ts.map +1 -1
- package/lib/handlers/Chrome74.js +35 -16
- package/lib/handlers/Edge11.d.ts.map +1 -1
- package/lib/handlers/Edge11.js +30 -15
- package/lib/handlers/FakeHandler.d.ts.map +1 -1
- package/lib/handlers/FakeHandler.js +16 -8
- package/lib/handlers/Firefox60.d.ts.map +1 -1
- package/lib/handlers/Firefox60.js +38 -19
- package/lib/handlers/ReactNative.d.ts.map +1 -1
- package/lib/handlers/ReactNative.js +12 -6
- package/lib/handlers/ReactNativeUnifiedPlan.d.ts.map +1 -1
- package/lib/handlers/ReactNativeUnifiedPlan.js +35 -16
- package/lib/handlers/Safari11.d.ts.map +1 -1
- package/lib/handlers/Safari11.js +32 -16
- package/lib/handlers/Safari12.d.ts.map +1 -1
- package/lib/handlers/Safari12.js +37 -17
- package/lib/handlers/ortc/edgeUtils.d.ts.map +1 -1
- package/lib/handlers/ortc/edgeUtils.js +8 -4
- package/lib/handlers/ortc/utils.d.ts +6 -0
- package/lib/handlers/ortc/utils.d.ts.map +1 -0
- package/lib/handlers/ortc/utils.js +20 -0
- package/lib/handlers/sdp/MediaSection.d.ts.map +1 -1
- package/lib/handlers/sdp/MediaSection.js +56 -23
- package/lib/handlers/sdp/RemoteSdp.d.ts.map +1 -1
- package/lib/handlers/sdp/RemoteSdp.js +8 -4
- package/lib/handlers/sdp/commonUtils.d.ts.map +1 -1
- package/lib/handlers/sdp/commonUtils.js +26 -13
- package/lib/handlers/sdp/plainRtpUtils.d.ts.map +1 -1
- package/lib/handlers/sdp/plainRtpUtils.js +8 -4
- package/lib/handlers/sdp/planBUtils.d.ts.map +1 -1
- package/lib/handlers/sdp/planBUtils.js +22 -11
- package/lib/handlers/sdp/unifiedPlanUtils.d.ts.map +1 -1
- package/lib/handlers/sdp/unifiedPlanUtils.js +16 -8
- 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 +196 -98
- package/lib/utils.d.ts.map +1 -1
- package/lib/utils.js +2 -1
- package/package.json +3 -3
|
@@ -46,8 +46,9 @@ class MediaSection {
|
|
|
46
46
|
candidateObject.priority = candidate.priority;
|
|
47
47
|
candidateObject.transport = candidate.protocol;
|
|
48
48
|
candidateObject.type = candidate.type;
|
|
49
|
-
if (candidate.tcpType)
|
|
49
|
+
if (candidate.tcpType) {
|
|
50
50
|
candidateObject.tcptype = candidate.tcpType;
|
|
51
|
+
}
|
|
51
52
|
this._mediaObject.candidates.push(candidateObject);
|
|
52
53
|
}
|
|
53
54
|
this._mediaObject.endOfCandidates = 'end-of-candidates';
|
|
@@ -121,16 +122,19 @@ class AnswerMediaSection extends MediaSection {
|
|
|
121
122
|
codec: getCodecName(codec),
|
|
122
123
|
rate: codec.clockRate
|
|
123
124
|
};
|
|
124
|
-
if (codec.channels > 1)
|
|
125
|
+
if (codec.channels > 1) {
|
|
125
126
|
rtp.encoding = codec.channels;
|
|
127
|
+
}
|
|
126
128
|
this._mediaObject.rtp.push(rtp);
|
|
127
129
|
const codecParameters = utils.clone(codec.parameters, {});
|
|
130
|
+
let codecRtcpFeedback = utils.clone(codec.rtcpFeedback, []);
|
|
128
131
|
if (codecOptions) {
|
|
129
|
-
const { opusStereo, opusFec, opusDtx, opusMaxPlaybackRate, opusMaxAverageBitrate, opusPtime, videoGoogleStartBitrate, videoGoogleMaxBitrate, videoGoogleMinBitrate } = codecOptions;
|
|
132
|
+
const { opusStereo, opusFec, opusDtx, opusMaxPlaybackRate, opusMaxAverageBitrate, opusPtime, opusNack, videoGoogleStartBitrate, videoGoogleMaxBitrate, videoGoogleMinBitrate } = codecOptions;
|
|
130
133
|
const offerCodec = offerRtpParameters.codecs
|
|
131
134
|
.find((c) => (c.payloadType === codec.payloadType));
|
|
132
135
|
switch (codec.mimeType.toLowerCase()) {
|
|
133
136
|
case 'audio/opus':
|
|
137
|
+
case 'audio/multiopus':
|
|
134
138
|
{
|
|
135
139
|
if (opusStereo !== undefined) {
|
|
136
140
|
offerCodec.parameters['sprop-stereo'] = opusStereo ? 1 : 0;
|
|
@@ -154,6 +158,16 @@ class AnswerMediaSection extends MediaSection {
|
|
|
154
158
|
offerCodec.parameters.ptime = opusPtime;
|
|
155
159
|
codecParameters.ptime = opusPtime;
|
|
156
160
|
}
|
|
161
|
+
// If opusNack is not set, we must remove NACK support for OPUS.
|
|
162
|
+
// Otherwise it would be enabled for those handlers that artificially
|
|
163
|
+
// announce it in their RTP capabilities.
|
|
164
|
+
if (!opusNack) {
|
|
165
|
+
offerCodec.rtcpFeedback = offerCodec
|
|
166
|
+
.rtcpFeedback
|
|
167
|
+
.filter((fb) => fb.type !== 'nack' || fb.parameter);
|
|
168
|
+
codecRtcpFeedback = codecRtcpFeedback
|
|
169
|
+
.filter((fb) => fb.type !== 'nack' || fb.parameter);
|
|
170
|
+
}
|
|
157
171
|
break;
|
|
158
172
|
}
|
|
159
173
|
case 'video/vp8':
|
|
@@ -161,12 +175,15 @@ class AnswerMediaSection extends MediaSection {
|
|
|
161
175
|
case 'video/h264':
|
|
162
176
|
case 'video/h265':
|
|
163
177
|
{
|
|
164
|
-
if (videoGoogleStartBitrate !== undefined)
|
|
178
|
+
if (videoGoogleStartBitrate !== undefined) {
|
|
165
179
|
codecParameters['x-google-start-bitrate'] = videoGoogleStartBitrate;
|
|
166
|
-
|
|
180
|
+
}
|
|
181
|
+
if (videoGoogleMaxBitrate !== undefined) {
|
|
167
182
|
codecParameters['x-google-max-bitrate'] = videoGoogleMaxBitrate;
|
|
168
|
-
|
|
183
|
+
}
|
|
184
|
+
if (videoGoogleMinBitrate !== undefined) {
|
|
169
185
|
codecParameters['x-google-min-bitrate'] = videoGoogleMinBitrate;
|
|
186
|
+
}
|
|
170
187
|
break;
|
|
171
188
|
}
|
|
172
189
|
}
|
|
@@ -176,13 +193,15 @@ class AnswerMediaSection extends MediaSection {
|
|
|
176
193
|
config: ''
|
|
177
194
|
};
|
|
178
195
|
for (const key of Object.keys(codecParameters)) {
|
|
179
|
-
if (fmtp.config)
|
|
196
|
+
if (fmtp.config) {
|
|
180
197
|
fmtp.config += ';';
|
|
198
|
+
}
|
|
181
199
|
fmtp.config += `${key}=${codecParameters[key]}`;
|
|
182
200
|
}
|
|
183
|
-
if (fmtp.config)
|
|
201
|
+
if (fmtp.config) {
|
|
184
202
|
this._mediaObject.fmtp.push(fmtp);
|
|
185
|
-
|
|
203
|
+
}
|
|
204
|
+
for (const fb of codecRtcpFeedback) {
|
|
186
205
|
this._mediaObject.rtcpFb.push({
|
|
187
206
|
payload: codec.payloadType,
|
|
188
207
|
type: fb.type,
|
|
@@ -198,8 +217,9 @@ class AnswerMediaSection extends MediaSection {
|
|
|
198
217
|
// Don't add a header extension if not present in the offer.
|
|
199
218
|
const found = (offerMediaObject.ext || [])
|
|
200
219
|
.some((localExt) => localExt.uri === ext.uri);
|
|
201
|
-
if (!found)
|
|
220
|
+
if (!found) {
|
|
202
221
|
continue;
|
|
222
|
+
}
|
|
203
223
|
this._mediaObject.ext.push({
|
|
204
224
|
uri: ext.uri,
|
|
205
225
|
value: ext.id
|
|
@@ -219,8 +239,9 @@ class AnswerMediaSection extends MediaSection {
|
|
|
219
239
|
};
|
|
220
240
|
this._mediaObject.rids = [];
|
|
221
241
|
for (const rid of offerMediaObject.rids || []) {
|
|
222
|
-
if (rid.direction !== 'send')
|
|
242
|
+
if (rid.direction !== 'send') {
|
|
223
243
|
continue;
|
|
244
|
+
}
|
|
224
245
|
this._mediaObject.rids.push({
|
|
225
246
|
id: rid.id,
|
|
226
247
|
direction: 'recv'
|
|
@@ -236,8 +257,9 @@ class AnswerMediaSection extends MediaSection {
|
|
|
236
257
|
};
|
|
237
258
|
this._mediaObject.rids = [];
|
|
238
259
|
for (const rid of offerMediaObject.rids || []) {
|
|
239
|
-
if (rid.direction !== 'send')
|
|
260
|
+
if (rid.direction !== 'send') {
|
|
240
261
|
continue;
|
|
262
|
+
}
|
|
241
263
|
this._mediaObject.rids.push({
|
|
242
264
|
id: rid.id,
|
|
243
265
|
direction: 'recv'
|
|
@@ -246,8 +268,9 @@ class AnswerMediaSection extends MediaSection {
|
|
|
246
268
|
}
|
|
247
269
|
this._mediaObject.rtcpMux = 'rtcp-mux';
|
|
248
270
|
this._mediaObject.rtcpRsize = 'rtcp-rsize';
|
|
249
|
-
if (this._planB && this._mediaObject.type === 'video')
|
|
271
|
+
if (this._planB && this._mediaObject.type === 'video') {
|
|
250
272
|
this._mediaObject.xGoogleFlag = 'conference';
|
|
273
|
+
}
|
|
251
274
|
break;
|
|
252
275
|
}
|
|
253
276
|
case 'application':
|
|
@@ -320,10 +343,12 @@ class OfferMediaSection extends MediaSection {
|
|
|
320
343
|
this._mediaObject.type = kind;
|
|
321
344
|
if (!plainRtpParameters) {
|
|
322
345
|
this._mediaObject.connection = { ip: '127.0.0.1', version: 4 };
|
|
323
|
-
if (!sctpParameters)
|
|
346
|
+
if (!sctpParameters) {
|
|
324
347
|
this._mediaObject.protocol = 'UDP/TLS/RTP/SAVPF';
|
|
325
|
-
|
|
348
|
+
}
|
|
349
|
+
else {
|
|
326
350
|
this._mediaObject.protocol = 'UDP/DTLS/SCTP';
|
|
351
|
+
}
|
|
327
352
|
this._mediaObject.port = 7;
|
|
328
353
|
}
|
|
329
354
|
else {
|
|
@@ -343,28 +368,32 @@ class OfferMediaSection extends MediaSection {
|
|
|
343
368
|
this._mediaObject.rtp = [];
|
|
344
369
|
this._mediaObject.rtcpFb = [];
|
|
345
370
|
this._mediaObject.fmtp = [];
|
|
346
|
-
if (!this._planB)
|
|
371
|
+
if (!this._planB) {
|
|
347
372
|
this._mediaObject.msid = `${streamId || '-'} ${trackId}`;
|
|
373
|
+
}
|
|
348
374
|
for (const codec of offerRtpParameters.codecs) {
|
|
349
375
|
const rtp = {
|
|
350
376
|
payload: codec.payloadType,
|
|
351
377
|
codec: getCodecName(codec),
|
|
352
378
|
rate: codec.clockRate
|
|
353
379
|
};
|
|
354
|
-
if (codec.channels > 1)
|
|
380
|
+
if (codec.channels > 1) {
|
|
355
381
|
rtp.encoding = codec.channels;
|
|
382
|
+
}
|
|
356
383
|
this._mediaObject.rtp.push(rtp);
|
|
357
384
|
const fmtp = {
|
|
358
385
|
payload: codec.payloadType,
|
|
359
386
|
config: ''
|
|
360
387
|
};
|
|
361
388
|
for (const key of Object.keys(codec.parameters)) {
|
|
362
|
-
if (fmtp.config)
|
|
389
|
+
if (fmtp.config) {
|
|
363
390
|
fmtp.config += ';';
|
|
391
|
+
}
|
|
364
392
|
fmtp.config += `${key}=${codec.parameters[key]}`;
|
|
365
393
|
}
|
|
366
|
-
if (fmtp.config)
|
|
394
|
+
if (fmtp.config) {
|
|
367
395
|
this._mediaObject.fmtp.push(fmtp);
|
|
396
|
+
}
|
|
368
397
|
for (const fb of codec.rtcpFeedback) {
|
|
369
398
|
this._mediaObject.rtcpFb.push({
|
|
370
399
|
payload: codec.payloadType,
|
|
@@ -475,20 +504,23 @@ class OfferMediaSection extends MediaSection {
|
|
|
475
504
|
codec: getCodecName(codec),
|
|
476
505
|
rate: codec.clockRate
|
|
477
506
|
};
|
|
478
|
-
if (codec.channels > 1)
|
|
507
|
+
if (codec.channels > 1) {
|
|
479
508
|
rtp.encoding = codec.channels;
|
|
509
|
+
}
|
|
480
510
|
this._mediaObject.rtp.push(rtp);
|
|
481
511
|
const fmtp = {
|
|
482
512
|
payload: codec.payloadType,
|
|
483
513
|
config: ''
|
|
484
514
|
};
|
|
485
515
|
for (const key of Object.keys(codec.parameters)) {
|
|
486
|
-
if (fmtp.config)
|
|
516
|
+
if (fmtp.config) {
|
|
487
517
|
fmtp.config += ';';
|
|
518
|
+
}
|
|
488
519
|
fmtp.config += `${key}=${codec.parameters[key]}`;
|
|
489
520
|
}
|
|
490
|
-
if (fmtp.config)
|
|
521
|
+
if (fmtp.config) {
|
|
491
522
|
this._mediaObject.fmtp.push(fmtp);
|
|
523
|
+
}
|
|
492
524
|
for (const fb of codec.rtcpFeedback) {
|
|
493
525
|
this._mediaObject.rtcpFb.push({
|
|
494
526
|
payload: codec.payloadType,
|
|
@@ -553,7 +585,8 @@ exports.OfferMediaSection = OfferMediaSection;
|
|
|
553
585
|
function getCodecName(codec) {
|
|
554
586
|
const MimeTypeRegex = new RegExp('^(audio|video)/(.+)', 'i');
|
|
555
587
|
const mimeTypeMatch = MimeTypeRegex.exec(codec.mimeType);
|
|
556
|
-
if (!mimeTypeMatch)
|
|
588
|
+
if (!mimeTypeMatch) {
|
|
557
589
|
throw new TypeError('invalid codec.mimeType');
|
|
590
|
+
}
|
|
558
591
|
return mimeTypeMatch[2];
|
|
559
592
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"RemoteSdp.d.ts","sourceRoot":"","sources":["../../../src/handlers/sdp/RemoteSdp.ts"],"names":[],"mappings":"AAEA,OAAO,EACN,YAAY,EAGZ,MAAM,gBAAgB,CAAC;AACxB,OAAO,EACN,aAAa,EACb,YAAY,EACZ,cAAc,EACd,QAAQ,EACR,kBAAkB,EAClB,MAAM,iBAAiB,CAAC;AACzB,OAAO,EAAE,oBAAoB,EAAE,MAAM,gBAAgB,CAAC;AACtD,OAAO,EAAE,SAAS,EAAE,aAAa,EAAE,MAAM,qBAAqB,CAAC;AAC/D,OAAO,EAAE,cAAc,EAAE,MAAM,sBAAsB,CAAC;AAItD,qBAAa,SAAS;IAGrB,OAAO,CAAC,cAAc,CAAC,CAAgB;IAEvC,OAAO,CAAC,QAAQ,CAAC,cAAc,CAAC,CAAiB;IAEjD,OAAO,CAAC,QAAQ,CAAC,eAAe,CAAC,CAAiB;IAElD,OAAO,CAAC,QAAQ,CAAC,eAAe,CAAC,CAAiB;IAElD,OAAO,CAAC,QAAQ,CAAC,mBAAmB,CAAC,CAAqB;IAE1D,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAU;IAEjC,OAAO,CAAC,QAAQ,CAAC,cAAc,CAAsB;IAErD,OAAO,CAAC,QAAQ,CAAC,WAAW,CAAkC;IAE9D,OAAO,CAAC,SAAS,CAAC,CAAS;IAE3B,OAAO,CAAC,QAAQ,CAAC,UAAU,CAAM;gBAGhC,EACC,aAAa,EACb,aAAa,EACb,cAAc,EACd,cAAc,EACd,kBAAkB,EAClB,KAAa,EACb,EACD;QACC,aAAa,CAAC,EAAE,aAAa,CAAC;QAC9B,aAAa,CAAC,EAAE,YAAY,EAAE,CAAC;QAC/B,cAAc,CAAC,EAAE,cAAc,CAAC;QAChC,cAAc,CAAC,EAAE,cAAc,CAAC;QAChC,kBAAkB,CAAC,EAAE,kBAAkB,CAAC;QACxC,KAAK,CAAC,EAAE,OAAO,CAAC;KAChB;IAyDF,mBAAmB,CAAC,aAAa,EAAE,aAAa,GAAG,IAAI;IAevD,cAAc,CAAC,IAAI,EAAE,QAAQ,GAAG,IAAI;IAYpC,sBAAsB,IAAI;QAAE,GAAG,EAAE,MAAM,CAAC;QAAC,QAAQ,CAAC,EAAE,MAAM,CAAA;KAAE;
|
|
1
|
+
{"version":3,"file":"RemoteSdp.d.ts","sourceRoot":"","sources":["../../../src/handlers/sdp/RemoteSdp.ts"],"names":[],"mappings":"AAEA,OAAO,EACN,YAAY,EAGZ,MAAM,gBAAgB,CAAC;AACxB,OAAO,EACN,aAAa,EACb,YAAY,EACZ,cAAc,EACd,QAAQ,EACR,kBAAkB,EAClB,MAAM,iBAAiB,CAAC;AACzB,OAAO,EAAE,oBAAoB,EAAE,MAAM,gBAAgB,CAAC;AACtD,OAAO,EAAE,SAAS,EAAE,aAAa,EAAE,MAAM,qBAAqB,CAAC;AAC/D,OAAO,EAAE,cAAc,EAAE,MAAM,sBAAsB,CAAC;AAItD,qBAAa,SAAS;IAGrB,OAAO,CAAC,cAAc,CAAC,CAAgB;IAEvC,OAAO,CAAC,QAAQ,CAAC,cAAc,CAAC,CAAiB;IAEjD,OAAO,CAAC,QAAQ,CAAC,eAAe,CAAC,CAAiB;IAElD,OAAO,CAAC,QAAQ,CAAC,eAAe,CAAC,CAAiB;IAElD,OAAO,CAAC,QAAQ,CAAC,mBAAmB,CAAC,CAAqB;IAE1D,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAU;IAEjC,OAAO,CAAC,QAAQ,CAAC,cAAc,CAAsB;IAErD,OAAO,CAAC,QAAQ,CAAC,WAAW,CAAkC;IAE9D,OAAO,CAAC,SAAS,CAAC,CAAS;IAE3B,OAAO,CAAC,QAAQ,CAAC,UAAU,CAAM;gBAGhC,EACC,aAAa,EACb,aAAa,EACb,cAAc,EACd,cAAc,EACd,kBAAkB,EAClB,KAAa,EACb,EACD;QACC,aAAa,CAAC,EAAE,aAAa,CAAC;QAC9B,aAAa,CAAC,EAAE,YAAY,EAAE,CAAC;QAC/B,cAAc,CAAC,EAAE,cAAc,CAAC;QAChC,cAAc,CAAC,EAAE,cAAc,CAAC;QAChC,kBAAkB,CAAC,EAAE,kBAAkB,CAAC;QACxC,KAAK,CAAC,EAAE,OAAO,CAAC;KAChB;IAyDF,mBAAmB,CAAC,aAAa,EAAE,aAAa,GAAG,IAAI;IAevD,cAAc,CAAC,IAAI,EAAE,QAAQ,GAAG,IAAI;IAYpC,sBAAsB,IAAI;QAAE,GAAG,EAAE,MAAM,CAAC;QAAC,QAAQ,CAAC,EAAE,MAAM,CAAA;KAAE;IAiB5D,IAAI,CACH,EACC,gBAAgB,EAChB,QAAQ,EACR,kBAAkB,EAClB,mBAAmB,EACnB,YAAY,EACZ,gBAAwB,EACxB,EACD;QACC,gBAAgB,EAAE,GAAG,CAAC;QACtB,QAAQ,CAAC,EAAE,MAAM,CAAC;QAClB,kBAAkB,EAAE,aAAa,CAAC;QAClC,mBAAmB,EAAE,aAAa,CAAC;QACnC,YAAY,CAAC,EAAE,oBAAoB,CAAC;QACpC,gBAAgB,CAAC,EAAG,OAAO,CAAC;KAC5B,GACC,IAAI;IAiCP,OAAO,CACN,EACC,GAAG,EACH,IAAI,EACJ,kBAAkB,EAClB,QAAQ,EACR,OAAO,EACP,EACD;QACC,GAAG,EAAE,MAAM,CAAC;QACZ,IAAI,EAAE,SAAS,CAAC;QAChB,kBAAkB,EAAE,aAAa,CAAC;QAClC,QAAQ,EAAE,MAAM,CAAC;QACjB,OAAO,EAAE,MAAM,CAAC;KAChB,GACC,IAAI;IAiDP,iBAAiB,CAAC,GAAG,EAAE,MAAM,GAAG,IAAI;IAOpC,yBAAyB,CAAC,GAAG,EAAE,MAAM,GAAG,IAAI;IAO5C,2BAA2B,CAAC,GAAG,EAAE,MAAM,GAAG,IAAI;IAO9C,mBAAmB,CAAC,GAAG,EAAE,MAAM,GAAG,IAAI;IAOtC;;;;;;OAMG;IACH,iBAAiB,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO;IAyBvC,wBAAwB,CACvB,GAAG,EAAE,MAAM,EAAE,SAAS,EAAE,wBAAwB,EAAE,GAChD,IAAI;IASP,kBAAkB,CACjB,EACC,GAAG,EACH,kBAAkB,EAClB,EACD;QACC,GAAG,EAAE,MAAM,CAAC;QACZ,kBAAkB,EAAE,aAAa,CAAC;KAClC,GACC,IAAI;IASP,mBAAmB,CAAC,EAAE,gBAAgB,EAAE,EAAE;QAAE,gBAAgB,EAAE,GAAG,CAAA;KAAE,GAAG,IAAI;IAe1E,sBAAsB,CACrB,EAAE,kBAA0B,EAAE,GAC9B;QAAE,kBAAkB,CAAC,EAAE,OAAO,CAAA;KAAO,GACnC,IAAI;IAiBP,MAAM,IAAI,MAAM;IAQhB,gBAAgB,CAAC,eAAe,EAAE,YAAY,GAAG,IAAI;IAoBrD,oBAAoB,CAAC,eAAe,EAAE,YAAY,EAAE,QAAQ,CAAC,EAAE,MAAM,GAAG,IAAI;IA6C5E,iBAAiB,CAAC,GAAG,EAAE,MAAM,GAAG,YAAY;IAY5C,qBAAqB,IAAI,IAAI;CAY7B"}
|
|
@@ -96,8 +96,9 @@ class RemoteSdp {
|
|
|
96
96
|
// If a closed media section is found, return its index.
|
|
97
97
|
for (let idx = 0; idx < this._mediaSections.length; ++idx) {
|
|
98
98
|
const mediaSection = this._mediaSections[idx];
|
|
99
|
-
if (mediaSection.closed)
|
|
99
|
+
if (mediaSection.closed) {
|
|
100
100
|
return { idx, reuseMid: mediaSection.mid };
|
|
101
|
+
}
|
|
101
102
|
}
|
|
102
103
|
// If no closed media section is found, return next one.
|
|
103
104
|
return { idx: this._mediaSections.length };
|
|
@@ -131,8 +132,9 @@ class RemoteSdp {
|
|
|
131
132
|
receive({ mid, kind, offerRtpParameters, streamId, trackId }) {
|
|
132
133
|
const idx = this._midToIndex.get(mid);
|
|
133
134
|
let mediaSection;
|
|
134
|
-
if (idx !== undefined)
|
|
135
|
+
if (idx !== undefined) {
|
|
135
136
|
mediaSection = this._mediaSections[idx];
|
|
137
|
+
}
|
|
136
138
|
// Unified-Plan or different media kind.
|
|
137
139
|
if (!mediaSection) {
|
|
138
140
|
mediaSection = new MediaSection_1.OfferMediaSection({
|
|
@@ -240,8 +242,9 @@ class RemoteSdp {
|
|
|
240
242
|
return sdpTransform.write(this._sdpObject);
|
|
241
243
|
}
|
|
242
244
|
_addMediaSection(newMediaSection) {
|
|
243
|
-
if (!this._firstMid)
|
|
245
|
+
if (!this._firstMid) {
|
|
244
246
|
this._firstMid = newMediaSection.mid;
|
|
247
|
+
}
|
|
245
248
|
// Add to the vector.
|
|
246
249
|
this._mediaSections.push(newMediaSection);
|
|
247
250
|
// Add to the map.
|
|
@@ -288,8 +291,9 @@ class RemoteSdp {
|
|
|
288
291
|
return this._mediaSections[idx];
|
|
289
292
|
}
|
|
290
293
|
_regenerateBundleMids() {
|
|
291
|
-
if (!this._dtlsParameters)
|
|
294
|
+
if (!this._dtlsParameters) {
|
|
292
295
|
return;
|
|
296
|
+
}
|
|
293
297
|
this._sdpObject.groups[0].mids = this._mediaSections
|
|
294
298
|
.filter((mediaSection) => !mediaSection.closed)
|
|
295
299
|
.map((mediaSection) => mediaSection.mid)
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"commonUtils.d.ts","sourceRoot":"","sources":["../../../src/handlers/sdp/commonUtils.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,cAAc,EAAY,MAAM,iBAAiB,CAAC;AAC3D,OAAO,EACN,eAAe,EAGf,aAAa,EAEb,MAAM,qBAAqB,CAAC;AAE7B;;;GAGG;AACH,wBAAgB,sBAAsB,CACrC,EAAE,SAAS,EAAE,EACb;IAAE,SAAS,EAAE,GAAG,CAAA;CAAE,GAChB,eAAe,
|
|
1
|
+
{"version":3,"file":"commonUtils.d.ts","sourceRoot":"","sources":["../../../src/handlers/sdp/commonUtils.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,cAAc,EAAY,MAAM,iBAAiB,CAAC;AAC3D,OAAO,EACN,eAAe,EAGf,aAAa,EAEb,MAAM,qBAAqB,CAAC;AAE7B;;;GAGG;AACH,wBAAgB,sBAAsB,CACrC,EAAE,SAAS,EAAE,EACb;IAAE,SAAS,EAAE,GAAG,CAAA;CAAE,GAChB,eAAe,CAqJjB;AAED,wBAAgB,qBAAqB,CACpC,EAAE,SAAS,EAAE,EACb;IAAE,SAAS,EAAE,GAAG,CAAA;CAAE,GAChB,cAAc,CAyChB;AAED,wBAAgB,QAAQ,CACvB,EAAE,gBAAgB,EAAE,EACpB;IAAE,gBAAgB,EAAE,GAAG,CAAA;CAAE,GACvB,MAAM,CAWR;AAED;;;GAGG;AACH,wBAAgB,oBAAoB,CACnC,EACC,kBAAkB,EAClB,iBAAiB,EACjB,EACD;IACC,kBAAkB,EAAE,aAAa,CAAC;IAClC,iBAAiB,EAAE,GAAG,CAAC;CACvB,GACC,IAAI,CA8DN"}
|
|
@@ -42,15 +42,17 @@ function extractRtpCapabilities({ sdpObject }) {
|
|
|
42
42
|
switch (kind) {
|
|
43
43
|
case 'audio':
|
|
44
44
|
{
|
|
45
|
-
if (gotAudio)
|
|
45
|
+
if (gotAudio) {
|
|
46
46
|
continue;
|
|
47
|
+
}
|
|
47
48
|
gotAudio = true;
|
|
48
49
|
break;
|
|
49
50
|
}
|
|
50
51
|
case 'video':
|
|
51
52
|
{
|
|
52
|
-
if (gotVideo)
|
|
53
|
+
if (gotVideo) {
|
|
53
54
|
continue;
|
|
55
|
+
}
|
|
54
56
|
gotVideo = true;
|
|
55
57
|
break;
|
|
56
58
|
}
|
|
@@ -76,11 +78,13 @@ function extractRtpCapabilities({ sdpObject }) {
|
|
|
76
78
|
for (const fmtp of m.fmtp || []) {
|
|
77
79
|
const parameters = sdpTransform.parseParams(fmtp.config);
|
|
78
80
|
const codec = codecsMap.get(fmtp.payload);
|
|
79
|
-
if (!codec)
|
|
81
|
+
if (!codec) {
|
|
80
82
|
continue;
|
|
83
|
+
}
|
|
81
84
|
// Specials case to convert parameter value to string.
|
|
82
|
-
if (parameters && parameters.hasOwnProperty('profile-level-id'))
|
|
85
|
+
if (parameters && parameters.hasOwnProperty('profile-level-id')) {
|
|
83
86
|
parameters['profile-level-id'] = String(parameters['profile-level-id']);
|
|
87
|
+
}
|
|
84
88
|
codec.parameters = parameters;
|
|
85
89
|
}
|
|
86
90
|
// Get RTCP feedback for each codec.
|
|
@@ -89,14 +93,16 @@ function extractRtpCapabilities({ sdpObject }) {
|
|
|
89
93
|
type: fb.type,
|
|
90
94
|
parameter: fb.subtype
|
|
91
95
|
};
|
|
92
|
-
if (!feedback.parameter)
|
|
96
|
+
if (!feedback.parameter) {
|
|
93
97
|
delete feedback.parameter;
|
|
98
|
+
}
|
|
94
99
|
// rtcp-fb payload is not '*', so just apply it to its corresponding
|
|
95
100
|
// codec.
|
|
96
101
|
if (fb.payload !== '*') {
|
|
97
102
|
const codec = codecsMap.get(fb.payload);
|
|
98
|
-
if (!codec)
|
|
103
|
+
if (!codec) {
|
|
99
104
|
continue;
|
|
105
|
+
}
|
|
100
106
|
codec.rtcpFeedback.push(feedback);
|
|
101
107
|
}
|
|
102
108
|
// If rtcp-fb payload is '*' it must be applied to all codecs with same
|
|
@@ -112,8 +118,9 @@ function extractRtpCapabilities({ sdpObject }) {
|
|
|
112
118
|
// Get RTP header extensions.
|
|
113
119
|
for (const ext of m.ext || []) {
|
|
114
120
|
// Ignore encrypted extensions (not yet supported in mediasoup).
|
|
115
|
-
if (ext['encrypt-uri'])
|
|
121
|
+
if (ext['encrypt-uri']) {
|
|
116
122
|
continue;
|
|
123
|
+
}
|
|
117
124
|
const headerExtension = {
|
|
118
125
|
kind: kind,
|
|
119
126
|
uri: ext.uri,
|
|
@@ -132,8 +139,9 @@ exports.extractRtpCapabilities = extractRtpCapabilities;
|
|
|
132
139
|
function extractDtlsParameters({ sdpObject }) {
|
|
133
140
|
const mediaObject = (sdpObject.media || [])
|
|
134
141
|
.find((m) => (m.iceUfrag && m.port !== 0));
|
|
135
|
-
if (!mediaObject)
|
|
142
|
+
if (!mediaObject) {
|
|
136
143
|
throw new Error('no active media section found');
|
|
144
|
+
}
|
|
137
145
|
const fingerprint = mediaObject.fingerprint || sdpObject.fingerprint;
|
|
138
146
|
let role;
|
|
139
147
|
switch (mediaObject.setup) {
|
|
@@ -162,8 +170,9 @@ exports.extractDtlsParameters = extractDtlsParameters;
|
|
|
162
170
|
function getCname({ offerMediaObject }) {
|
|
163
171
|
const ssrcCnameLine = (offerMediaObject.ssrcs || [])
|
|
164
172
|
.find((line) => line.attribute === 'cname');
|
|
165
|
-
if (!ssrcCnameLine)
|
|
173
|
+
if (!ssrcCnameLine) {
|
|
166
174
|
return '';
|
|
175
|
+
}
|
|
167
176
|
return ssrcCnameLine.value;
|
|
168
177
|
}
|
|
169
178
|
exports.getCname = getCname;
|
|
@@ -175,12 +184,14 @@ function applyCodecParameters({ offerRtpParameters, answerMediaObject }) {
|
|
|
175
184
|
for (const codec of offerRtpParameters.codecs) {
|
|
176
185
|
const mimeType = codec.mimeType.toLowerCase();
|
|
177
186
|
// Avoid parsing codec parameters for unhandled codecs.
|
|
178
|
-
if (mimeType !== 'audio/opus')
|
|
187
|
+
if (mimeType !== 'audio/opus') {
|
|
179
188
|
continue;
|
|
189
|
+
}
|
|
180
190
|
const rtp = (answerMediaObject.rtp || [])
|
|
181
191
|
.find((r) => r.payload === codec.payloadType);
|
|
182
|
-
if (!rtp)
|
|
192
|
+
if (!rtp) {
|
|
183
193
|
continue;
|
|
194
|
+
}
|
|
184
195
|
// Just in case.
|
|
185
196
|
answerMediaObject.fmtp = answerMediaObject.fmtp || [];
|
|
186
197
|
let fmtp = answerMediaObject.fmtp
|
|
@@ -194,16 +205,18 @@ function applyCodecParameters({ offerRtpParameters, answerMediaObject }) {
|
|
|
194
205
|
case 'audio/opus':
|
|
195
206
|
{
|
|
196
207
|
const spropStereo = codec.parameters['sprop-stereo'];
|
|
197
|
-
if (spropStereo !== undefined)
|
|
208
|
+
if (spropStereo !== undefined) {
|
|
198
209
|
parameters.stereo = spropStereo ? 1 : 0;
|
|
210
|
+
}
|
|
199
211
|
break;
|
|
200
212
|
}
|
|
201
213
|
}
|
|
202
214
|
// Write the codec fmtp.config back.
|
|
203
215
|
fmtp.config = '';
|
|
204
216
|
for (const key of Object.keys(parameters)) {
|
|
205
|
-
if (fmtp.config)
|
|
217
|
+
if (fmtp.config) {
|
|
206
218
|
fmtp.config += ';';
|
|
219
|
+
}
|
|
207
220
|
fmtp.config += `${key}=${parameters[key]}`;
|
|
208
221
|
}
|
|
209
222
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"plainRtpUtils.d.ts","sourceRoot":"","sources":["../../../src/handlers/sdp/plainRtpUtils.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,qBAAqB,EAAE,MAAM,qBAAqB,CAAC;AAEvE,wBAAgB,yBAAyB,CACxC,EACC,SAAS,EACT,IAAI,EACJ,EACD;IACC,SAAS,EAAE,GAAG,CAAC;IACf,IAAI,EAAE,SAAS,CAAC;CAChB,GAEF;IACC,EAAE,EAAE,MAAM,CAAC;IACX,SAAS,EAAE,CAAC,GAAG,CAAC,CAAC;IACjB,IAAI,EAAE,MAAM,CAAC;CACb,
|
|
1
|
+
{"version":3,"file":"plainRtpUtils.d.ts","sourceRoot":"","sources":["../../../src/handlers/sdp/plainRtpUtils.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,qBAAqB,EAAE,MAAM,qBAAqB,CAAC;AAEvE,wBAAgB,yBAAyB,CACxC,EACC,SAAS,EACT,IAAI,EACJ,EACD;IACC,SAAS,EAAE,GAAG,CAAC;IACf,IAAI,EAAE,SAAS,CAAC;CAChB,GAEF;IACC,EAAE,EAAE,MAAM,CAAC;IACX,SAAS,EAAE,CAAC,GAAG,CAAC,CAAC;IACjB,IAAI,EAAE,MAAM,CAAC;CACb,CAiBA;AAED,wBAAgB,eAAe,CAC9B,EACC,SAAS,EACT,IAAI,EACJ,EACD;IACC,SAAS,EAAE,GAAG,CAAC;IACf,IAAI,EAAE,SAAS,CAAC;CAChB,GACC,qBAAqB,EAAE,CAqBzB"}
|
|
@@ -4,8 +4,9 @@ exports.getRtpEncodings = exports.extractPlainRtpParameters = void 0;
|
|
|
4
4
|
function extractPlainRtpParameters({ sdpObject, kind }) {
|
|
5
5
|
const mediaObject = (sdpObject.media || [])
|
|
6
6
|
.find((m) => m.type === kind);
|
|
7
|
-
if (!mediaObject)
|
|
7
|
+
if (!mediaObject) {
|
|
8
8
|
throw new Error(`m=${kind} section not found`);
|
|
9
|
+
}
|
|
9
10
|
const connectionObject = mediaObject.connection || sdpObject.connection;
|
|
10
11
|
return {
|
|
11
12
|
ip: connectionObject.ip,
|
|
@@ -17,13 +18,16 @@ exports.extractPlainRtpParameters = extractPlainRtpParameters;
|
|
|
17
18
|
function getRtpEncodings({ sdpObject, kind }) {
|
|
18
19
|
const mediaObject = (sdpObject.media || [])
|
|
19
20
|
.find((m) => m.type === kind);
|
|
20
|
-
if (!mediaObject)
|
|
21
|
+
if (!mediaObject) {
|
|
21
22
|
throw new Error(`m=${kind} section not found`);
|
|
23
|
+
}
|
|
22
24
|
const ssrcCnameLine = (mediaObject.ssrcs || [])[0];
|
|
23
25
|
const ssrc = ssrcCnameLine ? ssrcCnameLine.id : null;
|
|
24
|
-
if (ssrc)
|
|
26
|
+
if (ssrc) {
|
|
25
27
|
return [{ ssrc }];
|
|
26
|
-
|
|
28
|
+
}
|
|
29
|
+
else {
|
|
27
30
|
return [];
|
|
31
|
+
}
|
|
28
32
|
}
|
|
29
33
|
exports.getRtpEncodings = getRtpEncodings;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"planBUtils.d.ts","sourceRoot":"","sources":["../../../src/handlers/sdp/planBUtils.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,qBAAqB,EAAE,MAAM,qBAAqB,CAAC;AAE5D,wBAAgB,eAAe,CAC9B,EACC,gBAAgB,EAChB,KAAK,EACL,EACD;IACC,gBAAgB,EAAE,GAAG,CAAC;IACtB,KAAK,EAAE,gBAAgB,CAAC;CACxB,GACC,qBAAqB,EAAE,
|
|
1
|
+
{"version":3,"file":"planBUtils.d.ts","sourceRoot":"","sources":["../../../src/handlers/sdp/planBUtils.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,qBAAqB,EAAE,MAAM,qBAAqB,CAAC;AAE5D,wBAAgB,eAAe,CAC9B,EACC,gBAAgB,EAChB,KAAK,EACL,EACD;IACC,gBAAgB,EAAE,GAAG,CAAC;IACtB,KAAK,EAAE,gBAAgB,CAAC;CACxB,GACC,qBAAqB,EAAE,CAmFzB;AAED;;GAEG;AACH,wBAAgB,kBAAkB,CACjC,EACC,gBAAgB,EAChB,KAAK,EACL,UAAU,EACV,EACD;IACC,gBAAgB,EAAE,GAAG,CAAC;IACtB,KAAK,EAAE,gBAAgB,CAAC;IACxB,UAAU,EAAE,MAAM,CAAC;CACnB,GACC,IAAI,CA0IN"}
|
|
@@ -6,23 +6,27 @@ function getRtpEncodings({ offerMediaObject, track }) {
|
|
|
6
6
|
let firstSsrc;
|
|
7
7
|
const ssrcs = new Set();
|
|
8
8
|
for (const line of offerMediaObject.ssrcs || []) {
|
|
9
|
-
if (line.attribute !== 'msid')
|
|
9
|
+
if (line.attribute !== 'msid') {
|
|
10
10
|
continue;
|
|
11
|
+
}
|
|
11
12
|
const trackId = line.value.split(' ')[1];
|
|
12
13
|
if (trackId === track.id) {
|
|
13
14
|
const ssrc = line.id;
|
|
14
15
|
ssrcs.add(ssrc);
|
|
15
|
-
if (!firstSsrc)
|
|
16
|
+
if (!firstSsrc) {
|
|
16
17
|
firstSsrc = ssrc;
|
|
18
|
+
}
|
|
17
19
|
}
|
|
18
20
|
}
|
|
19
|
-
if (ssrcs.size === 0)
|
|
21
|
+
if (ssrcs.size === 0) {
|
|
20
22
|
throw new Error(`a=ssrc line with msid information not found [track.id:${track.id}]`);
|
|
23
|
+
}
|
|
21
24
|
const ssrcToRtxSsrc = new Map();
|
|
22
25
|
// First assume RTX is used.
|
|
23
26
|
for (const line of offerMediaObject.ssrcGroups || []) {
|
|
24
|
-
if (line.semantics !== 'FID')
|
|
27
|
+
if (line.semantics !== 'FID') {
|
|
25
28
|
continue;
|
|
29
|
+
}
|
|
26
30
|
let [ssrc, rtxSsrc] = line.ssrcs.split(/\s+/);
|
|
27
31
|
ssrc = Number(ssrc);
|
|
28
32
|
rtxSsrc = Number(rtxSsrc);
|
|
@@ -44,8 +48,9 @@ function getRtpEncodings({ offerMediaObject, track }) {
|
|
|
44
48
|
const encodings = [];
|
|
45
49
|
for (const [ssrc, rtxSsrc] of ssrcToRtxSsrc) {
|
|
46
50
|
const encoding = { ssrc };
|
|
47
|
-
if (rtxSsrc)
|
|
51
|
+
if (rtxSsrc) {
|
|
48
52
|
encoding.rtx = { ssrc: rtxSsrc };
|
|
53
|
+
}
|
|
49
54
|
encodings.push(encoding);
|
|
50
55
|
}
|
|
51
56
|
return encodings;
|
|
@@ -55,16 +60,18 @@ exports.getRtpEncodings = getRtpEncodings;
|
|
|
55
60
|
* Adds multi-ssrc based simulcast into the given SDP media section offer.
|
|
56
61
|
*/
|
|
57
62
|
function addLegacySimulcast({ offerMediaObject, track, numStreams }) {
|
|
58
|
-
if (numStreams <= 1)
|
|
63
|
+
if (numStreams <= 1) {
|
|
59
64
|
throw new TypeError('numStreams must be greater than 1');
|
|
65
|
+
}
|
|
60
66
|
let firstSsrc;
|
|
61
67
|
let firstRtxSsrc;
|
|
62
68
|
let streamId;
|
|
63
69
|
// Get the SSRC.
|
|
64
70
|
const ssrcMsidLine = (offerMediaObject.ssrcs || [])
|
|
65
71
|
.find((line) => {
|
|
66
|
-
if (line.attribute !== 'msid')
|
|
72
|
+
if (line.attribute !== 'msid') {
|
|
67
73
|
return false;
|
|
74
|
+
}
|
|
68
75
|
const trackId = line.value.split(' ')[1];
|
|
69
76
|
if (trackId === track.id) {
|
|
70
77
|
firstSsrc = line.id;
|
|
@@ -75,13 +82,15 @@ function addLegacySimulcast({ offerMediaObject, track, numStreams }) {
|
|
|
75
82
|
return false;
|
|
76
83
|
}
|
|
77
84
|
});
|
|
78
|
-
if (!ssrcMsidLine)
|
|
85
|
+
if (!ssrcMsidLine) {
|
|
79
86
|
throw new Error(`a=ssrc line with msid information not found [track.id:${track.id}]`);
|
|
87
|
+
}
|
|
80
88
|
// Get the SSRC for RTX.
|
|
81
89
|
(offerMediaObject.ssrcGroups || [])
|
|
82
90
|
.some((line) => {
|
|
83
|
-
if (line.semantics !== 'FID')
|
|
91
|
+
if (line.semantics !== 'FID') {
|
|
84
92
|
return false;
|
|
93
|
+
}
|
|
85
94
|
const ssrcs = line.ssrcs.split(/\s+/);
|
|
86
95
|
if (Number(ssrcs[0]) === firstSsrc) {
|
|
87
96
|
firstRtxSsrc = Number(ssrcs[1]);
|
|
@@ -93,15 +102,17 @@ function addLegacySimulcast({ offerMediaObject, track, numStreams }) {
|
|
|
93
102
|
});
|
|
94
103
|
const ssrcCnameLine = offerMediaObject.ssrcs
|
|
95
104
|
.find((line) => (line.attribute === 'cname' && line.id === firstSsrc));
|
|
96
|
-
if (!ssrcCnameLine)
|
|
105
|
+
if (!ssrcCnameLine) {
|
|
97
106
|
throw new Error(`a=ssrc line with cname information not found [track.id:${track.id}]`);
|
|
107
|
+
}
|
|
98
108
|
const cname = ssrcCnameLine.value;
|
|
99
109
|
const ssrcs = [];
|
|
100
110
|
const rtxSsrcs = [];
|
|
101
111
|
for (let i = 0; i < numStreams; ++i) {
|
|
102
112
|
ssrcs.push(firstSsrc + i);
|
|
103
|
-
if (firstRtxSsrc)
|
|
113
|
+
if (firstRtxSsrc) {
|
|
104
114
|
rtxSsrcs.push(firstRtxSsrc + i);
|
|
115
|
+
}
|
|
105
116
|
}
|
|
106
117
|
offerMediaObject.ssrcGroups = offerMediaObject.ssrcGroups || [];
|
|
107
118
|
offerMediaObject.ssrcs = offerMediaObject.ssrcs || [];
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"unifiedPlanUtils.d.ts","sourceRoot":"","sources":["../../../src/handlers/sdp/unifiedPlanUtils.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,qBAAqB,EAAE,MAAM,qBAAqB,CAAC;AAE5D,wBAAgB,eAAe,CAC9B,EAAE,gBAAgB,EAAE,EACpB;IAAE,gBAAgB,EAAE,GAAG,CAAA;CAAE,GACvB,qBAAqB,EAAE,
|
|
1
|
+
{"version":3,"file":"unifiedPlanUtils.d.ts","sourceRoot":"","sources":["../../../src/handlers/sdp/unifiedPlanUtils.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,qBAAqB,EAAE,MAAM,qBAAqB,CAAC;AAE5D,wBAAgB,eAAe,CAC9B,EAAE,gBAAgB,EAAE,EACpB;IAAE,gBAAgB,EAAE,GAAG,CAAA;CAAE,GACvB,qBAAqB,EAAE,CAkEzB;AAED;;GAEG;AACH,wBAAgB,kBAAkB,CACjC,EACC,gBAAgB,EAChB,UAAU,EACV,EACD;IACC,gBAAgB,EAAE,GAAG,CAAC;IACtB,UAAU,EAAE,MAAM,CAAC;CACnB,GACC,IAAI,CAsHN"}
|
|
@@ -7,13 +7,15 @@ function getRtpEncodings({ offerMediaObject }) {
|
|
|
7
7
|
const ssrc = line.id;
|
|
8
8
|
ssrcs.add(ssrc);
|
|
9
9
|
}
|
|
10
|
-
if (ssrcs.size === 0)
|
|
10
|
+
if (ssrcs.size === 0) {
|
|
11
11
|
throw new Error('no a=ssrc lines found');
|
|
12
|
+
}
|
|
12
13
|
const ssrcToRtxSsrc = new Map();
|
|
13
14
|
// First assume RTX is used.
|
|
14
15
|
for (const line of offerMediaObject.ssrcGroups || []) {
|
|
15
|
-
if (line.semantics !== 'FID')
|
|
16
|
+
if (line.semantics !== 'FID') {
|
|
16
17
|
continue;
|
|
18
|
+
}
|
|
17
19
|
let [ssrc, rtxSsrc] = line.ssrcs.split(/\s+/);
|
|
18
20
|
ssrc = Number(ssrc);
|
|
19
21
|
rtxSsrc = Number(rtxSsrc);
|
|
@@ -35,8 +37,9 @@ function getRtpEncodings({ offerMediaObject }) {
|
|
|
35
37
|
const encodings = [];
|
|
36
38
|
for (const [ssrc, rtxSsrc] of ssrcToRtxSsrc) {
|
|
37
39
|
const encoding = { ssrc };
|
|
38
|
-
if (rtxSsrc)
|
|
40
|
+
if (rtxSsrc) {
|
|
39
41
|
encoding.rtx = { ssrc: rtxSsrc };
|
|
42
|
+
}
|
|
40
43
|
encodings.push(encoding);
|
|
41
44
|
}
|
|
42
45
|
return encodings;
|
|
@@ -46,21 +49,24 @@ exports.getRtpEncodings = getRtpEncodings;
|
|
|
46
49
|
* Adds multi-ssrc based simulcast into the given SDP media section offer.
|
|
47
50
|
*/
|
|
48
51
|
function addLegacySimulcast({ offerMediaObject, numStreams }) {
|
|
49
|
-
if (numStreams <= 1)
|
|
52
|
+
if (numStreams <= 1) {
|
|
50
53
|
throw new TypeError('numStreams must be greater than 1');
|
|
54
|
+
}
|
|
51
55
|
// Get the SSRC.
|
|
52
56
|
const ssrcMsidLine = (offerMediaObject.ssrcs || [])
|
|
53
57
|
.find((line) => line.attribute === 'msid');
|
|
54
|
-
if (!ssrcMsidLine)
|
|
58
|
+
if (!ssrcMsidLine) {
|
|
55
59
|
throw new Error('a=ssrc line with msid information not found');
|
|
60
|
+
}
|
|
56
61
|
const [streamId, trackId] = ssrcMsidLine.value.split(' ');
|
|
57
62
|
const firstSsrc = ssrcMsidLine.id;
|
|
58
63
|
let firstRtxSsrc;
|
|
59
64
|
// Get the SSRC for RTX.
|
|
60
65
|
(offerMediaObject.ssrcGroups || [])
|
|
61
66
|
.some((line) => {
|
|
62
|
-
if (line.semantics !== 'FID')
|
|
67
|
+
if (line.semantics !== 'FID') {
|
|
63
68
|
return false;
|
|
69
|
+
}
|
|
64
70
|
const ssrcs = line.ssrcs.split(/\s+/);
|
|
65
71
|
if (Number(ssrcs[0]) === firstSsrc) {
|
|
66
72
|
firstRtxSsrc = Number(ssrcs[1]);
|
|
@@ -72,15 +78,17 @@ function addLegacySimulcast({ offerMediaObject, numStreams }) {
|
|
|
72
78
|
});
|
|
73
79
|
const ssrcCnameLine = offerMediaObject.ssrcs
|
|
74
80
|
.find((line) => line.attribute === 'cname');
|
|
75
|
-
if (!ssrcCnameLine)
|
|
81
|
+
if (!ssrcCnameLine) {
|
|
76
82
|
throw new Error('a=ssrc line with cname information not found');
|
|
83
|
+
}
|
|
77
84
|
const cname = ssrcCnameLine.value;
|
|
78
85
|
const ssrcs = [];
|
|
79
86
|
const rtxSsrcs = [];
|
|
80
87
|
for (let i = 0; i < numStreams; ++i) {
|
|
81
88
|
ssrcs.push(firstSsrc + i);
|
|
82
|
-
if (firstRtxSsrc)
|
|
89
|
+
if (firstRtxSsrc) {
|
|
83
90
|
rtxSsrcs.push(firstRtxSsrc + i);
|
|
91
|
+
}
|
|
84
92
|
}
|
|
85
93
|
offerMediaObject.ssrcGroups = [];
|
|
86
94
|
offerMediaObject.ssrcs = [];
|
package/lib/index.d.ts
CHANGED