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 "webrtc/modules/remote_bitrate_estimator/remote_bitrate_estimator_singl
e_stream.h" | 25 #include "webrtc/modules/remote_bitrate_estimator/remote_bitrate_estimator_singl
e_stream.h" |
26 #include "webrtc/modules/utility/include/process_thread.h" | 26 #include "webrtc/modules/utility/include/process_thread.h" |
27 #include "webrtc/system_wrappers/include/critical_section_wrapper.h" | 27 #include "webrtc/system_wrappers/include/critical_section_wrapper.h" |
28 #include "webrtc/video/payload_router.h" | 28 #include "webrtc/video/payload_router.h" |
29 | 29 |
30 namespace webrtc { | 30 namespace webrtc { |
31 namespace { | 31 namespace { |
32 | 32 |
33 static const uint32_t kTimeOffsetSwitchThreshold = 30; | 33 static const uint32_t kTimeOffsetSwitchThreshold = 30; |
34 | 34 |
| 35 // Makes sure that the bitrate and the min, max values are in valid range. |
| 36 static void ClampBitrates(int* bitrate_bps, |
| 37 int* min_bitrate_bps, |
| 38 int* max_bitrate_bps) { |
| 39 // TODO(holmer): We should make sure the default bitrates are set to 10 kbps, |
| 40 // and that we don't try to set the min bitrate to 0 from any applications. |
| 41 // The congestion controller should allow a min bitrate of 0. |
| 42 const int kMinBitrateBps = 10000; |
| 43 if (*min_bitrate_bps < kMinBitrateBps) |
| 44 *min_bitrate_bps = kMinBitrateBps; |
| 45 if (*max_bitrate_bps > 0) |
| 46 *max_bitrate_bps = std::max(*min_bitrate_bps, *max_bitrate_bps); |
| 47 if (*bitrate_bps > 0) |
| 48 *bitrate_bps = std::max(*min_bitrate_bps, *bitrate_bps); |
| 49 } |
| 50 |
35 class WrappingBitrateEstimator : public RemoteBitrateEstimator { | 51 class WrappingBitrateEstimator : public RemoteBitrateEstimator { |
36 public: | 52 public: |
37 WrappingBitrateEstimator(RemoteBitrateObserver* observer, Clock* clock) | 53 WrappingBitrateEstimator(RemoteBitrateObserver* observer, Clock* clock) |
38 : observer_(observer), | 54 : observer_(observer), |
39 clock_(clock), | 55 clock_(clock), |
40 crit_sect_(CriticalSectionWrapper::CreateCriticalSection()), | 56 crit_sect_(CriticalSectionWrapper::CreateCriticalSection()), |
41 rbe_(new RemoteBitrateEstimatorSingleStream(observer_, clock_)), | 57 rbe_(new RemoteBitrateEstimatorSingleStream(observer_, clock_)), |
42 using_absolute_send_time_(false), | 58 using_absolute_send_time_(false), |
43 packets_since_absolute_send_time_(0), | 59 packets_since_absolute_send_time_(0), |
44 min_bitrate_bps_(RemoteBitrateEstimator::kDefaultMinBitrateBps) {} | 60 min_bitrate_bps_(RemoteBitrateEstimator::kDefaultMinBitrateBps) {} |
(...skipping 160 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
205 | 221 |
206 CongestionController::~CongestionController() {} | 222 CongestionController::~CongestionController() {} |
207 | 223 |
208 void CongestionController::Init() { | 224 void CongestionController::Init() { |
209 transport_feedback_adapter_.SetBitrateEstimator( | 225 transport_feedback_adapter_.SetBitrateEstimator( |
210 new RemoteBitrateEstimatorAbsSendTime(&transport_feedback_adapter_)); | 226 new RemoteBitrateEstimatorAbsSendTime(&transport_feedback_adapter_)); |
211 transport_feedback_adapter_.GetBitrateEstimator()->SetMinBitrate( | 227 transport_feedback_adapter_.GetBitrateEstimator()->SetMinBitrate( |
212 min_bitrate_bps_); | 228 min_bitrate_bps_); |
213 } | 229 } |
214 | 230 |
215 | |
216 void CongestionController::SetBweBitrates(int min_bitrate_bps, | 231 void CongestionController::SetBweBitrates(int min_bitrate_bps, |
217 int start_bitrate_bps, | 232 int start_bitrate_bps, |
218 int max_bitrate_bps) { | 233 int max_bitrate_bps) { |
219 // TODO(holmer): We should make sure the default bitrates are set to 10 kbps, | 234 ClampBitrates(&start_bitrate_bps, &min_bitrate_bps, &max_bitrate_bps); |
220 // and that we don't try to set the min bitrate to 0 from any applications. | |
221 // The congestion controller should allow a min bitrate of 0. | |
222 const int kMinBitrateBps = 10000; | |
223 if (min_bitrate_bps < kMinBitrateBps) | |
224 min_bitrate_bps = kMinBitrateBps; | |
225 if (max_bitrate_bps > 0) | |
226 max_bitrate_bps = std::max(min_bitrate_bps, max_bitrate_bps); | |
227 if (start_bitrate_bps > 0) | |
228 start_bitrate_bps = std::max(min_bitrate_bps, start_bitrate_bps); | |
229 | |
230 bitrate_controller_->SetBitrates(start_bitrate_bps, | 235 bitrate_controller_->SetBitrates(start_bitrate_bps, |
231 min_bitrate_bps, | 236 min_bitrate_bps, |
232 max_bitrate_bps); | 237 max_bitrate_bps); |
233 | 238 |
234 if (remote_bitrate_estimator_) | 239 if (remote_bitrate_estimator_) |
235 remote_bitrate_estimator_->SetMinBitrate(min_bitrate_bps); | 240 remote_bitrate_estimator_->SetMinBitrate(min_bitrate_bps); |
236 min_bitrate_bps_ = min_bitrate_bps; | 241 min_bitrate_bps_ = min_bitrate_bps; |
237 transport_feedback_adapter_.GetBitrateEstimator()->SetMinBitrate( | 242 transport_feedback_adapter_.GetBitrateEstimator()->SetMinBitrate( |
238 min_bitrate_bps_); | 243 min_bitrate_bps_); |
239 MaybeTriggerOnNetworkChanged(); | 244 MaybeTriggerOnNetworkChanged(); |
240 } | 245 } |
241 | 246 |
| 247 void CongestionController::ResetBweAndBitrates(int bitrate_bps, |
| 248 int min_bitrate_bps, |
| 249 int max_bitrate_bps) { |
| 250 ClampBitrates(&bitrate_bps, &min_bitrate_bps, &max_bitrate_bps); |
| 251 // TODO(honghaiz): Recreate this object once the bitrate controller is |
| 252 // no longer exposed outside CongestionController. |
| 253 bitrate_controller_->ResetBitrates(bitrate_bps, min_bitrate_bps, |
| 254 max_bitrate_bps); |
| 255 min_bitrate_bps_ = min_bitrate_bps; |
| 256 // TODO(honghaiz): Recreate this object once the remote bitrate estimator is |
| 257 // no longer exposed outside CongestionController. |
| 258 if (remote_bitrate_estimator_) |
| 259 remote_bitrate_estimator_->SetMinBitrate(min_bitrate_bps); |
| 260 |
| 261 RemoteBitrateEstimator* rbe = |
| 262 new RemoteBitrateEstimatorAbsSendTime(&transport_feedback_adapter_); |
| 263 transport_feedback_adapter_.SetBitrateEstimator(rbe); |
| 264 rbe->SetMinBitrate(min_bitrate_bps); |
| 265 // TODO(holmer): Trigger a new probe once mid-call probing is implemented. |
| 266 MaybeTriggerOnNetworkChanged(); |
| 267 } |
| 268 |
242 BitrateController* CongestionController::GetBitrateController() const { | 269 BitrateController* CongestionController::GetBitrateController() const { |
243 return bitrate_controller_.get(); | 270 return bitrate_controller_.get(); |
244 } | 271 } |
245 | 272 |
246 RemoteBitrateEstimator* CongestionController::GetRemoteBitrateEstimator( | 273 RemoteBitrateEstimator* CongestionController::GetRemoteBitrateEstimator( |
247 bool send_side_bwe) { | 274 bool send_side_bwe) { |
248 if (send_side_bwe) { | 275 if (send_side_bwe) { |
249 return &remote_estimator_proxy_; | 276 return &remote_estimator_proxy_; |
250 } else { | 277 } else { |
251 return remote_bitrate_estimator_.get(); | 278 return remote_bitrate_estimator_.get(); |
(...skipping 87 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
339 bool CongestionController::IsSendQueueFull() const { | 366 bool CongestionController::IsSendQueueFull() const { |
340 return pacer_->ExpectedQueueTimeMs() > PacedSender::kMaxQueueLengthMs; | 367 return pacer_->ExpectedQueueTimeMs() > PacedSender::kMaxQueueLengthMs; |
341 } | 368 } |
342 | 369 |
343 bool CongestionController::IsNetworkDown() const { | 370 bool CongestionController::IsNetworkDown() const { |
344 rtc::CritScope cs(&critsect_); | 371 rtc::CritScope cs(&critsect_); |
345 return network_state_ == kNetworkDown; | 372 return network_state_ == kNetworkDown; |
346 } | 373 } |
347 | 374 |
348 } // namespace webrtc | 375 } // namespace webrtc |
OLD | NEW |