| /* |
| * 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_ |