Chromium Code Reviews| Index: webrtc/modules/bitrate_controller/bitrate_controller_impl.cc |
| diff --git a/webrtc/modules/bitrate_controller/bitrate_controller_impl.cc b/webrtc/modules/bitrate_controller/bitrate_controller_impl.cc |
| index bf608789d5d7462110f9c6e434d4def02a09c79e..f270f17670b06ee4cf089a49a1fb46c0c8fbf7c6 100644 |
| --- a/webrtc/modules/bitrate_controller/bitrate_controller_impl.cc |
| +++ b/webrtc/modules/bitrate_controller/bitrate_controller_impl.cc |
| @@ -15,6 +15,8 @@ |
| #include <map> |
| #include <utility> |
| +#include "webrtc/base/checks.h" |
| +#include "webrtc/base/logging.h" |
| #include "webrtc/modules/rtp_rtcp/include/rtp_rtcp_defines.h" |
| namespace webrtc { |
| @@ -79,21 +81,27 @@ class BitrateControllerImpl::RtcpBandwidthObserverImpl |
| BitrateController* BitrateController::CreateBitrateController( |
| Clock* clock, |
| - BitrateObserver* observer) { |
| - return new BitrateControllerImpl(clock, observer); |
| + BitrateObserver* observer, |
| + PacedSender* pacer) { |
| + return new BitrateControllerImpl(clock, observer, pacer); |
| } |
| BitrateControllerImpl::BitrateControllerImpl(Clock* clock, |
| - BitrateObserver* observer) |
| + BitrateObserver* observer, |
| + PacedSender* pacer) |
| : clock_(clock), |
| observer_(observer), |
| + pacer_(pacer), |
| last_bitrate_update_ms_(clock_->TimeInMilliseconds()), |
| bandwidth_estimation_(), |
| reserved_bitrate_bps_(0), |
| last_bitrate_bps_(0), |
| last_fraction_loss_(0), |
| last_rtt_ms_(0), |
| - last_reserved_bitrate_bps_(0) { |
| + last_reserved_bitrate_bps_(0), |
| + send_queue_full_(false) { |
| + RTC_DCHECK(observer_); |
| + RTC_DCHECK(pacer_); |
| // This calls the observer_, which means that the observer provided by the |
| // user must be ready to accept a bitrate update when it constructs the |
| // controller. We do this to avoid having to keep synchronized initial values |
| @@ -187,11 +195,24 @@ void BitrateControllerImpl::OnReceivedRtcpReceiverReport( |
| } |
| void BitrateControllerImpl::MaybeTriggerOnNetworkChanged() { |
| - uint32_t bitrate; |
| + uint32_t bitrate_bps; |
| uint8_t fraction_loss; |
| int64_t rtt; |
| - if (GetNetworkParameters(&bitrate, &fraction_loss, &rtt)) |
| - observer_->OnNetworkChanged(bitrate, fraction_loss, rtt); |
| + |
| + bool network_changed = |
| + GetNetworkParameters(&bitrate_bps, &fraction_loss, &rtt); |
| + if (network_changed) { |
| + pacer_->SetNetWorkEstimateTargetBitrate(bitrate_bps); |
|
stefan-webrtc
2016/04/29 10:48:38
I'd prefer keeping this in OnNetworkChanged and no
perkj_webrtc
2016/05/02 11:29:10
ok- as discussed.
|
| + } |
| + bool send_queue_full = |
| + pacer_->ExpectedQueueTimeMs() > PacedSender::kMaxQueueLengthMs; |
| + |
| + bitrate_bps = send_queue_full ? 0 : bitrate_bps; |
| + if (UpdateSendQueueStatus(send_queue_full) || |
| + (network_changed && !send_queue_full)) { |
| + observer_->OnNetworkChanged(bitrate_bps, fraction_loss, rtt); |
| + return; |
| + } |
| } |
| bool BitrateControllerImpl::GetNetworkParameters(uint32_t* bitrate, |
| @@ -215,9 +236,21 @@ bool BitrateControllerImpl::GetNetworkParameters(uint32_t* bitrate, |
| last_reserved_bitrate_bps_ = reserved_bitrate_bps_; |
| new_bitrate = true; |
| } |
| + |
| return new_bitrate; |
| } |
| +bool BitrateControllerImpl::UpdateSendQueueStatus(bool is_full) { |
| + rtc::CritScope cs(&critsect_); |
| + bool changed = is_full != send_queue_full_; |
| + send_queue_full_ = is_full; |
| + if (changed) { |
| + LOG(LS_INFO) << "Send queue status changed state. " |
| + << " Queue is " << (changed ? "full" : "not full."); |
| + } |
| + return changed; |
| +} |
| + |
| bool BitrateControllerImpl::AvailableBandwidth(uint32_t* bandwidth) const { |
| rtc::CritScope cs(&critsect_); |
| int bitrate; |