@@ -316,49 +316,58 @@ constructor(
316316 sender : RtpSender ,
317317 qualities : List <LivekitRtc .SubscribedQuality >,
318318 ) {
319- val parameters = sender.parameters ? : return
320- val encodings = parameters.encodings ? : return
321- var hasChanged = false
322-
323- if (encodings.firstOrNull()?.scalabilityMode != null ) {
324- val encoding = encodings.first()
325- var maxQuality = ProtoVideoQuality .OFF
326- for (quality in qualities) {
327- if (quality.enabled && (maxQuality == ProtoVideoQuality .OFF || quality.quality.number > maxQuality.number)) {
328- maxQuality = quality.quality
319+ if (isDisposed) {
320+ LKLog .i { " attempted to set publishing layer for disposed video track." }
321+ return
322+ }
323+ try {
324+ val parameters = sender.parameters ? : return
325+ val encodings = parameters.encodings ? : return
326+ var hasChanged = false
327+
328+ if (encodings.firstOrNull()?.scalabilityMode != null ) {
329+ val encoding = encodings.first()
330+ var maxQuality = ProtoVideoQuality .OFF
331+ for (quality in qualities) {
332+ if (quality.enabled && (maxQuality == ProtoVideoQuality .OFF || quality.quality.number > maxQuality.number)) {
333+ maxQuality = quality.quality
334+ }
329335 }
330- }
331336
332- if (maxQuality == ProtoVideoQuality .OFF ) {
333- if (encoding.active) {
334- LKLog .v { " setting svc track to disabled" }
335- encoding.active = false
337+ if (maxQuality == ProtoVideoQuality .OFF ) {
338+ if (encoding.active) {
339+ LKLog .v { " setting svc track to disabled" }
340+ encoding.active = false
341+ hasChanged = true
342+ }
343+ } else if (! encoding.active) {
344+ LKLog .v { " setting svc track to enabled" }
345+ encoding.active = true
336346 hasChanged = true
337347 }
338- } else if (! encoding.active) {
339- LKLog .v { " setting svc track to enabled" }
340- encoding.active = true
341- hasChanged = true
342- }
343- } else {
344- // simulcast dynacast encodings
345- for (quality in qualities) {
346- val rid = EncodingUtils .ridForVideoQuality(quality.quality) ? : continue
347- val encoding = encodings.firstOrNull { it.rid == rid }
348- // use low quality layer settings for non-simulcasted streams
349- ? : encodings.takeIf { it.size == 1 && quality.quality == LivekitModels .VideoQuality .LOW }?.first()
350- ? : continue
351- if (encoding.active != quality.enabled) {
352- hasChanged = true
353- encoding.active = quality.enabled
354- LKLog .v { " setting layer ${quality.quality} to ${quality.enabled} " }
348+ } else {
349+ // simulcast dynacast encodings
350+ for (quality in qualities) {
351+ val rid = EncodingUtils .ridForVideoQuality(quality.quality) ? : continue
352+ val encoding = encodings.firstOrNull { it.rid == rid }
353+ // use low quality layer settings for non-simulcasted streams
354+ ? : encodings.takeIf { it.size == 1 && quality.quality == LivekitModels .VideoQuality .LOW }?.first()
355+ ? : continue
356+ if (encoding.active != quality.enabled) {
357+ hasChanged = true
358+ encoding.active = quality.enabled
359+ LKLog .v { " setting layer ${quality.quality} to ${quality.enabled} " }
360+ }
355361 }
356362 }
357- }
358363
359- if (hasChanged) {
360- // This refeshes the native code with the new information
361- sender.parameters = sender.parameters
364+ if (hasChanged) {
365+ // This refreshes the native code with the new information
366+ sender.parameters = parameters
367+ }
368+ } catch (e: Exception ) {
369+ LKLog .w(e) { " Exception caught while setting publishing layers." }
370+ return
362371 }
363372 }
364373
0 commit comments