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 6dc25d2b77ab8205d41fcb6fe11d8a83ff352b12..9b836be34835d90400a5389bafe765dd40d1f7c3 100644 |
--- a/webrtc/modules/congestion_controller/congestion_controller.cc |
+++ b/webrtc/modules/congestion_controller/congestion_controller.cc |
@@ -25,198 +25,18 @@ |
#include "webrtc/modules/remote_bitrate_estimator/remote_bitrate_estimator_single_stream.h" |
namespace webrtc { |
-namespace { |
- |
-static const uint32_t kTimeOffsetSwitchThreshold = 30; |
-static const int64_t kRetransmitWindowSizeMs = 500; |
- |
-// Makes sure that the bitrate and the min, max values are in valid range. |
-static void ClampBitrates(int* bitrate_bps, |
- int* min_bitrate_bps, |
- int* max_bitrate_bps) { |
- // TODO(holmer): We should make sure the default bitrates are set to 10 kbps, |
- // and that we don't try to set the min bitrate to 0 from any applications. |
- // The congestion controller should allow a min bitrate of 0. |
- if (*min_bitrate_bps < congestion_controller::GetMinBitrateBps()) |
- *min_bitrate_bps = congestion_controller::GetMinBitrateBps(); |
- if (*max_bitrate_bps > 0) |
- *max_bitrate_bps = std::max(*min_bitrate_bps, *max_bitrate_bps); |
- if (*bitrate_bps > 0) |
- *bitrate_bps = std::max(*min_bitrate_bps, *bitrate_bps); |
-} |
- |
-} // namespace |
- |
-CongestionController::WrappingBitrateEstimator::WrappingBitrateEstimator( |
- RemoteBitrateObserver* observer, const Clock* clock) |
- : observer_(observer), |
- clock_(clock), |
- rbe_(new RemoteBitrateEstimatorSingleStream(observer_, clock_)), |
- using_absolute_send_time_(false), |
- packets_since_absolute_send_time_(0), |
- min_bitrate_bps_(congestion_controller::GetMinBitrateBps()) {} |
- |
-void CongestionController::WrappingBitrateEstimator::IncomingPacket( |
- int64_t arrival_time_ms, |
- size_t payload_size, |
- const RTPHeader& header) { |
- rtc::CritScope cs(&crit_sect_); |
- PickEstimatorFromHeader(header); |
- rbe_->IncomingPacket(arrival_time_ms, payload_size, header); |
-} |
- |
-void CongestionController::WrappingBitrateEstimator::Process() { |
- rtc::CritScope cs(&crit_sect_); |
- rbe_->Process(); |
-} |
- |
-int64_t CongestionController::WrappingBitrateEstimator::TimeUntilNextProcess() { |
- rtc::CritScope cs(&crit_sect_); |
- return rbe_->TimeUntilNextProcess(); |
-} |
- |
-void CongestionController::WrappingBitrateEstimator::OnRttUpdate( |
- int64_t avg_rtt_ms, int64_t max_rtt_ms) { |
- rtc::CritScope cs(&crit_sect_); |
- rbe_->OnRttUpdate(avg_rtt_ms, max_rtt_ms); |
-} |
- |
-void CongestionController::WrappingBitrateEstimator::RemoveStream( |
- unsigned int ssrc) { |
- rtc::CritScope cs(&crit_sect_); |
- rbe_->RemoveStream(ssrc); |
-} |
- |
-bool CongestionController::WrappingBitrateEstimator::LatestEstimate( |
- std::vector<unsigned int>* ssrcs, |
- unsigned int* bitrate_bps) const { |
- rtc::CritScope cs(&crit_sect_); |
- return rbe_->LatestEstimate(ssrcs, bitrate_bps); |
-} |
- |
-void CongestionController::WrappingBitrateEstimator::SetMinBitrate( |
- int min_bitrate_bps) { |
- rtc::CritScope cs(&crit_sect_); |
- rbe_->SetMinBitrate(min_bitrate_bps); |
- min_bitrate_bps_ = min_bitrate_bps; |
-} |
- |
-void CongestionController::WrappingBitrateEstimator::PickEstimatorFromHeader( |
- const RTPHeader& header) { |
- if (header.extension.hasAbsoluteSendTime) { |
- // If we see AST in header, switch RBE strategy immediately. |
- if (!using_absolute_send_time_) { |
- LOG(LS_INFO) << |
- "WrappingBitrateEstimator: Switching to absolute send time RBE."; |
- using_absolute_send_time_ = true; |
- PickEstimator(); |
- } |
- packets_since_absolute_send_time_ = 0; |
- } else { |
- // When we don't see AST, wait for a few packets before going back to TOF. |
- if (using_absolute_send_time_) { |
- ++packets_since_absolute_send_time_; |
- if (packets_since_absolute_send_time_ >= kTimeOffsetSwitchThreshold) { |
- LOG(LS_INFO) << "WrappingBitrateEstimator: Switching to transmission " |
- << "time offset RBE."; |
- using_absolute_send_time_ = false; |
- PickEstimator(); |
- } |
- } |
- } |
-} |
- |
-// Instantiate RBE for Time Offset or Absolute Send Time extensions. |
-void CongestionController::WrappingBitrateEstimator::PickEstimator() { |
- if (using_absolute_send_time_) { |
- rbe_.reset(new RemoteBitrateEstimatorAbsSendTime(observer_, clock_)); |
- } else { |
- rbe_.reset(new RemoteBitrateEstimatorSingleStream(observer_, clock_)); |
- } |
- rbe_->SetMinBitrate(min_bitrate_bps_); |
-} |
- |
-CongestionController::CongestionController( |
- const Clock* clock, |
- Observer* observer, |
- RemoteBitrateObserver* remote_bitrate_observer, |
- RtcEventLog* event_log, |
- PacketRouter* packet_router) |
- : CongestionController( |
- clock, |
- observer, |
- remote_bitrate_observer, |
- event_log, |
- packet_router, |
- std::unique_ptr<PacedSender>(new PacedSender(clock, packet_router))) { |
-} |
- |
-CongestionController::CongestionController( |
- const Clock* clock, |
- Observer* observer, |
- RemoteBitrateObserver* remote_bitrate_observer, |
- RtcEventLog* event_log, |
- PacketRouter* packet_router, |
- std::unique_ptr<PacedSender> pacer) |
- : clock_(clock), |
- observer_(observer), |
- event_log_(event_log), |
- packet_router_(packet_router), |
- pacer_(std::move(pacer)), |
- bitrate_controller_( |
- BitrateController::CreateBitrateController(clock_, event_log)), |
- probe_controller_(new ProbeController(pacer_.get(), clock_)), |
- retransmission_rate_limiter_( |
- new RateLimiter(clock, kRetransmitWindowSizeMs)), |
- remote_bitrate_estimator_(remote_bitrate_observer, clock_), |
- remote_estimator_proxy_(clock_, packet_router_), |
- transport_feedback_adapter_(clock_), |
- last_reported_bitrate_bps_(0), |
- last_reported_fraction_loss_(0), |
- last_reported_rtt_(0), |
- network_state_(kNetworkUp), |
- min_bitrate_bps_(congestion_controller::GetMinBitrateBps()), |
- delay_based_bwe_(new DelayBasedBwe(event_log_, clock_)) { |
- delay_based_bwe_->SetMinBitrate(min_bitrate_bps_); |
- worker_thread_checker_.DetachFromThread(); |
-} |
- |
-CongestionController::~CongestionController() {} |
void CongestionController::OnReceivedPacket(int64_t arrival_time_ms, |
size_t payload_size, |
const RTPHeader& header) { |
- // Send-side BWE. |
- if (header.extension.hasTransportSequenceNumber) { |
- remote_estimator_proxy_.IncomingPacket(arrival_time_ms, payload_size, |
- header); |
- } else { |
- // Receive-side BWE. |
- remote_bitrate_estimator_.IncomingPacket(arrival_time_ms, payload_size, |
- header); |
- } |
+ receive_side_cc_.OnReceivedPacket(arrival_time_ms, payload_size, header); |
} |
void CongestionController::SetBweBitrates(int min_bitrate_bps, |
int start_bitrate_bps, |
int max_bitrate_bps) { |
- ClampBitrates(&start_bitrate_bps, &min_bitrate_bps, &max_bitrate_bps); |
- bitrate_controller_->SetBitrates(start_bitrate_bps, |
- min_bitrate_bps, |
- max_bitrate_bps); |
- |
- probe_controller_->SetBitrates(min_bitrate_bps, start_bitrate_bps, |
- max_bitrate_bps); |
- |
- remote_bitrate_estimator_.SetMinBitrate(min_bitrate_bps); |
- { |
- rtc::CritScope cs(&bwe_lock_); |
- if (start_bitrate_bps > 0) |
- delay_based_bwe_->SetStartBitrate(start_bitrate_bps); |
- min_bitrate_bps_ = min_bitrate_bps; |
- delay_based_bwe_->SetMinBitrate(min_bitrate_bps_); |
- } |
- MaybeTriggerOnNetworkChanged(); |
+ send_side_cc_.SetBweBitrates(min_bitrate_bps, start_bitrate_bps, |
+ max_bitrate_bps); |
} |
// TODO(holmer): Split this up and use SetBweBitrates in combination with |
@@ -226,199 +46,80 @@ void CongestionController::OnNetworkRouteChanged( |
int bitrate_bps, |
int min_bitrate_bps, |
int max_bitrate_bps) { |
- ClampBitrates(&bitrate_bps, &min_bitrate_bps, &max_bitrate_bps); |
- // TODO(honghaiz): Recreate this object once the bitrate controller is |
- // no longer exposed outside CongestionController. |
- bitrate_controller_->ResetBitrates(bitrate_bps, min_bitrate_bps, |
- max_bitrate_bps); |
- // TODO(honghaiz): Recreate this object once the remote bitrate estimator is |
- // no longer exposed outside CongestionController. |
- remote_bitrate_estimator_.SetMinBitrate(min_bitrate_bps); |
- |
- transport_feedback_adapter_.SetNetworkIds(network_route.local_network_id, |
- network_route.remote_network_id); |
- { |
- rtc::CritScope cs(&bwe_lock_); |
- min_bitrate_bps_ = min_bitrate_bps; |
- 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); |
- |
- MaybeTriggerOnNetworkChanged(); |
+ send_side_cc_.OnNetworkRouteChanged(network_route, bitrate_bps, |
+ min_bitrate_bps, max_bitrate_bps); |
} |
BitrateController* CongestionController::GetBitrateController() const { |
- return bitrate_controller_.get(); |
+ return send_side_cc_.GetBitrateController(); |
} |
RemoteBitrateEstimator* CongestionController::GetRemoteBitrateEstimator( |
bool send_side_bwe) { |
- if (send_side_bwe) { |
- return &remote_estimator_proxy_; |
- } else { |
- return &remote_bitrate_estimator_; |
- } |
+ return receive_side_cc_.GetRemoteBitrateEstimator(send_side_bwe); |
} |
RateLimiter* CongestionController::GetRetransmissionRateLimiter() { |
- return retransmission_rate_limiter_.get(); |
+ return send_side_cc_.GetRetransmissionRateLimiter(); |
} |
void CongestionController::EnablePeriodicAlrProbing(bool enable) { |
- probe_controller_->EnablePeriodicAlrProbing(enable); |
+ send_side_cc_.EnablePeriodicAlrProbing(enable); |
} |
void CongestionController::SetAllocatedSendBitrateLimits( |
int min_send_bitrate_bps, |
int max_padding_bitrate_bps) { |
- pacer_->SetSendBitrateLimits(min_send_bitrate_bps, max_padding_bitrate_bps); |
+ send_side_cc_.SetAllocatedSendBitrateLimits(min_send_bitrate_bps, |
+ max_padding_bitrate_bps); |
} |
int64_t CongestionController::GetPacerQueuingDelayMs() const { |
- return IsNetworkDown() ? 0 : pacer_->QueueInMs(); |
+ return send_side_cc_.GetPacerQueuingDelayMs(); |
} |
void CongestionController::SignalNetworkState(NetworkState state) { |
- LOG(LS_INFO) << "SignalNetworkState " |
- << (state == kNetworkUp ? "Up" : "Down"); |
- if (state == kNetworkUp) { |
- pacer_->Resume(); |
- } else { |
- pacer_->Pause(); |
- } |
- { |
- rtc::CritScope cs(&network_state_lock_); |
- network_state_ = state; |
- } |
- probe_controller_->OnNetworkStateChanged(state); |
- MaybeTriggerOnNetworkChanged(); |
+ send_side_cc_.SignalNetworkState(state); |
} |
void CongestionController::SetTransportOverhead( |
size_t transport_overhead_bytes_per_packet) { |
- transport_feedback_adapter_.SetTransportOverhead( |
- transport_overhead_bytes_per_packet); |
+ send_side_cc_.SetTransportOverhead(transport_overhead_bytes_per_packet); |
} |
void CongestionController::OnSentPacket(const rtc::SentPacket& sent_packet) { |
- // We're not interested in packets without an id, which may be stun packets, |
- // etc, sent on the same transport. |
- if (sent_packet.packet_id == -1) |
- return; |
- transport_feedback_adapter_.OnSentPacket(sent_packet.packet_id, |
- sent_packet.send_time_ms); |
+ send_side_cc_.OnSentPacket(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); |
- { |
- rtc::CritScope cs(&bwe_lock_); |
- delay_based_bwe_->OnRttUpdate(avg_rtt_ms, max_rtt_ms); |
- } |
+ receive_side_cc_.OnRttUpdate(avg_rtt_ms, max_rtt_ms); |
+ send_side_cc_.OnRttUpdate(avg_rtt_ms, max_rtt_ms); |
} |
int64_t CongestionController::TimeUntilNextProcess() { |
- return std::min(bitrate_controller_->TimeUntilNextProcess(), |
- remote_bitrate_estimator_.TimeUntilNextProcess()); |
+ return std::min(send_side_cc_.TimeUntilNextProcess(), |
+ receive_side_cc_.TimeUntilNextProcess()); |
} |
void CongestionController::Process() { |
- bitrate_controller_->Process(); |
- remote_bitrate_estimator_.Process(); |
- probe_controller_->Process(); |
- MaybeTriggerOnNetworkChanged(); |
+ send_side_cc_.Process(); |
+ receive_side_cc_.Process(); |
} |
void CongestionController::AddPacket(uint16_t sequence_number, |
size_t length, |
const PacedPacketInfo& pacing_info) { |
- transport_feedback_adapter_.AddPacket(sequence_number, length, pacing_info); |
+ send_side_cc_.AddPacket(sequence_number, length, pacing_info); |
} |
void CongestionController::OnTransportFeedback( |
const rtcp::TransportFeedback& feedback) { |
- RTC_DCHECK(worker_thread_checker_.CalledOnValidThread()); |
- transport_feedback_adapter_.OnTransportFeedback(feedback); |
- std::vector<PacketFeedback> feedback_vector = |
- transport_feedback_adapter_.GetTransportFeedbackVector(); |
- if (feedback_vector.empty()) |
- return; |
- DelayBasedBwe::Result result; |
- { |
- rtc::CritScope cs(&bwe_lock_); |
- result = delay_based_bwe_->IncomingPacketFeedbackVector(feedback_vector); |
- } |
- if (result.updated) |
- bitrate_controller_->OnDelayBasedBweResult(result); |
+ send_side_cc_.OnTransportFeedback(feedback); |
} |
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. |
- if (!observer_) |
- return; |
- |
- uint32_t bitrate_bps; |
- uint8_t fraction_loss; |
- int64_t rtt; |
- bool estimate_changed = bitrate_controller_->GetNetworkParameters( |
- &bitrate_bps, &fraction_loss, &rtt); |
- if (estimate_changed) { |
- pacer_->SetEstimatedBitrate(bitrate_bps); |
- probe_controller_->SetEstimatedBitrate(bitrate_bps); |
- retransmission_rate_limiter_->SetMaxRate(bitrate_bps); |
- } |
- |
- bitrate_bps = IsNetworkDown() || IsSendQueueFull() ? 0 : bitrate_bps; |
- |
- if (HasNetworkParametersToReportChanged(bitrate_bps, fraction_loss, rtt)) { |
- 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); |
- } |
-} |
- |
-bool CongestionController::HasNetworkParametersToReportChanged( |
- uint32_t bitrate_bps, |
- uint8_t fraction_loss, |
- int64_t rtt) { |
- rtc::CritScope cs(&network_state_lock_); |
- bool changed = |
- last_reported_bitrate_bps_ != bitrate_bps || |
- (bitrate_bps > 0 && (last_reported_fraction_loss_ != fraction_loss || |
- last_reported_rtt_ != rtt)); |
- if (changed && (last_reported_bitrate_bps_ == 0 || bitrate_bps == 0)) { |
- LOG(LS_INFO) << "Bitrate estimate state changed, BWE: " << bitrate_bps |
- << " bps."; |
- } |
- 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(&network_state_lock_); |
- return network_state_ == kNetworkDown; |
+ return send_side_cc_.GetTransportFeedbackVector(); |
} |
} // namespace webrtc |