Index: webrtc/modules/congestion_controller/transport_feedback_adapter.cc |
diff --git a/webrtc/modules/congestion_controller/transport_feedback_adapter.cc b/webrtc/modules/congestion_controller/transport_feedback_adapter.cc |
index 38f6173e22dbdafe8da051da1c6ad95e8f274720..034e570b8288991da1ad9244c8aeba2dcbde4eba 100644 |
--- a/webrtc/modules/congestion_controller/transport_feedback_adapter.cc |
+++ b/webrtc/modules/congestion_controller/transport_feedback_adapter.cc |
@@ -15,6 +15,7 @@ |
#include "webrtc/base/checks.h" |
#include "webrtc/base/logging.h" |
+#include "webrtc/base/mod_ops.h" |
#include "webrtc/logging/rtc_event_log/rtc_event_log.h" |
#include "webrtc/modules/bitrate_controller/include/bitrate_controller.h" |
#include "webrtc/modules/congestion_controller/delay_based_bwe.h" |
@@ -30,17 +31,6 @@ const int64_t kBaseTimestampScaleFactor = |
rtcp::TransportFeedback::kDeltaScaleFactor * (1 << 8); |
const int64_t kBaseTimestampRangeSizeUs = kBaseTimestampScaleFactor * (1 << 24); |
-class PacketFeedbackComparator { |
- public: |
- inline bool operator()(const PacketFeedback& lhs, const 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; |
- } |
-}; |
- |
TransportFeedbackAdapter::TransportFeedbackAdapter( |
RtcEventLog* event_log, |
Clock* clock, |
@@ -123,26 +113,48 @@ std::vector<PacketFeedback> TransportFeedbackAdapter::GetPacketFeedbackVector( |
auto received_packets = feedback.GetReceivedPackets(); |
std::vector<PacketFeedback> packet_feedback_vector; |
- packet_feedback_vector.reserve(received_packets.size()); |
if (received_packets.empty()) { |
LOG(LS_INFO) << "Empty transport feedback packet received."; |
return packet_feedback_vector; |
} |
+ const uint16_t last_sequence_number = |
+ received_packets.back().sequence_number(); |
+ const size_t packet_count = |
+ 1 + ForwardDiff(feedback.GetBaseSequence(), last_sequence_number); |
+ packet_feedback_vector.reserve(packet_count); |
+ // feedback.GetStatusVector().size() is a less efficient way to reach what |
+ // should be the same value. |
+ RTC_DCHECK_EQ(packet_count, feedback.GetStatusVector().size()); |
+ |
{ |
rtc::CritScope cs(&lock_); |
size_t failed_lookups = 0; |
int64_t offset_us = 0; |
int64_t timestamp_ms = 0; |
- for (const auto& packet : feedback.GetReceivedPackets()) { |
+ uint16_t seq_num = feedback.GetBaseSequence(); |
+ for (const auto& packet : received_packets) { |
+ // Insert into the vector those unreceived packets which precede this |
+ // iteration's received packet. |
+ for (; seq_num != packet.sequence_number(); ++seq_num) { |
+ PacketFeedback packet_feedback(PacketFeedback::kNotReceived, seq_num); |
+ // Note: Element not removed from history because it might be reported |
+ // as received by another feedback. |
+ if (!send_time_history_.GetFeedback(&packet_feedback, false)) |
+ ++failed_lookups; |
+ packet_feedback_vector.push_back(packet_feedback); |
+ } |
+ |
+ // Handle this iteration's received packet. |
offset_us += packet.delta_us(); |
timestamp_ms = current_offset_ms_ + (offset_us / 1000); |
PacketFeedback packet_feedback(timestamp_ms, packet.sequence_number()); |
if (!send_time_history_.GetFeedback(&packet_feedback, true)) |
++failed_lookups; |
packet_feedback_vector.push_back(packet_feedback); |
+ |
+ ++seq_num; |
} |
- std::sort(packet_feedback_vector.begin(), packet_feedback_vector.end(), |
- PacketFeedbackComparator()); |
+ |
if (failed_lookups > 0) { |
LOG(LS_WARNING) << "Failed to lookup send time for " << failed_lookups |
<< " packet" << (failed_lookups > 1 ? "s" : "") |