#ifndef _CONGESTION_CONTROL_H_ #define _CONGESTION_CONTROL_H_ #include #include #include "acknowledged_bitrate_estimator.h" #include "acknowledged_bitrate_estimator_interface.h" #include "alr_detector.h" #include "api/network_state_predictor.h" #include "api/transport/network_types.h" #include "congestion_window_pushback_controller.h" #include "delay_based_bwe.h" #include "probe_controller.h" #include "send_side_bandwidth_estimation.h" using namespace webrtc; class CongestionControl { public: CongestionControl(); ~CongestionControl(); public: NetworkControlUpdate OnTransportPacketsFeedback( TransportPacketsFeedback report); void MaybeTriggerOnNetworkChanged(NetworkControlUpdate* update, Timestamp at_time); private: PacerConfig GetPacingRates(Timestamp at_time) const; private: const bool packet_feedback_only_; const bool use_min_allocatable_as_lower_bound_; const bool ignore_probes_lower_than_network_estimate_; const bool limit_probes_lower_than_throughput_estimate_; const bool pace_at_max_of_bwe_and_lower_link_capacity_; const bool limit_pacingfactor_by_upper_link_capacity_estimate_; const std::unique_ptr probe_controller_; const std::unique_ptr congestion_window_pushback_controller_; std::unique_ptr bandwidth_estimation_; std::unique_ptr alr_detector_; std::unique_ptr probe_bitrate_estimator_; std::unique_ptr delay_based_bwe_; std::unique_ptr acknowledged_bitrate_estimator_; DataRate min_target_rate_ = DataRate::Zero(); DataRate min_data_rate_ = DataRate::Zero(); DataRate max_data_rate_ = DataRate::PlusInfinity(); std::optional starting_rate_; bool first_packet_sent_ = false; std::optional estimate_; Timestamp next_loss_update_ = Timestamp::MinusInfinity(); int lost_packets_since_last_loss_update_ = 0; int expected_packets_since_last_loss_update_ = 0; std::deque feedback_max_rtts_; DataRate last_loss_based_target_rate_; DataRate last_pushback_target_rate_; DataRate last_stable_target_rate_; LossBasedState last_loss_base_state_; std::optional last_estimated_fraction_loss_ = 0; TimeDelta last_estimated_round_trip_time_ = TimeDelta::PlusInfinity(); double pacing_factor_; DataRate min_total_allocated_bitrate_; DataRate max_padding_rate_; bool previously_in_alr_ = false; std::optional current_data_window_; }; #endif