blob: c26225162e1cb63b4f40991d76261ebcffcef886 [file] [log] [blame]
isheriff31687812016-10-04 08:43:09 -07001/*
2 * Copyright (c) 2016 The WebRTC project authors. All Rights Reserved.
3 *
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
6 * tree. An additional intellectual property rights grant can be found
7 * in the file PATENTS. All contributing project authors may
8 * be found in the AUTHORS file in the root of the source tree.
9 */
10
Mirko Bonadei92ea95e2017-09-15 06:47:31 +020011#include "modules/pacing/alr_detector.h"
isheriff31687812016-10-04 08:43:09 -070012
sprang89c4a7e2017-06-30 13:27:40 -070013#include <string>
14
Mirko Bonadei92ea95e2017-09-15 06:47:31 +020015#include "rtc_base/checks.h"
16#include "rtc_base/format_macros.h"
17#include "rtc_base/logging.h"
18#include "rtc_base/timeutils.h"
19#include "system_wrappers/include/field_trial.h"
isheriff31687812016-10-04 08:43:09 -070020
isheriff31687812016-10-04 08:43:09 -070021namespace webrtc {
22
agrieve26622d32017-08-08 10:48:15 -070023const char AlrDetector::kScreenshareProbingBweExperimentName[] =
sprang89c4a7e2017-06-30 13:27:40 -070024 "WebRTC-ProbingScreenshareBwe";
agrieve26622d32017-08-08 10:48:15 -070025const char AlrDetector::kStrictPacingAndProbingExperimentName[] =
stefand7a418f2017-08-08 06:51:05 -070026 "WebRTC-StrictPacingAndProbing";
sprang89c4a7e2017-06-30 13:27:40 -070027
isheriff31687812016-10-04 08:43:09 -070028AlrDetector::AlrDetector()
tschumim82c55932017-07-11 06:56:04 -070029 : bandwidth_usage_percent_(kDefaultAlrBandwidthUsagePercent),
30 alr_start_budget_level_percent_(kDefaultAlrStartBudgetLevelPercent),
31 alr_stop_budget_level_percent_(kDefaultAlrStopBudgetLevelPercent),
32 alr_budget_(0, true) {
stefand7a418f2017-08-08 06:51:05 -070033 RTC_CHECK(
34 field_trial::FindFullName(kStrictPacingAndProbingExperimentName)
35 .empty() ||
36 field_trial::FindFullName(kScreenshareProbingBweExperimentName).empty());
sprang89c4a7e2017-06-30 13:27:40 -070037 rtc::Optional<AlrExperimentSettings> experiment_settings =
stefand7a418f2017-08-08 06:51:05 -070038 ParseAlrSettingsFromFieldTrial(kScreenshareProbingBweExperimentName);
39 if (!experiment_settings) {
40 experiment_settings =
41 ParseAlrSettingsFromFieldTrial(kStrictPacingAndProbingExperimentName);
42 }
sprang89c4a7e2017-06-30 13:27:40 -070043 if (experiment_settings) {
tschumim82c55932017-07-11 06:56:04 -070044 alr_stop_budget_level_percent_ =
45 experiment_settings->alr_stop_budget_level_percent;
46 alr_start_budget_level_percent_ =
47 experiment_settings->alr_start_budget_level_percent;
48 bandwidth_usage_percent_ = experiment_settings->alr_bandwidth_usage_percent;
sprang89c4a7e2017-06-30 13:27:40 -070049 }
50}
isheriff31687812016-10-04 08:43:09 -070051
52AlrDetector::~AlrDetector() {}
53
tschumim82c55932017-07-11 06:56:04 -070054void AlrDetector::OnBytesSent(size_t bytes_sent, int64_t delta_time_ms) {
55 alr_budget_.UseBudget(bytes_sent);
56 alr_budget_.IncreaseBudget(delta_time_ms);
Sergey Ulanov0182f852016-11-16 15:42:11 -080057
tschumim82c55932017-07-11 06:56:04 -070058 if (alr_budget_.budget_level_percent() > alr_start_budget_level_percent_ &&
59 !alr_started_time_ms_) {
60 alr_started_time_ms_.emplace(rtc::TimeMillis());
61 } else if (alr_budget_.budget_level_percent() <
62 alr_stop_budget_level_percent_ &&
63 alr_started_time_ms_) {
64 alr_started_time_ms_.reset();
isheriff31687812016-10-04 08:43:09 -070065 }
66}
67
68void AlrDetector::SetEstimatedBitrate(int bitrate_bps) {
69 RTC_DCHECK(bitrate_bps);
oprypinba09f792017-09-04 08:32:43 -070070 const auto target_rate_kbps = int64_t{bitrate_bps} *
71 bandwidth_usage_percent_ / (1000 * 100);
72 alr_budget_.set_target_rate_kbps(rtc::dchecked_cast<int>(target_rate_kbps));
isheriff31687812016-10-04 08:43:09 -070073}
74
sergeyu80ed35e2016-11-28 13:11:13 -080075rtc::Optional<int64_t> AlrDetector::GetApplicationLimitedRegionStartTime()
76 const {
77 return alr_started_time_ms_;
isheriff31687812016-10-04 08:43:09 -070078}
79
sprang89c4a7e2017-06-30 13:27:40 -070080rtc::Optional<AlrDetector::AlrExperimentSettings>
stefand7a418f2017-08-08 06:51:05 -070081AlrDetector::ParseAlrSettingsFromFieldTrial(const char* experiment_name) {
sprang89c4a7e2017-06-30 13:27:40 -070082 rtc::Optional<AlrExperimentSettings> ret;
stefand7a418f2017-08-08 06:51:05 -070083 std::string group_name = field_trial::FindFullName(experiment_name);
sprang89c4a7e2017-06-30 13:27:40 -070084
85 const std::string kIgnoredSuffix = "_Dogfood";
Erik Språngb378a222017-10-02 13:25:38 +020086 std::string::size_type suffix_pos = group_name.rfind(kIgnoredSuffix);
87 if (suffix_pos != std::string::npos &&
88 suffix_pos == group_name.length() - kIgnoredSuffix.length()) {
sprang89c4a7e2017-06-30 13:27:40 -070089 group_name.resize(group_name.length() - kIgnoredSuffix.length());
90 }
91
92 if (group_name.empty())
93 return ret;
94
95 AlrExperimentSettings settings;
ilnik6d5b4d62017-08-30 03:32:14 -070096 if (sscanf(group_name.c_str(), "%f,%" PRId64 ",%d,%d,%d,%d",
sprang89c4a7e2017-06-30 13:27:40 -070097 &settings.pacing_factor, &settings.max_paced_queue_time,
tschumim82c55932017-07-11 06:56:04 -070098 &settings.alr_bandwidth_usage_percent,
99 &settings.alr_start_budget_level_percent,
ilnik6d5b4d62017-08-30 03:32:14 -0700100 &settings.alr_stop_budget_level_percent,
101 &settings.group_id) == 6) {
sprang89c4a7e2017-06-30 13:27:40 -0700102 ret.emplace(settings);
Mirko Bonadei675513b2017-11-09 11:09:25 +0100103 RTC_LOG(LS_INFO) << "Using ALR experiment settings: "
104 "pacing factor: "
105 << settings.pacing_factor << ", max pacer queue length: "
106 << settings.max_paced_queue_time
107 << ", ALR start bandwidth usage percent: "
108 << settings.alr_bandwidth_usage_percent
109 << ", ALR end budget level percent: "
110 << settings.alr_start_budget_level_percent
111 << ", ALR end budget level percent: "
112 << settings.alr_stop_budget_level_percent
113 << ", ALR experiment group ID: " << settings.group_id;
stefand7a418f2017-08-08 06:51:05 -0700114 } else {
Mirko Bonadei675513b2017-11-09 11:09:25 +0100115 RTC_LOG(LS_INFO) << "Failed to parse ALR experiment: " << experiment_name;
sprang89c4a7e2017-06-30 13:27:40 -0700116 }
117
118 return ret;
119}
120
isheriff31687812016-10-04 08:43:09 -0700121} // namespace webrtc