From 2147925d340c5849370a54cb60430bd7ed2ec7c8 Mon Sep 17 00:00:00 2001 From: George Zhang Date: Thu, 11 Jun 2026 13:49:44 -0700 Subject: [PATCH 1/2] fix(video): Prevent crash and ANR during content share stop Three fixes for content share teardown: 1. DefaultContentShareVideoClientController: Guard stopVideoShare() with isSharing check to prevent re-entrant calls. The callback from MediaProjection.onStop() and onContentShareStopped both trigger additional stopVideoShare() calls, causing javaStopService()+destroy() to execute 3-4 times on the main thread, blocking it past the 5s ANR threshold. 2. DefaultContentShareVideoClientController: Disconnect the video source adapter and stop sending BEFORE destroying the video client. Prevents frames flowing into freed native objects. 3. DefaultSurfaceTextureCaptureSource: Cancel pending handler messages (minFps resend timer) in stop() to prevent delayed frame delivery into a torn-down pipeline. --- .../video/capture/DefaultSurfaceTextureCaptureSource.kt | 1 + .../DefaultContentShareVideoClientController.kt | 6 +++++- 2 files changed, 6 insertions(+), 1 deletion(-) diff --git a/amazon-chime-sdk/src/main/java/com/amazonaws/services/chime/sdk/meetings/audiovideo/video/capture/DefaultSurfaceTextureCaptureSource.kt b/amazon-chime-sdk/src/main/java/com/amazonaws/services/chime/sdk/meetings/audiovideo/video/capture/DefaultSurfaceTextureCaptureSource.kt index aa67290b3..ec7c9b873 100644 --- a/amazon-chime-sdk/src/main/java/com/amazonaws/services/chime/sdk/meetings/audiovideo/video/capture/DefaultSurfaceTextureCaptureSource.kt +++ b/amazon-chime-sdk/src/main/java/com/amazonaws/services/chime/sdk/meetings/audiovideo/video/capture/DefaultSurfaceTextureCaptureSource.kt @@ -140,6 +140,7 @@ class DefaultSurfaceTextureCaptureSource( runBlocking(handler.asCoroutineDispatcher().immediate) { logger.info(TAG, "Setting on frame available listener to null") surfaceTexture.setOnFrameAvailableListener(null) + handler.removeCallbacksAndMessages(null) } } diff --git a/amazon-chime-sdk/src/main/java/com/amazonaws/services/chime/sdk/meetings/internal/contentshare/DefaultContentShareVideoClientController.kt b/amazon-chime-sdk/src/main/java/com/amazonaws/services/chime/sdk/meetings/internal/contentshare/DefaultContentShareVideoClientController.kt index dd1cf29d2..389d2ebdf 100644 --- a/amazon-chime-sdk/src/main/java/com/amazonaws/services/chime/sdk/meetings/internal/contentshare/DefaultContentShareVideoClientController.kt +++ b/amazon-chime-sdk/src/main/java/com/amazonaws/services/chime/sdk/meetings/internal/contentshare/DefaultContentShareVideoClientController.kt @@ -141,12 +141,16 @@ class DefaultContentShareVideoClientController( } override fun stopVideoShare() { + if (!isSharing) return + isSharing = false + logger.info(TAG, "Stopping content share video client") + videoSourceAdapter.source = null + videoClient?.setSending(false) videoClient?.javaStopService() videoClient?.destroy() videoClient = null - isSharing = false eglCore?.release() eglCore = null } From 9693498ac0dd179820a8e95762e45cf74160dac9 Mon Sep 17 00:00:00 2001 From: George Zhang Date: Thu, 11 Jun 2026 23:58:07 -0700 Subject: [PATCH 2/2] fix(video): Move blocking content share teardown off main thread Move javaStopService() + destroy() to a background thread to prevent ANR. These calls block for 1-2s via signaling_thread_->BlockingCall() waiting for WebRTC peer connection close and signaling teardown. The video source adapter is disconnected synchronously on the main thread to prevent frames reaching freed native objects, then actual native cleanup runs asynchronously. --- .../DefaultContentShareVideoClientController.kt | 15 ++++++++++----- 1 file changed, 10 insertions(+), 5 deletions(-) diff --git a/amazon-chime-sdk/src/main/java/com/amazonaws/services/chime/sdk/meetings/internal/contentshare/DefaultContentShareVideoClientController.kt b/amazon-chime-sdk/src/main/java/com/amazonaws/services/chime/sdk/meetings/internal/contentshare/DefaultContentShareVideoClientController.kt index 389d2ebdf..32b8faf5c 100644 --- a/amazon-chime-sdk/src/main/java/com/amazonaws/services/chime/sdk/meetings/internal/contentshare/DefaultContentShareVideoClientController.kt +++ b/amazon-chime-sdk/src/main/java/com/amazonaws/services/chime/sdk/meetings/internal/contentshare/DefaultContentShareVideoClientController.kt @@ -146,13 +146,18 @@ class DefaultContentShareVideoClientController( logger.info(TAG, "Stopping content share video client") videoSourceAdapter.source = null - videoClient?.setSending(false) - videoClient?.javaStopService() - videoClient?.destroy() - videoClient = null - eglCore?.release() + val client = videoClient + val core = eglCore + videoClient = null eglCore = null + + Thread { + client?.setSending(false) + client?.javaStopService() + client?.destroy() + core?.release() + }.start() } override fun subscribeToVideoClientStateChange(observer: ContentShareObserver) {