@@ -232,12 +232,30 @@ func trackDetailsToRTPReceiveParameters(t *trackDetails) RTPReceiveParameters {
232
232
return RTPReceiveParameters {Encodings : encodings }
233
233
}
234
234
235
- func getRids (media * sdp.MediaDescription ) map [string ]string {
236
- rids := map [string ]string {}
235
+ func getRids (media * sdp.MediaDescription ) map [string ]* simulcastRid {
236
+ rids := map [string ]* simulcastRid {}
237
+ var simulcastAttr string
237
238
for _ , attr := range media .Attributes {
238
239
if attr .Key == sdpAttributeRid {
239
240
split := strings .Split (attr .Value , " " )
240
- rids [split [0 ]] = attr .Value
241
+ rids [split [0 ]] = & simulcastRid {attrValue : attr .Value }
242
+ } else if attr .Key == sdpAttributeSimulcast {
243
+ simulcastAttr = attr .Value
244
+ }
245
+ }
246
+ // process paused stream like "a=simulcast:send 1;~2;~3"
247
+ if simulcastAttr != "" {
248
+ if space := strings .Index (simulcastAttr , " " ); space > 0 {
249
+ simulcastAttr = simulcastAttr [space + 1 :]
250
+ }
251
+ ridStates := strings .Split (simulcastAttr , ";" )
252
+ for _ , ridState := range ridStates {
253
+ if ridState [:1 ] == "~" {
254
+ rid := ridState [1 :]
255
+ if r , ok := rids [rid ]; ok {
256
+ r .paused = true
257
+ }
258
+ }
241
259
}
242
260
}
243
261
return rids
@@ -379,7 +397,7 @@ func addSenderSDP(
379
397
sendRids = append (sendRids , encoding .RID )
380
398
}
381
399
// Simulcast
382
- media .WithValueAttribute ("simulcast" , "send " + strings .Join (sendRids , ";" ))
400
+ media .WithValueAttribute (sdpAttributeSimulcast , "send " + strings .Join (sendRids , ";" ))
383
401
}
384
402
385
403
if ! isPlanB {
@@ -475,10 +493,13 @@ func addTransceiverSDP(
475
493
476
494
for rid := range mediaSection .ridMap {
477
495
media .WithValueAttribute (sdpAttributeRid , rid + " recv" )
496
+ if mediaSection .ridMap [rid ].paused {
497
+ rid = "~" + rid
498
+ }
478
499
recvRids = append (recvRids , rid )
479
500
}
480
501
// Simulcast
481
- media .WithValueAttribute ("simulcast" , "recv " + strings .Join (recvRids , ";" ))
502
+ media .WithValueAttribute (sdpAttributeSimulcast , "recv " + strings .Join (recvRids , ";" ))
482
503
}
483
504
484
505
addSenderSDP (mediaSection , isPlanB , media )
@@ -500,11 +521,16 @@ func addTransceiverSDP(
500
521
return true , nil
501
522
}
502
523
524
+ type simulcastRid struct {
525
+ attrValue string
526
+ paused bool
527
+ }
528
+
503
529
type mediaSection struct {
504
530
id string
505
531
transceivers []* RTPTransceiver
506
532
data bool
507
- ridMap map [string ]string
533
+ ridMap map [string ]* simulcastRid
508
534
}
509
535
510
536
func bundleMatchFromRemote (matchBundleGroup * string ) func (mid string ) bool {
0 commit comments