|  | /* | 
|  | *  Copyright (c) 2018 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 MODULES_CONGESTION_CONTROLLER_PCC_PCC_NETWORK_CONTROLLER_H_ | 
|  | #define MODULES_CONGESTION_CONTROLLER_PCC_PCC_NETWORK_CONTROLLER_H_ | 
|  |  | 
|  | #include <stddef.h> | 
|  | #include <stdint.h> | 
|  |  | 
|  | #include <deque> | 
|  | #include <vector> | 
|  |  | 
|  | #include "api/transport/network_control.h" | 
|  | #include "api/transport/network_types.h" | 
|  | #include "api/units/data_rate.h" | 
|  | #include "api/units/time_delta.h" | 
|  | #include "api/units/timestamp.h" | 
|  | #include "modules/congestion_controller/pcc/bitrate_controller.h" | 
|  | #include "modules/congestion_controller/pcc/monitor_interval.h" | 
|  | #include "modules/congestion_controller/pcc/rtt_tracker.h" | 
|  | #include "rtc_base/random.h" | 
|  |  | 
|  | namespace webrtc { | 
|  | namespace pcc { | 
|  |  | 
|  | // PCC (Performance-oriented Congestion Control) Vivace is a congestion | 
|  | // control algorithm based on online (convex) optimization in machine learning. | 
|  | // It divides time into consecutive Monitor Intervals (MI) to test sending | 
|  | // rates r(1 + eps), r(1 - eps) for the current sending rate r. | 
|  | // At the end of each MI it computes utility function to transform the | 
|  | // performance statistics into a numerical value. Then it updates current | 
|  | // sending rate using gradient ascent to maximize utility function. | 
|  | class PccNetworkController : public NetworkControllerInterface { | 
|  | public: | 
|  | enum class Mode { | 
|  | kStartup, | 
|  | // Slow start phase of PCC doubles sending rate each monitor interval. | 
|  | kSlowStart, | 
|  | // After getting the first decrease in utility function PCC exits slow start | 
|  | // and enters the online learning phase. | 
|  | kOnlineLearning, | 
|  | // If we got that sending with the lower rate resulted in higher packet | 
|  | // loss, then the measurements are unreliable and we need to double check | 
|  | // them. | 
|  | kDoubleCheck | 
|  | }; | 
|  |  | 
|  | enum class MonitorIntervalLengthStrategy { | 
|  | // Monitor interval length adaptive when it is proportional to packets RTT. | 
|  | kAdaptive, | 
|  | // Monitor interval length is fixed when it is equal to the time of sending | 
|  | // predefined amount of packets (kMinPacketsNumberPerInterval). | 
|  | kFixed | 
|  | }; | 
|  |  | 
|  | explicit PccNetworkController(NetworkControllerConfig config); | 
|  | ~PccNetworkController() override; | 
|  |  | 
|  | // NetworkControllerInterface | 
|  | NetworkControlUpdate OnNetworkAvailability(NetworkAvailability msg) override; | 
|  | NetworkControlUpdate OnNetworkRouteChange(NetworkRouteChange msg) override; | 
|  | NetworkControlUpdate OnProcessInterval(ProcessInterval msg) override; | 
|  | NetworkControlUpdate OnSentPacket(SentPacket msg) override; | 
|  | NetworkControlUpdate OnTargetRateConstraints( | 
|  | TargetRateConstraints msg) override; | 
|  | NetworkControlUpdate OnTransportPacketsFeedback( | 
|  | TransportPacketsFeedback msg) override; | 
|  |  | 
|  | // Part of remote bitrate estimation api, not implemented for PCC | 
|  | NetworkControlUpdate OnStreamsConfig(StreamsConfig msg) override; | 
|  | NetworkControlUpdate OnRemoteBitrateReport(RemoteBitrateReport msg) override; | 
|  | NetworkControlUpdate OnRoundTripTimeUpdate(RoundTripTimeUpdate msg) override; | 
|  | NetworkControlUpdate OnTransportLossReport(TransportLossReport msg) override; | 
|  | NetworkControlUpdate OnReceivedPacket(ReceivedPacket msg) override; | 
|  | NetworkControlUpdate OnNetworkStateEstimate( | 
|  | NetworkStateEstimate msg) override; | 
|  |  | 
|  | private: | 
|  | void UpdateSendingRateAndMode(); | 
|  | NetworkControlUpdate CreateRateUpdate(Timestamp at_time) const; | 
|  | TimeDelta ComputeMonitorIntervalsDuration() const; | 
|  | bool NeedDoubleCheckMeasurments() const; | 
|  | bool IsTimeoutExpired(Timestamp current_time) const; | 
|  | bool IsFeedbackCollectionDone() const; | 
|  |  | 
|  | Timestamp start_time_; | 
|  | Timestamp last_sent_packet_time_; | 
|  | TimeDelta smoothed_packets_sending_interval_; | 
|  | Mode mode_; | 
|  |  | 
|  | // Default value used for initializing bandwidth. | 
|  | DataRate default_bandwidth_; | 
|  | // Current estimate r. | 
|  | DataRate bandwidth_estimate_; | 
|  |  | 
|  | RttTracker rtt_tracker_; | 
|  | TimeDelta monitor_interval_timeout_; | 
|  | const MonitorIntervalLengthStrategy monitor_interval_length_strategy_; | 
|  | const double monitor_interval_duration_ratio_; | 
|  | const double sampling_step_;  // Epsilon. | 
|  | const double monitor_interval_timeout_ratio_; | 
|  | const int64_t min_packets_number_per_interval_; | 
|  |  | 
|  | PccBitrateController bitrate_controller_; | 
|  |  | 
|  | std::vector<PccMonitorInterval> monitor_intervals_; | 
|  | std::vector<DataRate> monitor_intervals_bitrates_; | 
|  | TimeDelta monitor_intervals_duration_; | 
|  | size_t complete_feedback_monitor_interval_number_; | 
|  |  | 
|  | webrtc::Random random_generator_; | 
|  | std::deque<PacketResult> last_received_packets_; | 
|  | }; | 
|  |  | 
|  | }  // namespace pcc | 
|  | }  // namespace webrtc | 
|  |  | 
|  | #endif  // MODULES_CONGESTION_CONTROLLER_PCC_PCC_NETWORK_CONTROLLER_H_ |