Chromium Code Reviews| 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..567b77802c8ec45bbe26ebc8c70939736e9dbc94 100644 |
| --- a/webrtc/modules/congestion_controller/delay_based_bwe.cc |
| +++ b/webrtc/modules/congestion_controller/delay_based_bwe.cc |
| @@ -122,6 +122,18 @@ 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; |
| + } |
| +}; |
| } // namespace |
| namespace webrtc { |
| @@ -255,6 +267,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 +280,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 +294,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; |
| @@ -422,6 +439,16 @@ bool DelayBasedBwe::UpdateEstimate(int64_t arrival_time_ms, |
| return rate_control_.ValidEstimate(); |
| } |
| +void DelayBasedBwe::SortPacketFeedbackVector( |
|
stefan-webrtc
2017/03/07 12:04:18
This should be in the anonymous namespace and not
elad.alon_webrtc.org
2017/03/07 12:11:07
Done.
|
| + const std::vector<PacketFeedback>& input, |
| + std::vector<PacketFeedback>* output) { |
| + auto pred = [](const PacketFeedback& packet_feedback) { |
| + return packet_feedback.arrival_time_ms != PacketFeedback::kNotReceived; |
| + }; |
| + std::copy_if(input.begin(), input.end(), std::back_inserter(*output), pred); |
| + std::sort(output->begin(), output->end(), PacketFeedbackComparator()); |
| +} |
| + |
| void DelayBasedBwe::OnRttUpdate(int64_t avg_rtt_ms, int64_t max_rtt_ms) { |
| rate_control_.SetRtt(avg_rtt_ms); |
| } |