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

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

Issue 2398963003: Move usage of QualityScaler to ViEEncoder. (Closed)
Patch Set: rebase Created 4 years, 1 month 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 | « no previous file | webrtc/api/peerconnection_unittest.cc » ('j') | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
Index: webrtc/api/android/jni/androidmediaencoder_jni.cc
diff --git a/webrtc/api/android/jni/androidmediaencoder_jni.cc b/webrtc/api/android/jni/androidmediaencoder_jni.cc
index f6d15b74495d25b13fd331ac2870d459e07e8e9c..8a7a72466581b3133dd547ab5b80aa27e6a2ce7e 100644
--- a/webrtc/api/android/jni/androidmediaencoder_jni.cc
+++ b/webrtc/api/android/jni/androidmediaencoder_jni.cc
@@ -37,6 +37,7 @@
#include "webrtc/modules/video_coding/utility/vp8_header_parser.h"
#include "webrtc/system_wrappers/include/field_trial.h"
#include "webrtc/system_wrappers/include/logcat_trace_context.h"
+#include "webrtc/video_encoder.h"
using rtc::Bind;
using rtc::Thread;
@@ -120,8 +121,6 @@ class MediaCodecVideoEncoder : public webrtc::VideoEncoder,
// rtc::MessageHandler implementation.
void OnMessage(rtc::Message* msg) override;
- void OnDroppedFrame() override;
-
bool SupportsNativeHandle() const override { return egl_context_ != nullptr; }
const char* ImplementationName() const override;
@@ -168,7 +167,6 @@ class MediaCodecVideoEncoder : public webrtc::VideoEncoder,
webrtc::EncodedImageCallback* callback);
int32_t ReleaseOnCodecThread();
int32_t SetRatesOnCodecThread(uint32_t new_bit_rate, uint32_t frame_rate);
- void OnDroppedFrameOnCodecThread();
// Helper accessors for MediaCodecVideoEncoder$OutputBufferInfo members.
int GetOutputBufferInfoIndex(JNIEnv* jni, jobject j_output_buffer_info);
@@ -184,6 +182,8 @@ class MediaCodecVideoEncoder : public webrtc::VideoEncoder,
// Search for H.264 start codes.
int32_t NextNaluPosition(uint8_t *buffer, size_t buffer_size);
+ VideoEncoder::ScalingSettings GetScalingSettings() const override;
+
// Displays encoder statistics.
void LogStatistics(bool force_log);
@@ -269,13 +269,9 @@ class MediaCodecVideoEncoder : public webrtc::VideoEncoder,
// True only when between a callback_->OnEncodedImage() call return a positive
// value and the next Encode() call being ignored.
bool drop_next_input_frame_;
+ bool scale_;
// Global references; must be deleted in Release().
std::vector<jobject> input_buffers_;
- QualityScaler quality_scaler_;
- // Dynamic resolution change, off by default.
- bool scale_;
-
- // H264 bitstream parser, used to extract QP from encoded bitstreams.
webrtc::H264BitstreamParser h264_bitstream_parser_;
// VP9 variables to populate codec specific structure.
@@ -417,23 +413,6 @@ int32_t MediaCodecVideoEncoder::InitEncode(
ALOGD << "InitEncode request: " << init_width << " x " << init_height;
ALOGD << "Encoder automatic resize " << (scale_ ? "enabled" : "disabled");
- if (scale_) {
- if (codec_type == kVideoCodecVP8 || codec_type == kVideoCodecH264) {
- quality_scaler_.Init(codec_type, codec_settings->startBitrate,
- codec_settings->width, codec_settings->height,
- codec_settings->maxFramerate);
- } else {
- // When adding codec support to additional hardware codecs, also configure
- // their QP thresholds for scaling.
- RTC_NOTREACHED() << "Unsupported codec without configured QP thresholds.";
- scale_ = false;
- }
- QualityScaler::Resolution res = quality_scaler_.GetScaledResolution();
- init_width = res.width;
- init_height = res.height;
- ALOGD << "Scaled resolution: " << init_width << " x " << init_height;
- }
-
return codec_thread_->Invoke<int32_t>(
RTC_FROM_HERE,
Bind(&MediaCodecVideoEncoder::InitEncodeOnCodecThread, this, init_width,
@@ -715,7 +694,6 @@ int32_t MediaCodecVideoEncoder::EncodeOnCodecThread(
drop_next_input_frame_ = false;
current_timestamp_us_ += rtc::kNumMicrosecsPerSec / last_set_fps_;
frames_dropped_media_encoder_++;
- OnDroppedFrameOnCodecThread();
return WEBRTC_VIDEO_CODEC_OK;
}
@@ -737,32 +715,12 @@ int32_t MediaCodecVideoEncoder::EncodeOnCodecThread(
return ProcessHWErrorOnEncodeOnCodecThread();
}
frames_dropped_media_encoder_++;
- OnDroppedFrameOnCodecThread();
return WEBRTC_VIDEO_CODEC_OK;
}
consecutive_full_queue_frame_drops_ = 0;
rtc::scoped_refptr<webrtc::VideoFrameBuffer> input_buffer(
frame.video_frame_buffer());
- if (scale_) {
- // Check framerate before spatial resolution change.
- quality_scaler_.OnEncodeFrame(frame.width(), frame.height());
- const webrtc::QualityScaler::Resolution scaled_resolution =
- quality_scaler_.GetScaledResolution();
- if (scaled_resolution.width != frame.width() ||
- scaled_resolution.height != frame.height()) {
- if (input_buffer->native_handle() != nullptr) {
- input_buffer = static_cast<AndroidTextureBuffer*>(input_buffer.get())
- ->CropScaleAndRotate(frame.width(), frame.height(),
- 0, 0,
- scaled_resolution.width,
- scaled_resolution.height,
- webrtc::kVideoRotation_0);
- } else {
- input_buffer = quality_scaler_.GetScaledBuffer(input_buffer);
- }
- }
- }
VideoFrame input_frame(input_buffer, frame.timestamp(),
frame.render_time_ms(), frame.rotation());
@@ -788,7 +746,6 @@ int32_t MediaCodecVideoEncoder::EncodeOnCodecThread(
if (frames_received_ > 1) {
current_timestamp_us_ += rtc::kNumMicrosecsPerSec / last_set_fps_;
frames_dropped_media_encoder_++;
- OnDroppedFrameOnCodecThread();
} else {
// Input buffers are not ready after codec initialization, HW is still
// allocating thme - this is expected and should not result in drop
@@ -969,9 +926,6 @@ int32_t MediaCodecVideoEncoder::SetRatesOnCodecThread(uint32_t new_bit_rate,
last_set_fps_ == frame_rate) {
return WEBRTC_VIDEO_CODEC_OK;
}
- if (scale_) {
- quality_scaler_.ReportFramerate(frame_rate);
- }
JNIEnv* jni = AttachCurrentThreadIfNeeded();
ScopedLocalRefFrame local_ref_frame(jni);
if (new_bit_rate > 0) {
@@ -1086,9 +1040,6 @@ bool MediaCodecVideoEncoder::DeliverPendingOutputs(JNIEnv* jni) {
image->_frameType =
(key_frame ? webrtc::kVideoFrameKey : webrtc::kVideoFrameDelta);
image->_completeFrame = true;
- image->adapt_reason_.quality_resolution_downscales =
- scale_ ? quality_scaler_.downscale_shift() : -1;
-
webrtc::CodecSpecificInfo info;
memset(&info, 0, sizeof(info));
info.codecType = codec_type;
@@ -1135,23 +1086,19 @@ bool MediaCodecVideoEncoder::DeliverPendingOutputs(JNIEnv* jni) {
header.fragmentationLength[0] = image->_length;
header.fragmentationPlType[0] = 0;
header.fragmentationTimeDiff[0] = 0;
- if (codec_type == kVideoCodecVP8 && scale_) {
+ if (codec_type == kVideoCodecVP8) {
int qp;
if (webrtc::vp8::GetQp(payload, payload_size, &qp)) {
current_acc_qp_ += qp;
- quality_scaler_.ReportQP(qp);
image->qp_ = qp;
}
}
} else if (codec_type == kVideoCodecH264) {
- if (scale_) {
- h264_bitstream_parser_.ParseBitstream(payload, payload_size);
- int qp;
- if (h264_bitstream_parser_.GetLastSliceQp(&qp)) {
- current_acc_qp_ += qp;
- quality_scaler_.ReportQP(qp);
- image->qp_ = qp;
- }
+ h264_bitstream_parser_.ParseBitstream(payload, payload_size);
+ int qp;
+ if (h264_bitstream_parser_.GetLastSliceQp(&qp)) {
+ current_acc_qp_ += qp;
+ image->qp_ = qp;
}
// For H.264 search for start codes.
int32_t scPositions[MAX_NALUS_PERFRAME + 1] = {};
@@ -1252,6 +1199,11 @@ void MediaCodecVideoEncoder::LogStatistics(bool force_log) {
}
}
+webrtc::VideoEncoder::ScalingSettings
+MediaCodecVideoEncoder::GetScalingSettings() const {
+ return VideoEncoder::ScalingSettings(scale_);
+}
+
int32_t MediaCodecVideoEncoder::NextNaluPosition(
uint8_t *buffer, size_t buffer_size) {
if (buffer_size < H264_SC_LENGTH) {
@@ -1284,22 +1236,6 @@ int32_t MediaCodecVideoEncoder::NextNaluPosition(
return -1;
}
-void MediaCodecVideoEncoder::OnDroppedFrame() {
- // Methods running on the codec thread should call OnDroppedFrameOnCodecThread
- // directly.
- RTC_DCHECK(!codec_thread_checker_.CalledOnValidThread());
- codec_thread_->Invoke<void>(
- RTC_FROM_HERE,
- Bind(&MediaCodecVideoEncoder::OnDroppedFrameOnCodecThread, this));
-}
-
-void MediaCodecVideoEncoder::OnDroppedFrameOnCodecThread() {
- RTC_DCHECK(codec_thread_checker_.CalledOnValidThread());
- // Report dropped frame to quality_scaler_.
- if (scale_)
- quality_scaler_.ReportDroppedFrame();
-}
-
const char* MediaCodecVideoEncoder::ImplementationName() const {
return "MediaCodec";
}
« no previous file with comments | « no previous file | webrtc/api/peerconnection_unittest.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698