| Index: webrtc/api/java/jni/androidmediaencoder_jni.cc
|
| diff --git a/webrtc/api/java/jni/androidmediaencoder_jni.cc b/webrtc/api/java/jni/androidmediaencoder_jni.cc
|
| index 6a1c58110777f2d43a3513c5c645259af3668441..8fbd594db743b61c39776735ccc54867678c5bbc 100644
|
| --- a/webrtc/api/java/jni/androidmediaencoder_jni.cc
|
| +++ b/webrtc/api/java/jni/androidmediaencoder_jni.cc
|
| @@ -226,6 +226,7 @@ class MediaCodecVideoEncoder : public webrtc::VideoEncoder,
|
| int current_encoding_time_ms_; // Overall encoding time in the current second
|
| int64_t last_input_timestamp_ms_; // Timestamp of last received yuv frame.
|
| int64_t last_output_timestamp_ms_; // Timestamp of last encoded frame.
|
| + bool output_delivery_loop_running_; // Is the onMessage loop running
|
|
|
| struct InputFrameInfo {
|
| InputFrameInfo(int64_t encode_start_time,
|
| @@ -306,6 +307,7 @@ MediaCodecVideoEncoder::MediaCodecVideoEncoder(
|
| inited_(false),
|
| use_surface_(false),
|
| picture_id_(0),
|
| + output_delivery_loop_running_(false),
|
| egl_context_(egl_context) {
|
| ScopedLocalRefFrame local_ref_frame(jni);
|
| // It would be nice to avoid spinning up a new thread per MediaCodec, and
|
| @@ -473,7 +475,13 @@ void MediaCodecVideoEncoder::OnMessage(rtc::Message* msg) {
|
| // unclear how to signal such a failure to the app, so instead we stay silent
|
| // about it and let the next app-called API method reveal the borkedness.
|
| DeliverPendingOutputs(jni);
|
| - codec_thread_->PostDelayed(kMediaCodecPollMs, this);
|
| +
|
| + // If there aren't more frames to deliver, we can stop the loop
|
| + if (!input_frame_infos_.empty()) {
|
| + codec_thread_->PostDelayed(kMediaCodecPollMs, this);
|
| + } else {
|
| + output_delivery_loop_running_ = false;
|
| + }
|
| }
|
|
|
| bool MediaCodecVideoEncoder::ResetCodecOnCodecThread() {
|
| @@ -587,7 +595,6 @@ int32_t MediaCodecVideoEncoder::InitEncodeOnCodecThread(
|
| }
|
|
|
| inited_ = true;
|
| - codec_thread_->PostDelayed(kMediaCodecPollMs, this);
|
| return WEBRTC_VIDEO_CODEC_OK;
|
| }
|
|
|
| @@ -733,6 +740,11 @@ int32_t MediaCodecVideoEncoder::EncodeOnCodecThread(
|
|
|
| current_timestamp_us_ += rtc::kNumMicrosecsPerSec / last_set_fps_;
|
|
|
| + if (!output_delivery_loop_running_) {
|
| + output_delivery_loop_running_ = true;
|
| + codec_thread_->PostDelayed(kMediaCodecPollMs, this);
|
| + }
|
| +
|
| if (!DeliverPendingOutputs(jni)) {
|
| ALOGE << "Failed deliver pending outputs.";
|
| ResetCodecOnCodecThread();
|
| @@ -852,6 +864,7 @@ int32_t MediaCodecVideoEncoder::ReleaseOnCodecThread() {
|
| rtc::MessageQueueManager::Clear(this);
|
| inited_ = false;
|
| use_surface_ = false;
|
| + output_delivery_loop_running_ = false;
|
| ALOGD << "EncoderReleaseOnCodecThread done.";
|
| return WEBRTC_VIDEO_CODEC_OK;
|
| }
|
| @@ -939,7 +952,7 @@ bool MediaCodecVideoEncoder::DeliverPendingOutputs(JNIEnv* jni) {
|
| int64_t frame_encoding_time_ms = 0;
|
| last_output_timestamp_ms_ =
|
| GetOutputBufferInfoPresentationTimestampUs(jni, j_output_buffer_info) /
|
| - 1000;
|
| + rtc::kNumMicrosecsPerMillisec;
|
| if (!input_frame_infos_.empty()) {
|
| const InputFrameInfo& frame_info = input_frame_infos_.front();
|
| output_timestamp_ = frame_info.frame_timestamp;
|
|
|