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

Side by Side Diff: webrtc/modules/congestion_controller/transport_feedback_adapter.cc

Issue 2755553003: Ignore packets sent on old network route when receiving feedback. (Closed)
Patch Set: Comments addressed. 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 unified diff | Download patch
OLDNEW
1 /* 1 /*
2 * Copyright (c) 2015 The WebRTC project authors. All Rights Reserved. 2 * Copyright (c) 2015 The WebRTC project authors. All Rights Reserved.
3 * 3 *
4 * Use of this source code is governed by a BSD-style license 4 * Use of this source code is governed by a BSD-style license
5 * that can be found in the LICENSE file in the root of the source 5 * that can be found in the LICENSE file in the root of the source
6 * tree. An additional intellectual property rights grant can be found 6 * tree. An additional intellectual property rights grant can be found
7 * in the file PATENTS. All contributing project authors may 7 * in the file PATENTS. All contributing project authors may
8 * be found in the AUTHORS file in the root of the source tree. 8 * be found in the AUTHORS file in the root of the source tree.
9 */ 9 */
10 10
(...skipping 14 matching lines...) Expand all
25 rtcp::TransportFeedback::kDeltaScaleFactor * (1 << 8); 25 rtcp::TransportFeedback::kDeltaScaleFactor * (1 << 8);
26 const int64_t kBaseTimestampRangeSizeUs = kBaseTimestampScaleFactor * (1 << 24); 26 const int64_t kBaseTimestampRangeSizeUs = kBaseTimestampScaleFactor * (1 << 24);
27 27
28 TransportFeedbackAdapter::TransportFeedbackAdapter(const Clock* clock) 28 TransportFeedbackAdapter::TransportFeedbackAdapter(const Clock* clock)
29 : send_side_bwe_with_overhead_( 29 : send_side_bwe_with_overhead_(
30 webrtc::field_trial::IsEnabled("WebRTC-SendSideBwe-WithOverhead")), 30 webrtc::field_trial::IsEnabled("WebRTC-SendSideBwe-WithOverhead")),
31 transport_overhead_bytes_per_packet_(0), 31 transport_overhead_bytes_per_packet_(0),
32 send_time_history_(clock, kSendTimeHistoryWindowMs), 32 send_time_history_(clock, kSendTimeHistoryWindowMs),
33 clock_(clock), 33 clock_(clock),
34 current_offset_ms_(kNoTimestamp), 34 current_offset_ms_(kNoTimestamp),
35 last_timestamp_us_(kNoTimestamp) {} 35 last_timestamp_us_(kNoTimestamp),
36 local_net_id_(0),
37 remote_net_id_(0) {}
36 38
37 TransportFeedbackAdapter::~TransportFeedbackAdapter() {} 39 TransportFeedbackAdapter::~TransportFeedbackAdapter() {}
38 40
39 void TransportFeedbackAdapter::AddPacket(uint16_t sequence_number, 41 void TransportFeedbackAdapter::AddPacket(uint16_t sequence_number,
40 size_t length, 42 size_t length,
41 const PacedPacketInfo& pacing_info) { 43 const PacedPacketInfo& pacing_info) {
42 rtc::CritScope cs(&lock_); 44 rtc::CritScope cs(&lock_);
43 if (send_side_bwe_with_overhead_) { 45 if (send_side_bwe_with_overhead_) {
44 length += transport_overhead_bytes_per_packet_; 46 length += transport_overhead_bytes_per_packet_;
45 } 47 }
46 send_time_history_.AddAndRemoveOld(sequence_number, length, pacing_info); 48 const int64_t creation_time_ms = clock_->TimeInMilliseconds();
49 send_time_history_.AddAndRemoveOld(
50 PacketFeedback(creation_time_ms, sequence_number, length, local_net_id_,
51 remote_net_id_, pacing_info));
47 } 52 }
48 53
49 void TransportFeedbackAdapter::OnSentPacket(uint16_t sequence_number, 54 void TransportFeedbackAdapter::OnSentPacket(uint16_t sequence_number,
50 int64_t send_time_ms) { 55 int64_t send_time_ms) {
51 rtc::CritScope cs(&lock_); 56 rtc::CritScope cs(&lock_);
52 send_time_history_.OnSentPacket(sequence_number, send_time_ms); 57 send_time_history_.OnSentPacket(sequence_number, send_time_ms);
53 } 58 }
54 59
55 void TransportFeedbackAdapter::SetTransportOverhead( 60 void TransportFeedbackAdapter::SetTransportOverhead(
56 int transport_overhead_bytes_per_packet) { 61 int transport_overhead_bytes_per_packet) {
57 rtc::CritScope cs(&lock_); 62 rtc::CritScope cs(&lock_);
58 transport_overhead_bytes_per_packet_ = transport_overhead_bytes_per_packet; 63 transport_overhead_bytes_per_packet_ = transport_overhead_bytes_per_packet;
59 } 64 }
60 65
61 void TransportFeedbackAdapter::ClearSendTimeHistory() { 66 void TransportFeedbackAdapter::SetNetworkIds(uint16_t local_id,
67 uint16_t remote_id) {
62 rtc::CritScope cs(&lock_); 68 rtc::CritScope cs(&lock_);
63 send_time_history_.Clear(); 69 local_net_id_ = local_id;
70 remote_net_id_ = remote_id;
64 } 71 }
65 72
66 std::vector<PacketFeedback> TransportFeedbackAdapter::GetPacketFeedbackVector( 73 std::vector<PacketFeedback> TransportFeedbackAdapter::GetPacketFeedbackVector(
67 const rtcp::TransportFeedback& feedback) { 74 const rtcp::TransportFeedback& feedback) {
68 int64_t timestamp_us = feedback.GetBaseTimeUs(); 75 int64_t timestamp_us = feedback.GetBaseTimeUs();
69 // Add timestamp deltas to a local time base selected on first packet arrival. 76 // Add timestamp deltas to a local time base selected on first packet arrival.
70 // This won't be the true time base, but makes it easier to manually inspect 77 // This won't be the true time base, but makes it easier to manually inspect
71 // time stamps. 78 // time stamps.
72 if (last_timestamp_us_ == kNoTimestamp) { 79 if (last_timestamp_us_ == kNoTimestamp) {
73 current_offset_ms_ = clock_->TimeInMilliseconds(); 80 current_offset_ms_ = clock_->TimeInMilliseconds();
(...skipping 34 matching lines...) Expand 10 before | Expand all | Expand 10 after
108 uint16_t seq_num = feedback.GetBaseSequence(); 115 uint16_t seq_num = feedback.GetBaseSequence();
109 for (const auto& packet : received_packets) { 116 for (const auto& packet : received_packets) {
110 // Insert into the vector those unreceived packets which precede this 117 // Insert into the vector those unreceived packets which precede this
111 // iteration's received packet. 118 // iteration's received packet.
112 for (; seq_num != packet.sequence_number(); ++seq_num) { 119 for (; seq_num != packet.sequence_number(); ++seq_num) {
113 PacketFeedback packet_feedback(PacketFeedback::kNotReceived, seq_num); 120 PacketFeedback packet_feedback(PacketFeedback::kNotReceived, seq_num);
114 // Note: Element not removed from history because it might be reported 121 // Note: Element not removed from history because it might be reported
115 // as received by another feedback. 122 // as received by another feedback.
116 if (!send_time_history_.GetFeedback(&packet_feedback, false)) 123 if (!send_time_history_.GetFeedback(&packet_feedback, false))
117 ++failed_lookups; 124 ++failed_lookups;
118 packet_feedback_vector.push_back(packet_feedback); 125 if (packet_feedback.local_net_id == local_net_id_ &&
126 packet_feedback.remote_net_id == remote_net_id_) {
127 packet_feedback_vector.push_back(packet_feedback);
128 }
119 } 129 }
120 130
121 // Handle this iteration's received packet. 131 // Handle this iteration's received packet.
122 offset_us += packet.delta_us(); 132 offset_us += packet.delta_us();
123 timestamp_ms = current_offset_ms_ + (offset_us / 1000); 133 timestamp_ms = current_offset_ms_ + (offset_us / 1000);
124 PacketFeedback packet_feedback(timestamp_ms, packet.sequence_number()); 134 PacketFeedback packet_feedback(timestamp_ms, packet.sequence_number());
125 if (!send_time_history_.GetFeedback(&packet_feedback, true)) 135 if (!send_time_history_.GetFeedback(&packet_feedback, true))
126 ++failed_lookups; 136 ++failed_lookups;
127 packet_feedback_vector.push_back(packet_feedback); 137 if (packet_feedback.local_net_id == local_net_id_ &&
138 packet_feedback.remote_net_id == remote_net_id_) {
139 packet_feedback_vector.push_back(packet_feedback);
140 }
128 141
129 ++seq_num; 142 ++seq_num;
130 } 143 }
131 144
132 if (failed_lookups > 0) { 145 if (failed_lookups > 0) {
133 LOG(LS_WARNING) << "Failed to lookup send time for " << failed_lookups 146 LOG(LS_WARNING) << "Failed to lookup send time for " << failed_lookups
134 << " packet" << (failed_lookups > 1 ? "s" : "") 147 << " packet" << (failed_lookups > 1 ? "s" : "")
135 << ". Send time history too small?"; 148 << ". Send time history too small?";
136 } 149 }
137 } 150 }
138 return packet_feedback_vector; 151 return packet_feedback_vector;
139 } 152 }
140 153
141 void TransportFeedbackAdapter::OnTransportFeedback( 154 void TransportFeedbackAdapter::OnTransportFeedback(
142 const rtcp::TransportFeedback& feedback) { 155 const rtcp::TransportFeedback& feedback) {
143 last_packet_feedback_vector_ = GetPacketFeedbackVector(feedback); 156 last_packet_feedback_vector_ = GetPacketFeedbackVector(feedback);
144 } 157 }
145 158
146 std::vector<PacketFeedback> 159 std::vector<PacketFeedback>
147 TransportFeedbackAdapter::GetTransportFeedbackVector() const { 160 TransportFeedbackAdapter::GetTransportFeedbackVector() const {
148 return last_packet_feedback_vector_; 161 return last_packet_feedback_vector_;
149 } 162 }
150 } // namespace webrtc 163 } // namespace webrtc
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698