| 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 7fa93de1493ad4067902dd479cc2d308ce137f9c..71e297c948ddbc29839e973961f5d92b5ca13895 100644
|
| --- a/webrtc/api/java/jni/androidmediaencoder_jni.cc
|
| +++ b/webrtc/api/java/jni/androidmediaencoder_jni.cc
|
| @@ -45,6 +45,7 @@ using webrtc::VideoCodecType;
|
| using webrtc::kVideoCodecH264;
|
| using webrtc::kVideoCodecVP8;
|
| using webrtc::kVideoCodecVP9;
|
| +using webrtc::QualityScaler;
|
|
|
| namespace webrtc_jni {
|
|
|
| @@ -242,7 +243,7 @@ class MediaCodecVideoEncoder : public webrtc::VideoEncoder,
|
| bool drop_next_input_frame_;
|
| // Global references; must be deleted in Release().
|
| std::vector<jobject> input_buffers_;
|
| - webrtc::QualityScaler quality_scaler_;
|
| + QualityScaler quality_scaler_;
|
| // Dynamic resolution change, off by default.
|
| bool scale_;
|
|
|
| @@ -355,7 +356,6 @@ int32_t MediaCodecVideoEncoder::InitEncode(
|
| size_t /* max_payload_size */) {
|
| const int kMinWidth = 320;
|
| const int kMinHeight = 180;
|
| - const int kLowQpThresholdDenominator = 3;
|
| if (codec_settings == NULL) {
|
| ALOGE << "NULL VideoCodec instance";
|
| return WEBRTC_VIDEO_CODEC_ERR_PARAMETER;
|
| @@ -365,40 +365,52 @@ int32_t MediaCodecVideoEncoder::InitEncode(
|
| << "Unsupported codec " << codec_settings->codecType << " for "
|
| << codecType_;
|
|
|
| - ALOGD << "InitEncode request";
|
| codec_mode_ = codec_settings->mode;
|
| + int init_width = codec_settings->width;
|
| + int init_height = codec_settings->height;
|
| scale_ = (codecType_ != kVideoCodecVP9) && (webrtc::field_trial::FindFullName(
|
| "WebRTC-MediaCodecVideoEncoder-AutomaticResize") == "Enabled");
|
| +
|
| + ALOGD << "InitEncode request: " << init_width << " x " << init_height;
|
| ALOGD << "Encoder automatic resize " << (scale_ ? "enabled" : "disabled");
|
| +
|
| if (scale_) {
|
| if (codecType_ == kVideoCodecVP8) {
|
| // QP is obtained from VP8-bitstream for HW, so the QP corresponds to the
|
| // (internal) range: [0, 127]. And we cannot change QP_max in HW, so it is
|
| // always = 127. Note that in SW, QP is that of the user-level range [0,
|
| // 63].
|
| - const int kMaxQp = 127;
|
| - const int kBadQpThreshold = 95;
|
| - quality_scaler_.Init(
|
| - kMaxQp / kLowQpThresholdDenominator, kBadQpThreshold, false);
|
| + const int kLowQpThreshold = 32;
|
| + const int kBadQpThreshold = 92;
|
| + quality_scaler_.Init(kLowQpThreshold, kBadQpThreshold, false,
|
| + codec_settings->startBitrate,
|
| + codec_settings->width, codec_settings->height);
|
| } else if (codecType_ == kVideoCodecH264) {
|
| // H264 QP is in the range [0, 51].
|
| - const int kMaxQp = 51;
|
| + const int kLowQpThreshold = 17;
|
| const int kBadQpThreshold = 40;
|
| - quality_scaler_.Init(
|
| - kMaxQp / kLowQpThresholdDenominator, kBadQpThreshold, false);
|
| + quality_scaler_.Init(kLowQpThreshold, kBadQpThreshold, false,
|
| + codec_settings->startBitrate,
|
| + codec_settings->width, codec_settings->height);
|
| } 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;
|
| }
|
| quality_scaler_.SetMinResolution(kMinWidth, kMinHeight);
|
| quality_scaler_.ReportFramerate(codec_settings->maxFramerate);
|
| + QualityScaler::Resolution res = quality_scaler_.GetScaledResolution();
|
| + init_width = std::max(res.width, kMinWidth);
|
| + init_height = std::max(res.height, kMinHeight);
|
| + ALOGD << "Scaled resolution: " << init_width << " x " << init_height;
|
| }
|
| +
|
| return codec_thread_->Invoke<int32_t>(
|
| Bind(&MediaCodecVideoEncoder::InitEncodeOnCodecThread,
|
| this,
|
| - codec_settings->width,
|
| - codec_settings->height,
|
| + init_width,
|
| + init_height,
|
| codec_settings->startBitrate,
|
| codec_settings->maxFramerate,
|
| false /* use_surface */));
|
|
|