Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(534)

Unified Diff: webrtc/modules/congestion_controller/congestion_controller.cc

Issue 2752233002: Split CongestionController into send- and receive-side classes. (Closed)
Patch Set: Use variable names receive_side_cc and send_side_cc. Created 3 years, 9 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
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
« no previous file with comments | « webrtc/modules/congestion_controller/BUILD.gn ('k') | webrtc/modules/congestion_controller/include/congestion_controller.h » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698