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

Side by Side Diff: webrtc/modules/congestion_controller/delay_based_bwe.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 unified diff | Download patch
« no previous file with comments | « no previous file | webrtc/modules/congestion_controller/transport_feedback_adapter.cc » ('j') | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
1 /* 1 /*
2 * Copyright (c) 2016 The WebRTC project authors. All Rights Reserved. 2 * Copyright (c) 2016 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 104 matching lines...) Expand 10 before | Expand all | Expand 10 after
115 RTC_CHECK_GT(*window_size, 1) << "Need at least 2 points to fit a line."; 115 RTC_CHECK_GT(*window_size, 1) << "Need at least 2 points to fit a line.";
116 RTC_CHECK_GT(*threshold_gain, 0) << "Threshold gain needs to be positive."; 116 RTC_CHECK_GT(*threshold_gain, 0) << "Threshold gain needs to be positive.";
117 return true; 117 return true;
118 } 118 }
119 LOG(LS_WARNING) << "Failed to parse parameters for BweMedianSlopeFilter " 119 LOG(LS_WARNING) << "Failed to parse parameters for BweMedianSlopeFilter "
120 "experiment from field trial string. Using default."; 120 "experiment from field trial string. Using default.";
121 *window_size = kDefaultMedianSlopeWindowSize; 121 *window_size = kDefaultMedianSlopeWindowSize;
122 *threshold_gain = kDefaultMedianSlopeThresholdGain; 122 *threshold_gain = kDefaultMedianSlopeThresholdGain;
123 return false; 123 return false;
124 } 124 }
125
126 class PacketFeedbackComparator {
127 public:
128 inline bool operator()(const webrtc::PacketFeedback& lhs,
129 const webrtc::PacketFeedback& rhs) {
130 if (lhs.arrival_time_ms != rhs.arrival_time_ms)
131 return lhs.arrival_time_ms < rhs.arrival_time_ms;
132 if (lhs.send_time_ms != rhs.send_time_ms)
133 return lhs.send_time_ms < rhs.send_time_ms;
134 return lhs.sequence_number < rhs.sequence_number;
135 }
136 };
137
138 void SortPacketFeedbackVector(const std::vector<webrtc::PacketFeedback>& input,
139 std::vector<webrtc::PacketFeedback>* output) {
140 auto pred = [](const webrtc::PacketFeedback& packet_feedback) {
141 return packet_feedback.arrival_time_ms !=
142 webrtc::PacketFeedback::kNotReceived;
143 };
144 std::copy_if(input.begin(), input.end(), std::back_inserter(*output), pred);
145 std::sort(output->begin(), output->end(), PacketFeedbackComparator());
146 }
125 } // namespace 147 } // namespace
126 148
127 namespace webrtc { 149 namespace webrtc {
128 150
129 DelayBasedBwe::BitrateEstimator::BitrateEstimator() 151 DelayBasedBwe::BitrateEstimator::BitrateEstimator()
130 : sum_(0), 152 : sum_(0),
131 current_win_ms_(0), 153 current_win_ms_(0),
132 prev_time_ms_(-1), 154 prev_time_ms_(-1),
133 bitrate_estimate_(-1.0f), 155 bitrate_estimate_(-1.0f),
134 bitrate_estimate_var_(50.0f), 156 bitrate_estimate_var_(50.0f),
(...skipping 113 matching lines...) Expand 10 before | Expand all | Expand 10 after
248 if (!in_trendline_experiment_ && !in_median_slope_experiment_) { 270 if (!in_trendline_experiment_ && !in_median_slope_experiment_) {
249 LOG(LS_INFO) << "No overuse experiment enabled. Using Kalman filter."; 271 LOG(LS_INFO) << "No overuse experiment enabled. Using Kalman filter.";
250 } 272 }
251 273
252 network_thread_.DetachFromThread(); 274 network_thread_.DetachFromThread();
253 } 275 }
254 276
255 DelayBasedBwe::Result DelayBasedBwe::IncomingPacketFeedbackVector( 277 DelayBasedBwe::Result DelayBasedBwe::IncomingPacketFeedbackVector(
256 const std::vector<PacketFeedback>& packet_feedback_vector) { 278 const std::vector<PacketFeedback>& packet_feedback_vector) {
257 RTC_DCHECK(network_thread_.CalledOnValidThread()); 279 RTC_DCHECK(network_thread_.CalledOnValidThread());
280
281 std::vector<PacketFeedback> sorted_packet_feedback_vector;
282 SortPacketFeedbackVector(packet_feedback_vector,
283 &sorted_packet_feedback_vector);
284
258 if (!uma_recorded_) { 285 if (!uma_recorded_) {
259 RTC_HISTOGRAM_ENUMERATION(kBweTypeHistogram, 286 RTC_HISTOGRAM_ENUMERATION(kBweTypeHistogram,
260 BweNames::kSendSideTransportSeqNum, 287 BweNames::kSendSideTransportSeqNum,
261 BweNames::kBweNamesMax); 288 BweNames::kBweNamesMax);
262 uma_recorded_ = true; 289 uma_recorded_ = true;
263 } 290 }
264 Result aggregated_result; 291 Result aggregated_result;
265 bool delayed_feedback = true; 292 bool delayed_feedback = true;
266 for (const auto& packet_feedback : packet_feedback_vector) { 293 for (const auto& packet_feedback : sorted_packet_feedback_vector) {
267 if (packet_feedback.send_time_ms < 0) 294 if (packet_feedback.send_time_ms < 0)
268 continue; 295 continue;
269 delayed_feedback = false; 296 delayed_feedback = false;
270 Result result = IncomingPacketFeedback(packet_feedback); 297 Result result = IncomingPacketFeedback(packet_feedback);
271 if (result.updated) 298 if (result.updated)
272 aggregated_result = result; 299 aggregated_result = result;
273 } 300 }
274 if (delayed_feedback) { 301 if (delayed_feedback) {
275 ++consecutive_delayed_feedbacks_; 302 ++consecutive_delayed_feedbacks_;
276 } else { 303 } else {
277 consecutive_delayed_feedbacks_ = 0; 304 consecutive_delayed_feedbacks_ = 0;
278 } 305 }
279 if (consecutive_delayed_feedbacks_ >= kMaxConsecutiveFailedLookups) { 306 if (consecutive_delayed_feedbacks_ >= kMaxConsecutiveFailedLookups) {
280 aggregated_result = 307 aggregated_result = OnLongFeedbackDelay(
281 OnLongFeedbackDelay(packet_feedback_vector.back().arrival_time_ms); 308 sorted_packet_feedback_vector.back().arrival_time_ms);
282 consecutive_delayed_feedbacks_ = 0; 309 consecutive_delayed_feedbacks_ = 0;
283 } 310 }
284 return aggregated_result; 311 return aggregated_result;
285 } 312 }
286 313
287 DelayBasedBwe::Result DelayBasedBwe::OnLongFeedbackDelay( 314 DelayBasedBwe::Result DelayBasedBwe::OnLongFeedbackDelay(
288 int64_t arrival_time_ms) { 315 int64_t arrival_time_ms) {
289 // Estimate should always be valid since a start bitrate always is set in the 316 // Estimate should always be valid since a start bitrate always is set in the
290 // Call constructor. An alternative would be to return an empty Result here, 317 // Call constructor. An alternative would be to return an empty Result here,
291 // or to estimate the throughput based on the feedback we received. 318 // or to estimate the throughput based on the feedback we received.
(...skipping 158 matching lines...) Expand 10 before | Expand all | Expand 10 after
450 void DelayBasedBwe::SetMinBitrate(int min_bitrate_bps) { 477 void DelayBasedBwe::SetMinBitrate(int min_bitrate_bps) {
451 // Called from both the configuration thread and the network thread. Shouldn't 478 // Called from both the configuration thread and the network thread. Shouldn't
452 // be called from the network thread in the future. 479 // be called from the network thread in the future.
453 rate_control_.SetMinBitrate(min_bitrate_bps); 480 rate_control_.SetMinBitrate(min_bitrate_bps);
454 } 481 }
455 482
456 int64_t DelayBasedBwe::GetProbingIntervalMs() const { 483 int64_t DelayBasedBwe::GetProbingIntervalMs() const {
457 return probing_interval_estimator_.GetIntervalMs(); 484 return probing_interval_estimator_.GetIntervalMs();
458 } 485 }
459 } // namespace webrtc 486 } // namespace webrtc
OLDNEW
« no previous file with comments | « no previous file | webrtc/modules/congestion_controller/transport_feedback_adapter.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698