| Index: webrtc/modules/remote_bitrate_estimator/test/estimators/bbr.h
|
| diff --git a/webrtc/modules/remote_bitrate_estimator/test/estimators/bbr.h b/webrtc/modules/remote_bitrate_estimator/test/estimators/bbr.h
|
| index 2782f353d0bb7c4320b71e372c378d9c6d624104..63dc78b123356bc0c2c8751938b21036fefa6085 100644
|
| --- a/webrtc/modules/remote_bitrate_estimator/test/estimators/bbr.h
|
| +++ b/webrtc/modules/remote_bitrate_estimator/test/estimators/bbr.h
|
| @@ -12,11 +12,13 @@
|
| #ifndef WEBRTC_MODULES_REMOTE_BITRATE_ESTIMATOR_TEST_ESTIMATORS_BBR_H_
|
| #define WEBRTC_MODULES_REMOTE_BITRATE_ESTIMATOR_TEST_ESTIMATORS_BBR_H_
|
|
|
| +#include <list>
|
| #include <map>
|
| #include <memory>
|
| #include <vector>
|
|
|
| #include "webrtc/modules/remote_bitrate_estimator/test/bwe.h"
|
| +#include "webrtc/modules/video_coding/sequence_number_util.h"
|
| #include "webrtc/rtc_base/optional.h"
|
| #include "webrtc/rtc_base/random.h"
|
|
|
| @@ -39,15 +41,69 @@ class BbrBweSender : public BweSender {
|
| PROBE_BW,
|
| // Temporarily limiting congestion window size in order to measure
|
| // minimum RTT.
|
| - PROBE_RTT
|
| + PROBE_RTT,
|
| + // Temporarily reducing pacing rate and congestion window, in order to
|
| + // ensure no queues are built.
|
| + RECOVERY
|
| };
|
| +
|
| struct PacketStats {
|
| PacketStats() {}
|
| - PacketStats(int64_t send_time_, size_t payload_size_)
|
| - : send_time(send_time_), payload_size(payload_size_) {}
|
| -
|
| - int64_t send_time;
|
| - size_t payload_size;
|
| + PacketStats(uint16_t sequence_number_,
|
| + int64_t last_sent_packet_send_time_ms_,
|
| + int64_t send_time_ms_,
|
| + int64_t ack_time_ms_,
|
| + int64_t last_acked_packet_ack_time_ms_,
|
| + size_t payload_size_bytes_,
|
| + size_t data_sent_bytes_,
|
| + size_t data_sent_before_last_sent_packet_bytes_,
|
| + size_t data_acked_bytes_,
|
| + size_t data_acked_before_last_acked_packet_bytes_)
|
| + : sequence_number(sequence_number_),
|
| + last_sent_packet_send_time_ms(last_sent_packet_send_time_ms_),
|
| + send_time_ms(send_time_ms_),
|
| + ack_time_ms(ack_time_ms_),
|
| + last_acked_packet_ack_time_ms(last_acked_packet_ack_time_ms_),
|
| + payload_size_bytes(payload_size_bytes_),
|
| + data_sent_bytes(data_sent_bytes_),
|
| + data_sent_before_last_sent_packet_bytes(
|
| + data_sent_before_last_sent_packet_bytes_),
|
| + data_acked_bytes(data_acked_bytes_),
|
| + data_acked_before_last_acked_packet_bytes(
|
| + data_acked_before_last_acked_packet_bytes_) {}
|
| + // Sequence number of this packet.
|
| + uint16_t sequence_number;
|
| + // Send time of the last sent packet at ack time of this packet.
|
| + int64_t last_sent_packet_send_time_ms;
|
| + // Send time of this packet.
|
| + int64_t send_time_ms;
|
| + // Ack time of this packet.
|
| + int64_t ack_time_ms;
|
| + // Ack time of the last acked packet at send time of this packet.
|
| + int64_t last_acked_packet_ack_time_ms;
|
| + // Payload size of this packet.
|
| + size_t payload_size_bytes;
|
| + // Amount of data sent before this packet was sent.
|
| + size_t data_sent_bytes;
|
| + // Amount of data sent, before last sent packet.
|
| + size_t data_sent_before_last_sent_packet_bytes;
|
| + // Amount of data acked, before this packet was acked.
|
| + size_t data_acked_bytes;
|
| + // Amount of data acked, before last acked packet.
|
| + size_t data_acked_before_last_acked_packet_bytes;
|
| + };
|
| + struct AverageRtt {
|
| + AverageRtt() {}
|
| + AverageRtt(int64_t sum_of_rtts_ms_, int64_t num_samples_, uint64_t round_)
|
| + : sum_of_rtts_ms(sum_of_rtts_ms_),
|
| + num_samples(num_samples_),
|
| + round(round_) {}
|
| + // Sum of RTTs over the round.
|
| + int64_t sum_of_rtts_ms;
|
| + // Number of RTT samples over the round.
|
| + int64_t num_samples;
|
| + // The number of the round average RTT is recorded for.
|
| + uint64_t round;
|
| };
|
| void OnPacketsSent(const Packets& packets) override;
|
| int GetFeedbackIntervalMs() const override;
|
| @@ -57,14 +113,38 @@ class BbrBweSender : public BweSender {
|
|
|
| private:
|
| void EnterStartup();
|
| - bool UpdateBandwidthAndMinRtt();
|
| + bool UpdateBandwidthAndMinRtt(int64_t now_ms,
|
| + const std::vector<uint64_t>& feedback_vector,
|
| + int64_t bytes_acked);
|
| void TryExitingStartup();
|
| void TryExitingDrain(int64_t now_ms);
|
| void EnterProbeBw(int64_t now_ms);
|
| void TryUpdatingCyclePhase(int64_t now_ms);
|
| void TryEnteringProbeRtt(int64_t now_ms);
|
| void TryExitingProbeRtt(int64_t now_ms, int64_t round);
|
| + void TryEnteringRecovery(bool new_round_started);
|
| + void TryExitingRecovery(bool new_round_started);
|
| size_t TargetCongestionWindow(float gain);
|
| + void CalculatePacingRate();
|
| +
|
| + // Calculates and returns bandwidth sample as minimum between send rate and
|
| + // ack rate, returns nothing if sample cannot be calculated.
|
| + rtc::Optional<int64_t> CalculateBandwidthSample(size_t data_sent,
|
| + int64_t send_time_delta_ms,
|
| + size_t data_acked,
|
| + int64_t ack_time_delta_ms);
|
| +
|
| + // Calculate and add bandwidth sample only for packets' sent during high gain
|
| + // phase. Motivation of having a seperate bucket for high gain phase is to
|
| + // achieve quicker ramp up. Slight overestimations may happen due to window
|
| + // not being as large as usual.
|
| + void AddSampleForHighGain();
|
| +
|
| + // Declares lost packets as acked. Implements simple logic by looking at the
|
| + // gap between sequence numbers. If there is a gap between sequence numbers we
|
| + // declare those packets as lost immediately.
|
| + void HandleLoss(uint64_t last_acked_packet, uint64_t recently_acked_packet);
|
| + void AddToPastRtts(int64_t rtt_sample_ms);
|
| Clock* const clock_;
|
| Mode mode_;
|
| std::unique_ptr<MaxBandwidthFilter> max_bandwidth_filter_;
|
| @@ -72,7 +152,6 @@ class BbrBweSender : public BweSender {
|
| std::unique_ptr<CongestionWindow> congestion_window_;
|
| std::unique_ptr<Random> rand_;
|
| uint64_t round_count_;
|
| - uint64_t last_packet_sent_;
|
| uint64_t round_trip_end_;
|
| float pacing_gain_;
|
| float congestion_window_gain_;
|
| @@ -87,9 +166,7 @@ class BbrBweSender : public BweSender {
|
| // Index number of the currently used gain value in PROBE_BW mode, from 0 to
|
| // kGainCycleLength - 1.
|
| int64_t cycle_index_;
|
| -
|
| - // Data inflight prior to the moment when last feedback was received.
|
| - size_t prior_in_flight_;
|
| + size_t bytes_acked_;
|
|
|
| // Time we entered PROBE_RTT mode.
|
| int64_t probe_rtt_start_time_ms_;
|
| @@ -101,6 +178,48 @@ class BbrBweSender : public BweSender {
|
| // First round when data inflight decreased below kMinimumCongestionWindow in
|
| // PROBE_RTT mode.
|
| int64_t minimum_congestion_window_start_round_;
|
| + size_t bytes_sent_;
|
| + uint16_t last_packet_sent_sequence_number_;
|
| + uint16_t last_packet_acked_sequence_number_;
|
| + int64_t last_packet_ack_time_;
|
| + int64_t last_packet_send_time_;
|
| + int64_t pacing_rate_bps_;
|
| +
|
| + // Send time of a packet sent first during high gain phase. Also serves as a
|
| + // flag, holding value means that we are already in high gain.
|
| + rtc::Optional<int64_t> first_packet_send_time_during_high_gain_ms_;
|
| +
|
| + // Send time of a packet sent last during high gain phase.
|
| + int64_t last_packet_send_time_during_high_gain_ms_;
|
| +
|
| + // Amount of data sent, before first packet was sent during high gain phase.
|
| + int64_t data_sent_before_high_gain_started_bytes_;
|
| +
|
| + // Amount of data sent, before last packet was sent during high gain phase.
|
| + int64_t data_sent_before_high_gain_ended_bytes_;
|
| +
|
| + // Ack time of a packet acked first during high gain phase.
|
| + int64_t first_packet_ack_time_during_high_gain_ms_;
|
| +
|
| + // Ack time of a packet acked last during high gain phase.
|
| + int64_t last_packet_ack_time_during_high_gain_ms_;
|
| +
|
| + // Amount of data acked, before the first packet was acked during high gain
|
| + // phase.
|
| + int64_t data_acked_before_high_gain_started_bytes_;
|
| +
|
| + // Amount of data acked, before the last packet was acked during high gain
|
| + // phase.
|
| + int64_t data_acked_before_high_gain_ended_bytes_;
|
| +
|
| + // Sequence number of the first packet sent during high gain phase.
|
| + uint16_t first_packet_seq_num_during_high_gain_;
|
| +
|
| + // Sequence number of the last packet sent during high gain phase.
|
| + uint16_t last_packet_seq_num_during_high_gain_;
|
| + bool high_gain_over_;
|
| + std::map<int64_t, PacketStats> packet_stats_;
|
| + std::list<AverageRtt> past_rtts_;
|
| };
|
|
|
| class BbrBweReceiver : public BweReceiver {
|
| @@ -113,6 +232,7 @@ class BbrBweReceiver : public BweReceiver {
|
|
|
| private:
|
| SimulatedClock clock_;
|
| + std::vector<uint64_t> packet_feedbacks_;
|
| };
|
| } // namespace bwe
|
| } // namespace testing
|
|
|