Skip to content

Commit 8aec3ac

Browse files
committed
Enable codec selection in transport.produce():
- New `codec` option in ProducerOptions. - If given, it must be a codec in device.rtpCapabilites.codecs. - Just available for browsers/handlers using Unified-Plan, this is, any modern browser (not available in React-Native).
1 parent df4879e commit 8aec3ac

File tree

13 files changed

+200
-35
lines changed

13 files changed

+200
-35
lines changed

src/Producer.ts

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,7 @@ import { EnhancedEventEmitter } from './EnhancedEventEmitter';
33
import { UnsupportedError, InvalidStateError } from './errors';
44
import {
55
MediaKind,
6+
RtpCodecCapability,
67
RtpParameters,
78
RtpEncodingParameters
89
} from './RtpParameters';
@@ -12,6 +13,7 @@ export type ProducerOptions =
1213
track?: MediaStreamTrack;
1314
encodings?: RtpEncodingParameters[];
1415
codecOptions?: ProducerCodecOptions;
16+
codec?: RtpCodecCapability;
1517
stopTracks?: boolean;
1618
appData?: any;
1719
}

src/Transport.ts

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -396,6 +396,7 @@ export class Transport extends EnhancedEventEmitter
396396
track,
397397
encodings,
398398
codecOptions,
399+
codec,
399400
stopTracks = true,
400401
appData = {}
401402
}: ProducerOptions = {}
@@ -464,7 +465,8 @@ export class Transport extends EnhancedEventEmitter
464465
{
465466
track,
466467
encodings : normalizedEncodings,
467-
codecOptions
468+
codecOptions,
469+
codec
468470
});
469471

470472
try

src/handlers/Chrome55.ts

Lines changed: 18 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -282,13 +282,20 @@ export class Chrome55 extends HandlerInterface
282282
}
283283

284284
async send(
285-
{ track, encodings, codecOptions }: HandlerSendOptions
285+
{ track, encodings, codecOptions, codec }: HandlerSendOptions
286286
): Promise<HandlerSendResult>
287287
{
288288
this._assertSendDirection();
289289

290290
logger.debug('send() [kind:%s, track.id:%s]', track.kind, track.id);
291291

292+
if (codec)
293+
{
294+
logger.warn(
295+
'send() | codec selection is not available in %s handler',
296+
this.name);
297+
}
298+
292299
this._sendStream.addTrack(track);
293300
this._pc.addStream(this._sendStream);
294301

@@ -298,6 +305,15 @@ export class Chrome55 extends HandlerInterface
298305
const sendingRtpParameters =
299306
utils.clone(this._sendingRtpParametersByKind[track.kind]);
300307

308+
sendingRtpParameters.codecs =
309+
ortc.reduceCodecs(sendingRtpParameters.codecs);
310+
311+
const sendingRemoteRtpParameters =
312+
this._sendingRemoteRtpParametersByKind[track.kind];
313+
314+
sendingRemoteRtpParameters.codecs =
315+
ortc.reduceCodecs(sendingRemoteRtpParameters.codecs);
316+
301317
if (!this._transportReady)
302318
await this._setupTransport({ localDtlsRole: 'server', localSdpObject });
303319

@@ -364,7 +380,7 @@ export class Chrome55 extends HandlerInterface
364380
{
365381
offerMediaObject,
366382
offerRtpParameters : sendingRtpParameters,
367-
answerRtpParameters : this._sendingRemoteRtpParametersByKind[track.kind],
383+
answerRtpParameters : sendingRemoteRtpParameters,
368384
codecOptions
369385
});
370386

src/handlers/Chrome67.ts

Lines changed: 18 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -283,13 +283,20 @@ export class Chrome67 extends HandlerInterface
283283
}
284284

