@@ -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+
606688export function setMaxBitrate ( sdp , encodingParametersList ) {
607689 for ( const encodingParameters of encodingParametersList ) {
608690 if ( encodingParameters . maxBitrate ) {
0 commit comments