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; |