Index: media/cast/sender/video_sender.cc |
diff --git a/media/cast/sender/video_sender.cc b/media/cast/sender/video_sender.cc |
index 598e0d3a98906e7234d0fba149a165522df5caf0..7f72038890ac9a93354085eaf2fe1d705d8464c8 100644 |
--- a/media/cast/sender/video_sender.cc |
+++ b/media/cast/sender/video_sender.cc |
@@ -22,6 +22,20 @@ namespace cast { |
const int kNumAggressiveReportsSentAtStart = 100; |
const int kMinSchedulingDelayMs = 1; |
+namespace { |
+ |
+// Returns a fixed bitrate value when external video encoder is used. |
+// Some hardware encoder shows bad behavior if we set the bitrate too |
+// frequently, e.g. quality drop, not abiding by target bitrate, etc. |
+// See details: crbug.com/392086. |
+size_t GetFixedBitrate(const VideoSenderConfig& video_config) { |
+ if (!video_config.use_external_encoder) |
+ return 0; |
+ return (video_config.min_bitrate + video_config.max_bitrate) / 2; |
+} |
+ |
+} // namespace |
+ |
VideoSender::VideoSender( |
scoped_refptr<CastEnvironment> cast_environment, |
const VideoSenderConfig& video_config, |
@@ -40,6 +54,7 @@ VideoSender::VideoSender( |
1 + static_cast<int>(target_playout_delay_ * |
video_config.max_frame_rate / |
base::TimeDelta::FromSeconds(1)))), |
+ fixed_bitrate_(GetFixedBitrate(video_config)), |
num_aggressive_rtcp_reports_sent_(0), |
frames_in_encoder_(0), |
last_sent_frame_id_(0), |
@@ -117,10 +132,18 @@ void VideoSender::InsertRawVideoFrame( |
return; |
} |
- uint32 bitrate = congestion_control_.GetBitrate( |
- capture_time + target_playout_delay_, target_playout_delay_); |
- |
- video_encoder_->SetBitRate(bitrate); |
+ uint32 bitrate = fixed_bitrate_; |
+ if (!bitrate) { |
+ bitrate = congestion_control_.GetBitrate( |
+ capture_time + target_playout_delay_, target_playout_delay_); |
+ DCHECK(bitrate); |
+ video_encoder_->SetBitRate(bitrate); |
+ } else if (last_send_time_.is_null()) { |
+ // Set the fixed bitrate value to codec until a frame is sent. We might |
+ // set this value a couple times at the very beginning of the stream but |
+ // it is not harmful. |
+ video_encoder_->SetBitRate(bitrate); |
+ } |
if (video_encoder_->EncodeVideoFrame( |
video_frame, |