Index: webrtc/modules/bitrate_controller/send_side_bandwidth_estimation.cc |
diff --git a/webrtc/modules/bitrate_controller/send_side_bandwidth_estimation.cc b/webrtc/modules/bitrate_controller/send_side_bandwidth_estimation.cc |
index 2b7a74e084c644001fdc36b1045a2d946ac4b7e0..e7bb6361f2ab609254edcab79b9948d85486b0d9 100644 |
--- a/webrtc/modules/bitrate_controller/send_side_bandwidth_estimation.cc |
+++ b/webrtc/modules/bitrate_controller/send_side_bandwidth_estimation.cc |
@@ -104,7 +104,7 @@ bool ReadBweLossExperimentParameters(float* low_loss_threshold, |
SendSideBandwidthEstimation::SendSideBandwidthEstimation(RtcEventLog* event_log) |
: lost_packets_since_last_loss_update_Q8_(0), |
expected_packets_since_last_loss_update_(0), |
- bitrate_(0), |
+ current_bitrate_bps_(0), |
min_bitrate_configured_(congestion_controller::GetMinBitrateBps()), |
max_bitrate_configured_(kDefaultMaxBitrateBps), |
last_low_bitrate_log_ms_(-1), |
@@ -149,15 +149,15 @@ SendSideBandwidthEstimation::~SendSideBandwidthEstimation() {} |
void SendSideBandwidthEstimation::SetBitrates(int send_bitrate, |
int min_bitrate, |
int max_bitrate) { |
+ SetMinMaxBitrate(min_bitrate, max_bitrate); |
if (send_bitrate > 0) |
SetSendBitrate(send_bitrate); |
- SetMinMaxBitrate(min_bitrate, max_bitrate); |
} |
void SendSideBandwidthEstimation::SetSendBitrate(int bitrate) { |
RTC_DCHECK_GT(bitrate, 0); |
- bitrate_ = bitrate; |
- |
+ CapBitrateToThresholds(Clock::GetRealTimeClock()->TimeInMilliseconds(), |
+ bitrate); |
// Clear last sent bitrate history so the new value can be used directly |
// and not capped. |
min_bitrate_history_.clear(); |
@@ -183,7 +183,7 @@ int SendSideBandwidthEstimation::GetMinBitrate() const { |
void SendSideBandwidthEstimation::CurrentEstimate(int* bitrate, |
uint8_t* loss, |
int64_t* rtt) const { |
- *bitrate = bitrate_; |
+ *bitrate = current_bitrate_bps_; |
*loss = last_fraction_loss_; |
*rtt = last_round_trip_time_ms_; |
} |
@@ -191,14 +191,14 @@ void SendSideBandwidthEstimation::CurrentEstimate(int* bitrate, |
void SendSideBandwidthEstimation::UpdateReceiverEstimate( |
int64_t now_ms, uint32_t bandwidth) { |
bwe_incoming_ = bandwidth; |
- bitrate_ = CapBitrateToThresholds(now_ms, bitrate_); |
+ CapBitrateToThresholds(now_ms, current_bitrate_bps_); |
} |
void SendSideBandwidthEstimation::UpdateDelayBasedEstimate( |
int64_t now_ms, |
uint32_t bitrate_bps) { |
delay_based_bitrate_bps_ = bitrate_bps; |
- bitrate_ = CapBitrateToThresholds(now_ms, bitrate_); |
+ CapBitrateToThresholds(now_ms, current_bitrate_bps_); |
} |
void SendSideBandwidthEstimation::UpdateReceiverBlock(uint8_t fraction_loss, |
@@ -240,7 +240,7 @@ void SendSideBandwidthEstimation::UpdateReceiverBlock(uint8_t fraction_loss, |
void SendSideBandwidthEstimation::UpdateUmaStats(int64_t now_ms, |
int64_t rtt, |
int lost_packets) { |
- int bitrate_kbps = static_cast<int>((bitrate_ + 500) / 1000); |
+ int bitrate_kbps = static_cast<int>((current_bitrate_bps_ + 500) / 1000); |
for (size_t i = 0; i < kNumUmaRampupMetrics; ++i) { |
if (!rampup_uma_stats_updated_[i] && |
bitrate_kbps >= kUmaRampupMetrics[i].bitrate_kbps) { |
@@ -271,25 +271,25 @@ void SendSideBandwidthEstimation::UpdateUmaStats(int64_t now_ms, |
} |
void SendSideBandwidthEstimation::UpdateEstimate(int64_t now_ms) { |
+ uint32_t new_bitrate = current_bitrate_bps_; |
// We trust the REMB and/or delay-based estimate during the first 2 seconds if |
// we haven't had any packet loss reported, to allow startup bitrate probing. |
if (last_fraction_loss_ == 0 && IsInStartPhase(now_ms)) { |
- uint32_t prev_bitrate = bitrate_; |
- if (bwe_incoming_ > bitrate_) |
- bitrate_ = CapBitrateToThresholds(now_ms, bwe_incoming_); |
- if (delay_based_bitrate_bps_ > bitrate_) { |
- bitrate_ = CapBitrateToThresholds(now_ms, delay_based_bitrate_bps_); |
- } |
- if (bitrate_ != prev_bitrate) { |
+ new_bitrate = std::max(bwe_incoming_, new_bitrate); |
+ new_bitrate = std::max(delay_based_bitrate_bps_, new_bitrate); |
+ |
+ if (new_bitrate != current_bitrate_bps_) { |
min_bitrate_history_.clear(); |
- min_bitrate_history_.push_back(std::make_pair(now_ms, bitrate_)); |
+ min_bitrate_history_.push_back( |
+ std::make_pair(now_ms, current_bitrate_bps_)); |
+ CapBitrateToThresholds(now_ms, new_bitrate); |
return; |
} |
} |
UpdateMinHistory(now_ms); |
if (last_packet_report_ms_ == -1) { |
// No feedback received. |
- bitrate_ = CapBitrateToThresholds(now_ms, bitrate_); |
+ CapBitrateToThresholds(now_ms, current_bitrate_bps_); |
return; |
} |
int64_t time_since_packet_report_ms = now_ms - last_packet_report_ms_; |
@@ -300,7 +300,8 @@ void SendSideBandwidthEstimation::UpdateEstimate(int64_t now_ms) { |
// We only make decisions based on loss when the bitrate is above a |
// threshold. This is a crude way of handling loss which is uncorrelated |
// to congestion. |
- if (bitrate_ < bitrate_threshold_bps_ || loss <= low_loss_threshold_) { |
+ if (current_bitrate_bps_ < bitrate_threshold_bps_ || |
+ loss <= low_loss_threshold_) { |
// Loss < 2%: Increase rate by 8% of the min bitrate in the last |
// kBweIncreaseIntervalMs. |
// Note that by remembering the bitrate over the last second one can |
@@ -308,17 +309,17 @@ void SendSideBandwidthEstimation::UpdateEstimate(int64_t now_ms) { |
// at 8% per second rate now. E.g.: |
// If sending a constant 100kbps it can rampup immediatly to 108kbps |
// whenever a receiver report is received with lower packet loss. |
- // If instead one would do: bitrate_ *= 1.08^(delta time), it would |
- // take over one second since the lower packet loss to achieve |
+ // If instead one would do: current_bitrate_bps_ *= 1.08^(delta time), |
+ // it would take over one second since the lower packet loss to achieve |
// 108kbps. |
- bitrate_ = static_cast<uint32_t>( |
+ new_bitrate = static_cast<uint32_t>( |
min_bitrate_history_.front().second * 1.08 + 0.5); |
// Add 1 kbps extra, just to make sure that we do not get stuck |
// (gives a little extra increase at low rates, negligible at higher |
// rates). |
- bitrate_ += 1000; |
- } else if (bitrate_ > bitrate_threshold_bps_) { |
+ new_bitrate += 1000; |
+ } else if (current_bitrate_bps_ > bitrate_threshold_bps_) { |
if (loss <= high_loss_threshold_) { |
// Loss between 2% - 10%: Do nothing. |
} else { |
@@ -332,8 +333,9 @@ void SendSideBandwidthEstimation::UpdateEstimate(int64_t now_ms) { |
// Reduce rate: |
// newRate = rate * (1 - 0.5*lossRate); |
// where packetLoss = 256*lossRate; |
- bitrate_ = static_cast<uint32_t>( |
- (bitrate_ * static_cast<double>(512 - last_fraction_loss_)) / |
+ new_bitrate = static_cast<uint32_t>( |
+ (current_bitrate_bps_ * |
+ static_cast<double>(512 - last_fraction_loss_)) / |
512.0); |
has_decreased_since_last_fraction_loss_ = true; |
} |
@@ -346,7 +348,7 @@ void SendSideBandwidthEstimation::UpdateEstimate(int64_t now_ms) { |
if (in_timeout_experiment_) { |
LOG(LS_WARNING) << "Feedback timed out (" << time_since_feedback_ms |
<< " ms), reducing bitrate."; |
- bitrate_ *= 0.8; |
+ new_bitrate *= 0.8; |
// Reset accumulators since we've already acted on missing feedback and |
// shouldn't to act again on these old lost packets. |
lost_packets_since_last_loss_update_Q8_ = 0; |
@@ -354,17 +356,8 @@ void SendSideBandwidthEstimation::UpdateEstimate(int64_t now_ms) { |
last_timeout_ms_ = now_ms; |
} |
} |
- uint32_t capped_bitrate = CapBitrateToThresholds(now_ms, bitrate_); |
- if (capped_bitrate != bitrate_ || |
- last_fraction_loss_ != last_logged_fraction_loss_ || |
- last_rtc_event_log_ms_ == -1 || |
- now_ms - last_rtc_event_log_ms_ > kRtcEventLogPeriodMs) { |
- event_log_->LogLossBasedBweUpdate(capped_bitrate, last_fraction_loss_, |
- expected_packets_since_last_loss_update_); |
- last_logged_fraction_loss_ = last_fraction_loss_; |
- last_rtc_event_log_ms_ = now_ms; |
- } |
- bitrate_ = capped_bitrate; |
+ |
+ CapBitrateToThresholds(now_ms, new_bitrate); |
} |
bool SendSideBandwidthEstimation::IsInStartPhase(int64_t now_ms) const { |
@@ -385,34 +378,43 @@ void SendSideBandwidthEstimation::UpdateMinHistory(int64_t now_ms) { |
// Typical minimum sliding-window algorithm: Pop values higher than current |
// bitrate before pushing it. |
while (!min_bitrate_history_.empty() && |
- bitrate_ <= min_bitrate_history_.back().second) { |
+ current_bitrate_bps_ <= min_bitrate_history_.back().second) { |
min_bitrate_history_.pop_back(); |
} |
- min_bitrate_history_.push_back(std::make_pair(now_ms, bitrate_)); |
+ min_bitrate_history_.push_back(std::make_pair(now_ms, current_bitrate_bps_)); |
} |
-uint32_t SendSideBandwidthEstimation::CapBitrateToThresholds( |
- int64_t now_ms, uint32_t bitrate) { |
- if (bwe_incoming_ > 0 && bitrate > bwe_incoming_) { |
- bitrate = bwe_incoming_; |
+void SendSideBandwidthEstimation::CapBitrateToThresholds(int64_t now_ms, |
+ uint32_t bitrate_bps) { |
+ if (bwe_incoming_ > 0 && bitrate_bps > bwe_incoming_) { |
+ bitrate_bps = bwe_incoming_; |
} |
- if (delay_based_bitrate_bps_ > 0 && bitrate > delay_based_bitrate_bps_) { |
- bitrate = delay_based_bitrate_bps_; |
+ if (delay_based_bitrate_bps_ > 0 && bitrate_bps > delay_based_bitrate_bps_) { |
+ bitrate_bps = delay_based_bitrate_bps_; |
} |
- if (bitrate > max_bitrate_configured_) { |
- bitrate = max_bitrate_configured_; |
+ if (bitrate_bps > max_bitrate_configured_) { |
+ bitrate_bps = max_bitrate_configured_; |
} |
- if (bitrate < min_bitrate_configured_) { |
+ if (bitrate_bps < min_bitrate_configured_) { |
if (last_low_bitrate_log_ms_ == -1 || |
now_ms - last_low_bitrate_log_ms_ > kLowBitrateLogPeriodMs) { |
- LOG(LS_WARNING) << "Estimated available bandwidth " << bitrate / 1000 |
+ LOG(LS_WARNING) << "Estimated available bandwidth " << bitrate_bps / 1000 |
<< " kbps is below configured min bitrate " |
<< min_bitrate_configured_ / 1000 << " kbps."; |
last_low_bitrate_log_ms_ = now_ms; |
} |
- bitrate = min_bitrate_configured_; |
+ bitrate_bps = min_bitrate_configured_; |
+ } |
+ |
+ if (bitrate_bps != current_bitrate_bps_ || |
+ last_fraction_loss_ != last_logged_fraction_loss_ || |
+ now_ms - last_rtc_event_log_ms_ > kRtcEventLogPeriodMs) { |
+ event_log_->LogLossBasedBweUpdate(bitrate_bps, last_fraction_loss_, |
+ expected_packets_since_last_loss_update_); |
+ last_logged_fraction_loss_ = last_fraction_loss_; |
+ last_rtc_event_log_ms_ = now_ms; |
} |
- return bitrate; |
+ current_bitrate_bps_ = bitrate_bps; |
} |
} // namespace webrtc |