| OLD | NEW |
| 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 10 matching lines...) Expand all Loading... |
| 21 #include "webrtc/base/arraysize.h" | 21 #include "webrtc/base/arraysize.h" |
| 22 #include "webrtc/base/common.h" | 22 #include "webrtc/base/common.h" |
| 23 #include "webrtc/modules/remote_bitrate_estimator/test/estimators/nada.h" | 23 #include "webrtc/modules/remote_bitrate_estimator/test/estimators/nada.h" |
| 24 #include "webrtc/modules/remote_bitrate_estimator/test/bwe_test_logging.h" | 24 #include "webrtc/modules/remote_bitrate_estimator/test/bwe_test_logging.h" |
| 25 #include "webrtc/modules/rtp_rtcp/include/receive_statistics.h" | 25 #include "webrtc/modules/rtp_rtcp/include/receive_statistics.h" |
| 26 | 26 |
| 27 namespace webrtc { | 27 namespace webrtc { |
| 28 namespace testing { | 28 namespace testing { |
| 29 namespace bwe { | 29 namespace bwe { |
| 30 | 30 |
| 31 namespace { |
| 32 // Used as an upper bound for calling AcceleratedRampDown. |
| 33 const float kMaxCongestionSignalMs = |
| 34 40.0f + NadaBweSender::kMinNadaBitrateKbps / 15; |
| 35 } // namespace |
| 36 |
| 37 const int NadaBweSender::kMinNadaBitrateKbps = 50; |
| 31 const int64_t NadaBweReceiver::kReceivingRateTimeWindowMs = 500; | 38 const int64_t NadaBweReceiver::kReceivingRateTimeWindowMs = 500; |
| 32 | 39 |
| 33 NadaBweReceiver::NadaBweReceiver(int flow_id) | 40 NadaBweReceiver::NadaBweReceiver(int flow_id) |
| 34 : BweReceiver(flow_id, kReceivingRateTimeWindowMs), | 41 : BweReceiver(flow_id, kReceivingRateTimeWindowMs), |
| 35 clock_(0), | 42 clock_(0), |
| 36 last_feedback_ms_(0), | 43 last_feedback_ms_(0), |
| 37 recv_stats_(ReceiveStatistics::Create(&clock_)), | 44 recv_stats_(ReceiveStatistics::Create(&clock_)), |
| 38 baseline_delay_ms_(10000), // Initialized as an upper bound. | 45 baseline_delay_ms_(10000), // Initialized as an upper bound. |
| 39 delay_signal_ms_(0), | 46 delay_signal_ms_(0), |
| 40 last_congestion_signal_ms_(0), | 47 last_congestion_signal_ms_(0), |
| (...skipping 112 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 153 | 160 |
| 154 // Implementation according to Cisco's proposal by default. | 161 // Implementation according to Cisco's proposal by default. |
| 155 NadaBweSender::NadaBweSender(int kbps, BitrateObserver* observer, Clock* clock) | 162 NadaBweSender::NadaBweSender(int kbps, BitrateObserver* observer, Clock* clock) |
| 156 : BweSender(kbps), // Referred as "Reference Rate" = R_n., | 163 : BweSender(kbps), // Referred as "Reference Rate" = R_n., |
| 157 clock_(clock), | 164 clock_(clock), |
| 158 observer_(observer), | 165 observer_(observer), |
| 159 original_operating_mode_(true) { | 166 original_operating_mode_(true) { |
| 160 } | 167 } |
| 161 | 168 |
| 162 NadaBweSender::NadaBweSender(BitrateObserver* observer, Clock* clock) | 169 NadaBweSender::NadaBweSender(BitrateObserver* observer, Clock* clock) |
| 163 : BweSender(kMinBitrateKbps), // Referred as "Reference Rate" = R_n. | 170 : BweSender(kMinNadaBitrateKbps), // Referred as "Reference Rate" = R_n. |
| 164 clock_(clock), | 171 clock_(clock), |
| 165 observer_(observer), | 172 observer_(observer), |
| 166 original_operating_mode_(true) { | 173 original_operating_mode_(true) {} |
| 167 } | |
| 168 | 174 |
| 169 NadaBweSender::~NadaBweSender() { | 175 NadaBweSender::~NadaBweSender() { |
| 170 } | 176 } |
| 171 | 177 |
| 172 int NadaBweSender::GetFeedbackIntervalMs() const { | 178 int NadaBweSender::GetFeedbackIntervalMs() const { |
| 173 return 100; | 179 return 100; |
| 174 } | 180 } |
| 175 | 181 |
| 176 void NadaBweSender::GiveFeedback(const FeedbackPacket& feedback) { | 182 void NadaBweSender::GiveFeedback(const FeedbackPacket& feedback) { |
| 177 const NadaFeedback& fb = static_cast<const NadaFeedback&>(feedback); | 183 const NadaFeedback& fb = static_cast<const NadaFeedback&>(feedback); |
| (...skipping 28 matching lines...) Expand all Loading... |
| 206 fb.derivative() < kDerivativeUpperBound) { | 212 fb.derivative() < kDerivativeUpperBound) { |
| 207 AcceleratedRampUp(fb); | 213 AcceleratedRampUp(fb); |
| 208 } else { | 214 } else { |
| 209 GradualRateUpdate(fb, delta_s, 1.0); | 215 GradualRateUpdate(fb, delta_s, 1.0); |
| 210 } | 216 } |
| 211 } else { | 217 } else { |
| 212 // Modified if conditions and rate update; new ramp down mode. | 218 // Modified if conditions and rate update; new ramp down mode. |
| 213 if (fb.congestion_signal() == fb.est_queuing_delay_signal_ms() && | 219 if (fb.congestion_signal() == fb.est_queuing_delay_signal_ms() && |
| 214 fb.est_queuing_delay_signal_ms() < kQueuingDelayUpperBoundMs && | 220 fb.est_queuing_delay_signal_ms() < kQueuingDelayUpperBoundMs && |
| 215 fb.exp_smoothed_delay_ms() < | 221 fb.exp_smoothed_delay_ms() < |
| 216 kMinBitrateKbps / kProportionalityDelayBits && | 222 kMinNadaBitrateKbps / kProportionalityDelayBits && |
| 217 fb.derivative() < kDerivativeUpperBound && | 223 fb.derivative() < kDerivativeUpperBound && |
| 218 fb.receiving_rate() > kMinBitrateKbps) { | 224 fb.receiving_rate() > kMinNadaBitrateKbps) { |
| 219 AcceleratedRampUp(fb); | 225 AcceleratedRampUp(fb); |
| 220 } else if (fb.congestion_signal() > kMaxCongestionSignalMs || | 226 } else if (fb.congestion_signal() > kMaxCongestionSignalMs || |
| 221 fb.exp_smoothed_delay_ms() > kMaxCongestionSignalMs) { | 227 fb.exp_smoothed_delay_ms() > kMaxCongestionSignalMs) { |
| 222 AcceleratedRampDown(fb); | 228 AcceleratedRampDown(fb); |
| 223 } else { | 229 } else { |
| 224 double bitrate_reference = | 230 double bitrate_reference = |
| 225 (2.0 * bitrate_kbps_) / (kMaxBitrateKbps + kMinBitrateKbps); | 231 (2.0 * bitrate_kbps_) / (kMaxBitrateKbps + kMinNadaBitrateKbps); |
| 226 double smoothing_factor = pow(bitrate_reference, 0.75); | 232 double smoothing_factor = pow(bitrate_reference, 0.75); |
| 227 GradualRateUpdate(fb, delta_s, smoothing_factor); | 233 GradualRateUpdate(fb, delta_s, smoothing_factor); |
| 228 } | 234 } |
| 229 } | 235 } |
| 230 | 236 |
| 231 bitrate_kbps_ = std::min(bitrate_kbps_, kMaxBitrateKbps); | 237 bitrate_kbps_ = std::min(bitrate_kbps_, kMaxBitrateKbps); |
| 232 bitrate_kbps_ = std::max(bitrate_kbps_, kMinBitrateKbps); | 238 bitrate_kbps_ = std::max(bitrate_kbps_, kMinNadaBitrateKbps); |
| 233 | 239 |
| 234 observer_->OnNetworkChanged(1000 * bitrate_kbps_, 0, rtt_ms); | 240 observer_->OnNetworkChanged(1000 * bitrate_kbps_, 0, rtt_ms); |
| 235 } | 241 } |
| 236 | 242 |
| 237 int64_t NadaBweSender::TimeUntilNextProcess() { | 243 int64_t NadaBweSender::TimeUntilNextProcess() { |
| 238 return 100; | 244 return 100; |
| 239 } | 245 } |
| 240 | 246 |
| 241 void NadaBweSender::Process() { | 247 void NadaBweSender::Process() { |
| 242 } | 248 } |
| (...skipping 21 matching lines...) Expand all Loading... |
| 264 float delta_s, | 270 float delta_s, |
| 265 double smoothing_factor) { | 271 double smoothing_factor) { |
| 266 const float kTauOMs = 500.0f; // Referred as tau_o. | 272 const float kTauOMs = 500.0f; // Referred as tau_o. |
| 267 const float kEta = 2.0f; // Referred as eta. | 273 const float kEta = 2.0f; // Referred as eta. |
| 268 const float kKappa = 1.0f; // Referred as kappa. | 274 const float kKappa = 1.0f; // Referred as kappa. |
| 269 const float kReferenceDelayMs = 10.0f; // Referred as x_ref. | 275 const float kReferenceDelayMs = 10.0f; // Referred as x_ref. |
| 270 const float kPriorityWeight = 1.0f; // Referred as w. | 276 const float kPriorityWeight = 1.0f; // Referred as w. |
| 271 | 277 |
| 272 float x_hat = fb.congestion_signal() + kEta * kTauOMs * fb.derivative(); | 278 float x_hat = fb.congestion_signal() + kEta * kTauOMs * fb.derivative(); |
| 273 | 279 |
| 274 float kTheta = | 280 float kTheta = kPriorityWeight * (kMaxBitrateKbps - kMinNadaBitrateKbps) * |
| 275 kPriorityWeight * (kMaxBitrateKbps - kMinBitrateKbps) * kReferenceDelayMs; | 281 kReferenceDelayMs; |
| 276 | 282 |
| 277 int original_increase = | 283 int original_increase = static_cast<int>( |
| 278 static_cast<int>((kKappa * delta_s * | 284 (kKappa * delta_s * |
| 279 (kTheta - (bitrate_kbps_ - kMinBitrateKbps) * x_hat)) / | 285 (kTheta - (bitrate_kbps_ - kMinNadaBitrateKbps) * x_hat)) / |
| 280 (kTauOMs * kTauOMs) + | 286 (kTauOMs * kTauOMs) + |
| 281 0.5f); | 287 0.5f); |
| 282 | 288 |
| 283 bitrate_kbps_ = bitrate_kbps_ + smoothing_factor * original_increase; | 289 bitrate_kbps_ = bitrate_kbps_ + smoothing_factor * original_increase; |
| 284 } | 290 } |
| 285 | 291 |
| 286 } // namespace bwe | 292 } // namespace bwe |
| 287 } // namespace testing | 293 } // namespace testing |
| 288 } // namespace webrtc | 294 } // namespace webrtc |
| OLD | NEW |