285285
async send(
286-
{ track, encodings, codecOptions }: HandlerSendOptions
286+
{ track, encodings, codecOptions, codec }: HandlerSendOptions
287287
): Promise<HandlerSendResult>
288288
{
289289
this._assertSendDirection();
290290

291291
logger.debug('send() [kind:%s, track.id:%s]', track.kind, track.id);
292292

293+
if (codec)
294+
{
295+
logger.warn(
296+
'send() | codec selection is not available in %s handler',
297+
this.name);
298+
}
299+
293300
this._sendStream.addTrack(track);
294301
this._pc.addTrack(track, this._sendStream);
295302

@@ -299,6 +306,15 @@ export class Chrome67 extends HandlerInterface
299306
const sendingRtpParameters =
300307
utils.clone(this._sendingRtpParametersByKind[track.kind]);
301308

309+
sendingRtpParameters.codecs =
310+
ortc.reduceCodecs(sendingRtpParameters.codecs);
311+
312+
const sendingRemoteRtpParameters =
313+
this._sendingRemoteRtpParametersByKind[track.kind];
314+
315+
sendingRemoteRtpParameters.codecs =
316+
ortc.reduceCodecs(sendingRemoteRtpParameters.codecs);
317+
302318
if (!this._transportReady)
303319
await this._setupTransport({ localDtlsRole: 'server', localSdpObject });
304320

@@ -365,7 +381,7 @@ export class Chrome67 extends HandlerInterface
365381
{
366382
offerMediaObject,
367383
offerRtpParameters : sendingRtpParameters,
368-
answerRtpParameters : this._sendingRemoteRtpParametersByKind[track.kind],
384+
answerRtpParameters : sendingRemoteRtpParameters,
369385
codecOptions
370386
});
371387

src/handlers/Chrome70.ts

Lines changed: 16 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -269,21 +269,33 @@ export class Chrome70 extends HandlerInterface
269269
}
270270

271271
async send(
272-
{ track, encodings, codecOptions }: HandlerSendOptions
272+
{ track, encodings, codecOptions, codec }: HandlerSendOptions
273273
): Promise<HandlerSendResult>
274274
{
275275
this._assertSendDirection();
276276

277277
logger.debug('send() [kind:%s, track.id:%s]', track.kind, track.id);
278278

279+
const sendingRtpParameters =
280+
utils.clone(this._sendingRtpParametersByKind[track.kind]);
281+
282+
// This may throw.
283+
sendingRtpParameters.codecs =
284+
ortc.reduceCodecs(sendingRtpParameters.codecs, codec);
285+
286+
const sendingRemoteRtpParameters =
287+
this._sendingRemoteRtpParametersByKind[track.kind];
288+
289+
// This may throw.
290+
sendingRemoteRtpParameters.codecs =
291+
ortc.reduceCodecs(sendingRemoteRtpParameters.codecs, codec);
292+
279293
const mediaSectionIdx = this._remoteSdp.getNextMediaSectionIdx();
280294
const transceiver = this._pc.addTransceiver(
281295
track, { direction: 'sendonly', streams: [ this._sendStream ] });
282296
let offer = await this._pc.createOffer();
283297
let localSdpObject = sdpTransform.parse(offer.sdp);
284298
let offerMediaObject;
285-
const sendingRtpParameters =
286-
utils.clone(this._sendingRtpParametersByKind[track.kind]);
287299

288300
if (!this._transportReady)
289301
await this._setupTransport({ localDtlsRole: 'server', localSdpObject });
@@ -392,7 +404,7 @@ export class Chrome70 extends HandlerInterface
392404
offerMediaObject,
393405
reuseMid : mediaSectionIdx.reuseMid,
394406
offerRtpParameters : sendingRtpParameters,
395-
answerRtpParameters : this._sendingRemoteRtpParametersByKind[track.kind],
407+
answerRtpParameters : sendingRemoteRtpParameters,
396408
codecOptions
397409
});
398410

src/handlers/Chrome74.ts

Lines changed: 16 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -273,7 +273,7 @@ export class Chrome74 extends HandlerInterface
273273
}
274274

