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 c50f0d4b45e8fd1c9bd071f3f68082e30cc9647a..fd55d1ac23ef9b710d28d04859ca82b1ea782fe5 100644 |
| --- a/webrtc/modules/congestion_controller/delay_based_bwe.cc |
| +++ b/webrtc/modules/congestion_controller/delay_based_bwe.cc |
| @@ -46,6 +46,13 @@ constexpr double kDefaultTrendlineThresholdGain = 4.0; |
| constexpr int kMaxConsecutiveFailedLookups = 5; |
| +// If the bitrate drops to a factor |kBitrateDropThreshold| or lower |
| +// and we recover within |kBitrateDropTimeLimitMs|, then we'll send |
| +// a probe at a fraction |kBitrateDropProbeFraction| of the original bitrate. |
| +constexpr double kBitrateDropThreshold = 0.5; |
| +constexpr int kBitrateDropTimeLimitMs = 3000; |
| +constexpr double kBitrateDropProbeFraction = 0.85; |
| + |
| const char kBweSparseUpdateExperiment[] = "WebRTC-BweSparseUpdateExperiment"; |
| bool BweSparseUpdateExperimentIsEnabled() { |
| @@ -57,6 +64,28 @@ bool BweSparseUpdateExperimentIsEnabled() { |
| namespace webrtc { |
| +DelayBasedBwe::Result::Result() |
| + : updated(false), |
| + probe(false), |
| + target_bitrate_bps(0), |
| + suggested_probe_bps() {} |
| + |
| +DelayBasedBwe::Result::Result(bool probe, uint32_t target_bitrate_bps) |
| + : updated(true), |
| + probe(probe), |
| + target_bitrate_bps(target_bitrate_bps), |
| + suggested_probe_bps() {} |
| + |
| +DelayBasedBwe::Result::Result(bool probe, |
| + uint32_t target_bitrate_bps, |
| + uint32_t suggested_probe_bps) |
| + : updated(true), |
| + probe(probe), |
| + target_bitrate_bps(target_bitrate_bps), |
| + suggested_probe_bps(suggested_probe_bps) {} |
| + |
| +DelayBasedBwe::Result::~Result() {} |
| + |
| DelayBasedBwe::DelayBasedBwe(RtcEventLog* event_log, const Clock* clock) |
| : event_log_(event_log), |
| clock_(clock), |
| @@ -102,6 +131,8 @@ DelayBasedBwe::Result DelayBasedBwe::IncomingPacketFeedbackVector( |
| } |
| bool overusing = false; |
| bool delayed_feedback = true; |
| + bool request_probe = false; |
| + BandwidthUsage prev_detector_state = detector_.State(); |
| for (const auto& packet_feedback : packet_feedback_vector) { |
| if (packet_feedback.send_time_ms < 0) |
| continue; |
| @@ -109,9 +140,15 @@ DelayBasedBwe::Result DelayBasedBwe::IncomingPacketFeedbackVector( |
| IncomingPacketFeedback(packet_feedback); |
| if (!in_sparse_update_experiment_) |
| overusing |= (detector_.State() == BandwidthUsage::kBwOverusing); |
| + if (prev_detector_state == BandwidthUsage::kBwUnderusing && |
| + detector_.State() == BandwidthUsage::kBwNormal) { |
| + request_probe = true; |
| + } |
| + prev_detector_state = detector_.State(); |
| } |
| if (in_sparse_update_experiment_) |
| overusing = (detector_.State() == BandwidthUsage::kBwOverusing); |
| + |
| if (delayed_feedback) { |
| ++consecutive_delayed_feedbacks_; |
| if (consecutive_delayed_feedbacks_ >= kMaxConsecutiveFailedLookups) { |
| @@ -120,7 +157,7 @@ DelayBasedBwe::Result DelayBasedBwe::IncomingPacketFeedbackVector( |
| } |
| } else { |
| consecutive_delayed_feedbacks_ = 0; |
| - return MaybeUpdateEstimate(overusing, acked_bitrate_bps); |
| + return MaybeUpdateEstimate(overusing, acked_bitrate_bps, request_probe); |
| } |
| return Result(); |
| } |
| @@ -189,7 +226,8 @@ void DelayBasedBwe::IncomingPacketFeedback( |
| DelayBasedBwe::Result DelayBasedBwe::MaybeUpdateEstimate( |
| bool overusing, |
| - rtc::Optional<uint32_t> acked_bitrate_bps) { |
| + rtc::Optional<uint32_t> acked_bitrate_bps, |
| + bool request_probe) { |
| Result result; |
| int64_t now_ms = clock_->TimeInMilliseconds(); |
| @@ -223,6 +261,13 @@ DelayBasedBwe::Result DelayBasedBwe::MaybeUpdateEstimate( |
| } else { |
| result.updated = UpdateEstimate(now_ms, acked_bitrate_bps, overusing, |
| &result.target_bitrate_bps); |
| + if (request_probe && |
| + result.target_bitrate_bps < |
| + kBitrateDropProbeFraction * bitrate_before_last_large_drop_ && |
|
philipel
2017/07/25 11:26:04
I think a slightly clearer way of doing this check
terelius
2017/07/27 21:02:45
It is not the same thing. However, it seems a bit
terelius
2017/07/28 17:14:47
Moved the entire drop detection into the ProbeCont
|
| + now_ms - time_of_last_large_drop_ms_ < kBitrateDropTimeLimitMs) { |
| + result.suggested_probe_bps = static_cast<rtc::Optional<uint32_t>>( |
|
philipel
2017/07/25 11:26:04
result.suggested_probe_bps.emplace
terelius
2017/07/27 21:02:45
Done.
|
| + kBitrateDropProbeFraction * bitrate_before_last_large_drop_); |
| + } |
| } |
| } |
| if (result.updated) { |
| @@ -250,6 +295,10 @@ bool DelayBasedBwe::UpdateEstimate(int64_t now_ms, |
| acked_bitrate_bps, 0); |
| uint32_t prev_target_bitrate_bps = rate_control_.LatestEstimate(); |
| *target_bitrate_bps = rate_control_.Update(&input, now_ms); |
| + if (*target_bitrate_bps < kBitrateDropThreshold * prev_target_bitrate_bps) { |
| + time_of_last_large_drop_ms_ = now_ms; |
| + bitrate_before_last_large_drop_ = prev_target_bitrate_bps; |
| + } |
| return rate_control_.ValidEstimate() && |
| prev_target_bitrate_bps != *target_bitrate_bps; |
| } |