Index: webrtc/modules/congestion_controller/delay_based_bwe.cc |
diff --git a/webrtc/modules/congestion_controller/delay_based_bwe.cc b/webrtc/modules/congestion_controller/delay_based_bwe.cc |
index e8d9d21050f21d1b931999b758979b95ec953bcb..25229d24c147cbd683bfff00002d78f9f92d00d1 100644 |
--- a/webrtc/modules/congestion_controller/delay_based_bwe.cc |
+++ b/webrtc/modules/congestion_controller/delay_based_bwe.cc |
@@ -155,15 +155,21 @@ DelayBasedBwe::BitrateEstimator::BitrateEstimator() |
bitrate_estimate_(-1.0f), |
bitrate_estimate_var_(50.0f), |
old_estimator_(kBitrateWindowMs, 8000), |
- in_experiment_(BitrateEstimateExperimentIsEnabled()) {} |
+ in_experiment_(BitrateEstimateExperimentIsEnabled()), |
+ last_result_was_valid_(false) {} |
void DelayBasedBwe::BitrateEstimator::Update(int64_t now_ms, int bytes) { |
if (!in_experiment_) { |
old_estimator_.Update(bytes, now_ms); |
rtc::Optional<uint32_t> rate = old_estimator_.Rate(now_ms); |
bitrate_estimate_ = -1.0f; |
- if (rate) |
+ if (rate) { |
bitrate_estimate_ = *rate / 1000.0f; |
+ last_result_was_valid_ = true; |
terelius
2017/03/29 15:14:29
I'm a little bit worried that this might reset the
michaelt
2017/04/11 11:04:33
Ok the hack is removed.
|
+ } else if (last_result_was_valid_) { |
+ old_estimator_.Reset(); |
+ last_result_was_valid_ = false; |
+ } |
return; |
} |
int rate_window_ms = kRateWindowMs; |
@@ -240,7 +246,6 @@ DelayBasedBwe::DelayBasedBwe(RtcEventLog* event_log, const Clock* clock) |
trendline_estimator_(), |
detector_(), |
receiver_incoming_bitrate_(), |
- last_update_ms_(-1), |
last_seen_packet_ms_(-1), |
uma_recorded_(false), |
probe_bitrate_estimator_(event_log), |
@@ -290,15 +295,14 @@ DelayBasedBwe::Result DelayBasedBwe::IncomingPacketFeedbackVector( |
BweNames::kBweNamesMax); |
uma_recorded_ = true; |
} |
- Result aggregated_result; |
+ bool overusing = false; |
bool delayed_feedback = true; |
for (const auto& packet_feedback : sorted_packet_feedback_vector) { |
if (packet_feedback.send_time_ms < 0) |
continue; |
delayed_feedback = false; |
- Result result = IncomingPacketFeedback(packet_feedback); |
- if (result.updated) |
- aggregated_result = result; |
+ IncomingPacketFeedback(packet_feedback); |
+ overusing |= detector_.State() == kBwOverusing; |
} |
if (delayed_feedback) { |
++consecutive_delayed_feedbacks_; |
@@ -306,11 +310,11 @@ DelayBasedBwe::Result DelayBasedBwe::IncomingPacketFeedbackVector( |
consecutive_delayed_feedbacks_ = 0; |
} |
if (consecutive_delayed_feedbacks_ >= kMaxConsecutiveFailedLookups) { |
- aggregated_result = OnLongFeedbackDelay( |
- sorted_packet_feedback_vector.back().arrival_time_ms); |
consecutive_delayed_feedbacks_ = 0; |
+ return OnLongFeedbackDelay( |
+ sorted_packet_feedback_vector.back().arrival_time_ms); |
} |
- return aggregated_result; |
+ return MaybeUpdateEstimate(overusing); |
} |
DelayBasedBwe::Result DelayBasedBwe::OnLongFeedbackDelay( |
@@ -330,7 +334,7 @@ DelayBasedBwe::Result DelayBasedBwe::OnLongFeedbackDelay( |
return result; |
} |
-DelayBasedBwe::Result DelayBasedBwe::IncomingPacketFeedback( |
+void DelayBasedBwe::IncomingPacketFeedback( |
const PacketFeedback& packet_feedback) { |
int64_t now_ms = clock_->TimeInMilliseconds(); |
@@ -391,40 +395,35 @@ DelayBasedBwe::Result DelayBasedBwe::IncomingPacketFeedback( |
packet_feedback.arrival_time_ms); |
} |
} |
- |
- int probing_bps = 0; |
if (packet_feedback.pacing_info.probe_cluster_id != |
PacedPacketInfo::kNotAProbe) { |
- probing_bps = |
- probe_bitrate_estimator_.HandleProbeAndEstimateBitrate(packet_feedback); |
+ probe_bitrate_estimator_.HandleProbeAndEstimateBitrate(packet_feedback); |
} |
+} |
+ |
+DelayBasedBwe::Result DelayBasedBwe::MaybeUpdateEstimate(bool overusing) { |
+ Result result; |
rtc::Optional<uint32_t> acked_bitrate_bps = |
receiver_incoming_bitrate_.bitrate_bps(); |
+ int64_t now_ms = clock_->TimeInMilliseconds(); |
+ rtc::Optional<int> probe_bitrate_bps = |
+ probe_bitrate_estimator_.FetchAndResetLastEstimatedBitrateBps(); |
// Currently overusing the bandwidth. |
- if (detector_.State() == kBwOverusing) { |
+ if (overusing) { |
if (acked_bitrate_bps && |
rate_control_.TimeToReduceFurther(now_ms, *acked_bitrate_bps)) { |
result.updated = |
- UpdateEstimate(packet_feedback.arrival_time_ms, now_ms, |
- acked_bitrate_bps, &result.target_bitrate_bps); |
+ UpdateEstimate(now_ms, acked_bitrate_bps, overusing, &result); |
+ } |
+ } else { |
+ if (probe_bitrate_bps) { |
+ rate_control_.SetEstimate(*probe_bitrate_bps, now_ms); |
+ result.probe = true; |
} |
- } else if (probing_bps > 0) { |
- // No overuse, but probing measured a bitrate. |
- rate_control_.SetEstimate(probing_bps, packet_feedback.arrival_time_ms); |
- result.probe = true; |
- result.updated = |
- UpdateEstimate(packet_feedback.arrival_time_ms, now_ms, |
- acked_bitrate_bps, &result.target_bitrate_bps); |
- } |
- if (!result.updated && |
- (last_update_ms_ == -1 || |
- now_ms - last_update_ms_ > rate_control_.GetFeedbackInterval())) { |
result.updated = |
- UpdateEstimate(packet_feedback.arrival_time_ms, now_ms, |
- acked_bitrate_bps, &result.target_bitrate_bps); |
+ UpdateEstimate(now_ms, acked_bitrate_bps, overusing, &result); |
} |
if (result.updated) { |
- last_update_ms_ = now_ms; |
BWE_TEST_LOGGING_PLOT(1, "target_bitrate_bps", now_ms, |
result.target_bitrate_bps); |
if (event_log_ && (result.target_bitrate_bps != last_logged_bitrate_ || |
@@ -435,19 +434,21 @@ DelayBasedBwe::Result DelayBasedBwe::IncomingPacketFeedback( |
last_logged_state_ = detector_.State(); |
} |
} |
- |
return result; |
} |
-bool DelayBasedBwe::UpdateEstimate(int64_t arrival_time_ms, |
- int64_t now_ms, |
+bool DelayBasedBwe::UpdateEstimate(int64_t now_ms, |
rtc::Optional<uint32_t> acked_bitrate_bps, |
- uint32_t* target_bitrate_bps) { |
+ bool overusing, |
+ Result* result) { |
// TODO(terelius): RateControlInput::noise_var is deprecated and will be |
// removed. In the meantime, we set it to zero. |
- const RateControlInput input(detector_.State(), acked_bitrate_bps, 0); |
+ const RateControlInput input(overusing ? kBwOverusing : detector_.State(), |
+ acked_bitrate_bps, 0); |
rate_control_.Update(&input, now_ms); |
- *target_bitrate_bps = rate_control_.UpdateBandwidthEstimate(now_ms); |
+ result->target_bitrate_bps = rate_control_.UpdateBandwidthEstimate(now_ms); |
+ BWE_TEST_LOGGING_PLOT(1, "target_bitrate_bps", now_ms, |
+ result->target_bitrate_bps); |
return rate_control_.ValidEstimate(); |
} |