OLD | NEW |
1 /* | 1 /* |
2 * Copyright (c) 2012 The WebRTC project authors. All Rights Reserved. | 2 * Copyright (c) 2012 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 Loading... |
25 #include "rtc_base/ptr_util.h" | 25 #include "rtc_base/ptr_util.h" |
26 #include "rtc_base/rate_limiter.h" | 26 #include "rtc_base/rate_limiter.h" |
27 #include "rtc_base/socket.h" | 27 #include "rtc_base/socket.h" |
28 #include "rtc_base/timeutils.h" | 28 #include "rtc_base/timeutils.h" |
29 #include "system_wrappers/include/field_trial.h" | 29 #include "system_wrappers/include/field_trial.h" |
30 | 30 |
31 namespace webrtc { | 31 namespace webrtc { |
32 namespace { | 32 namespace { |
33 | 33 |
34 const char kCwndExperiment[] = "WebRTC-CwndExperiment"; | 34 const char kCwndExperiment[] = "WebRTC-CwndExperiment"; |
| 35 const char kPacerPushbackExperiment[] = "WebRTC-PacerPushbackExperiment"; |
35 const int64_t kDefaultAcceptedQueueMs = 250; | 36 const int64_t kDefaultAcceptedQueueMs = 250; |
36 | 37 |
37 bool CwndExperimentEnabled() { | 38 bool CwndExperimentEnabled() { |
38 std::string experiment_string = | 39 std::string experiment_string = |
39 webrtc::field_trial::FindFullName(kCwndExperiment); | 40 webrtc::field_trial::FindFullName(kCwndExperiment); |
40 // The experiment is enabled iff the field trial string begins with "Enabled". | 41 // The experiment is enabled iff the field trial string begins with "Enabled". |
41 return experiment_string.find("Enabled") == 0; | 42 return experiment_string.find("Enabled") == 0; |
42 } | 43 } |
43 | 44 |
44 bool ReadCwndExperimentParameter(int64_t* accepted_queue_ms) { | 45 bool ReadCwndExperimentParameter(int64_t* accepted_queue_ms) { |
(...skipping 70 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
115 last_reported_bitrate_bps_(0), | 116 last_reported_bitrate_bps_(0), |
116 last_reported_fraction_loss_(0), | 117 last_reported_fraction_loss_(0), |
117 last_reported_rtt_(0), | 118 last_reported_rtt_(0), |
118 network_state_(kNetworkUp), | 119 network_state_(kNetworkUp), |
119 pause_pacer_(false), | 120 pause_pacer_(false), |
120 pacer_paused_(false), | 121 pacer_paused_(false), |
121 min_bitrate_bps_(congestion_controller::GetMinBitrateBps()), | 122 min_bitrate_bps_(congestion_controller::GetMinBitrateBps()), |
122 delay_based_bwe_(new DelayBasedBwe(event_log_, clock_)), | 123 delay_based_bwe_(new DelayBasedBwe(event_log_, clock_)), |
123 in_cwnd_experiment_(CwndExperimentEnabled()), | 124 in_cwnd_experiment_(CwndExperimentEnabled()), |
124 accepted_queue_ms_(kDefaultAcceptedQueueMs), | 125 accepted_queue_ms_(kDefaultAcceptedQueueMs), |
125 was_in_alr_(0) { | 126 was_in_alr_(false), |
| 127 pacer_pushback_experiment_( |
| 128 webrtc::field_trial::IsEnabled(kPacerPushbackExperiment)) { |
126 delay_based_bwe_->SetMinBitrate(min_bitrate_bps_); | 129 delay_based_bwe_->SetMinBitrate(min_bitrate_bps_); |
127 if (in_cwnd_experiment_ && | 130 if (in_cwnd_experiment_ && |
128 !ReadCwndExperimentParameter(&accepted_queue_ms_)) { | 131 !ReadCwndExperimentParameter(&accepted_queue_ms_)) { |
129 LOG(LS_WARNING) << "Failed to parse parameters for CwndExperiment " | 132 LOG(LS_WARNING) << "Failed to parse parameters for CwndExperiment " |
130 "from field trial string. Experiment disabled."; | 133 "from field trial string. Experiment disabled."; |
131 in_cwnd_experiment_ = false; | 134 in_cwnd_experiment_ = false; |
132 } | 135 } |
133 } | 136 } |
134 | 137 |
135 SendSideCongestionController::SendSideCongestionController( | 138 SendSideCongestionController::SendSideCongestionController( |
(...skipping 16 matching lines...) Expand all Loading... |
152 last_reported_bitrate_bps_(0), | 155 last_reported_bitrate_bps_(0), |
153 last_reported_fraction_loss_(0), | 156 last_reported_fraction_loss_(0), |
154 last_reported_rtt_(0), | 157 last_reported_rtt_(0), |
155 network_state_(kNetworkUp), | 158 network_state_(kNetworkUp), |
156 pause_pacer_(false), | 159 pause_pacer_(false), |
157 pacer_paused_(false), | 160 pacer_paused_(false), |
158 min_bitrate_bps_(congestion_controller::GetMinBitrateBps()), | 161 min_bitrate_bps_(congestion_controller::GetMinBitrateBps()), |
159 delay_based_bwe_(new DelayBasedBwe(event_log_, clock_)), | 162 delay_based_bwe_(new DelayBasedBwe(event_log_, clock_)), |
160 in_cwnd_experiment_(CwndExperimentEnabled()), | 163 in_cwnd_experiment_(CwndExperimentEnabled()), |
161 accepted_queue_ms_(kDefaultAcceptedQueueMs), | 164 accepted_queue_ms_(kDefaultAcceptedQueueMs), |
162 was_in_alr_(0) { | 165 was_in_alr_(false), |
| 166 pacer_pushback_experiment_( |
| 167 webrtc::field_trial::IsEnabled(kPacerPushbackExperiment)) { |
163 delay_based_bwe_->SetMinBitrate(min_bitrate_bps_); | 168 delay_based_bwe_->SetMinBitrate(min_bitrate_bps_); |
164 if (in_cwnd_experiment_ && | 169 if (in_cwnd_experiment_ && |
165 !ReadCwndExperimentParameter(&accepted_queue_ms_)) { | 170 !ReadCwndExperimentParameter(&accepted_queue_ms_)) { |
166 LOG(LS_WARNING) << "Failed to parse parameters for CwndExperiment " | 171 LOG(LS_WARNING) << "Failed to parse parameters for CwndExperiment " |
167 "from field trial string. Experiment disabled."; | 172 "from field trial string. Experiment disabled."; |
168 in_cwnd_experiment_ = false; | 173 in_cwnd_experiment_ = false; |
169 } | 174 } |
170 } | 175 } |
171 | 176 |
172 SendSideCongestionController::~SendSideCongestionController() {} | 177 SendSideCongestionController::~SendSideCongestionController() {} |
(...skipping 236 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
409 uint8_t fraction_loss; | 414 uint8_t fraction_loss; |
410 int64_t rtt; | 415 int64_t rtt; |
411 bool estimate_changed = bitrate_controller_->GetNetworkParameters( | 416 bool estimate_changed = bitrate_controller_->GetNetworkParameters( |
412 &bitrate_bps, &fraction_loss, &rtt); | 417 &bitrate_bps, &fraction_loss, &rtt); |
413 if (estimate_changed) { | 418 if (estimate_changed) { |
414 pacer_->SetEstimatedBitrate(bitrate_bps); | 419 pacer_->SetEstimatedBitrate(bitrate_bps); |
415 probe_controller_->SetEstimatedBitrate(bitrate_bps); | 420 probe_controller_->SetEstimatedBitrate(bitrate_bps); |
416 retransmission_rate_limiter_->SetMaxRate(bitrate_bps); | 421 retransmission_rate_limiter_->SetMaxRate(bitrate_bps); |
417 } | 422 } |
418 | 423 |
419 bitrate_bps = IsNetworkDown() || IsSendQueueFull() ? 0 : bitrate_bps; | 424 if (!pacer_pushback_experiment_) { |
| 425 bitrate_bps = IsNetworkDown() || IsSendQueueFull() ? 0 : bitrate_bps; |
| 426 } else { |
| 427 if (IsNetworkDown()) { |
| 428 bitrate_bps = 0; |
| 429 } else { |
| 430 int64_t queue_length_ms = pacer_->ExpectedQueueTimeMs(); |
| 431 |
| 432 if (queue_length_ms == 0) { |
| 433 encoding_rate_ = 1.0; |
| 434 } else if (queue_length_ms > 50) { |
| 435 float encoding_rate = 1.0 - queue_length_ms / 1000.0; |
| 436 encoding_rate_ = std::min(encoding_rate_, encoding_rate); |
| 437 encoding_rate_ = std::max(encoding_rate_, 0.0f); |
| 438 } |
| 439 |
| 440 bitrate_bps *= encoding_rate_; |
| 441 bitrate_bps = bitrate_bps < 50000 ? 0 : bitrate_bps; |
| 442 } |
| 443 } |
420 | 444 |
421 if (HasNetworkParametersToReportChanged(bitrate_bps, fraction_loss, rtt)) { | 445 if (HasNetworkParametersToReportChanged(bitrate_bps, fraction_loss, rtt)) { |
422 int64_t probing_interval_ms; | 446 int64_t probing_interval_ms; |
423 { | 447 { |
424 rtc::CritScope cs(&bwe_lock_); | 448 rtc::CritScope cs(&bwe_lock_); |
425 probing_interval_ms = delay_based_bwe_->GetExpectedBwePeriodMs(); | 449 probing_interval_ms = delay_based_bwe_->GetExpectedBwePeriodMs(); |
426 } | 450 } |
427 { | 451 { |
428 rtc::CritScope cs(&observer_lock_); | 452 rtc::CritScope cs(&observer_lock_); |
429 if (observer_) { | 453 if (observer_) { |
(...skipping 26 matching lines...) Expand all Loading... |
456 bool SendSideCongestionController::IsSendQueueFull() const { | 480 bool SendSideCongestionController::IsSendQueueFull() const { |
457 return pacer_->ExpectedQueueTimeMs() > PacedSender::kMaxQueueLengthMs; | 481 return pacer_->ExpectedQueueTimeMs() > PacedSender::kMaxQueueLengthMs; |
458 } | 482 } |
459 | 483 |
460 bool SendSideCongestionController::IsNetworkDown() const { | 484 bool SendSideCongestionController::IsNetworkDown() const { |
461 rtc::CritScope cs(&network_state_lock_); | 485 rtc::CritScope cs(&network_state_lock_); |
462 return network_state_ == kNetworkDown; | 486 return network_state_ == kNetworkDown; |
463 } | 487 } |
464 | 488 |
465 } // namespace webrtc | 489 } // namespace webrtc |
OLD | NEW |