blob: e60a007b9d94402253d1982b27f3649f79bb6f32 [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
11#ifndef WEBRTC_MODULES_CONGESTION_CONTROLLER_PROBE_CONTROLLER_H_
12#define WEBRTC_MODULES_CONGESTION_CONTROLLER_PROBE_CONTROLLER_H_
13
14#include <initializer_list>
15
16#include "webrtc/base/criticalsection.h"
17#include "webrtc/common_types.h"
18#include "webrtc/modules/pacing/paced_sender.h"
19
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:
29 ProbeController(PacedSender* pacer, Clock* clock);
30
31 void SetBitrates(int min_bitrate_bps,
32 int start_bitrate_bps,
33 int max_bitrate_bps);
Sergey Ulanove2b15012016-11-22 16:08:30 -080034
35 void OnNetworkStateChanged(NetworkState state);
36
Irfan Sheriffb2540bb2016-09-12 12:28:54 -070037 void SetEstimatedBitrate(int bitrate_bps);
38
39 private:
Irfan Sheriffb2540bb2016-09-12 12:28:54 -070040 enum class State {
41 // Initial state where no probing has been triggered yet.
42 kInit,
43 // Waiting for probing results to continue further probing.
44 kWaitingForProbingResult,
45 // Probing is complete.
46 kProbingComplete,
47 };
Sergey Ulanove2b15012016-11-22 16:08:30 -080048
49 void InitiateExponentialProbing() EXCLUSIVE_LOCKS_REQUIRED(critsect_);
50 void InitiateProbing(std::initializer_list<int> bitrates_to_probe,
51 int min_bitrate_to_probe_further_bps)
52 EXCLUSIVE_LOCKS_REQUIRED(critsect_);
53
Irfan Sheriffb2540bb2016-09-12 12:28:54 -070054 rtc::CriticalSection critsect_;
55 PacedSender* const pacer_;
56 Clock* const clock_;
Sergey Ulanove2b15012016-11-22 16:08:30 -080057 NetworkState network_state_ GUARDED_BY(critsect_);
Irfan Sheriffb2540bb2016-09-12 12:28:54 -070058 State state_ GUARDED_BY(critsect_);
59 int min_bitrate_to_probe_further_bps_ GUARDED_BY(critsect_);
60 int64_t time_last_probing_initiated_ms_ GUARDED_BY(critsect_);
61 int estimated_bitrate_bps_ GUARDED_BY(critsect_);
Sergey Ulanove2b15012016-11-22 16:08:30 -080062 int start_bitrate_bps_ GUARDED_BY(critsect_);
Irfan Sheriffb2540bb2016-09-12 12:28:54 -070063 int max_bitrate_bps_ GUARDED_BY(critsect_);
Irfan Sheriff1eb12932016-10-18 17:04:25 -070064 int64_t last_alr_probing_time_ GUARDED_BY(critsect_);
Irfan Sheriffb2540bb2016-09-12 12:28:54 -070065
66 RTC_DISALLOW_IMPLICIT_CONSTRUCTORS(ProbeController);
67};
68
69} // namespace webrtc
70
71#endif // WEBRTC_MODULES_CONGESTION_CONTROLLER_PROBE_CONTROLLER_H_