mediasoup-client 3.6.44 → 3.6.48
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/DataConsumer.d.ts +2 -2
- package/lib/DataConsumer.d.ts.map +1 -1
- package/lib/Device.d.ts.map +1 -1
- package/lib/Device.js +7 -3
- package/lib/Logger.js +6 -6
- package/lib/Transport.d.ts +3 -0
- package/lib/Transport.d.ts.map +1 -1
- package/lib/Transport.js +111 -40
- package/lib/handlers/Chrome55.d.ts +1 -1
- package/lib/handlers/Chrome55.d.ts.map +1 -1
- package/lib/handlers/Chrome55.js +53 -32
- package/lib/handlers/Chrome67.d.ts +1 -1
- package/lib/handlers/Chrome67.d.ts.map +1 -1
- package/lib/handlers/Chrome67.js +57 -35
- package/lib/handlers/Chrome70.d.ts +1 -1
- package/lib/handlers/Chrome70.d.ts.map +1 -1
- package/lib/handlers/Chrome70.js +55 -35
- package/lib/handlers/Chrome74.d.ts +1 -1
- package/lib/handlers/Chrome74.d.ts.map +1 -1
- package/lib/handlers/Chrome74.js +58 -35
- package/lib/handlers/Edge11.d.ts +1 -1
- package/lib/handlers/Edge11.d.ts.map +1 -1
- package/lib/handlers/Edge11.js +31 -22
- package/lib/handlers/FakeHandler.d.ts +1 -1
- package/lib/handlers/FakeHandler.d.ts.map +1 -1
- package/lib/handlers/FakeHandler.js +14 -11
- package/lib/handlers/Firefox60.d.ts +1 -1
- package/lib/handlers/Firefox60.d.ts.map +1 -1
- package/lib/handlers/Firefox60.js +54 -33
- package/lib/handlers/HandlerInterface.d.ts +1 -1
- package/lib/handlers/HandlerInterface.d.ts.map +1 -1
- package/lib/handlers/ReactNative.d.ts +1 -1
- package/lib/handlers/ReactNative.d.ts.map +1 -1
- package/lib/handlers/ReactNative.js +59 -38
- package/lib/handlers/Safari11.d.ts +1 -1
- package/lib/handlers/Safari11.d.ts.map +1 -1
- package/lib/handlers/Safari11.js +54 -35
- package/lib/handlers/Safari12.d.ts +1 -1
- package/lib/handlers/Safari12.d.ts.map +1 -1
- package/lib/handlers/Safari12.js +53 -34
- package/lib/handlers/ortc/edgeUtils.js +1 -1
- package/lib/handlers/sdp/MediaSection.js +1 -1
- package/lib/handlers/sdp/RemoteSdp.js +1 -1
- package/lib/handlers/sdp/commonUtils.js +1 -1
- package/lib/index.d.ts +1 -1
- package/lib/index.js +3 -3
- package/lib/ortc.js +5 -7
- package/lib/types.js +1 -1
- package/package.json +11 -11
- package/src/DataConsumer.ts +2 -2
- package/src/Device.ts +7 -2
- package/src/Transport.ts +162 -58
- package/src/handlers/Chrome55.ts +55 -34
- package/src/handlers/Chrome67.ts +57 -36
- package/src/handlers/Chrome70.ts +54 -34
- package/src/handlers/Chrome74.ts +58 -34
- package/src/handlers/Edge11.ts +42 -26
- package/src/handlers/FakeHandler.ts +18 -10
- package/src/handlers/Firefox60.ts +54 -33
- package/src/handlers/HandlerInterface.ts +2 -2
- package/src/handlers/ReactNative.ts +62 -41
- package/src/handlers/Safari11.ts +57 -36
- package/src/handlers/Safari12.ts +54 -34
- package/src/ortc.ts +6 -8
- package/tsconfig.json +1 -1
|
@@ -324,21 +324,29 @@ export class FakeHandler extends HandlerInterface
|
|
|
324
324
|
}
|
|
325
325
|
|
|
326
326
|
async receive(
|
|
327
|
-
|
|
328
|
-
|
|
329
|
-
): Promise<HandlerReceiveResult>
|
|
327
|
+
optionsList: HandlerReceiveOptions[]
|
|
328
|
+
) : Promise<HandlerReceiveResult[]>
|
|
330
329
|
{
|
|
331
|
-
|
|
332
|
-
await this._setupTransport({ localDtlsRole: 'client' });
|
|
330
|
+
const results: HandlerReceiveResult[] = [];
|
|
333
331
|
|
|
334
|
-
|
|
332
|
+
for (const options of optionsList)
|
|
333
|
+
{
|
|
334
|
+
const { trackId, kind } = options;
|
|
335
335
|
|
|
336
|
-
|
|
337
|
-
|
|
336
|
+
if (!this._transportReady)
|
|
337
|
+
await this._setupTransport({ localDtlsRole: 'client' });
|
|
338
338
|
|
|
339
|
-
|
|
339
|
+
logger.debug('receive() [trackId:%s, kind:%s]', trackId, kind);
|
|
340
|
+
|
|
341
|
+
const localId = this._nextLocalId++;
|
|
342
|
+
const track = new FakeMediaStreamTrack({ kind });
|
|
343
|
+
|
|
344
|
+
this._tracks.set(localId, track);
|
|
345
|
+
|
|
346
|
+
results.push({ localId: String(localId), track });
|
|
347
|
+
}
|
|
340
348
|
|
|
341
|
-
return
|
|
349
|
+
return results;
|
|
342
350
|
}
|
|
343
351
|
|
|
344
352
|
async stopReceiving(localId: string): Promise<void>
|
|
@@ -643,23 +643,31 @@ export class Firefox60 extends HandlerInterface
|
|
|
643
643
|
}
|
|
644
644
|
|
|
645
645
|
async receive(
|
|
646
|
-
|
|
647
|
-
|
|
646
|
+
// eslint-disable-next-line @typescript-eslint/no-unused-vars
|
|
647
|
+
optionsList: HandlerReceiveOptions[]
|
|
648
|
+
) : Promise<HandlerReceiveResult[]>
|
|
648
649
|
{
|
|
649
650
|
this._assertRecvDirection();
|
|
650
651
|
|
|
651
|
-
|
|
652
|
+
const results: HandlerReceiveResult[] = [];
|
|
652
653
|
|
|
653
|
-
const
|
|
654
|
+
for (const options of optionsList)
|
|
655
|
+
{
|
|
656
|
+
const { trackId, kind, rtpParameters } = options;
|
|
654
657
|
|
|
655
|
-
|
|
656
|
-
|
|
657
|
-
|
|
658
|
-
|
|
659
|
-
|
|
660
|
-
|
|
661
|
-
|
|
662
|
-
|
|
658
|
+
logger.debug('receive() [trackId:%s, kind:%s]', trackId, kind);
|
|
659
|
+
|
|
660
|
+
const localId = rtpParameters.mid || String(this._mapMidTransceiver.size);
|
|
661
|
+
|
|
662
|
+
this._remoteSdp!.receive(
|
|
663
|
+
{
|
|
664
|
+
mid : localId,
|
|
665
|
+
kind,
|
|
666
|
+
offerRtpParameters : rtpParameters,
|
|
667
|
+
streamId : rtpParameters.rtcp!.cname!,
|
|
668
|
+
trackId
|
|
669
|
+
});
|
|
670
|
+
}
|
|
663
671
|
|
|
664
672
|
const offer = { type: 'offer', sdp: this._remoteSdp!.getSdp() };
|
|
665
673
|
|
|
@@ -671,18 +679,24 @@ export class Firefox60 extends HandlerInterface
|
|
|
671
679
|
|
|
672
680
|
let answer = await this._pc.createAnswer();
|
|
673
681
|
const localSdpObject = sdpTransform.parse(answer.sdp);
|
|
674
|
-
const answerMediaObject = localSdpObject.media
|
|
675
|
-
.find((m: any) => String(m.mid) === localId);
|
|
676
682
|
|
|
677
|
-
|
|
678
|
-
|
|
679
|
-
|
|
680
|
-
|
|
681
|
-
|
|
682
|
-
|
|
683
|
-
|
|
683
|
+
for (const options of optionsList)
|
|
684
|
+
{
|
|
685
|
+
const { rtpParameters } = options;
|
|
686
|
+
const localId = rtpParameters.mid || String(this._mapMidTransceiver.size);
|
|
687
|
+
const answerMediaObject = localSdpObject.media
|
|
688
|
+
.find((m: any) => String(m.mid) === localId);
|
|
689
|
+
|
|
690
|
+
// May need to modify codec parameters in the answer based on codec
|
|
691
|
+
// parameters in the offer.
|
|
692
|
+
sdpCommonUtils.applyCodecParameters(
|
|
693
|
+
{
|
|
694
|
+
offerRtpParameters : rtpParameters,
|
|
695
|
+
answerMediaObject
|
|
696
|
+
});
|
|
684
697
|
|
|
685
|
-
|
|
698
|
+
answer = { type: 'answer', sdp: sdpTransform.write(localSdpObject) };
|
|
699
|
+
}
|
|
686
700
|
|
|
687
701
|
if (!this._transportReady)
|
|
688
702
|
await this._setupTransport({ localDtlsRole: 'client', localSdpObject });
|
|
@@ -693,20 +707,27 @@ export class Firefox60 extends HandlerInterface
|
|
|
693
707
|
|
|
694
708
|
await this._pc.setLocalDescription(answer);
|
|
695
709
|
|
|
696
|
-
const
|
|
697
|
-
|
|
710
|
+
for (const options of optionsList)
|
|
711
|
+
{
|
|
712
|
+
const { rtpParameters } = options;
|
|
713
|
+
const localId = rtpParameters.mid || String(this._mapMidTransceiver.size);
|
|
714
|
+
const transceiver = this._pc.getTransceivers()
|
|
715
|
+
.find((t: RTCRtpTransceiver) => t.mid === localId);
|
|
698
716
|
|
|
699
|
-
|
|
700
|
-
|
|
717
|
+
if (!transceiver)
|
|
718
|
+
throw new Error('new RTCRtpTransceiver not found');
|
|
701
719
|
|
|
702
|
-
|
|
703
|
-
|
|
720
|
+
// Store in the map.
|
|
721
|
+
this._mapMidTransceiver.set(localId, transceiver);
|
|
704
722
|
|
|
705
|
-
|
|
706
|
-
|
|
707
|
-
|
|
708
|
-
|
|
709
|
-
|
|
723
|
+
results.push({
|
|
724
|
+
localId,
|
|
725
|
+
track : transceiver.receiver.track,
|
|
726
|
+
rtpReceiver : transceiver.receiver
|
|
727
|
+
});
|
|
728
|
+
}
|
|
729
|
+
|
|
730
|
+
return results;
|
|
710
731
|
}
|
|
711
732
|
|
|
712
733
|
async stopReceiving(localId: string): Promise<void>
|
|
@@ -136,8 +136,8 @@ export abstract class HandlerInterface extends EnhancedEventEmitter
|
|
|
136
136
|
): Promise<HandlerSendDataChannelResult>;
|
|
137
137
|
|
|
138
138
|
abstract receive(
|
|
139
|
-
|
|
140
|
-
): Promise<HandlerReceiveResult
|
|
139
|
+
optionsList: HandlerReceiveOptions[]
|
|
140
|
+
) : Promise<HandlerReceiveResult[]>
|
|
141
141
|
|
|
142
142
|
abstract stopReceiving(localId: string): Promise<void>;
|
|
143
143
|
|
|
@@ -333,7 +333,7 @@ export class ReactNative extends HandlerInterface
|
|
|
333
333
|
{
|
|
334
334
|
await this._setupTransport(
|
|
335
335
|
{
|
|
336
|
-
localDtlsRole : this._forcedLocalDtlsRole ?? '
|
|
336
|
+
localDtlsRole : this._forcedLocalDtlsRole ?? 'client',
|
|
337
337
|
localSdpObject
|
|
338
338
|
});
|
|
339
339
|
}
|
|
@@ -462,7 +462,7 @@ export class ReactNative extends HandlerInterface
|
|
|
462
462
|
{
|
|
463
463
|
logger.warn(
|
|
464
464
|
'stopSending() | ignoring expected error due no sending tracks: %s',
|
|
465
|
-
error.toString());
|
|
465
|
+
(error as Error).toString());
|
|
466
466
|
|
|
467
467
|
return;
|
|
468
468
|
}
|
|
@@ -552,7 +552,7 @@ export class ReactNative extends HandlerInterface
|
|
|
552
552
|
{
|
|
553
553
|
await this._setupTransport(
|
|
554
554
|
{
|
|
555
|
-
localDtlsRole : this._forcedLocalDtlsRole ?? '
|
|
555
|
+
localDtlsRole : this._forcedLocalDtlsRole ?? 'client',
|
|
556
556
|
localSdpObject
|
|
557
557
|
});
|
|
558
558
|
}
|
|
@@ -588,34 +588,40 @@ export class ReactNative extends HandlerInterface
|
|
|
588
588
|
}
|
|
589
589
|
|
|
590
590
|
async receive(
|
|
591
|
-
|
|
592
|
-
): Promise<HandlerReceiveResult>
|
|
591
|
+
optionsList: HandlerReceiveOptions[]
|
|
592
|
+
) : Promise<HandlerReceiveResult[]>
|
|
593
593
|
{
|
|
594
594
|
this._assertRecvDirection();
|
|
595
595
|
|
|
596
|
-
|
|
596
|
+
const results: HandlerReceiveResult[] = [];
|
|
597
597
|
|
|
598
|
-
const
|
|
599
|
-
|
|
600
|
-
|
|
598
|
+
for (const options of optionsList)
|
|
599
|
+
{
|
|
600
|
+
const { trackId, kind, rtpParameters } = options;
|
|
601
601
|
|
|
602
|
-
|
|
603
|
-
// remote tracks. This is because react-native-webrtc does not react on new
|
|
604
|
-
// tracks generated within already existing streams, so force the streamId
|
|
605
|
-
// to be different.
|
|
606
|
-
logger.debug(
|
|
607
|
-
'receive() | forcing a random remote streamId to avoid well known bug in react-native-webrtc');
|
|
602
|
+
logger.debug('receive() [trackId:%s, kind:%s]', trackId, kind);
|
|
608
603
|
|
|
609
|
-
|
|
604
|
+
const mid = kind;
|
|
605
|
+
let streamId = rtpParameters.rtcp!.cname!;
|
|
610
606
|
|
|
611
|
-
|
|
612
|
-
|
|
613
|
-
|
|
614
|
-
|
|
615
|
-
|
|
616
|
-
streamId
|
|
617
|
-
|
|
618
|
-
}
|
|
607
|
+
// NOTE: In React-Native we cannot reuse the same remote MediaStream for new
|
|
608
|
+
// remote tracks. This is because react-native-webrtc does not react on new
|
|
609
|
+
// tracks generated within already existing streams, so force the streamId
|
|
610
|
+
// to be different.
|
|
611
|
+
logger.debug(
|
|
612
|
+
'receive() | forcing a random remote streamId to avoid well known bug in react-native-webrtc');
|
|
613
|
+
|
|
614
|
+
streamId += `-hack-${utils.generateRandomNumber()}`;
|
|
615
|
+
|
|
616
|
+
this._remoteSdp!.receive(
|
|
617
|
+
{
|
|
618
|
+
mid,
|
|
619
|
+
kind,
|
|
620
|
+
offerRtpParameters : rtpParameters,
|
|
621
|
+
streamId,
|
|
622
|
+
trackId
|
|
623
|
+
});
|
|
624
|
+
}
|
|
619
625
|
|
|
620
626
|
const offer = { type: 'offer', sdp: this._remoteSdp!.getSdp() };
|
|
621
627
|
|
|
@@ -627,16 +633,22 @@ export class ReactNative extends HandlerInterface
|
|
|
627
633
|
|
|
628
634
|
let answer = await this._pc.createAnswer();
|
|
629
635
|
const localSdpObject = sdpTransform.parse(answer.sdp);
|
|
630
|
-
const answerMediaObject = localSdpObject.media
|
|
631
|
-
.find((m: any) => String(m.mid) === mid);
|
|
632
636
|
|
|
633
|
-
|
|
634
|
-
|
|
635
|
-
|
|
636
|
-
|
|
637
|
-
|
|
638
|
-
|
|
639
|
-
|
|
637
|
+
for (const options of optionsList)
|
|
638
|
+
{
|
|
639
|
+
const { kind, rtpParameters } = options;
|
|
640
|
+
const mid = kind;
|
|
641
|
+
const answerMediaObject = localSdpObject.media
|
|
642
|
+
.find((m: any) => String(m.mid) === mid);
|
|
643
|
+
|
|
644
|
+
// May need to modify codec parameters in the answer based on codec
|
|
645
|
+
// parameters in the offer.
|
|
646
|
+
sdpCommonUtils.applyCodecParameters(
|
|
647
|
+
{
|
|
648
|
+
offerRtpParameters : rtpParameters,
|
|
649
|
+
answerMediaObject
|
|
650
|
+
});
|
|
651
|
+
}
|
|
640
652
|
|
|
641
653
|
answer = { type: 'answer', sdp: sdpTransform.write(localSdpObject) };
|
|
642
654
|
|
|
@@ -655,17 +667,26 @@ export class ReactNative extends HandlerInterface
|
|
|
655
667
|
|
|
656
668
|
await this._pc.setLocalDescription(answer);
|
|
657
669
|
|
|
658
|
-
const
|
|
659
|
-
|
|
660
|
-
|
|
670
|
+
for (const options of optionsList)
|
|
671
|
+
{
|
|
672
|
+
const { kind, trackId, rtpParameters } = options;
|
|
673
|
+
const localId = trackId;
|
|
674
|
+
const mid = kind;
|
|
675
|
+
const streamId = rtpParameters.rtcp!.cname!;
|
|
676
|
+
const stream = this._pc.getRemoteStreams()
|
|
677
|
+
.find((s: MediaStream) => s.id === streamId);
|
|
678
|
+
const track = stream.getTrackById(localId);
|
|
661
679
|
|
|
662
|
-
|
|
663
|
-
|
|
680
|
+
if (!track)
|
|
681
|
+
throw new Error('remote track not found');
|
|
664
682
|
|
|
665
|
-
|
|
666
|
-
|
|
683
|
+
// Insert into the map.
|
|
684
|
+
this._mapRecvLocalIdInfo.set(localId, { mid, rtpParameters });
|
|
685
|
+
|
|
686
|
+
results.push({ localId, track });
|
|
687
|
+
}
|
|
667
688
|
|
|
668
|
-
return
|
|
689
|
+
return results;
|
|
669
690
|
}
|
|
670
691
|
|
|
671
692
|
async stopReceiving(localId: string): Promise<void>
|
package/src/handlers/Safari11.ts
CHANGED
|
@@ -328,7 +328,7 @@ export class Safari11 extends HandlerInterface
|
|
|
328
328
|
{
|
|
329
329
|
await this._setupTransport(
|
|
330
330
|
{
|
|
331
|
-
localDtlsRole : this._forcedLocalDtlsRole ?? '
|
|
331
|
+
localDtlsRole : this._forcedLocalDtlsRole ?? 'client',
|
|
332
332
|
localSdpObject
|
|
333
333
|
});
|
|
334
334
|
}
|
|
@@ -457,7 +457,7 @@ export class Safari11 extends HandlerInterface
|
|
|
457
457
|
{
|
|
458
458
|
logger.warn(
|
|
459
459
|
'stopSending() | ignoring expected error due no sending tracks: %s',
|
|
460
|
-
error.toString());
|
|
460
|
+
(error as Error).toString());
|
|
461
461
|
|
|
462
462
|
return;
|
|
463
463
|
}
|
|
@@ -615,7 +615,7 @@ export class Safari11 extends HandlerInterface
|
|
|
615
615
|
{
|
|
616
616
|
await this._setupTransport(
|
|
617
617
|
{
|
|
618
|
-
localDtlsRole : this._forcedLocalDtlsRole ?? '
|
|
618
|
+
localDtlsRole : this._forcedLocalDtlsRole ?? 'client',
|
|
619
619
|
localSdpObject
|
|
620
620
|
});
|
|
621
621
|
}
|
|
@@ -651,24 +651,30 @@ export class Safari11 extends HandlerInterface
|
|
|
651
651
|
}
|
|
652
652
|
|
|
653
653
|
async receive(
|
|
654
|
-
|
|
655
|
-
): Promise<HandlerReceiveResult>
|
|
654
|
+
optionsList: HandlerReceiveOptions[]
|
|
655
|
+
) : Promise<HandlerReceiveResult[]>
|
|
656
656
|
{
|
|
657
657
|
this._assertRecvDirection();
|
|
658
658
|
|
|
659
|
-
|
|
659
|
+
const results: HandlerReceiveResult[] = [];
|
|
660
660
|
|
|
661
|
-
const
|
|
662
|
-
|
|
661
|
+
for (const options of optionsList)
|
|
662
|
+
{
|
|
663
|
+
const { trackId, kind, rtpParameters } = options;
|
|
663
664
|
|
|
664
|
-
|
|
665
|
-
|
|
666
|
-
|
|
667
|
-
|
|
668
|
-
|
|
669
|
-
|
|
670
|
-
|
|
671
|
-
|
|
665
|
+
logger.debug('receive() [trackId:%s, kind:%s]', trackId, kind);
|
|
666
|
+
|
|
667
|
+
const mid = kind;
|
|
668
|
+
|
|
669
|
+
this._remoteSdp!.receive(
|
|
670
|
+
{
|
|
671
|
+
mid,
|
|
672
|
+
kind,
|
|
673
|
+
offerRtpParameters : rtpParameters,
|
|
674
|
+
streamId : rtpParameters.rtcp!.cname!,
|
|
675
|
+
trackId
|
|
676
|
+
});
|
|
677
|
+
}
|
|
672
678
|
|
|
673
679
|
const offer = { type: 'offer', sdp: this._remoteSdp!.getSdp() };
|
|
674
680
|
|
|
@@ -680,16 +686,22 @@ export class Safari11 extends HandlerInterface
|
|
|
680
686
|
|
|
681
687
|
let answer = await this._pc.createAnswer();
|
|
682
688
|
const localSdpObject = sdpTransform.parse(answer.sdp);
|
|
683
|
-
const answerMediaObject = localSdpObject.media
|
|
684
|
-
.find((m: any) => String(m.mid) === mid);
|
|
685
689
|
|
|
686
|
-
|
|
687
|
-
|
|
688
|
-
|
|
689
|
-
|
|
690
|
-
|
|
691
|
-
|
|
692
|
-
|
|
690
|
+
for (const options of optionsList)
|
|
691
|
+
{
|
|
692
|
+
const { kind, rtpParameters } = options;
|
|
693
|
+
const mid = kind;
|
|
694
|
+
const answerMediaObject = localSdpObject.media
|
|
695
|
+
.find((m: any) => String(m.mid) === mid);
|
|
696
|
+
|
|
697
|
+
// May need to modify codec parameters in the answer based on codec
|
|
698
|
+
// parameters in the offer.
|
|
699
|
+
sdpCommonUtils.applyCodecParameters(
|
|
700
|
+
{
|
|
701
|
+
offerRtpParameters : rtpParameters,
|
|
702
|
+
answerMediaObject
|
|
703
|
+
});
|
|
704
|
+
}
|
|
693
705
|
|
|
694
706
|
answer = { type: 'answer', sdp: sdpTransform.write(localSdpObject) };
|
|
695
707
|
|
|
@@ -708,20 +720,29 @@ export class Safari11 extends HandlerInterface
|
|
|
708
720
|
|
|
709
721
|
await this._pc.setLocalDescription(answer);
|
|
710
722
|
|
|
711
|
-
const
|
|
712
|
-
|
|
723
|
+
for (const options of optionsList)
|
|
724
|
+
{
|
|
725
|
+
const { kind, trackId, rtpParameters } = options;
|
|
726
|
+
const mid = kind;
|
|
727
|
+
const localId = trackId;
|
|
713
728
|
|
|
714
|
-
|
|
715
|
-
|
|
729
|
+
const rtpReceiver = this._pc.getReceivers()
|
|
730
|
+
.find((r: RTCRtpReceiver) => r.track && r.track.id === localId);
|
|
716
731
|
|
|
717
|
-
|
|
718
|
-
|
|
732
|
+
if (!rtpReceiver)
|
|
733
|
+
throw new Error('new RTCRtpReceiver not');
|
|
719
734
|
|
|
720
|
-
|
|
721
|
-
localId,
|
|
722
|
-
|
|
723
|
-
|
|
724
|
-
|
|
735
|
+
// Insert into the map.
|
|
736
|
+
this._mapRecvLocalIdInfo.set(localId, { mid, rtpParameters, rtpReceiver });
|
|
737
|
+
|
|
738
|
+
results.push({
|
|
739
|
+
localId,
|
|
740
|
+
track : rtpReceiver.track,
|
|
741
|
+
rtpReceiver
|
|
742
|
+
});
|
|
743
|
+
}
|
|
744
|
+
|
|
745
|
+
return results;
|
|
725
746
|
}
|
|
726
747
|
|
|
727
748
|
async stopReceiving(localId: string): Promise<void>
|
package/src/handlers/Safari12.ts
CHANGED
|
@@ -308,7 +308,7 @@ export class Safari12 extends HandlerInterface
|
|
|
308
308
|
{
|
|
309
309
|
await this._setupTransport(
|
|
310
310
|
{
|
|
311
|
-
localDtlsRole : this._forcedLocalDtlsRole ?? '
|
|
311
|
+
localDtlsRole : this._forcedLocalDtlsRole ?? 'client',
|
|
312
312
|
localSdpObject
|
|
313
313
|
});
|
|
314
314
|
}
|
|
@@ -567,7 +567,7 @@ export class Safari12 extends HandlerInterface
|
|
|
567
567
|
{
|
|
568
568
|
await this._setupTransport(
|
|
569
569
|
{
|
|
570
|
-
localDtlsRole : this._forcedLocalDtlsRole ?? '
|
|
570
|
+
localDtlsRole : this._forcedLocalDtlsRole ?? 'client',
|
|
571
571
|
localSdpObject
|
|
572
572
|
});
|
|
573
573
|
}
|
|
@@ -603,23 +603,30 @@ export class Safari12 extends HandlerInterface
|
|
|
603
603
|
}
|
|
604
604
|
|
|
605
605
|
async receive(
|
|
606
|
-
|
|
607
|
-
): Promise<HandlerReceiveResult>
|
|
606
|
+
optionsList: HandlerReceiveOptions[]
|
|
607
|
+
) : Promise<HandlerReceiveResult[]>
|
|
608
608
|
{
|
|
609
609
|
this._assertRecvDirection();
|
|
610
610
|
|
|
611
|
-
|
|
611
|
+
const results: HandlerReceiveResult[] = [];
|
|
612
612
|
|
|
613
|
-
const
|
|
613
|
+
for (const options of optionsList)
|
|
614
|
+
{
|
|
615
|
+
const { trackId, kind, rtpParameters } = options;
|
|
614
616
|
|
|
615
|
-
|
|
616
|
-
|
|
617
|
-
|
|
618
|
-
|
|
619
|
-
|
|
620
|
-
|
|
621
|
-
|
|
622
|
-
|
|
617
|
+
logger.debug('receive() [trackId:%s, kind:%s]', trackId, kind);
|
|
618
|
+
|
|
619
|
+
const localId = rtpParameters.mid || String(this._mapMidTransceiver.size);
|
|
620
|
+
|
|
621
|
+
this._remoteSdp!.receive(
|
|
622
|
+
{
|
|
623
|
+
mid : localId,
|
|
624
|
+
kind,
|
|
625
|
+
offerRtpParameters : rtpParameters,
|
|
626
|
+
streamId : rtpParameters.rtcp!.cname!,
|
|
627
|
+
trackId
|
|
628
|
+
});
|
|
629
|
+
}
|
|
623
630
|
|
|
624
631
|
const offer = { type: 'offer', sdp: this._remoteSdp!.getSdp() };
|
|
625
632
|
|
|
@@ -631,16 +638,22 @@ export class Safari12 extends HandlerInterface
|
|
|
631
638
|
|
|
632
639
|
let answer = await this._pc.createAnswer();
|
|
633
640
|
const localSdpObject = sdpTransform.parse(answer.sdp);
|
|
634
|
-
const answerMediaObject = localSdpObject.media
|
|
635
|
-
.find((m: any) => String(m.mid) === localId);
|
|
636
641
|
|
|
637
|
-
|
|
638
|
-
|
|
639
|
-
|
|
640
|
-
|
|
641
|
-
|
|
642
|
-
|
|
643
|
-
|
|
642
|
+
for (const options of optionsList)
|
|
643
|
+
{
|
|
644
|
+
const { rtpParameters } = options;
|
|
645
|
+
const localId = rtpParameters.mid || String(this._mapMidTransceiver.size);
|
|
646
|
+
const answerMediaObject = localSdpObject.media
|
|
647
|
+
.find((m: any) => String(m.mid) === localId);
|
|
648
|
+
|
|
649
|
+
// May need to modify codec parameters in the answer based on codec
|
|
650
|
+
// parameters in the offer.
|
|
651
|
+
sdpCommonUtils.applyCodecParameters(
|
|
652
|
+
{
|
|
653
|
+
offerRtpParameters : rtpParameters,
|
|
654
|
+
answerMediaObject
|
|
655
|
+
});
|
|
656
|
+
}
|
|
644
657
|
|
|
645
658
|
answer = { type: 'answer', sdp: sdpTransform.write(localSdpObject) };
|
|
646
659
|
|
|
@@ -659,20 +672,27 @@ export class Safari12 extends HandlerInterface
|
|
|
659
672
|
|
|
660
673
|
await this._pc.setLocalDescription(answer);
|
|
661
674
|
|
|
662
|
-
const
|
|
663
|
-
|
|
675
|
+
for (const options of optionsList)
|
|
676
|
+
{
|
|
677
|
+
const { rtpParameters } = options;
|
|
678
|
+
const localId = rtpParameters.mid || String(this._mapMidTransceiver.size);
|
|
679
|
+
const transceiver = this._pc.getTransceivers()
|
|
680
|
+
.find((t: RTCRtpTransceiver) => t.mid === localId);
|
|
664
681
|
|
|
665
|
-
|
|
666
|
-
|
|
682
|
+
if (!transceiver)
|
|
683
|
+
throw new Error('new RTCRtpTransceiver not found');
|
|
667
684
|
|
|
668
|
-
|
|
669
|
-
|
|
685
|
+
// Store in the map.
|
|
686
|
+
this._mapMidTransceiver.set(localId, transceiver);
|
|
670
687
|
|
|
671
|
-
|
|
672
|
-
|
|
673
|
-
|
|
674
|
-
|
|
675
|
-
|
|
688
|
+
results.push({
|
|
689
|
+
localId,
|
|
690
|
+
track : transceiver.receiver.track,
|
|
691
|
+
rtpReceiver : transceiver.receiver
|
|
692
|
+
});
|
|
693
|
+
}
|
|
694
|
+
|
|
695
|
+
return results;
|
|
676
696
|
}
|
|
677
697
|
|
|
678
698
|
async stopReceiving(localId: string): Promise<void>
|
package/src/ortc.ts
CHANGED
|
@@ -1073,15 +1073,14 @@ function matchCodecs(
|
|
|
1073
1073
|
{
|
|
1074
1074
|
case 'video/h264':
|
|
1075
1075
|
{
|
|
1076
|
-
const aPacketizationMode = aCodec.parameters['packetization-mode'] || 0;
|
|
1077
|
-
const bPacketizationMode = bCodec.parameters['packetization-mode'] || 0;
|
|
1078
|
-
|
|
1079
|
-
if (aPacketizationMode !== bPacketizationMode)
|
|
1080
|
-
return false;
|
|
1081
|
-
|
|
1082
|
-
// If strict matching check profile-level-id.
|
|
1083
1076
|
if (strict)
|
|
1084
1077
|
{
|
|
1078
|
+
const aPacketizationMode = aCodec.parameters['packetization-mode'] || 0;
|
|
1079
|
+
const bPacketizationMode = bCodec.parameters['packetization-mode'] || 0;
|
|
1080
|
+
|
|
1081
|
+
if (aPacketizationMode !== bPacketizationMode)
|
|
1082
|
+
return false;
|
|
1083
|
+
|
|
1085
1084
|
if (!h264.isSameProfile(aCodec.parameters, bCodec.parameters))
|
|
1086
1085
|
return false;
|
|
1087
1086
|
|
|
@@ -1117,7 +1116,6 @@ function matchCodecs(
|
|
|
1117
1116
|
|
|
1118
1117
|
case 'video/vp9':
|
|
1119
1118
|
{
|
|
1120
|
-
// If strict matching check profile-id.
|
|
1121
1119
|
if (strict)
|
|
1122
1120
|
{
|
|
1123
1121
|
const aProfileId = aCodec.parameters['profile-id'] || 0;
|