/* * 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 #include #include #include #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 monitor_intervals_; std::vector monitor_intervals_bitrates_; TimeDelta monitor_intervals_duration_; size_t complete_feedback_monitor_interval_number_; webrtc::Random random_generator_; std::deque last_received_packets_; }; } // namespace pcc } // namespace webrtc #endif // MODULES_CONGESTION_CONTROLLER_PCC_PCC_NETWORK_CONTROLLER_H_