blob: 993c6cd07edde5b87d2ea5f4b061dc5c183c5a40 [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
11#include "webrtc/modules/pacing/alr_detector.h"
12
sprang89c4a7e2017-06-30 13:27:40 -070013#include <string>
14
Edward Lemurc20978e2017-07-06 19:44:34 +020015#include "webrtc/rtc_base/checks.h"
16#include "webrtc/rtc_base/format_macros.h"
17#include "webrtc/rtc_base/logging.h"
tschumim82c55932017-07-11 06:56:04 -070018#include "webrtc/rtc_base/timeutils.h"
sprang89c4a7e2017-06-30 13:27:40 -070019#include "webrtc/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);
tschumim82c55932017-07-11 06:56:04 -070070 alr_budget_.set_target_rate_kbps(bitrate_bps * bandwidth_usage_percent_ /
71 (1000 * 100));
isheriff31687812016-10-04 08:43:09 -070072}
73
sergeyu80ed35e2016-11-28 13:11:13 -080074rtc::Optional<int64_t> AlrDetector::GetApplicationLimitedRegionStartTime()
75 const {
76 return alr_started_time_ms_;
isheriff31687812016-10-04 08:43:09 -070077}
78
sprang89c4a7e2017-06-30 13:27:40 -070079rtc::Optional<AlrDetector::AlrExperimentSettings>
stefand7a418f2017-08-08 06:51:05 -070080AlrDetector::ParseAlrSettingsFromFieldTrial(const char* experiment_name) {
sprang89c4a7e2017-06-30 13:27:40 -070081 rtc::Optional<AlrExperimentSettings> ret;
stefand7a418f2017-08-08 06:51:05 -070082 std::string group_name = field_trial::FindFullName(experiment_name);
sprang89c4a7e2017-06-30 13:27:40 -070083
84 const std::string kIgnoredSuffix = "_Dogfood";
85 if (group_name.rfind(kIgnoredSuffix) ==
86 group_name.length() - kIgnoredSuffix.length()) {
87 group_name.resize(group_name.length() - kIgnoredSuffix.length());
88 }
89
90 if (group_name.empty())
91 return ret;
92
93 AlrExperimentSettings settings;
tschumim82c55932017-07-11 06:56:04 -070094 if (sscanf(group_name.c_str(), "%f,%" PRId64 ",%d,%d,%d",
sprang89c4a7e2017-06-30 13:27:40 -070095 &settings.pacing_factor, &settings.max_paced_queue_time,
tschumim82c55932017-07-11 06:56:04 -070096 &settings.alr_bandwidth_usage_percent,
97 &settings.alr_start_budget_level_percent,
98 &settings.alr_stop_budget_level_percent) == 5) {
sprang89c4a7e2017-06-30 13:27:40 -070099 ret.emplace(settings);
stefand7a418f2017-08-08 06:51:05 -0700100 LOG(LS_INFO) << "Using ALR experiment settings: "
sprang89c4a7e2017-06-30 13:27:40 -0700101 "pacing factor: "
102 << settings.pacing_factor << ", max pacer queue length: "
103 << settings.max_paced_queue_time
tschumim82c55932017-07-11 06:56:04 -0700104 << ", ALR start bandwidth usage percent: "
105 << settings.alr_bandwidth_usage_percent
106 << ", ALR end budget level percent: "
107 << settings.alr_start_budget_level_percent
108 << ", ALR end budget level percent: "
109 << settings.alr_stop_budget_level_percent;
stefand7a418f2017-08-08 06:51:05 -0700110 } else {
111 LOG(LS_INFO) << "Failed to parse ALR experiment: " << experiment_name;
sprang89c4a7e2017-06-30 13:27:40 -0700112 }
113
114 return ret;
115}
116
isheriff31687812016-10-04 08:43:09 -0700117} // namespace webrtc