Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(280)

Unified Diff: webrtc/api/java/jni/androidmediaencoder_jni.cc

Issue 2051403002: Always on statistics for AndroidMediaEncoder. (Closed) Base URL: https://chromium.googlesource.com/external/webrtc.git@master
Patch Set: Changes according to AlexG's comments Created 4 years, 6 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
« no previous file with comments | « webrtc/api/java/jni/androidmediacodeccommon.h ('k') | no next file » | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
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;
« no previous file with comments | « webrtc/api/java/jni/androidmediacodeccommon.h ('k') | no next file » | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698