275275
async send(
276-
{ track, encodings, codecOptions }: HandlerSendOptions
276+
{ track, encodings, codecOptions, codec }: HandlerSendOptions
277277
): Promise<HandlerSendResult>
278278
{
279279
this._assertSendDirection();
@@ -288,6 +288,20 @@ export class Chrome74 extends HandlerInterface
288288
});
289289
}
290290

291+
const sendingRtpParameters =
292+
utils.clone(this._sendingRtpParametersByKind[track.kind]);
293+
294+
// This may throw.
295+
sendingRtpParameters.codecs =
296+
ortc.reduceCodecs(sendingRtpParameters.codecs, codec);
297+
298+
const sendingRemoteRtpParameters =
299+
this._sendingRemoteRtpParametersByKind[track.kind];
300+
301+
// This may throw.
302+
sendingRemoteRtpParameters.codecs =
303+
ortc.reduceCodecs(sendingRemoteRtpParameters.codecs, codec);
304+
291305
const mediaSectionIdx = this._remoteSdp.getNextMediaSectionIdx();
292306
const transceiver = this._pc.addTransceiver(
293307
track,
@@ -299,8 +313,6 @@ export class Chrome74 extends HandlerInterface
299313
let offer = await this._pc.createOffer();
300314
let localSdpObject = sdpTransform.parse(offer.sdp);
301315
let offerMediaObject;
302-
const sendingRtpParameters =
303-
utils.clone(this._sendingRtpParametersByKind[track.kind]);
304316

305317
if (!this._transportReady)
306318
await this._setupTransport({ localDtlsRole: 'server', localSdpObject });
@@ -400,7 +412,7 @@ export class Chrome74 extends HandlerInterface
400412
offerMediaObject,
401413
reuseMid : mediaSectionIdx.reuseMid,
402414
offerRtpParameters : sendingRtpParameters,
403-
answerRtpParameters : this._sendingRemoteRtpParametersByKind[track.kind],
415+
answerRtpParameters : sendingRemoteRtpParameters,
404416
codecOptions,
405417
extmapAllowMixed : true
406418
});

src/handlers/Edge11.ts

Lines changed: 5 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -189,7 +189,7 @@ export class Edge11 extends HandlerInterface
189189

190190
async send(
191191
// eslint-disable-next-line @typescript-eslint/no-unused-vars
192-
{ track, encodings, codecOptions }: HandlerSendOptions
192+
{ track, encodings, codecOptions, codec }: HandlerSendOptions
193193
): Promise<HandlerSendResult>
194194
{
195195
logger.debug('send() [kind:%s, track.id:%s]', track.kind, track.id);
@@ -202,8 +202,11 @@ export class Edge11 extends HandlerInterface
202202
const rtpSender = new (RTCRtpSender as any)(track, this._dtlsTransport);
203203
const rtpParameters =
204204
utils.clone(this._sendingRtpParametersByKind[track.kind]);
205+
206+
rtpParameters.codecs = ortc.reduceCodecs(rtpParameters.codecs, codec);
207+
205208
const useRtx = rtpParameters.codecs
206-
.some((codec: any) => /.+\/rtx$/i.test(codec.mimeType));
209+
.some((_codec: any) => /.+\/rtx$/i.test(_codec.mimeType));
207210

208211
if (!encodings)
209212
encodings = [ {} ];

src/handlers/Firefox60.ts

Lines changed: 16 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -295,7 +295,7 @@ export class Firefox60 extends HandlerInterface
295295
}
296296

297297
async send(
298-
{ track, encodings, codecOptions }: HandlerSendOptions
298+
{ track, encodings, codecOptions, codec }: HandlerSendOptions
299299
): Promise<HandlerSendResult>
300300
{
301301
this._assertSendDirection();
@@ -316,6 +316,20 @@ export class Firefox60 extends HandlerInterface
316316
reverseEncodings = utils.clone(encodings).reverse();
317317
}
318318

