From dc8fc722048bd9330e6f3bfdb9e6d0eaf87cec3b Mon Sep 17 00:00:00 2001 From: Johnny Date: Tue, 14 Sep 2021 11:28:17 +0800 Subject: [PATCH] Fix potential crash during SimulcastEncoderAdapter tear down. MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit On the Android and iOS platforms, occasionally crash when using the SimulcastEncoderAdapter. The Android platform reverted, In function `SimulcastEncoderAdapter::EncoderContext::Release`, After executing `encoder_->RegisterEncodeCompleteCallback(nullptr)` before execute `encoder_->Release()` If the encoder thread is executed here, ``` // out/xxx/xxx/gen/sdk/android/generated_video_jni/VideoEncoderWrapper_jni.h JNI_GENERATOR_EXPORT void Java_org_webrtc_VideoEncoderWrapper_nativeOnEncodedFrame( JNIEnv* env, jclass jcaller, jlong nativeVideoEncoderWrapper, jobject frame) { VideoEncoderWrapper* native = reinterpret_cast(nativeVideoEncoderWrapper); CHECK_NATIVE_PTR(env, jcaller, native, "OnEncodedFrame"); return native->OnEncodedFrame(env, base::android::JavaParamRef(env, frame)); // HERE } ``` it will cause `native` to nullptr. iOS also. Bug: webrtc:13156 Change-Id: Id5563b3fa2c11606ae7b35de56bbaa6adba59b14 Reviewed-on: https://webrtc-review.googlesource.com/c/src/+/231780 Reviewed-by: Erik Språng Commit-Queue: Erik Språng Cr-Commit-Position: refs/heads/main@{#34989} --- AUTHORS | 1 + media/engine/simulcast_encoder_adapter.cc | 2 +- 2 files changed, 2 insertions(+), 1 deletion(-) diff --git a/AUTHORS b/AUTHORS index 2315b65c60..809628212d 100644 --- a/AUTHORS +++ b/AUTHORS @@ -58,6 +58,7 @@ Jesús Leganés-Combarro Jiawei Ou Jie Mao Jiwon Kim +Johnny Wong Jose Antonio Olivera Ortega Keiichi Enomoto Kiran Thind diff --git a/media/engine/simulcast_encoder_adapter.cc b/media/engine/simulcast_encoder_adapter.cc index 721ec88a24..a16f04d93e 100644 --- a/media/engine/simulcast_encoder_adapter.cc +++ b/media/engine/simulcast_encoder_adapter.cc @@ -159,8 +159,8 @@ SimulcastEncoderAdapter::EncoderContext::EncoderContext( void SimulcastEncoderAdapter::EncoderContext::Release() { if (encoder_) { - encoder_->RegisterEncodeCompleteCallback(nullptr); encoder_->Release(); + encoder_->RegisterEncodeCompleteCallback(nullptr); } }