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 0e36aa1b7463dba4b60b3b7a488d452d85c3982a..8b388bf1147ad31e18cbb4bd1994da82bbd4cc6d 100644 |
--- a/webrtc/api/java/jni/androidmediaencoder_jni.cc |
+++ b/webrtc/api/java/jni/androidmediaencoder_jni.cc |
@@ -226,7 +226,6 @@ 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, |
@@ -307,7 +306,6 @@ 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 |
@@ -476,12 +474,16 @@ void MediaCodecVideoEncoder::OnMessage(rtc::Message* msg) { |
// about it and let the next app-called API method reveal the borkedness. |
DeliverPendingOutputs(jni); |
- // If there aren't more frames to deliver, we can stop the loop |
+ // If there aren't more frames to deliver, we can start polling at lower rate. |
if (!input_frame_infos_.empty()) { |
AlexG
2016/06/13 17:02:54
nit: better to use positive condition
if (input_f
|
codec_thread_->PostDelayed(kMediaCodecPollMs, this); |
} else { |
- output_delivery_loop_running_ = false; |
+ codec_thread_->PostDelayed(kMediaCodecPollNoFramesMs, this); |
} |
+ |
+ // Call log statistics here so it's called even if no frames are being |
+ // delivered. |
+ LogStatistics(false); |
} |
bool MediaCodecVideoEncoder::ResetCodecOnCodecThread() { |
@@ -740,10 +742,8 @@ 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); |
- } |
+ codec_thread_->Clear(this); |
+ codec_thread_->PostDelayed(kMediaCodecPollMs, this); |
if (!DeliverPendingOutputs(jni)) { |
ALOGE << "Failed deliver pending outputs."; |
@@ -862,7 +862,6 @@ 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; |
} |
@@ -926,6 +925,7 @@ jlong MediaCodecVideoEncoder::GetOutputBufferInfoPresentationTimestampUs( |
bool MediaCodecVideoEncoder::DeliverPendingOutputs(JNIEnv* jni) { |
RTC_DCHECK(codec_thread_checker_.CalledOnValidThread()); |
+ |
while (true) { |
jobject j_output_buffer_info = jni->CallObjectMethod( |
*j_media_codec_video_encoder_, j_dequeue_output_buffer_method_); |
@@ -1121,8 +1121,11 @@ bool MediaCodecVideoEncoder::DeliverPendingOutputs(JNIEnv* jni) { |
void MediaCodecVideoEncoder::LogStatistics(bool force_log) { |
int statistic_time_ms = rtc::TimeMillis() - stat_start_time_ms_; |
- if ((statistic_time_ms >= kMediaCodecStatisticsIntervalMs || force_log) && |
- current_frames_ > 0 && statistic_time_ms > 0) { |
+ if ((statistic_time_ms >= kMediaCodecStatisticsIntervalMs || force_log) |
+ && statistic_time_ms > 0) { |
+ // Prevent division by zero. |
+ int current_frames_divider = current_frames_ != 0 ? current_frames_ : 1; |
+ |
int current_bitrate = current_bytes_ * 8 / statistic_time_ms; |
int current_fps = |
(current_frames_ * 1000 + statistic_time_ms / 2) / statistic_time_ms; |
@@ -1130,8 +1133,8 @@ void MediaCodecVideoEncoder::LogStatistics(bool force_log) { |
". Bitrate: " << current_bitrate << |
", target: " << last_set_bitrate_kbps_ << " kbps" << |
", fps: " << current_fps << |
- ", encTime: " << (current_encoding_time_ms_ / current_frames_) << |
- ". QP: " << (current_acc_qp_ / current_frames_) << |
+ ", encTime: " << (current_encoding_time_ms_ / current_frames_divider) << |
+ ". QP: " << (current_acc_qp_ / current_frames_divider) << |
" for last " << statistic_time_ms << " ms."; |
stat_start_time_ms_ = rtc::TimeMillis(); |
current_frames_ = 0; |