diff --git a/media/engine/simulcast_encoder_adapter.cc b/media/engine/simulcast_encoder_adapter.cc index ecd415dd9d..c931aba62f 100644 --- a/media/engine/simulcast_encoder_adapter.cc +++ b/media/engine/simulcast_encoder_adapter.cc @@ -151,11 +151,11 @@ int SimulcastEncoderAdapter::Release() { while (!streaminfos_.empty()) { std::unique_ptr encoder = std::move(streaminfos_.back().encoder); - encoder->Release(); // Even though it seems very unlikely, there are no guarantees that the - // encoder will not call back after being Release()'d. Therefore, we disable - // the callbacks here. + // encoder will not call back after being Release()'d. Therefore, we first + // disable the callbacks here. encoder->RegisterEncodeCompleteCallback(nullptr); + encoder->Release(); streaminfos_.pop_back(); // Deletes callback adapter. stored_encoders_.push(std::move(encoder)); } diff --git a/sdk/android/src/jni/androidmediaencoder_jni.cc b/sdk/android/src/jni/androidmediaencoder_jni.cc index 1891539c7f..07a6339f1f 100644 --- a/sdk/android/src/jni/androidmediaencoder_jni.cc +++ b/sdk/android/src/jni/androidmediaencoder_jni.cc @@ -1018,6 +1018,8 @@ int32_t MediaCodecVideoEncoder::Release() { } use_surface_ = false; ALOGD << "EncoderRelease done."; + // It's legal to move the encoder to another queue now. + encoder_queue_checker_.Detach(); return WEBRTC_VIDEO_CODEC_OK; }