/* * 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 MODULES_CONGESTION_CONTROLLER_GOOG_CC_DELAY_BASED_BWE_H_ #define MODULES_CONGESTION_CONTROLLER_GOOG_CC_DELAY_BASED_BWE_H_ #include #include #include #include #include "absl/types/optional.h" #include "api/network_state_predictor.h" #include "api/transport/network_types.h" #include "api/transport/webrtc_key_value_config.h" #include "modules/congestion_controller/goog_cc/delay_increase_detector_interface.h" #include "modules/congestion_controller/goog_cc/probe_bitrate_estimator.h" #include "modules/remote_bitrate_estimator/aimd_rate_control.h" #include "modules/remote_bitrate_estimator/include/bwe_defines.h" #include "modules/remote_bitrate_estimator/inter_arrival.h" #include "rtc_base/constructor_magic.h" #include "rtc_base/experiments/struct_parameters_parser.h" #include "rtc_base/race_checker.h" namespace webrtc { class RtcEventLog; struct BweIgnoreSmallPacketsSettings { static constexpr char kKey[] = "WebRTC-BweIgnoreSmallPacketsFix"; BweIgnoreSmallPacketsSettings() = default; explicit BweIgnoreSmallPacketsSettings( const WebRtcKeyValueConfig* key_value_config); double smoothing_factor = 0.1; double fraction_large = 1.0; DataSize large_threshold = DataSize::Zero(); DataSize small_threshold = DataSize::Zero(); std::unique_ptr Parser(); }; struct BweSeparateAudioPacketsSettings { static constexpr char kKey[] = "WebRTC-Bwe-SeparateAudioPackets"; BweSeparateAudioPacketsSettings() = default; explicit BweSeparateAudioPacketsSettings( const WebRtcKeyValueConfig* key_value_config); bool enabled = false; int packet_threshold = 10; TimeDelta time_threshold = TimeDelta::Seconds(1); std::unique_ptr Parser(); }; class DelayBasedBwe { public: struct Result { Result(); Result(bool probe, DataRate target_bitrate); ~Result() = default; bool updated; bool probe; DataRate target_bitrate = DataRate::Zero(); bool recovered_from_overuse; bool backoff_in_alr; }; explicit DelayBasedBwe(const WebRtcKeyValueConfig* key_value_config, RtcEventLog* event_log, NetworkStatePredictor* network_state_predictor); virtual ~DelayBasedBwe(); Result IncomingPacketFeedbackVector( const TransportPacketsFeedback& msg, absl::optional acked_bitrate, absl::optional probe_bitrate, absl::optional network_estimate, bool in_alr); void OnRttUpdate(TimeDelta avg_rtt); bool LatestEstimate(std::vector* ssrcs, DataRate* bitrate) const; void SetStartBitrate(DataRate start_bitrate); void SetMinBitrate(DataRate min_bitrate); TimeDelta GetExpectedBwePeriod() const; void SetAlrLimitedBackoffExperiment(bool enabled); DataRate TriggerOveruse(Timestamp at_time, absl::optional link_capacity); DataRate last_estimate() const { return prev_bitrate_; } private: friend class GoogCcStatePrinter; void IncomingPacketFeedback(const PacketResult& packet_feedback, Timestamp at_time); Result MaybeUpdateEstimate( absl::optional acked_bitrate, absl::optional probe_bitrate, absl::optional state_estimate, bool recovered_from_overuse, bool in_alr, Timestamp at_time); // Updates the current remote rate estimate and returns true if a valid // estimate exists. bool UpdateEstimate(Timestamp now, absl::optional acked_bitrate, DataRate* target_bitrate); rtc::RaceChecker network_race_; RtcEventLog* const event_log_; const WebRtcKeyValueConfig* const key_value_config_; // Filtering out small packets. Intention is to base the detection only // on video packets even if we have TWCC sequence numbers for audio. BweIgnoreSmallPacketsSettings ignore_small_; double fraction_large_packets_; // Alternatively, run two separate overuse detectors for audio and video, // and fall back to the audio one if we haven't seen a video packet in a // while. BweSeparateAudioPacketsSettings separate_audio_; int64_t audio_packets_since_last_video_; Timestamp last_video_packet_recv_time_; NetworkStatePredictor* network_state_predictor_; std::unique_ptr video_inter_arrival_; std::unique_ptr video_delay_detector_; std::unique_ptr audio_inter_arrival_; std::unique_ptr audio_delay_detector_; DelayIncreaseDetectorInterface* active_delay_detector_; Timestamp last_seen_packet_; bool uma_recorded_; AimdRateControl rate_control_; DataRate prev_bitrate_; bool has_once_detected_overuse_; BandwidthUsage prev_state_; bool alr_limited_backoff_enabled_; RTC_DISALLOW_IMPLICIT_CONSTRUCTORS(DelayBasedBwe); }; } // namespace webrtc #endif // MODULES_CONGESTION_CONTROLLER_GOOG_CC_DELAY_BASED_BWE_H_