Index: media/cast/video_sender/video_sender.cc |
diff --git a/media/cast/video_sender/video_sender.cc b/media/cast/video_sender/video_sender.cc |
index f228c1b3d1af1cedc5d376e41b690a5345132a79..b88a3bdf51d73bc9a80abe1a68d638549cce37da 100644 |
--- a/media/cast/video_sender/video_sender.cc |
+++ b/media/cast/video_sender/video_sender.cc |
@@ -33,11 +33,11 @@ VideoSender::VideoSender( |
target_playout_delay_(base::TimeDelta::FromMilliseconds( |
video_config.rtp_config.max_delay_ms)), |
transport_sender_(transport_sender), |
- max_unacked_frames_(std::min( |
- kMaxUnackedFrames, |
- 1 + static_cast<int>( |
- target_playout_delay_ * video_config.max_frame_rate / |
- base::TimeDelta::FromSeconds(1)))), |
+ max_unacked_frames_( |
+ std::min(kMaxUnackedFrames, |
+ 1 + static_cast<int>(target_playout_delay_ * |
+ video_config.max_frame_rate / |
+ base::TimeDelta::FromSeconds(1)))), |
rtcp_(cast_environment_, |
this, |
transport_sender_, |
@@ -55,12 +55,10 @@ VideoSender::VideoSender( |
last_sent_frame_id_(0), |
latest_acked_frame_id_(0), |
duplicate_ack_counter_(0), |
- current_requested_bitrate_(video_config.start_bitrate), |
congestion_control_(cast_environment->Clock(), |
- video_config.congestion_control_back_off, |
video_config.max_bitrate, |
video_config.min_bitrate, |
- video_config.start_bitrate), |
+ max_unacked_frames_), |
cast_initialization_status_(STATUS_VIDEO_UNINITIALIZED), |
weak_factory_(this) { |
VLOG(1) << "max_unacked_frames " << max_unacked_frames_; |
@@ -123,12 +121,17 @@ void VideoSender::InsertRawVideoFrame( |
return; |
} |
+ uint32 bitrate = congestion_control_.GetBitrate( |
+ capture_time + target_playout_delay_, target_playout_delay_); |
+ |
+ video_encoder_->SetBitRate(bitrate); |
+ |
if (video_encoder_->EncodeVideoFrame( |
video_frame, |
capture_time, |
base::Bind(&VideoSender::SendEncodedVideoFrame, |
weak_factory_.GetWeakPtr(), |
- current_requested_bitrate_))) { |
+ bitrate))) { |
frames_in_encoder_++; |
} else { |
VLOG(1) << "Encoder rejected a frame. Skipping..."; |
@@ -192,6 +195,9 @@ void VideoSender::SendEncodedVideoFrame( |
SendRtcpReport(is_last_aggressive_report); |
} |
+ congestion_control_.SendFrameToTransport( |
+ frame_id, encoded_frame->data.size() * 8, last_send_time_); |
+ |
transport_sender_->InsertCodedVideoFrame(*encoded_frame); |
} |
@@ -271,6 +277,8 @@ void VideoSender::OnReceivedCastFeedback(const RtcpCastMessage& cast_feedback) { |
base::TimeDelta min_rtt; |
base::TimeDelta max_rtt; |
if (rtcp_.Rtt(&rtt, &avg_rtt, &min_rtt, &max_rtt)) { |
+ congestion_control_.UpdateRtt(rtt); |
+ |
// Don't use a RTT lower than our average. |
rtt = std::max(rtt, avg_rtt); |
@@ -294,12 +302,6 @@ void VideoSender::OnReceivedCastFeedback(const RtcpCastMessage& cast_feedback) { |
if (cast_feedback.missing_frames_and_packets_.empty()) { |
video_encoder_->LatestFrameIdToReference(cast_feedback.ack_frame_id_); |
- if ((latest_acked_frame_id_ + 1) == cast_feedback.ack_frame_id_) { |
- uint32 new_bitrate = 0; |
- if (congestion_control_.OnAck(rtt, &new_bitrate)) { |
- UpdateBitrate(new_bitrate); |
- } |
- } |
// We only count duplicate ACKs when we have sent newer frames. |
if (latest_acked_frame_id_ == cast_feedback.ack_frame_id_ && |
latest_acked_frame_id_ != last_sent_frame_id_) { |
@@ -318,17 +320,18 @@ void VideoSender::OnReceivedCastFeedback(const RtcpCastMessage& cast_feedback) { |
duplicate_ack_counter_ = 0; |
transport_sender_->ResendPackets( |
false, cast_feedback.missing_frames_and_packets_); |
- uint32 new_bitrate = 0; |
- if (congestion_control_.OnNack(rtt, &new_bitrate)) { |
- UpdateBitrate(new_bitrate); |
- } |
} |
+ base::TimeTicks now = cast_environment_->Clock()->NowTicks(); |
+ congestion_control_.AckFrame(cast_feedback.ack_frame_id_, now); |
+ |
RtpTimestamp rtp_timestamp = |
frame_id_to_rtp_timestamp_[cast_feedback.ack_frame_id_ & 0xff]; |
- cast_environment_->Logging()->InsertFrameEvent( |
- cast_environment_->Clock()->NowTicks(), FRAME_ACK_RECEIVED, VIDEO_EVENT, |
- rtp_timestamp, cast_feedback.ack_frame_id_); |
+ cast_environment_->Logging()->InsertFrameEvent(now, |
+ FRAME_ACK_RECEIVED, |
+ VIDEO_EVENT, |
+ rtp_timestamp, |
+ cast_feedback.ack_frame_id_); |
const bool is_acked_out_of_order = |
static_cast<int32>(cast_feedback.ack_frame_id_ - |
@@ -370,12 +373,5 @@ void VideoSender::ResendForKickstart() { |
transport_sender_->ResendPackets(false, missing_frames_and_packets); |
} |
-void VideoSender::UpdateBitrate(int new_bitrate) { |
- // Make sure we don't set the bitrate too insanely low. |
- DCHECK_GT(new_bitrate, 1000); |
- video_encoder_->SetBitRate(new_bitrate); |
- current_requested_bitrate_ = new_bitrate; |
-} |
- |
} // namespace cast |
} // namespace media |