Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(763)

Side by Side Diff: webrtc/modules/congestion_controller/probe_controller.cc

Issue 2432633002: Handle BW drop in ALR region and initiate probing (Closed)
Patch Set: Created 4 years, 2 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
OLDNEW
1 /* 1 /*
2 * Copyright (c) 2016 The WebRTC project authors. All Rights Reserved. 2 * Copyright (c) 2016 The WebRTC project authors. All Rights Reserved.
3 * 3 *
4 * Use of this source code is governed by a BSD-style license 4 * Use of this source code is governed by a BSD-style license
5 * that can be found in the LICENSE file in the root of the source 5 * that can be found in the LICENSE file in the root of the source
6 * tree. An additional intellectual property rights grant can be found 6 * tree. An additional intellectual property rights grant can be found
7 * in the file PATENTS. All contributing project authors may 7 * in the file PATENTS. All contributing project authors may
8 * be found in the AUTHORS file in the root of the source tree. 8 * be found in the AUTHORS file in the root of the source tree.
9 */ 9 */
10 10
11 #include "webrtc/modules/congestion_controller/probe_controller.h" 11 #include "webrtc/modules/congestion_controller/probe_controller.h"
12 12
13 #include <algorithm> 13 #include <algorithm>
14 #include <initializer_list> 14 #include <initializer_list>
15 15
16 #include "webrtc/base/logging.h" 16 #include "webrtc/base/logging.h"
17 #include "webrtc/system_wrappers/include/metrics.h"
17 18
18 namespace webrtc { 19 namespace webrtc {
19 20
20 namespace { 21 namespace {
21 22
22 // Number of deltas between probes per cluster. On the very first cluster, 23 // Number of deltas between probes per cluster. On the very first cluster,
23 // we will need kProbeDeltasPerCluster + 1 probes, but on a cluster following 24 // we will need kProbeDeltasPerCluster + 1 probes, but on a cluster following
24 // another, we need kProbeDeltasPerCluster probes. 25 // another, we need kProbeDeltasPerCluster probes.
25 constexpr int kProbeDeltasPerCluster = 5; 26 constexpr int kProbeDeltasPerCluster = 5;
26 27
27 // Maximum waiting time from the time of initiating probing to getting 28 // Maximum waiting time from the time of initiating probing to getting
28 // the measured results back. 29 // the measured results back.
29 constexpr int64_t kMaxWaitingTimeForProbingResultMs = 1000; 30 constexpr int64_t kMaxWaitingTimeForProbingResultMs = 1000;
30 31
31 // Value of |min_bitrate_to_probe_further_bps_| that indicates 32 // Value of |min_bitrate_to_probe_further_bps_| that indicates
32 // further probing is disabled. 33 // further probing is disabled.
33 constexpr int kExponentialProbingDisabled = 0; 34 constexpr int kExponentialProbingDisabled = 0;
34 35
35 // A limit to prevent probing at excessive bitrates. 36 // A limit to prevent probing at excessive bitrates.
36 constexpr int kMaxProbingBitrateBps = 10000000; 37 constexpr int kMaxProbingBitrateBps = 10000000;
37 38
39 // This is a limit on how often probing can be done when there is a BW
40 // drop detected in ALR region.
41 constexpr int kAlrProbingIntervalLimitMs = 5000;
42
38 } // namespace 43 } // namespace
39 44
40 ProbeController::ProbeController(PacedSender* pacer, Clock* clock) 45 ProbeController::ProbeController(PacedSender* pacer, Clock* clock)
41 : pacer_(pacer), 46 : pacer_(pacer),
42 clock_(clock), 47 clock_(clock),
43 state_(State::kInit), 48 state_(State::kInit),
44 min_bitrate_to_probe_further_bps_(kExponentialProbingDisabled), 49 min_bitrate_to_probe_further_bps_(kExponentialProbingDisabled),
45 time_last_probing_initiated_ms_(0), 50 time_last_probing_initiated_ms_(0),
46 estimated_bitrate_bps_(0), 51 estimated_bitrate_bps_(0),
47 max_bitrate_bps_(0) {} 52 max_bitrate_bps_(0),
53 last_alr_probing_time_(clock_->TimeInMilliseconds()) {}
48 54
49 void ProbeController::SetBitrates(int min_bitrate_bps, 55 void ProbeController::SetBitrates(int min_bitrate_bps,
50 int start_bitrate_bps, 56 int start_bitrate_bps,
51 int max_bitrate_bps) { 57 int max_bitrate_bps) {
52 rtc::CritScope cs(&critsect_); 58 rtc::CritScope cs(&critsect_);
53 if (state_ == State::kInit) { 59 if (state_ == State::kInit) {
54 // When probing at 1.8 Mbps ( 6x 300), this represents a threshold of 60 // When probing at 1.8 Mbps ( 6x 300), this represents a threshold of
55 // 1.2 Mbps to continue probing. 61 // 1.2 Mbps to continue probing.
56 InitiateProbing({3 * start_bitrate_bps, 6 * start_bitrate_bps}, 62 InitiateProbing({3 * start_bitrate_bps, 6 * start_bitrate_bps},
57 4 * start_bitrate_bps); 63 4 * start_bitrate_bps);
(...skipping 27 matching lines...) Expand all
85 LOG(LS_INFO) << "Measured bitrate: " << bitrate_bps 91 LOG(LS_INFO) << "Measured bitrate: " << bitrate_bps
86 << " Minimum to probe further: " 92 << " Minimum to probe further: "
87 << min_bitrate_to_probe_further_bps_; 93 << min_bitrate_to_probe_further_bps_;
88 if (min_bitrate_to_probe_further_bps_ != kExponentialProbingDisabled && 94 if (min_bitrate_to_probe_further_bps_ != kExponentialProbingDisabled &&
89 bitrate_bps > min_bitrate_to_probe_further_bps_) { 95 bitrate_bps > min_bitrate_to_probe_further_bps_) {
90 // Double the probing bitrate and expect a minimum of 25% gain to 96 // Double the probing bitrate and expect a minimum of 25% gain to
91 // continue probing. 97 // continue probing.
92 InitiateProbing({2 * bitrate_bps}, 1.25 * bitrate_bps); 98 InitiateProbing({2 * bitrate_bps}, 1.25 * bitrate_bps);
93 } 99 }
94 } 100 }
101 } else {
102 // A drop in estimated BW when operating in ALR and not already probing.
103 // The current response is to initiate a single probe session at the
104 // previous bitrate and immediately use the reported bitrate as the new
105 // bitrate.
106 //
107 // If the probe session fails, the assumption is that this drop was a
108 // real one from a competing flow or something else on the network and
109 // it ramps up from bitrate_bps.
110 if (pacer_->InApplicationLimitedRegion() &&
111 bitrate_bps < 0.5 * estimated_bitrate_bps_) {
112 int64_t now_ms = clock_->TimeInMilliseconds();
113 if ((now_ms - last_alr_probing_time_) > kAlrProbingIntervalLimitMs) {
114 LOG(LS_INFO) << "Detected big BW drop in ALR, start probe.";
115 // Track how often we probe in response to BW drop in ALR.
116 RTC_HISTOGRAM_COUNTS_10000("WebRTC.BWE.AlrProbingIntervalInS",
117 (now_ms - last_alr_probing_time_) / 1000);
118 InitiateProbing({estimated_bitrate_bps_}, kExponentialProbingDisabled);
119 last_alr_probing_time_ = now_ms;
120 }
121 }
122 // TODO(isheriff): May want to track when we did ALR probing in order
123 // to reset |last_alr_probing_time_| if we validate that it was a
124 // drop due to exogenous event.
95 } 125 }
96 estimated_bitrate_bps_ = bitrate_bps; 126 estimated_bitrate_bps_ = bitrate_bps;
97 } 127 }
98 128
99 void ProbeController::InitiateProbing( 129 void ProbeController::InitiateProbing(
100 std::initializer_list<int> bitrates_to_probe, 130 std::initializer_list<int> bitrates_to_probe,
101 int min_bitrate_to_probe_further_bps) { 131 int min_bitrate_to_probe_further_bps) {
102 bool first_cluster = true; 132 bool first_cluster = true;
103 for (int bitrate : bitrates_to_probe) { 133 for (int bitrate : bitrates_to_probe) {
104 bitrate = std::min(bitrate, kMaxProbingBitrateBps); 134 bitrate = std::min(bitrate, kMaxProbingBitrateBps);
105 if (first_cluster) { 135 if (first_cluster) {
106 pacer_->CreateProbeCluster(bitrate, kProbeDeltasPerCluster + 1); 136 pacer_->CreateProbeCluster(bitrate, kProbeDeltasPerCluster + 1);
107 first_cluster = false; 137 first_cluster = false;
108 } else { 138 } else {
109 pacer_->CreateProbeCluster(bitrate, kProbeDeltasPerCluster); 139 pacer_->CreateProbeCluster(bitrate, kProbeDeltasPerCluster);
110 } 140 }
111 } 141 }
112 min_bitrate_to_probe_further_bps_ = min_bitrate_to_probe_further_bps; 142 min_bitrate_to_probe_further_bps_ = min_bitrate_to_probe_further_bps;
113 time_last_probing_initiated_ms_ = clock_->TimeInMilliseconds(); 143 time_last_probing_initiated_ms_ = clock_->TimeInMilliseconds();
114 if (min_bitrate_to_probe_further_bps == kExponentialProbingDisabled) 144 if (min_bitrate_to_probe_further_bps == kExponentialProbingDisabled)
115 state_ = State::kProbingComplete; 145 state_ = State::kProbingComplete;
116 else 146 else
117 state_ = State::kWaitingForProbingResult; 147 state_ = State::kWaitingForProbingResult;
118 } 148 }
119 149
120 } // namespace webrtc 150 } // namespace webrtc
OLDNEW
« no previous file with comments | « webrtc/modules/congestion_controller/probe_controller.h ('k') | webrtc/modules/pacing/paced_sender.h » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698