diff --git a/sdk/android/src/jni/video_encoder_wrapper.cc b/sdk/android/src/jni/video_encoder_wrapper.cc index 58556dde7e..8dde3d1b5f 100644 --- a/sdk/android/src/jni/video_encoder_wrapper.cc +++ b/sdk/android/src/jni/video_encoder_wrapper.cc @@ -45,7 +45,10 @@ int32_t VideoEncoderWrapper::InitEncode(const VideoCodec* codec_settings, number_of_cores_ = number_of_cores; codec_settings_ = *codec_settings; num_resets_ = 0; - encoder_queue_ = rtc::TaskQueue::Current(); + { + rtc::CritScope lock(&encoder_queue_crit_); + encoder_queue_ = rtc::TaskQueue::Current(); + } return InitEncodeInternal(jni); } @@ -106,7 +109,10 @@ int32_t VideoEncoderWrapper::Release() { RTC_LOG(LS_INFO) << "release: " << status; frame_extra_infos_.clear(); initialized_ = false; - encoder_queue_ = nullptr; + { + rtc::CritScope lock(&encoder_queue_crit_); + encoder_queue_ = nullptr; + } return status; } @@ -284,10 +290,15 @@ void VideoEncoderWrapper::OnEncodedFrame(JNIEnv* jni, } }; - encoder_queue_->PostTask( - Lambda{this, std::move(buffer_copy), qp, encoded_width, encoded_height, - capture_time_ns, frame_type, rotation, complete_frame, - &frame_extra_infos_, callback_}); + { + rtc::CritScope lock(&encoder_queue_crit_); + if (encoder_queue_ != nullptr) { + encoder_queue_->PostTask( + Lambda{this, std::move(buffer_copy), qp, encoded_width, + encoded_height, capture_time_ns, frame_type, rotation, + complete_frame, &frame_extra_infos_, callback_}); + } + } } int32_t VideoEncoderWrapper::HandleReturnCode(JNIEnv* jni, diff --git a/sdk/android/src/jni/video_encoder_wrapper.h b/sdk/android/src/jni/video_encoder_wrapper.h index 0d2a9b67f4..ef4f840865 100644 --- a/sdk/android/src/jni/video_encoder_wrapper.h +++ b/sdk/android/src/jni/video_encoder_wrapper.h @@ -91,7 +91,8 @@ class VideoEncoderWrapper : public VideoEncoder { const ScopedJavaGlobalRef encoder_; const ScopedJavaGlobalRef int_array_class_; - rtc::TaskQueue* encoder_queue_; + rtc::CriticalSection encoder_queue_crit_; + rtc::TaskQueue* encoder_queue_ RTC_GUARDED_BY(encoder_queue_crit_); std::deque frame_extra_infos_; EncodedImageCallback* callback_; bool initialized_;