@@ -370,17 +370,19 @@ impl LocalVideoTrack {
370370
371371 let mut changed = false ;
372372 for encoding in & mut params. encodings {
373- let quality = crate :: options:: video_quality_for_rid_or_default ( & encoding. rid ) ;
373+ // The SFU addresses layers by spatial index (0 = Low), so a
374+ // single rid-less encoding is addressed as Low, not High.
375+ let rid = if encoding. rid . is_empty ( ) { "q" } else { encoding. rid . as_str ( ) } ;
376+ let quality = crate :: options:: video_quality_for_rid_or_default ( rid) ;
374377
375- let should_active = qualities
376- . iter ( )
377- . find ( |q| q. quality == quality as i32 )
378- . map ( |q| q. enabled )
379- . unwrap_or ( false ) ;
378+ // A quality missing from the update is left untouched.
379+ let Some ( subscribed) = qualities. iter ( ) . find ( |q| q. quality == quality as i32 ) else {
380+ continue ;
381+ } ;
380382
381- if encoding. active != should_active {
383+ if encoding. active != subscribed . enabled {
382384 changed = true ;
383- encoding. active = should_active ;
385+ encoding. active = subscribed . enabled ;
384386 }
385387 }
386388
@@ -394,11 +396,10 @@ impl LocalVideoTrack {
394396 } )
395397 . collect ( ) ;
396398
397- sender
398- . set_parameters ( params)
399- . map_err ( |e| RoomError :: Internal ( format ! ( "failed to set sender parameters: {}" , e) ) ) ?;
400-
401399 if changed {
400+ sender. set_parameters ( params) . map_err ( |e| {
401+ RoomError :: Internal ( format ! ( "failed to set sender parameters: {}" , e) )
402+ } ) ?;
402403 log:: debug!( "dynacast: layers changed -> [{}]" , layers. join( ", " ) ) ;
403404 } else {
404405 log:: debug!( "dynacast: layers unchanged [{}]" , layers. join( ", " ) ) ;
0 commit comments