| Index: webrtc/modules/congestion_controller/congestion_controller.cc
|
| diff --git a/webrtc/modules/congestion_controller/congestion_controller.cc b/webrtc/modules/congestion_controller/congestion_controller.cc
|
| index 157258291ae92df4ea30a85a8206729886123dd7..5767448a5f7bf711a24ef214ea47d5f5cac18f20 100644
|
| --- a/webrtc/modules/congestion_controller/congestion_controller.cc
|
| +++ b/webrtc/modules/congestion_controller/congestion_controller.cc
|
| @@ -142,8 +142,7 @@ CongestionController::CongestionController(
|
| : clock_(clock),
|
| observer_(nullptr),
|
| packet_router_(new PacketRouter()),
|
| - pacer_(new PacedSender(clock_,
|
| - packet_router_.get())),
|
| + pacer_(new PacedSender(clock_, packet_router_.get())),
|
| remote_bitrate_estimator_(
|
| new WrappingBitrateEstimator(remote_bitrate_observer, clock_)),
|
| bitrate_controller_(
|
| @@ -151,7 +150,10 @@ CongestionController::CongestionController(
|
| remote_estimator_proxy_(clock_, packet_router_.get()),
|
| transport_feedback_adapter_(bitrate_controller_.get(), clock_),
|
| min_bitrate_bps_(RemoteBitrateEstimator::kDefaultMinBitrateBps),
|
| - send_queue_is_full_(false) {
|
| + last_reported_bitrate_bps_(0),
|
| + last_reported_fraction_loss_(0),
|
| + last_reported_rtt_(0),
|
| + network_state_(kNetworkUp) {
|
| Init();
|
| }
|
|
|
| @@ -162,15 +164,17 @@ CongestionController::CongestionController(
|
| : clock_(clock),
|
| observer_(observer),
|
| packet_router_(new PacketRouter()),
|
| - pacer_(new PacedSender(clock_,
|
| - packet_router_.get())),
|
| + pacer_(new PacedSender(clock_, packet_router_.get())),
|
| remote_bitrate_estimator_(
|
| new WrappingBitrateEstimator(remote_bitrate_observer, clock_)),
|
| bitrate_controller_(BitrateController::CreateBitrateController(clock_)),
|
| remote_estimator_proxy_(clock_, packet_router_.get()),
|
| transport_feedback_adapter_(bitrate_controller_.get(), clock_),
|
| min_bitrate_bps_(RemoteBitrateEstimator::kDefaultMinBitrateBps),
|
| - send_queue_is_full_(false) {
|
| + last_reported_bitrate_bps_(0),
|
| + last_reported_fraction_loss_(0),
|
| + last_reported_rtt_(0),
|
| + network_state_(kNetworkUp) {
|
| Init();
|
| }
|
|
|
| @@ -192,7 +196,10 @@ CongestionController::CongestionController(
|
| remote_estimator_proxy_(clock_, packet_router_.get()),
|
| transport_feedback_adapter_(bitrate_controller_.get(), clock_),
|
| min_bitrate_bps_(RemoteBitrateEstimator::kDefaultMinBitrateBps),
|
| - send_queue_is_full_(false) {
|
| + last_reported_bitrate_bps_(0),
|
| + last_reported_fraction_loss_(0),
|
| + last_reported_rtt_(0),
|
| + network_state_(kNetworkUp) {
|
| Init();
|
| }
|
|
|
| @@ -265,6 +272,11 @@ void CongestionController::SignalNetworkState(NetworkState state) {
|
| } else {
|
| pacer_->Pause();
|
| }
|
| + {
|
| + rtc::CritScope cs(&critsect_);
|
| + network_state_ = state;
|
| + }
|
| + MaybeTriggerOnNetworkChanged();
|
| }
|
|
|
| void CongestionController::OnSentPacket(const rtc::SentPacket& sent_packet) {
|
| @@ -297,24 +309,40 @@ void CongestionController::MaybeTriggerOnNetworkChanged() {
|
| uint32_t bitrate_bps;
|
| uint8_t fraction_loss;
|
| int64_t rtt;
|
| - bool network_changed = bitrate_controller_->GetNetworkParameters(
|
| + bool estimate_changed = bitrate_controller_->GetNetworkParameters(
|
| &bitrate_bps, &fraction_loss, &rtt);
|
| - if (network_changed)
|
| + if (estimate_changed)
|
| pacer_->SetEstimatedBitrate(bitrate_bps);
|
| - bool send_queue_is_full =
|
| - pacer_->ExpectedQueueTimeMs() > PacedSender::kMaxQueueLengthMs;
|
| - bitrate_bps = send_queue_is_full ? 0 : bitrate_bps;
|
| - if ((network_changed && !send_queue_is_full) ||
|
| - UpdateSendQueueStatus(send_queue_is_full)) {
|
| +
|
| + bitrate_bps = IsNetworkDown() || IsSendQueueFull() ? 0 : bitrate_bps;
|
| +
|
| + if (HasNetworkParametersToReportChanged(bitrate_bps, fraction_loss, rtt)) {
|
| observer_->OnNetworkChanged(bitrate_bps, fraction_loss, rtt);
|
| }
|
| }
|
|
|
| -bool CongestionController::UpdateSendQueueStatus(bool send_queue_is_full) {
|
| +bool CongestionController::HasNetworkParametersToReportChanged(
|
| + uint32_t bitrate_bps,
|
| + uint8_t fraction_loss,
|
| + int64_t rtt) {
|
| + rtc::CritScope cs(&critsect_);
|
| + bool changed =
|
| + last_reported_bitrate_bps_ != bitrate_bps ||
|
| + (bitrate_bps > 0 && (last_reported_fraction_loss_ != fraction_loss ||
|
| + last_reported_rtt_ != rtt));
|
| + last_reported_bitrate_bps_ = bitrate_bps;
|
| + last_reported_fraction_loss_ = fraction_loss;
|
| + last_reported_rtt_ = rtt;
|
| + return changed;
|
| +}
|
| +
|
| +bool CongestionController::IsSendQueueFull() const {
|
| + return pacer_->ExpectedQueueTimeMs() > PacedSender::kMaxQueueLengthMs;
|
| +}
|
| +
|
| +bool CongestionController::IsNetworkDown() const {
|
| rtc::CritScope cs(&critsect_);
|
| - bool result = send_queue_is_full_ != send_queue_is_full;
|
| - send_queue_is_full_ = send_queue_is_full;
|
| - return result;
|
| + return network_state_ == kNetworkDown;
|
| }
|
|
|
| } // namespace webrtc
|
|
|