Chromium Code Reviews| Index: webrtc/modules/remote_bitrate_estimator/overuse_detector.cc |
| diff --git a/webrtc/modules/remote_bitrate_estimator/overuse_detector.cc b/webrtc/modules/remote_bitrate_estimator/overuse_detector.cc |
| index 33b234c1f3aee2d962fe301a58cf8ec225af5750..3c29b3529855d97ff776106bef3eca246f93db3a 100644 |
| --- a/webrtc/modules/remote_bitrate_estimator/overuse_detector.cc |
| +++ b/webrtc/modules/remote_bitrate_estimator/overuse_detector.cc |
| @@ -11,25 +11,51 @@ |
| #include "webrtc/modules/remote_bitrate_estimator/overuse_detector.h" |
| #include <algorithm> |
| +#include <sstream> |
| #include <math.h> |
| #include <stdlib.h> |
| +#include "webrtc/base/checks.h" |
| +#include "webrtc/base/common.h" |
| #include "webrtc/modules/remote_bitrate_estimator/include/bwe_defines.h" |
| #include "webrtc/modules/remote_bitrate_estimator/test/bwe_test_logging.h" |
| #include "webrtc/modules/rtp_rtcp/source/rtp_utility.h" |
| +#include "webrtc/system_wrappers/interface/field_trial.h" |
| #include "webrtc/system_wrappers/interface/trace.h" |
| namespace webrtc { |
| -enum { kOverUsingTimeThreshold = 100 }; |
| +const char* kAdaptiveThresholdExperiment = "WebRTC-AdaptiveBweThreshold"; |
| +const char* kEnabledPrefix = "Enabled"; |
| +const size_t kEnabledPrefixLength = sizeof(kEnabledPrefix) - 1; |
| +const size_t kMinExperimentLength = kEnabledPrefixLength + 3; |
| + |
| +const double kMaxAdaptOffsetMs = 15.0; |
| +const double kOverUsingTimeThreshold = 10; |
| + |
| +bool AdaptiveThresholdExperimentIsEnabled() { |
| + std::string experiment_string = |
| + webrtc::field_trial::FindFullName(kAdaptiveThresholdExperiment); |
| + if (experiment_string.length() < kMinExperimentLength) |
| + return false; |
| + return experiment_string.substr(0, kEnabledPrefixLength) == kEnabledPrefix; |
| +} |
| OveruseDetector::OveruseDetector(const OverUseDetectorOptions& options) |
| - : options_(options), |
| - threshold_(options_.initial_threshold), |
| + : in_experiment_(AdaptiveThresholdExperimentIsEnabled()), |
| + k_up_(0.01), |
| + k_down_(0.00018), |
| + overusing_time_threshold_(100), |
| + options_(options), |
| + threshold_(12.5), |
| + last_update_ms_(-1), |
| prev_offset_(0.0), |
| time_over_using_(-1), |
| overuse_counter_(0), |
| - hypothesis_(kBwNormal) {} |
| + hypothesis_(kBwNormal) { |
| + if (in_experiment_) |
| + InitializeExperiment(); |
| +} |
| OveruseDetector::~OveruseDetector() {} |
| @@ -37,21 +63,6 @@ BandwidthUsage OveruseDetector::State() const { |
| return hypothesis_; |
| } |
| - |
| -void OveruseDetector::SetRateControlRegion(RateControlRegion region) { |
| - switch (region) { |
| - case kRcMaxUnknown: { |
| - threshold_ = options_.initial_threshold; |
| - break; |
| - } |
| - case kRcAboveMax: |
| - case kRcNearMax: { |
| - threshold_ = options_.initial_threshold / 2; |
| - break; |
| - } |
| - } |
| -} |
| - |
| BandwidthUsage OveruseDetector::Detect(double offset, |
| double ts_delta, |
| int num_of_deltas, |
| @@ -64,7 +75,6 @@ BandwidthUsage OveruseDetector::Detect(double offset, |
| const double T = std::min(num_of_deltas, 60) * offset; |
| BWE_TEST_LOGGING_PLOT(1, "offset", now_ms, T); |
| BWE_TEST_LOGGING_PLOT(1, "threshold", now_ms, threshold_); |
| - |
| if (T > threshold_) { |
| if (time_over_using_ == -1) { |
| // Initialize the timer. Assume that we've been |
| @@ -93,6 +103,62 @@ BandwidthUsage OveruseDetector::Detect(double offset, |
| overuse_counter_ = 0; |
| hypothesis_ = kBwNormal; |
| } |
| + |
| + UpdateThreshold(T, now_ms); |
| + |
| return hypothesis_; |
| } |
| + |
| +void OveruseDetector::UpdateThreshold(double modified_offset, int64_t now_ms) { |
| + if (!in_experiment_) |
| + return; |
| + |
| + if (last_update_ms_ == -1) |
| + last_update_ms_ = now_ms; |
| + |
| + if (fabs(modified_offset) > threshold_ + kMaxAdaptOffsetMs) { |
| + // Avoid adapting the threshold to big latency spikes, caused e.g., |
| + // by a sudden capacity drop. |
| + last_update_ms_ = now_ms; |
| + return; |
| + } |
| + |
| + const double k = fabs(modified_offset) < threshold_ ? k_down_ : k_up_; |
| + threshold_ += |
| + k * (fabs(modified_offset) - threshold_) * (now_ms - last_update_ms_); |
| + |
| + const double kMinThreshold = 6; |
| + const double kMaxThreshold = 600; |
| + threshold_ = std::min(std::max(threshold_, kMinThreshold), kMaxThreshold); |
| + |
| + last_update_ms_ = now_ms; |
| +} |
| + |
| +// Gets thresholds from the experiment name following the format |
| +// "WebRTC-AdaptiveBweThreshold/Enabled-0.5,0.002/". |
| +void OveruseDetector::InitializeExperiment() { |
| + DCHECK(in_experiment_); |
|
pbos-webrtc
2015/07/06 13:30:17
If this is now the only place where in_experiment_
|
| + double k_up = 0.0; |
| + double k_down = 0.0; |
| + overusing_time_threshold_ = kOverUsingTimeThreshold; |
| + if (ReadExperimentConstants(&k_up, &k_down)) { |
| + k_up_ = k_up; |
| + k_down_ = k_down; |
| + } |
| +} |
| + |
| +bool OveruseDetector::ReadExperimentConstants(double* k_up, |
| + double* k_down) const { |
| + std::string experiment_string = |
| + webrtc::field_trial::FindFullName(kAdaptiveThresholdExperiment); |
| + std::stringstream ss(experiment_string.substr(kEnabledPrefixLength + 1)); |
|
pbos-webrtc
2015/07/06 13:30:17
Easier to do this?
return sscanf(experiment_stri
|
| + ss >> *k_up; |
| + if (ss.peek() != ',') |
| + return false; |
| + ss.ignore(); |
| + ss >> *k_down; |
| + if (ss.rdbuf()->in_avail() > 0) |
| + return false; |
| + return true; |
| +} |
| } // namespace webrtc |