| 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..2ef4463e9147337393f0ad6c3dc0c2cc204a01e1 100644
|
| --- a/webrtc/modules/congestion_controller/delay_based_bwe.cc
|
| +++ b/webrtc/modules/congestion_controller/delay_based_bwe.cc
|
| @@ -57,6 +57,20 @@ bool BweSparseUpdateExperimentIsEnabled() {
|
|
|
| namespace webrtc {
|
|
|
| +DelayBasedBwe::Result::Result()
|
| + : updated(false),
|
| + probe(false),
|
| + target_bitrate_bps(0),
|
| + recovered_from_overuse(false) {}
|
| +
|
| +DelayBasedBwe::Result::Result(bool probe, uint32_t target_bitrate_bps)
|
| + : updated(true),
|
| + probe(probe),
|
| + target_bitrate_bps(target_bitrate_bps),
|
| + recovered_from_overuse(false) {}
|
| +
|
| +DelayBasedBwe::Result::~Result() {}
|
| +
|
| DelayBasedBwe::DelayBasedBwe(RtcEventLog* event_log, const Clock* clock)
|
| : event_log_(event_log),
|
| clock_(clock),
|
| @@ -102,6 +116,8 @@ DelayBasedBwe::Result DelayBasedBwe::IncomingPacketFeedbackVector(
|
| }
|
| bool overusing = false;
|
| bool delayed_feedback = true;
|
| + bool recovered_from_overuse = 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 +125,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) {
|
| + recovered_from_overuse = 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 +142,8 @@ DelayBasedBwe::Result DelayBasedBwe::IncomingPacketFeedbackVector(
|
| }
|
| } else {
|
| consecutive_delayed_feedbacks_ = 0;
|
| - return MaybeUpdateEstimate(overusing, acked_bitrate_bps);
|
| + return MaybeUpdateEstimate(overusing, acked_bitrate_bps,
|
| + recovered_from_overuse);
|
| }
|
| return Result();
|
| }
|
| @@ -189,7 +212,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 recovered_from_overuse) {
|
| Result result;
|
| int64_t now_ms = clock_->TimeInMilliseconds();
|
|
|
| @@ -223,6 +247,7 @@ DelayBasedBwe::Result DelayBasedBwe::MaybeUpdateEstimate(
|
| } else {
|
| result.updated = UpdateEstimate(now_ms, acked_bitrate_bps, overusing,
|
| &result.target_bitrate_bps);
|
| + result.recovered_from_overuse = recovered_from_overuse;
|
| }
|
| }
|
| if (result.updated) {
|
|
|