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 bc2f29cf0cfee22cd75ac6facf4a9bb74e6a7bd9..6ed64a299d73799ef4781277eacdb0e8770a39d4 100644 |
--- a/webrtc/modules/congestion_controller/congestion_controller.cc |
+++ b/webrtc/modules/congestion_controller/congestion_controller.cc |
@@ -160,6 +160,7 @@ CongestionController::CongestionController( |
std::unique_ptr<PacedSender> pacer) |
: clock_(clock), |
observer_(observer), |
+ event_log_(event_log), |
packet_router_(packet_router), |
pacer_(std::move(pacer)), |
bitrate_controller_( |
@@ -169,15 +170,16 @@ CongestionController::CongestionController( |
new RateLimiter(clock, kRetransmitWindowSizeMs)), |
remote_bitrate_estimator_(remote_bitrate_observer, clock_), |
remote_estimator_proxy_(clock_, packet_router_), |
- transport_feedback_adapter_(event_log, clock_, bitrate_controller_.get()), |
+ transport_feedback_adapter_(clock_), |
min_bitrate_bps_(congestion_controller::GetMinBitrateBps()), |
max_bitrate_bps_(0), |
last_reported_bitrate_bps_(0), |
last_reported_fraction_loss_(0), |
last_reported_rtt_(0), |
- network_state_(kNetworkUp) { |
- transport_feedback_adapter_.InitBwe(); |
- transport_feedback_adapter_.SetMinBitrate(min_bitrate_bps_); |
+ network_state_(kNetworkUp), |
+ delay_based_bwe_(new DelayBasedBwe(event_log_, clock_)) { |
+ delay_based_bwe_->SetMinBitrate(min_bitrate_bps_); |
+ worker_thread_checker_.DetachFromThread(); |
} |
CongestionController::~CongestionController() {} |
@@ -210,9 +212,12 @@ void CongestionController::SetBweBitrates(int min_bitrate_bps, |
remote_bitrate_estimator_.SetMinBitrate(min_bitrate_bps); |
min_bitrate_bps_ = min_bitrate_bps; |
- if (start_bitrate_bps > 0) |
- transport_feedback_adapter_.SetStartBitrate(start_bitrate_bps); |
- transport_feedback_adapter_.SetMinBitrate(min_bitrate_bps_); |
+ { |
+ rtc::CritScope cs(&bwe_lock_); |
+ if (start_bitrate_bps > 0) |
+ delay_based_bwe_->SetStartBitrate(start_bitrate_bps); |
+ delay_based_bwe_->SetMinBitrate(min_bitrate_bps_); |
+ } |
MaybeTriggerOnNetworkChanged(); |
} |
@@ -231,9 +236,12 @@ void CongestionController::ResetBweAndBitrates(int bitrate_bps, |
remote_bitrate_estimator_.SetMinBitrate(min_bitrate_bps); |
transport_feedback_adapter_.ClearSendTimeHistory(); |
- transport_feedback_adapter_.InitBwe(); |
- transport_feedback_adapter_.SetStartBitrate(bitrate_bps); |
- transport_feedback_adapter_.SetMinBitrate(min_bitrate_bps); |
+ { |
+ rtc::CritScope cs(&bwe_lock_); |
+ delay_based_bwe_.reset(new DelayBasedBwe(event_log_, clock_)); |
+ delay_based_bwe_->SetStartBitrate(bitrate_bps); |
+ delay_based_bwe_->SetMinBitrate(min_bitrate_bps); |
+ } |
probe_controller_->Reset(); |
probe_controller_->SetBitrates(min_bitrate_bps, bitrate_bps, max_bitrate_bps); |
@@ -254,11 +262,6 @@ RemoteBitrateEstimator* CongestionController::GetRemoteBitrateEstimator( |
} |
} |
-TransportFeedbackObserver* |
-CongestionController::GetTransportFeedbackObserver() { |
- return &transport_feedback_adapter_; |
-} |
- |
RateLimiter* CongestionController::GetRetransmissionRateLimiter() { |
return retransmission_rate_limiter_.get(); |
} |
@@ -286,7 +289,7 @@ void CongestionController::SignalNetworkState(NetworkState state) { |
pacer_->Pause(); |
} |
{ |
- rtc::CritScope cs(&critsect_); |
+ rtc::CritScope cs(&network_state_lock_); |
network_state_ = state; |
} |
probe_controller_->OnNetworkStateChanged(state); |
@@ -310,7 +313,10 @@ void CongestionController::OnSentPacket(const rtc::SentPacket& sent_packet) { |
void CongestionController::OnRttUpdate(int64_t avg_rtt_ms, int64_t max_rtt_ms) { |
remote_bitrate_estimator_.OnRttUpdate(avg_rtt_ms, max_rtt_ms); |
- transport_feedback_adapter_.OnRttUpdate(avg_rtt_ms, max_rtt_ms); |
+ { |
+ rtc::CritScope cs(&bwe_lock_); |
+ delay_based_bwe_->OnRttUpdate(avg_rtt_ms, max_rtt_ms); |
+ } |
} |
int64_t CongestionController::TimeUntilNextProcess() { |
@@ -325,6 +331,32 @@ void CongestionController::Process() { |
MaybeTriggerOnNetworkChanged(); |
} |
+void CongestionController::AddPacket(uint16_t sequence_number, |
+ size_t length, |
+ const PacedPacketInfo& pacing_info) { |
+ transport_feedback_adapter_.AddPacket(sequence_number, length, pacing_info); |
+} |
+ |
+void CongestionController::OnTransportFeedback( |
+ const rtcp::TransportFeedback& feedback) { |
+ RTC_DCHECK(worker_thread_checker_.CalledOnValidThread()); |
+ transport_feedback_adapter_.OnTransportFeedback(feedback); |
+ DelayBasedBwe::Result result; |
+ { |
+ rtc::CritScope cs(&bwe_lock_); |
+ result = delay_based_bwe_->IncomingPacketFeedbackVector( |
+ transport_feedback_adapter_.GetTransportFeedbackVector()); |
+ } |
+ if (result.updated) |
+ bitrate_controller_->OnDelayBasedBweResult(result); |
+} |
+ |
+std::vector<PacketFeedback> CongestionController::GetTransportFeedbackVector() |
+ const { |
+ RTC_DCHECK(worker_thread_checker_.CalledOnValidThread()); |
+ return transport_feedback_adapter_.GetTransportFeedbackVector(); |
+} |
+ |
void CongestionController::MaybeTriggerOnNetworkChanged() { |
// TODO(perkj): |observer_| can be nullptr if the ctor that accepts a |
// BitrateObserver is used. Remove this check once the ctor is removed. |
@@ -345,9 +377,13 @@ void CongestionController::MaybeTriggerOnNetworkChanged() { |
bitrate_bps = IsNetworkDown() || IsSendQueueFull() ? 0 : bitrate_bps; |
if (HasNetworkParametersToReportChanged(bitrate_bps, fraction_loss, rtt)) { |
- observer_->OnNetworkChanged( |
- bitrate_bps, fraction_loss, rtt, |
- transport_feedback_adapter_.GetProbingIntervalMs()); |
+ int64_t probing_interval_ms; |
+ { |
+ rtc::CritScope cs(&bwe_lock_); |
+ probing_interval_ms = delay_based_bwe_->GetProbingIntervalMs(); |
+ } |
+ observer_->OnNetworkChanged(bitrate_bps, fraction_loss, rtt, |
+ probing_interval_ms); |
remote_estimator_proxy_.OnBitrateChanged(bitrate_bps); |
} |
} |
@@ -356,7 +392,7 @@ bool CongestionController::HasNetworkParametersToReportChanged( |
uint32_t bitrate_bps, |
uint8_t fraction_loss, |
int64_t rtt) { |
- rtc::CritScope cs(&critsect_); |
+ rtc::CritScope cs(&network_state_lock_); |
bool changed = |
last_reported_bitrate_bps_ != bitrate_bps || |
(bitrate_bps > 0 && (last_reported_fraction_loss_ != fraction_loss || |
@@ -376,7 +412,7 @@ bool CongestionController::IsSendQueueFull() const { |
} |
bool CongestionController::IsNetworkDown() const { |
- rtc::CritScope cs(&critsect_); |
+ rtc::CritScope cs(&network_state_lock_); |
return network_state_ == kNetworkDown; |
} |