Chromium Code Reviews| Index: media/cast/sender/video_sender.cc |
| diff --git a/media/cast/sender/video_sender.cc b/media/cast/sender/video_sender.cc |
| index 9f8b6f9bd2e0f9c7eaf49019d46c219e930f72e5..a3ad5361506944e46abb1888ed082081b2cba1db 100644 |
| --- a/media/cast/sender/video_sender.cc |
| +++ b/media/cast/sender/video_sender.cc |
| @@ -19,6 +19,8 @@ |
| namespace media { |
| namespace cast { |
| +const int kRoundTripsNeeded = 4; |
|
Alpha Left Google
2014/09/11 01:24:26
nit: This constant needs to be more descriptive or
hubbe
2014/09/11 19:17:19
I actually think the name is pretty good (but I'm
|
| + |
| // Note, we use 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. |
| @@ -28,7 +30,8 @@ VideoSender::VideoSender( |
| const VideoSenderConfig& video_config, |
| const CreateVideoEncodeAcceleratorCallback& create_vea_cb, |
| const CreateVideoEncodeMemoryCallback& create_video_encode_mem_cb, |
| - CastTransportSender* const transport_sender) |
| + CastTransportSender* const transport_sender, |
| + const PlayoutDelayChangeCB& playout_delay_change_cb) |
| : FrameSender( |
| cast_environment, |
| false, |
| @@ -37,11 +40,13 @@ VideoSender::VideoSender( |
| kVideoFrequency, |
| video_config.ssrc, |
| video_config.max_frame_rate, |
| - video_config.target_playout_delay, |
| + video_config.min_playout_delay, |
| + video_config.max_playout_delay, |
| NewFixedCongestionControl( |
| (video_config.min_bitrate + video_config.max_bitrate) / 2)), |
| frames_in_encoder_(0), |
| last_bitrate_(0), |
| + playout_delay_change_cb_(playout_delay_change_cb), |
| weak_factory_(this) { |
| cast_initialization_status_ = STATUS_VIDEO_UNINITIALIZED; |
| VLOG(1) << "max_unacked_frames is " << max_unacked_frames_ |
| @@ -70,7 +75,11 @@ VideoSender::VideoSender( |
| transport_config.ssrc = video_config.ssrc; |
| transport_config.feedback_ssrc = video_config.incoming_feedback_ssrc; |
| transport_config.rtp_payload_type = video_config.rtp_payload_type; |
| - transport_config.stored_frames = max_unacked_frames_; |
| + transport_config.stored_frames = |
| + std::min(kMaxUnackedFrames, |
| + 1 + static_cast<int>(max_playout_delay_ * |
| + max_frame_rate_ / |
| + base::TimeDelta::FromSeconds(1))); |
| transport_config.aes_key = video_config.aes_key; |
| transport_config.aes_iv_mask = video_config.aes_iv_mask; |
| @@ -113,6 +122,12 @@ void VideoSender::InsertRawVideoFrame( |
| "rtp_timestamp", rtp_timestamp); |
| if (ShouldDropNextFrame(capture_time)) { |
| + base::TimeDelta new_target_delay = std::min( |
| + AverageRTT() * kRoundTripsNeeded, |
| + max_playout_delay_); |
| + if (new_target_delay > target_playout_delay_) { |
| + playout_delay_change_cb_.Run(new_target_delay); |
| + } |
| VLOG(1) << "Dropping frame due to too many frames currently in-flight."; |
| return; |
| } |