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

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: 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 constexpr int64_t kNoArrivalTimeMs = -1; // Arrival time is ignored.
49 constexpr int64_t kNoSendTimeMs = -1; // Send time is set by OnSentPacket.
50 int64_t creation_time_ms = clock_->TimeInMilliseconds();
51 send_time_history_.AddAndRemoveOld(PacketFeedback(
philipel 2017/03/15 10:38:37 I know it's more of a refactoring task, but having
stefan-webrtc 2017/03/15 10:51:39 Done.
52 creation_time_ms, kNoArrivalTimeMs, kNoSendTimeMs, sequence_number,
53 length, local_net_id_, remote_net_id_, pacing_info));
47 } 54 }
48 55
49 void TransportFeedbackAdapter::OnSentPacket(uint16_t sequence_number, 56 void TransportFeedbackAdapter::OnSentPacket(uint16_t sequence_number,
50 int64_t send_time_ms) { 57 int64_t send_time_ms) {
51 rtc::CritScope cs(&lock_); 58 rtc::CritScope cs(&lock_);
52 send_time_history_.OnSentPacket(sequence_number, send_time_ms); 59 send_time_history_.OnSentPacket(sequence_number, send_time_ms);
53 } 60 }
54 61
55 void TransportFeedbackAdapter::SetTransportOverhead( 62 void TransportFeedbackAdapter::SetTransportOverhead(
56 int transport_overhead_bytes_per_packet) { 63 int transport_overhead_bytes_per_packet) {
57 rtc::CritScope cs(&lock_); 64 rtc::CritScope cs(&lock_);
58 transport_overhead_bytes_per_packet_ = transport_overhead_bytes_per_packet; 65 transport_overhead_bytes_per_packet_ = transport_overhead_bytes_per_packet;
59 } 66 }
60 67
61 void TransportFeedbackAdapter::ClearSendTimeHistory() { 68 void TransportFeedbackAdapter::SetNetworkIds(uint16_t local_id,
69 uint16_t remote_id) {
62 rtc::CritScope cs(&lock_); 70 rtc::CritScope cs(&lock_);
63 send_time_history_.Clear(); 71 local_net_id_ = local_id;
72 remote_net_id_ = remote_id;
64 } 73 }
65 74
66 std::vector<PacketFeedback> TransportFeedbackAdapter::GetPacketFeedbackVector( 75 std::vector<PacketFeedback> TransportFeedbackAdapter::GetPacketFeedbackVector(
67 const rtcp::TransportFeedback& feedback) { 76 const rtcp::TransportFeedback& feedback) {
68 int64_t timestamp_us = feedback.GetBaseTimeUs(); 77 int64_t timestamp_us = feedback.GetBaseTimeUs();
69 // Add timestamp deltas to a local time base selected on first packet arrival. 78 // 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 79 // This won't be the true time base, but makes it easier to manually inspect
71 // time stamps. 80 // time stamps.
72 if (last_timestamp_us_ == kNoTimestamp) { 81 if (last_timestamp_us_ == kNoTimestamp) {
73 current_offset_ms_ = clock_->TimeInMilliseconds(); 82 current_offset_ms_ = clock_->TimeInMilliseconds();
(...skipping 34 matching lines...) Expand 10 before | Expand all | Expand 10 after
108 uint16_t seq_num = feedback.GetBaseSequence(); 117 uint16_t seq_num = feedback.GetBaseSequence();
109 for (const auto& packet : received_packets) { 118 for (const auto& packet : received_packets) {
110 // Insert into the vector those unreceived packets which precede this 119 // Insert into the vector those unreceived packets which precede this
111 // iteration's received packet. 120 // iteration's received packet.
112 for (; seq_num != packet.sequence_number(); ++seq_num) { 121 for (; seq_num != packet.sequence_number(); ++seq_num) {
113 PacketFeedback packet_feedback(PacketFeedback::kNotReceived, seq_num); 122 PacketFeedback packet_feedback(PacketFeedback::kNotReceived, seq_num);
114 // Note: Element not removed from history because it might be reported 123 // Note: Element not removed from history because it might be reported
115 // as received by another feedback. 124 // as received by another feedback.
116 if (!send_time_history_.GetFeedback(&packet_feedback, false)) 125 if (!send_time_history_.GetFeedback(&packet_feedback, false))
117 ++failed_lookups; 126 ++failed_lookups;
118 packet_feedback_vector.push_back(packet_feedback); 127 if (packet_feedback.local_net_id == local_net_id_ &&
128 packet_feedback.remote_net_id == remote_net_id_) {
129 packet_feedback_vector.push_back(packet_feedback);
130 }
119 } 131 }
120 132
121 // Handle this iteration's received packet. 133 // Handle this iteration's received packet.
122 offset_us += packet.delta_us(); 134 offset_us += packet.delta_us();
123 timestamp_ms = current_offset_ms_ + (offset_us / 1000); 135 timestamp_ms = current_offset_ms_ + (offset_us / 1000);
124 PacketFeedback packet_feedback(timestamp_ms, packet.sequence_number()); 136 PacketFeedback packet_feedback(timestamp_ms, packet.sequence_number());
125 if (!send_time_history_.GetFeedback(&packet_feedback, true)) 137 if (!send_time_history_.GetFeedback(&packet_feedback, true))
126 ++failed_lookups; 138 ++failed_lookups;
127 packet_feedback_vector.push_back(packet_feedback); 139 if (packet_feedback.local_net_id == local_net_id_ &&
140 packet_feedback.remote_net_id == remote_net_id_) {
141 packet_feedback_vector.push_back(packet_feedback);
142 }
128 143
129 ++seq_num; 144 ++seq_num;
130 } 145 }
131 146
132 if (failed_lookups > 0) { 147 if (failed_lookups > 0) {
133 LOG(LS_WARNING) << "Failed to lookup send time for " << failed_lookups 148 LOG(LS_WARNING) << "Failed to lookup send time for " << failed_lookups
134 << " packet" << (failed_lookups > 1 ? "s" : "") 149 << " packet" << (failed_lookups > 1 ? "s" : "")
135 << ". Send time history too small?"; 150 << ". Send time history too small?";
136 } 151 }
137 } 152 }
138 return packet_feedback_vector; 153 return packet_feedback_vector;
139 } 154 }
140 155
141 void TransportFeedbackAdapter::OnTransportFeedback( 156 void TransportFeedbackAdapter::OnTransportFeedback(
142 const rtcp::TransportFeedback& feedback) { 157 const rtcp::TransportFeedback& feedback) {
143 last_packet_feedback_vector_ = GetPacketFeedbackVector(feedback); 158 last_packet_feedback_vector_ = GetPacketFeedbackVector(feedback);
144 } 159 }
145 160
146 std::vector<PacketFeedback> 161 std::vector<PacketFeedback>
147 TransportFeedbackAdapter::GetTransportFeedbackVector() const { 162 TransportFeedbackAdapter::GetTransportFeedbackVector() const {
148 return last_packet_feedback_vector_; 163 return last_packet_feedback_vector_;
149 } 164 }
150 } // namespace webrtc 165 } // namespace webrtc
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698