Skip to content
This repository was archived by the owner on Oct 25, 2024. It is now read-only.

Commit 43b45d5

Browse files
starwarfanjianjunz
authored andcommitted
Add legacy simulcast for Safari (#290)
* Add legacy simulcast for safari * Remove unused variable
1 parent b5245fe commit 43b45d5

File tree

2 files changed

+89
-0
lines changed

2 files changed

+89
-0
lines changed

src/sdk/base/sdputils.js

Lines changed: 82 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -603,6 +603,88 @@ export function reorderCodecs(sdp, type, codecs) {
603603
return sdp;
604604
}
605605

606+
// Add legacy simulcast.
607+
export function addLegacySimulcast(sdp, type, numStreams) {
608+
if (!numStreams || !(numStreams > 1)) {
609+
return sdp;
610+
}
611+
612+
let sdpLines = sdp.split('\r\n');
613+
// Search for m line.
614+
const mLineStart = findLine(sdpLines, 'm=', type);
615+
if (mLineStart === null) {
616+
return sdp;
617+
}
618+
let mLineEnd = findLineInRange(sdpLines, mLineStart + 1, -1, 'm=');
619+
if (mLineEnd === null) {
620+
mLineEnd = sdpLines.length;
621+
}
622+
623+
const ssrcGetter = (line) => {
624+
const parts = line.split(' ');
625+
const ssrc = parts[0].split(':')[1];
626+
return ssrc;
627+
};
628+
629+
// Process ssrc lines from mLineIndex.
630+
const removes = new Set();
631+
const ssrcs = new Set();
632+
const gssrcs = new Set();
633+
const simLines = [];
634+
const simGroupLines = [];
635+
let i = mLineStart + 1;
636+
while (i < mLineEnd) {
637+
const line = sdpLines[i];
638+
if (line === '') {
639+
break;
640+
}
641+
if (line.indexOf('a=ssrc:') > -1) {
642+
const ssrc = ssrcGetter(sdpLines[i]);
643+
ssrcs.add(ssrc);
644+
if (line.indexOf('cname') > -1 || line.indexOf('msid') > -1) {
645+
for (let j = 1; j < numStreams; j++) {
646+
const nssrc = (parseInt(ssrc) + j) + '';
647+
simLines.push(line.replace(ssrc, nssrc));
648+
}
649+
} else {
650+
removes.add(line);
651+
}
652+
}
653+
if (line.indexOf('a=ssrc-group:FID') > -1) {
654+
const parts = line.split(' ');
655+
gssrcs.add(parts[2]);
656+
for (let j = 1; j < numStreams; j++) {
657+
const nssrc1 = (parseInt(parts[1]) + j) + '';
658+
const nssrc2 = (parseInt(parts[2]) + j) + '';
659+
simGroupLines.push(
660+
line.replace(parts[1], nssrc1).replace(parts[2], nssrc2));
661+
}
662+
}
663+
i++;
664+
}
665+
666+
const insertPos = i;
667+
ssrcs.forEach(ssrc => {
668+
if (!gssrcs.has(ssrc)) {
669+
let groupLine = 'a=ssrc-group:SIM';
670+
groupLine = groupLine + ' ' + ssrc;
671+
for (let j = 1; j < numStreams; j++) {
672+
groupLine = groupLine + ' ' + (parseInt(ssrc) + j);
673+
}
674+
simGroupLines.push(groupLine);
675+
}
676+
});
677+
678+
simLines.sort();
679+
// Insert simulcast ssrc lines.
680+
sdpLines.splice(insertPos, 0, ...simGroupLines);
681+
sdpLines.splice(insertPos, 0, ...simLines);
682+
sdpLines = sdpLines.filter(line => !removes.has(line));
683+
684+
sdp = sdpLines.join('\r\n');
685+
return sdp;
686+
}
687+
606688
export function setMaxBitrate(sdp, encodingParametersList) {
607689
for (const encodingParameters of encodingParametersList) {
608690
if (encodingParameters.maxBitrate) {

src/sdk/conference/channel.js

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -736,6 +736,13 @@ export class ConferencePeerConnectionChannel extends EventDispatcher {
736736
}
737737

738738
_setRtpReceiverOptions(sdp, options) {
739+
// Add legacy simulcast in SDP for safari.
740+
if (this._isRtpEncodingParameters(options.video) && Utils.isSafari()) {
741+
if (options.video.length > 1) {
742+
sdp = SdpUtils.addLegacySimulcast(sdp, 'video', options.video.length);
743+
}
744+
}
745+
739746
// _videoCodecs is a workaround for setting video codecs. It will be moved to RTCRtpSendParameters.
740747
if (this._isRtpEncodingParameters(options.video) && this._videoCodecs) {
741748
sdp = SdpUtils.reorderCodecs(sdp, 'video', this._videoCodecs);

0 commit comments

Comments
 (0)