319+
const sendingRtpParameters =
320+
utils.clone(this._sendingRtpParametersByKind[track.kind]);
321+
322+
// This may throw.
323+
sendingRtpParameters.codecs =
324+
ortc.reduceCodecs(sendingRtpParameters.codecs, codec);
325+
326+
const sendingRemoteRtpParameters =
327+
this._sendingRemoteRtpParametersByKind[track.kind];
328+
329+
// This may throw.
330+
sendingRemoteRtpParameters.codecs =
331+
ortc.reduceCodecs(sendingRemoteRtpParameters.codecs, codec);
332+
319333
// NOTE: Firefox fails sometimes to properly anticipate the closed media
320334
// section that it should use, so don't reuse closed media sections.
321335
// https://github.com/versatica/mediasoup-client/issues/104
@@ -336,8 +350,6 @@ export class Firefox60 extends HandlerInterface
336350

337351
const offer = await this._pc.createOffer();
338352
let localSdpObject = sdpTransform.parse(offer.sdp);
339-
const sendingRtpParameters =
340-
utils.clone(this._sendingRtpParametersByKind[track.kind]);
341353

342354
// In Firefox use DTLS role client even if we are the "offerer" since
343355
// Firefox does not respect ICE-Lite.
@@ -407,7 +419,7 @@ export class Firefox60 extends HandlerInterface
407419
{
408420
offerMediaObject,
409421
offerRtpParameters : sendingRtpParameters,
410-
answerRtpParameters : this._sendingRemoteRtpParametersByKind[track.kind],
422+
answerRtpParameters : sendingRemoteRtpParameters,
411423
codecOptions,
412424
extmapAllowMixed : true
413425
});

src/handlers/HandlerInterface.ts

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,7 @@ import {
77
} from '../Transport';
88
import {
99
RtpCapabilities,
10+
RtpCodecCapability,
1011
RtpParameters,
1112
RtpEncodingParameters
1213
} from '../RtpParameters';
@@ -37,6 +38,7 @@ export type HandlerSendOptions =
3738
track: MediaStreamTrack;
3839
encodings?: RtpEncodingParameters[];
3940
codecOptions?: ProducerCodecOptions;
41+
codec?: RtpCodecCapability;
4042
};
4143

4244
export type HandlerSendResult =

src/handlers/ReactNative.ts

Lines changed: 18 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -282,13 +282,20 @@ export class ReactNative extends HandlerInterface
282282
}
283283

284284
async send(
285-
{ track, encodings, codecOptions }: HandlerSendOptions
285+
{ track, encodings, codecOptions, codec }: HandlerSendOptions
286286
): Promise<HandlerSendResult>
287287
{
288288
this._assertSendDirection();
289289

290290
logger.debug('send() [kind:%s, track.id:%s]', track.kind, track.id);
291291

292+
if (codec)
293+
{
294+
logger.warn(
295+
'send() | codec selection is not available in %s handler',
296+
this.name);
297+
}
298+
292299
this._sendStream.addTrack(track);
293300
this._pc.addStream(this._sendStream);
294301

@@ -298,6 +305,15 @@ export class ReactNative extends HandlerInterface
298305
const sendingRtpParameters =
299306
utils.clone(this._sendingRtpParametersByKind[track.kind]);
300307

308+
sendingRtpParameters.codecs =
309+
ortc.reduceCodecs(sendingRtpParameters.codecs);
310+
311+
const sendingRemoteRtpParameters =
312+
this._sendingRemoteRtpParametersByKind[track.kind];
313+
314+
sendingRemoteRtpParameters.codecs =
315+
ortc.reduceCodecs(sendingRemoteRtpParameters.codecs);
316+
301317
if (!this._transportReady)
302318
await this._setupTransport({ localDtlsRole: 'server', localSdpObject });
303319

@@ -367,7 +383,7 @@ export class ReactNative extends HandlerInterface
367383
{
368384
offerMediaObject,
369385
offerRtpParameters : sendingRtpParameters,
370-
answerRtpParameters : this._sendingRemoteRtpParametersByKind[track.kind],
386+
answerRtpParameters : sendingRemoteRtpParameters,
371387
codecOptions
372388
});
373389

0 commit comments

Comments
 (0)