From d7a418f93a5f7a91af41fc831c607ff36df56d40 Mon Sep 17 00:00:00 2001 From: stefan Date: Tue, 8 Aug 2017 06:51:05 -0700 Subject: [PATCH] Add an experiment for stricter pacing and ALR probing. BUG=webrtc:8072 Review-Url: https://codereview.webrtc.org/2994623002 Cr-Commit-Position: refs/heads/master@{#19270} --- webrtc/modules/pacing/alr_detector.cc | 21 ++++++++++++++----- webrtc/modules/pacing/alr_detector.h | 4 +++- webrtc/video/video_send_stream.cc | 29 ++++++++++++++++++--------- 3 files changed, 38 insertions(+), 16 deletions(-) diff --git a/webrtc/modules/pacing/alr_detector.cc b/webrtc/modules/pacing/alr_detector.cc index 93752cf751..dcb0627fb8 100644 --- a/webrtc/modules/pacing/alr_detector.cc +++ b/webrtc/modules/pacing/alr_detector.cc @@ -22,14 +22,24 @@ namespace webrtc { const char* AlrDetector::kScreenshareProbingBweExperimentName = "WebRTC-ProbingScreenshareBwe"; +const char* AlrDetector::kStrictPacingAndProbingExperimentName = + "WebRTC-StrictPacingAndProbing"; AlrDetector::AlrDetector() : bandwidth_usage_percent_(kDefaultAlrBandwidthUsagePercent), alr_start_budget_level_percent_(kDefaultAlrStartBudgetLevelPercent), alr_stop_budget_level_percent_(kDefaultAlrStopBudgetLevelPercent), alr_budget_(0, true) { + RTC_CHECK( + field_trial::FindFullName(kStrictPacingAndProbingExperimentName) + .empty() || + field_trial::FindFullName(kScreenshareProbingBweExperimentName).empty()); rtc::Optional experiment_settings = - ParseAlrSettingsFromFieldTrial(); + ParseAlrSettingsFromFieldTrial(kScreenshareProbingBweExperimentName); + if (!experiment_settings) { + experiment_settings = + ParseAlrSettingsFromFieldTrial(kStrictPacingAndProbingExperimentName); + } if (experiment_settings) { alr_stop_budget_level_percent_ = experiment_settings->alr_stop_budget_level_percent; @@ -67,10 +77,9 @@ rtc::Optional AlrDetector::GetApplicationLimitedRegionStartTime() } rtc::Optional -AlrDetector::ParseAlrSettingsFromFieldTrial() { +AlrDetector::ParseAlrSettingsFromFieldTrial(const char* experiment_name) { rtc::Optional ret; - std::string group_name = - field_trial::FindFullName(kScreenshareProbingBweExperimentName); + std::string group_name = field_trial::FindFullName(experiment_name); const std::string kIgnoredSuffix = "_Dogfood"; if (group_name.rfind(kIgnoredSuffix) == @@ -88,7 +97,7 @@ AlrDetector::ParseAlrSettingsFromFieldTrial() { &settings.alr_start_budget_level_percent, &settings.alr_stop_budget_level_percent) == 5) { ret.emplace(settings); - LOG(LS_INFO) << "Using screenshare ALR experiment settings: " + LOG(LS_INFO) << "Using ALR experiment settings: " "pacing factor: " << settings.pacing_factor << ", max pacer queue length: " << settings.max_paced_queue_time @@ -98,6 +107,8 @@ AlrDetector::ParseAlrSettingsFromFieldTrial() { << settings.alr_start_budget_level_percent << ", ALR end budget level percent: " << settings.alr_stop_budget_level_percent; + } else { + LOG(LS_INFO) << "Failed to parse ALR experiment: " << experiment_name; } return ret; diff --git a/webrtc/modules/pacing/alr_detector.h b/webrtc/modules/pacing/alr_detector.h index 7e630970e6..250002d9fb 100644 --- a/webrtc/modules/pacing/alr_detector.h +++ b/webrtc/modules/pacing/alr_detector.h @@ -48,7 +48,8 @@ class AlrDetector { int alr_start_budget_level_percent = kDefaultAlrStartBudgetLevelPercent; int alr_stop_budget_level_percent = kDefaultAlrStopBudgetLevelPercent; }; - static rtc::Optional ParseAlrSettingsFromFieldTrial(); + static rtc::Optional ParseAlrSettingsFromFieldTrial( + const char* experiment_name); // Sent traffic percentage as a function of network capacity used to determine // application-limited region. ALR region start when bandwidth usage drops @@ -59,6 +60,7 @@ class AlrDetector { static constexpr int kDefaultAlrStartBudgetLevelPercent = 80; static constexpr int kDefaultAlrStopBudgetLevelPercent = 50; static const char* kScreenshareProbingBweExperimentName; + static const char* kStrictPacingAndProbingExperimentName; void UpdateBudgetWithElapsedTime(int64_t delta_time_ms); void UpdateBudgetWithBytesSent(size_t bytes_sent); diff --git a/webrtc/video/video_send_stream.cc b/webrtc/video/video_send_stream.cc index 8d587f82b3..c2231311f0 100644 --- a/webrtc/video/video_send_stream.cc +++ b/webrtc/video/video_send_stream.cc @@ -828,17 +828,26 @@ VideoSendStreamImpl::VideoSendStreamImpl( RTC_DCHECK(call_stats_); RTC_DCHECK(transport_); RTC_DCHECK(transport_->send_side_cc()); - + RTC_CHECK(field_trial::FindFullName( + AlrDetector::kStrictPacingAndProbingExperimentName) + .empty() || + field_trial::FindFullName( + AlrDetector::kScreenshareProbingBweExperimentName) + .empty()); + rtc::Optional alr_settings; if (content_type == VideoEncoderConfig::ContentType::kScreen) { - rtc::Optional alr_settings = - AlrDetector::ParseAlrSettingsFromFieldTrial(); - if (alr_settings) { - transport->send_side_cc()->EnablePeriodicAlrProbing(true); - transport->send_side_cc()->pacer()->SetPacingFactor( - alr_settings->pacing_factor); - transport->send_side_cc()->pacer()->SetQueueTimeLimit( - alr_settings->max_paced_queue_time); - } + alr_settings = AlrDetector::ParseAlrSettingsFromFieldTrial( + AlrDetector::kScreenshareProbingBweExperimentName); + } else { + alr_settings = AlrDetector::ParseAlrSettingsFromFieldTrial( + AlrDetector::kStrictPacingAndProbingExperimentName); + } + if (alr_settings) { + transport->send_side_cc()->EnablePeriodicAlrProbing(true); + transport->send_side_cc()->pacer()->SetPacingFactor( + alr_settings->pacing_factor); + transport->send_side_cc()->pacer()->SetQueueTimeLimit( + alr_settings->max_paced_queue_time); } if (config_->periodic_alr_bandwidth_probing) {