Index: webrtc/modules/congestion_controller/delay_based_bwe.cc |
diff --git a/webrtc/modules/congestion_controller/delay_based_bwe.cc b/webrtc/modules/congestion_controller/delay_based_bwe.cc |
index 43bf5924230fcc8dff9cf5c499f99836c3d597c5..b8fa341c22895c7b8fb7d2c3c572b132b76756b6 100644 |
--- a/webrtc/modules/congestion_controller/delay_based_bwe.cc |
+++ b/webrtc/modules/congestion_controller/delay_based_bwe.cc |
@@ -122,6 +122,28 @@ bool ReadMedianSlopeFilterExperimentParameters(size_t* window_size, |
*threshold_gain = kDefaultMedianSlopeThresholdGain; |
return false; |
} |
+ |
+class PacketFeedbackComparator { |
+ public: |
+ inline bool operator()(const webrtc::PacketFeedback& lhs, |
+ const webrtc::PacketFeedback& rhs) { |
+ if (lhs.arrival_time_ms != rhs.arrival_time_ms) |
+ return lhs.arrival_time_ms < rhs.arrival_time_ms; |
+ if (lhs.send_time_ms != rhs.send_time_ms) |
+ return lhs.send_time_ms < rhs.send_time_ms; |
+ return lhs.sequence_number < rhs.sequence_number; |
+ } |
+}; |
+ |
+void SortPacketFeedbackVector(const std::vector<webrtc::PacketFeedback>& input, |
+ std::vector<webrtc::PacketFeedback>* output) { |
+ auto pred = [](const webrtc::PacketFeedback& packet_feedback) { |
+ return packet_feedback.arrival_time_ms != |
+ webrtc::PacketFeedback::kNotReceived; |
+ }; |
+ std::copy_if(input.begin(), input.end(), std::back_inserter(*output), pred); |
+ std::sort(output->begin(), output->end(), PacketFeedbackComparator()); |
+} |
} // namespace |
namespace webrtc { |
@@ -255,6 +277,11 @@ DelayBasedBwe::DelayBasedBwe(RtcEventLog* event_log, Clock* clock) |
DelayBasedBwe::Result DelayBasedBwe::IncomingPacketFeedbackVector( |
const std::vector<PacketFeedback>& packet_feedback_vector) { |
RTC_DCHECK(network_thread_.CalledOnValidThread()); |
+ |
+ std::vector<PacketFeedback> sorted_packet_feedback_vector; |
+ SortPacketFeedbackVector(packet_feedback_vector, |
+ &sorted_packet_feedback_vector); |
+ |
if (!uma_recorded_) { |
RTC_HISTOGRAM_ENUMERATION(kBweTypeHistogram, |
BweNames::kSendSideTransportSeqNum, |
@@ -263,7 +290,7 @@ DelayBasedBwe::Result DelayBasedBwe::IncomingPacketFeedbackVector( |
} |
Result aggregated_result; |
bool delayed_feedback = true; |
- for (const auto& packet_feedback : packet_feedback_vector) { |
+ for (const auto& packet_feedback : sorted_packet_feedback_vector) { |
if (packet_feedback.send_time_ms < 0) |
continue; |
delayed_feedback = false; |
@@ -277,8 +304,8 @@ DelayBasedBwe::Result DelayBasedBwe::IncomingPacketFeedbackVector( |
consecutive_delayed_feedbacks_ = 0; |
} |
if (consecutive_delayed_feedbacks_ >= kMaxConsecutiveFailedLookups) { |
- aggregated_result = |
- OnLongFeedbackDelay(packet_feedback_vector.back().arrival_time_ms); |
+ aggregated_result = OnLongFeedbackDelay( |
+ sorted_packet_feedback_vector.back().arrival_time_ms); |
consecutive_delayed_feedbacks_ = 0; |
} |
return aggregated_result; |