From 33d81a05ebd4d4e3e50be08d64ed944c2f8d42fd Mon Sep 17 00:00:00 2001 From: Sergey Silkin Date: Fri, 8 May 2020 11:55:02 +0200 Subject: [PATCH] Keep OpenH264 iMaxBitrate unspecified. MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Max encoder bitrate in WebRTC and OpenH264 are different settings. In WebRTC it is a cap for encoder target bitrate whilst in OpenH264 it is a peak bitrate. I.e. OpenH264 is allowed to produce bitrate up to iMaxBitrate for short time interval. That is not what WebRTC expects. https://webrtc.googlesource.com/src/+/5ee6967c4edc667688d736c27db6f2e7be00dd0a disabled encoders re-initialization on min/max bitrate change. Reinit of some HW encoders takes hundreds of milliseconds and causes video freeze. I missed that max bitrate is used by OpenH264. This caused regression described in webrtc:11543. This change sets iMaxBitrate=UNSPECIFIED_BIT_RATE (which is the default value). Settings iMaxBitrate=UNSPECIFIED_BIT_RATE disables the frame dropping logic based on that parameter. But the encoder still will drop frames based on buffer fullness, https://source.chromium.org/chromium/chromium/src/+/master:third_party/openh264/src/codec/encoder/core/src/ratectl.cpp;l=806-807 Bug: webrtc:10773, webrtc:11543 Change-Id: I728be49e0df8a0d9a8f4438299e4c7b4c1497a78 Reviewed-on: https://webrtc-review.googlesource.com/c/src/+/174745 Reviewed-by: Erik Språng Commit-Queue: Sergey Silkin Cr-Commit-Position: refs/heads/master@{#31192} --- modules/video_coding/codecs/h264/h264_encoder_impl.cc | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/modules/video_coding/codecs/h264/h264_encoder_impl.cc b/modules/video_coding/codecs/h264/h264_encoder_impl.cc index ffe852b7da..af36dd9865 100644 --- a/modules/video_coding/codecs/h264/h264_encoder_impl.cc +++ b/modules/video_coding/codecs/h264/h264_encoder_impl.cc @@ -542,7 +542,9 @@ SEncParamExt H264EncoderImpl::CreateEncoderParams(size_t i) const { encoder_params.iPicWidth = configurations_[i].width; encoder_params.iPicHeight = configurations_[i].height; encoder_params.iTargetBitrate = configurations_[i].target_bps; - encoder_params.iMaxBitrate = configurations_[i].max_bps; + // Keep unspecified. WebRTC's max codec bitrate is not the same setting + // as OpenH264's iMaxBitrate. More details in https://crbug.com/webrtc/11543 + encoder_params.iMaxBitrate = UNSPECIFIED_BIT_RATE; // Rate Control mode encoder_params.iRCMode = RC_BITRATE_MODE; encoder_params.fMaxFrameRate = configurations_[i].max_frame_rate;