blob: 70662fa00f2287f3a1d37a30c269ddd685866269 [file] [log] [blame]
Irfan Sheriffb2540bb2016-09-12 12:28:54 -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#ifndef MODULES_CONGESTION_CONTROLLER_PROBE_CONTROLLER_H_
12#define MODULES_CONGESTION_CONTROLLER_PROBE_CONTROLLER_H_
Irfan Sheriffb2540bb2016-09-12 12:28:54 -070013
14#include <initializer_list>
15
Mirko Bonadei92ea95e2017-09-15 06:47:31 +020016#include "common_types.h"
17#include "modules/pacing/paced_sender.h"
18#include "rtc_base/criticalsection.h"
Irfan Sheriffb2540bb2016-09-12 12:28:54 -070019
20namespace webrtc {
21
22class Clock;
23
24// This class controls initiation of probing to estimate initial channel
25// capacity. There is also support for probing during a session when max
26// bitrate is adjusted by an application.
27class ProbeController {
28 public:
elad.alon61ce37e2017-03-09 07:09:31 -080029 ProbeController(PacedSender* pacer, const Clock* clock);
Irfan Sheriffb2540bb2016-09-12 12:28:54 -070030
sergeyu5bc39452016-12-15 10:42:09 -080031 void SetBitrates(int64_t min_bitrate_bps,
32 int64_t start_bitrate_bps,
33 int64_t max_bitrate_bps);
Sergey Ulanove2b15012016-11-22 16:08:30 -080034
35 void OnNetworkStateChanged(NetworkState state);
36
sergeyu5bc39452016-12-15 10:42:09 -080037 void SetEstimatedBitrate(int64_t bitrate_bps);
Irfan Sheriffb2540bb2016-09-12 12:28:54 -070038
sergeyu80ed35e2016-11-28 13:11:13 -080039 void EnablePeriodicAlrProbing(bool enable);
philipelcb9ba302017-03-07 06:30:59 -080040
terelius3376c842017-07-31 04:23:25 -070041 void SetAlrEndedTimeMs(int64_t alr_end_time);
42
43 void RequestProbe();
44
philipelcb9ba302017-03-07 06:30:59 -080045 // Resets the ProbeController to a state equivalent to as if it was just
46 // created EXCEPT for |enable_periodic_alr_probing_|.
47 void Reset();
48
sergeyu80ed35e2016-11-28 13:11:13 -080049 void Process();
50
Irfan Sheriffb2540bb2016-09-12 12:28:54 -070051 private:
Irfan Sheriffb2540bb2016-09-12 12:28:54 -070052 enum class State {
53 // Initial state where no probing has been triggered yet.
54 kInit,
55 // Waiting for probing results to continue further probing.
56 kWaitingForProbingResult,
57 // Probing is complete.
58 kProbingComplete,
59 };
Sergey Ulanove2b15012016-11-22 16:08:30 -080060
danilchap56359be2017-09-07 07:53:45 -070061 void InitiateExponentialProbing() RTC_EXCLUSIVE_LOCKS_REQUIRED(critsect_);
sergeyu80ed35e2016-11-28 13:11:13 -080062 void InitiateProbing(int64_t now_ms,
sergeyu5bc39452016-12-15 10:42:09 -080063 std::initializer_list<int64_t> bitrates_to_probe,
danilchap56359be2017-09-07 07:53:45 -070064 bool probe_further)
65 RTC_EXCLUSIVE_LOCKS_REQUIRED(critsect_);
Sergey Ulanove2b15012016-11-22 16:08:30 -080066
Irfan Sheriffb2540bb2016-09-12 12:28:54 -070067 rtc::CriticalSection critsect_;
68 PacedSender* const pacer_;
elad.alon61ce37e2017-03-09 07:09:31 -080069 const Clock* const clock_;
danilchap56359be2017-09-07 07:53:45 -070070 NetworkState network_state_ RTC_GUARDED_BY(critsect_);
71 State state_ RTC_GUARDED_BY(critsect_);
72 int64_t min_bitrate_to_probe_further_bps_ RTC_GUARDED_BY(critsect_);
73 int64_t time_last_probing_initiated_ms_ RTC_GUARDED_BY(critsect_);
74 int64_t estimated_bitrate_bps_ RTC_GUARDED_BY(critsect_);
75 int64_t start_bitrate_bps_ RTC_GUARDED_BY(critsect_);
76 int64_t max_bitrate_bps_ RTC_GUARDED_BY(critsect_);
77 int64_t last_bwe_drop_probing_time_ms_ RTC_GUARDED_BY(critsect_);
78 rtc::Optional<int64_t> alr_end_time_ms_ RTC_GUARDED_BY(critsect_);
79 bool enable_periodic_alr_probing_ RTC_GUARDED_BY(critsect_);
80 int64_t time_of_last_large_drop_ms_ RTC_GUARDED_BY(critsect_);
81 int64_t bitrate_before_last_large_drop_bps_ RTC_GUARDED_BY(critsect_);
Irfan Sheriffb2540bb2016-09-12 12:28:54 -070082
danilchap56359be2017-09-07 07:53:45 -070083 bool in_rapid_recovery_experiment_ RTC_GUARDED_BY(critsect_);
philipel2df07342017-01-16 09:31:49 -080084 // For WebRTC.BWE.MidCallProbing.* metric.
danilchap56359be2017-09-07 07:53:45 -070085 bool mid_call_probing_waiting_for_result_ RTC_GUARDED_BY(&critsect_);
86 int64_t mid_call_probing_bitrate_bps_ RTC_GUARDED_BY(&critsect_);
87 int64_t mid_call_probing_succcess_threshold_ RTC_GUARDED_BY(&critsect_);
philipel2df07342017-01-16 09:31:49 -080088
Irfan Sheriffb2540bb2016-09-12 12:28:54 -070089 RTC_DISALLOW_IMPLICIT_CONSTRUCTORS(ProbeController);
90};
91
92} // namespace webrtc
93
Mirko Bonadei92ea95e2017-09-15 06:47:31 +020094#endif // MODULES_CONGESTION_CONTROLLER_PROBE_CONTROLLER_H_