Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(597)

Unified Diff: media/cast/video_sender/video_sender.cc

Issue 326783002: Cast: Updated congestion control (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: bugfix Created 6 years, 6 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
« no previous file with comments | « media/cast/video_sender/video_sender.h ('k') | no next file » | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
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
« no previous file with comments | « media/cast/video_sender/video_sender.h ('k') | no next file » | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698