Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(1301)

Unified Diff: webrtc/modules/congestion_controller/transport_feedback_adapter.cc

Issue 2707383006: GetTransportFeedbackVector() includes unreceived packets, sorted by seq-num (Closed)
Patch Set: SortPacketFeedbackVector moved out of class. Created 3 years, 9 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
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" : "")

Powered by Google App Engine
This is Rietveld 408576698