Index: webrtc/sdk/android/src/jni/androidmediaencoder_jni.cc |
diff --git a/webrtc/sdk/android/src/jni/androidmediaencoder_jni.cc b/webrtc/sdk/android/src/jni/androidmediaencoder_jni.cc |
index 8fc9e7b0ce465409bacf0b107a8e75ddcfbc7130..92406ec107c0b4fc8365f0b7e26e2eec69efa223 100644 |
--- a/webrtc/sdk/android/src/jni/androidmediaencoder_jni.cc |
+++ b/webrtc/sdk/android/src/jni/androidmediaencoder_jni.cc |
@@ -456,6 +456,11 @@ bool MediaCodecVideoEncoder::EncodeTask::Run() { |
// about it and let the next app-called API method reveal the borkedness. |
encoder_->DeliverPendingOutputs(jni); |
+ if (!encoder_) { |
+ // Encoder can be destroyed in DeliverPendingOutputs. |
+ return true; |
+ } |
+ |
// Call log statistics here so it's called even if no frames are being |
// delivered. |
encoder_->LogStatistics(false); |
@@ -545,8 +550,6 @@ int32_t MediaCodecVideoEncoder::InitEncodeInternal(int width, |
gof_idx_ = 0; |
last_frame_received_ms_ = -1; |
frames_received_since_last_key_ = kMinKeyFrameInterval; |
- weak_factory_.reset(new rtc::WeakPtrFactory<MediaCodecVideoEncoder>(this)); |
- encode_task_.reset(new EncodeTask(weak_factory_->GetWeakPtr())); |
// We enforce no extra stride/padding in the format creation step. |
jobject j_video_codec_enum = JavaEnumFromIndexAndClassName( |
@@ -620,6 +623,9 @@ int32_t MediaCodecVideoEncoder::InitEncodeInternal(int width, |
#endif |
inited_ = true; |
} |
+ weak_factory_.reset(new rtc::WeakPtrFactory<MediaCodecVideoEncoder>(this)); |
+ encode_task_.reset(new EncodeTask(weak_factory_->GetWeakPtr())); |
+ |
return WEBRTC_VIDEO_CODEC_OK; |
} |
@@ -884,6 +890,8 @@ int32_t MediaCodecVideoEncoder::Release() { |
ALOGD << "EncoderRelease: Frames received: " << frames_received_ |
<< ". Encoded: " << frames_encoded_ |
<< ". Dropped: " << frames_dropped_media_encoder_; |
+ encode_task_.reset(nullptr); |
+ weak_factory_.reset(nullptr); |
ScopedLocalRefFrame local_ref_frame(jni); |
for (size_t i = 0; i < input_buffers_.size(); ++i) |
jni->DeleteGlobalRef(input_buffers_[i]); |
@@ -901,8 +909,6 @@ int32_t MediaCodecVideoEncoder::Release() { |
inited_ = false; |
} |
use_surface_ = false; |
- encode_task_.reset(nullptr); |
- weak_factory_.reset(nullptr); |
ALOGD << "EncoderRelease done."; |
return WEBRTC_VIDEO_CODEC_OK; |
} |