@@ -603,6 +603,88 @@ export function reorderCodecs(sdp, type, codecs) {
603
603
return sdp ;
604
604
}
605
605
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
+
606
688
export function setMaxBitrate ( sdp , encodingParametersList ) {
607
689
for ( const encodingParameters of encodingParametersList ) {
608
690
if ( encodingParameters . maxBitrate ) {
0 commit comments