Chromium Code Reviews| 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(); |
| } |