|  | /* | 
|  | *  Copyright (c) 2016 The WebRTC project authors. All Rights Reserved. | 
|  | * | 
|  | *  Use of this source code is governed by a BSD-style license | 
|  | *  that can be found in the LICENSE file in the root of the source | 
|  | *  tree. An additional intellectual property rights grant can be found | 
|  | *  in the file PATENTS.  All contributing project authors may | 
|  | *  be found in the AUTHORS file in the root of the source tree. | 
|  | */ | 
|  |  | 
|  | #ifndef WEBRTC_MODULES_CONGESTION_CONTROLLER_PROBE_CONTROLLER_H_ | 
|  | #define WEBRTC_MODULES_CONGESTION_CONTROLLER_PROBE_CONTROLLER_H_ | 
|  |  | 
|  | #include <initializer_list> | 
|  |  | 
|  | #include "webrtc/common_types.h" | 
|  | #include "webrtc/modules/pacing/paced_sender.h" | 
|  | #include "webrtc/rtc_base/criticalsection.h" | 
|  |  | 
|  | namespace webrtc { | 
|  |  | 
|  | class Clock; | 
|  |  | 
|  | // This class controls initiation of probing to estimate initial channel | 
|  | // capacity. There is also support for probing during a session when max | 
|  | // bitrate is adjusted by an application. | 
|  | class ProbeController { | 
|  | public: | 
|  | ProbeController(PacedSender* pacer, const Clock* clock); | 
|  |  | 
|  | void SetBitrates(int64_t min_bitrate_bps, | 
|  | int64_t start_bitrate_bps, | 
|  | int64_t max_bitrate_bps); | 
|  |  | 
|  | void OnNetworkStateChanged(NetworkState state); | 
|  |  | 
|  | void SetEstimatedBitrate(int64_t bitrate_bps); | 
|  |  | 
|  | void EnablePeriodicAlrProbing(bool enable); | 
|  |  | 
|  | void SetAlrEndedTimeMs(int64_t alr_end_time); | 
|  |  | 
|  | void RequestProbe(); | 
|  |  | 
|  | // Resets the ProbeController to a state equivalent to as if it was just | 
|  | // created EXCEPT for |enable_periodic_alr_probing_|. | 
|  | void Reset(); | 
|  |  | 
|  | void Process(); | 
|  |  | 
|  | private: | 
|  | enum class State { | 
|  | // Initial state where no probing has been triggered yet. | 
|  | kInit, | 
|  | // Waiting for probing results to continue further probing. | 
|  | kWaitingForProbingResult, | 
|  | // Probing is complete. | 
|  | kProbingComplete, | 
|  | }; | 
|  |  | 
|  | void InitiateExponentialProbing() EXCLUSIVE_LOCKS_REQUIRED(critsect_); | 
|  | void InitiateProbing(int64_t now_ms, | 
|  | std::initializer_list<int64_t> bitrates_to_probe, | 
|  | bool probe_further) EXCLUSIVE_LOCKS_REQUIRED(critsect_); | 
|  |  | 
|  | rtc::CriticalSection critsect_; | 
|  | PacedSender* const pacer_; | 
|  | const Clock* const clock_; | 
|  | NetworkState network_state_ GUARDED_BY(critsect_); | 
|  | State state_ GUARDED_BY(critsect_); | 
|  | int64_t min_bitrate_to_probe_further_bps_ GUARDED_BY(critsect_); | 
|  | int64_t time_last_probing_initiated_ms_ GUARDED_BY(critsect_); | 
|  | int64_t estimated_bitrate_bps_ GUARDED_BY(critsect_); | 
|  | int64_t start_bitrate_bps_ GUARDED_BY(critsect_); | 
|  | int64_t max_bitrate_bps_ GUARDED_BY(critsect_); | 
|  | int64_t last_bwe_drop_probing_time_ms_ GUARDED_BY(critsect_); | 
|  | rtc::Optional<int64_t> alr_end_time_ms_ GUARDED_BY(critsect_); | 
|  | bool enable_periodic_alr_probing_ GUARDED_BY(critsect_); | 
|  | int64_t time_of_last_large_drop_ms_ GUARDED_BY(critsect_); | 
|  | int64_t bitrate_before_last_large_drop_bps_ GUARDED_BY(critsect_); | 
|  |  | 
|  | bool in_rapid_recovery_experiment_ GUARDED_BY(critsect_); | 
|  | // For WebRTC.BWE.MidCallProbing.* metric. | 
|  | bool mid_call_probing_waiting_for_result_ GUARDED_BY(&critsect_); | 
|  | int64_t mid_call_probing_bitrate_bps_ GUARDED_BY(&critsect_); | 
|  | int64_t mid_call_probing_succcess_threshold_ GUARDED_BY(&critsect_); | 
|  |  | 
|  | RTC_DISALLOW_IMPLICIT_CONSTRUCTORS(ProbeController); | 
|  | }; | 
|  |  | 
|  | }  // namespace webrtc | 
|  |  | 
|  | #endif  // WEBRTC_MODULES_CONGESTION_CONTROLLER_PROBE_CONTROLLER_H_ |