blob: 0d43fbb8f2f6eec5f72f25a446e97ba9d83f46a6 [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#ifndef WEBRTC_MODULES_PACING_ALR_DETECTOR_H_
12#define WEBRTC_MODULES_PACING_ALR_DETECTOR_H_
13
kwiberg84f6a3f2017-09-05 08:43:13 -070014#include "webrtc/api/optional.h"
isheriff31687812016-10-04 08:43:09 -070015#include "webrtc/common_types.h"
tschumim82c55932017-07-11 06:56:04 -070016#include "webrtc/modules/pacing/interval_budget.h"
isheriff31687812016-10-04 08:43:09 -070017#include "webrtc/modules/pacing/paced_sender.h"
Edward Lemurc20978e2017-07-06 19:44:34 +020018#include "webrtc/rtc_base/rate_statistics.h"
isheriff31687812016-10-04 08:43:09 -070019#include "webrtc/typedefs.h"
20
21namespace webrtc {
22
23// Application limited region detector is a class that utilizes signals of
24// elapsed time and bytes sent to estimate whether network traffic is
25// currently limited by the application's ability to generate traffic.
26//
27// AlrDetector provides a signal that can be utilized to adjust
28// estimate bandwidth.
29// Note: This class is not thread-safe.
30class AlrDetector {
31 public:
32 AlrDetector();
33 ~AlrDetector();
Sergey Ulanov0182f852016-11-16 15:42:11 -080034
tschumim82c55932017-07-11 06:56:04 -070035 void OnBytesSent(size_t bytes_sent, int64_t delta_time_ms);
Sergey Ulanov0182f852016-11-16 15:42:11 -080036
isheriff31687812016-10-04 08:43:09 -070037 // Set current estimated bandwidth.
38 void SetEstimatedBitrate(int bitrate_bps);
Sergey Ulanov0182f852016-11-16 15:42:11 -080039
sergeyu80ed35e2016-11-28 13:11:13 -080040 // Returns time in milliseconds when the current application-limited region
41 // started or empty result if the sender is currently not application-limited.
42 rtc::Optional<int64_t> GetApplicationLimitedRegionStartTime() const;
isheriff31687812016-10-04 08:43:09 -070043
sprang89c4a7e2017-06-30 13:27:40 -070044 struct AlrExperimentSettings {
45 float pacing_factor = PacedSender::kDefaultPaceMultiplier;
46 int64_t max_paced_queue_time = PacedSender::kMaxQueueLengthMs;
tschumim82c55932017-07-11 06:56:04 -070047 int alr_bandwidth_usage_percent = kDefaultAlrBandwidthUsagePercent;
48 int alr_start_budget_level_percent = kDefaultAlrStartBudgetLevelPercent;
49 int alr_stop_budget_level_percent = kDefaultAlrStopBudgetLevelPercent;
ilnik6d5b4d62017-08-30 03:32:14 -070050 // Will be sent to the receive side for stats slicing.
51 // Can be 0..6, because it's sent as a 3 bits value and there's also
52 // reserved value to indicate absence of experiment.
53 int group_id = 0;
sprang89c4a7e2017-06-30 13:27:40 -070054 };
stefand7a418f2017-08-08 06:51:05 -070055 static rtc::Optional<AlrExperimentSettings> ParseAlrSettingsFromFieldTrial(
56 const char* experiment_name);
sprang89c4a7e2017-06-30 13:27:40 -070057
58 // Sent traffic percentage as a function of network capacity used to determine
59 // application-limited region. ALR region start when bandwidth usage drops
60 // below kAlrStartUsagePercent and ends when it raises above
61 // kAlrEndUsagePercent. NOTE: This is intentionally conservative at the moment
62 // until BW adjustments of application limited region is fine tuned.
tschumim82c55932017-07-11 06:56:04 -070063 static constexpr int kDefaultAlrBandwidthUsagePercent = 65;
tschumim9d117642017-07-17 01:41:41 -070064 static constexpr int kDefaultAlrStartBudgetLevelPercent = 80;
65 static constexpr int kDefaultAlrStopBudgetLevelPercent = 50;
agrieve26622d32017-08-08 10:48:15 -070066 static const char kScreenshareProbingBweExperimentName[];
67 static const char kStrictPacingAndProbingExperimentName[];
sprang89c4a7e2017-06-30 13:27:40 -070068
tschumim82c55932017-07-11 06:56:04 -070069 void UpdateBudgetWithElapsedTime(int64_t delta_time_ms);
70 void UpdateBudgetWithBytesSent(size_t bytes_sent);
sergeyu80ed35e2016-11-28 13:11:13 -080071
tschumim82c55932017-07-11 06:56:04 -070072 private:
73 int bandwidth_usage_percent_;
74 int alr_start_budget_level_percent_;
75 int alr_stop_budget_level_percent_;
76
77 IntervalBudget alr_budget_;
sergeyu80ed35e2016-11-28 13:11:13 -080078 rtc::Optional<int64_t> alr_started_time_ms_;
isheriff31687812016-10-04 08:43:09 -070079};
80
81} // namespace webrtc
82
83#endif // WEBRTC_MODULES_PACING_ALR_DETECTOR_H_