/* * 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 "aimd_rate_control.h" #include "api/transport/bandwidth_usage.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 "delay_increase_detector_interface.h" #include "inter_arrival.h" #include "inter_arrival_delta.h" #include "link_capacity_estimator.h" #include "probe_bitrate_estimator.h" namespace webrtc { class RtcEventLog; struct BweSeparateAudioPacketsSettings { static constexpr char kKey[] = "WebRTC-Bwe-SeparateAudioPackets"; BweSeparateAudioPacketsSettings() = default; bool enabled = false; int packet_threshold = 10; TimeDelta time_threshold = TimeDelta::Seconds(1); }; class DelayBasedBwe { public: struct Result { Result(); ~Result() = default; bool updated; bool probe; DataRate target_bitrate = DataRate::Zero(); bool recovered_from_overuse; BandwidthUsage delay_detector_state; }; DelayBasedBwe(); DelayBasedBwe(const DelayBasedBwe&) = delete; DelayBasedBwe& operator=(const DelayBasedBwe&) = delete; virtual ~DelayBasedBwe(); Result IncomingPacketFeedbackVector(const TransportPacketsFeedback& msg, std::optional acked_bitrate, std::optional probe_bitrate, 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; DataRate TriggerOveruse(Timestamp at_time, std::optional link_capacity); DataRate last_estimate() const { return prev_bitrate_; } BandwidthUsage last_state() const { return prev_state_; } private: friend class GoogCcStatePrinter; void IncomingPacketFeedback(const PacketResult& packet_feedback, Timestamp at_time); Result MaybeUpdateEstimate(std::optional acked_bitrate, std::optional probe_bitrate, 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 at_time, std::optional acked_bitrate, DataRate* target_rate); // 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_; std::unique_ptr video_inter_arrival_; std::unique_ptr video_inter_arrival_delta_; std::unique_ptr video_delay_detector_; std::unique_ptr audio_inter_arrival_; std::unique_ptr audio_inter_arrival_delta_; std::unique_ptr audio_delay_detector_; DelayIncreaseDetectorInterface* active_delay_detector_; Timestamp last_seen_packet_; bool uma_recorded_; AimdRateControl rate_control_; DataRate prev_bitrate_; BandwidthUsage prev_state_; }; } // namespace webrtc #endif // MODULES_CONGESTION_CONTROLLER_GOOG_CC_DELAY_BASED_BWE_H_