davidliu
Committed by GitHub

Fix crash when setting publishing layers (#559)

  1 +---
  2 +"client-sdk-android": patch
  3 +---
  4 +
  5 +Fix crash when setting publishing layers
@@ -316,49 +316,58 @@ constructor( @@ -316,49 +316,58 @@ constructor(
316 sender: RtpSender, 316 sender: RtpSender,
317 qualities: List<LivekitRtc.SubscribedQuality>, 317 qualities: List<LivekitRtc.SubscribedQuality>,
318 ) { 318 ) {
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 + }
329 } 335 }
330 - }  
331 336
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
336 hasChanged = true 346 hasChanged = true
337 } 347 }
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 + }
355 } 361 }
356 } 362 }
357 - }  
358 363
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
362 } 371 }
363 } 372 }
364 373