| Index: webrtc/modules/congestion_controller/send_side_congestion_controller.cc
|
| diff --git a/webrtc/modules/congestion_controller/congestion_controller.cc b/webrtc/modules/congestion_controller/send_side_congestion_controller.cc
|
| similarity index 53%
|
| copy from webrtc/modules/congestion_controller/congestion_controller.cc
|
| copy to webrtc/modules/congestion_controller/send_side_congestion_controller.cc
|
| index 6dc25d2b77ab8205d41fcb6fe11d8a83ff352b12..f3cbed96520e2c911621a13a22f26bf9a0253be3 100644
|
| --- a/webrtc/modules/congestion_controller/congestion_controller.cc
|
| +++ b/webrtc/modules/congestion_controller/send_side_congestion_controller.cc
|
| @@ -8,7 +8,7 @@
|
| * be found in the AUTHORS file in the root of the source tree.
|
| */
|
|
|
| -#include "webrtc/modules/congestion_controller/include/congestion_controller.h"
|
| +#include "webrtc/modules/congestion_controller/include/send_side_congestion_controller.h"
|
|
|
| #include <algorithm>
|
| #include <memory>
|
| @@ -21,13 +21,10 @@
|
| #include "webrtc/modules/bitrate_controller/include/bitrate_controller.h"
|
| #include "webrtc/modules/congestion_controller/probe_controller.h"
|
| #include "webrtc/modules/remote_bitrate_estimator/include/bwe_defines.h"
|
| -#include "webrtc/modules/remote_bitrate_estimator/remote_bitrate_estimator_abs_send_time.h"
|
| -#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.
|
| @@ -47,129 +44,32 @@ static void ClampBitrates(int* 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(
|
| +SendSideCongestionController::SendSideCongestionController(
|
| const Clock* clock,
|
| Observer* observer,
|
| - RemoteBitrateObserver* remote_bitrate_observer,
|
| RtcEventLog* event_log,
|
| PacketRouter* packet_router)
|
| - : CongestionController(
|
| + : SendSideCongestionController(
|
| clock,
|
| observer,
|
| - remote_bitrate_observer,
|
| event_log,
|
| - packet_router,
|
| std::unique_ptr<PacedSender>(new PacedSender(clock, packet_router))) {
|
| }
|
|
|
| -CongestionController::CongestionController(
|
| +SendSideCongestionController::SendSideCongestionController(
|
| 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),
|
| @@ -181,34 +81,18 @@ CongestionController::CongestionController(
|
| 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);
|
| - }
|
| -}
|
| +SendSideCongestionController::~SendSideCongestionController() {}
|
|
|
| -void CongestionController::SetBweBitrates(int min_bitrate_bps,
|
| - int start_bitrate_bps,
|
| - int max_bitrate_bps) {
|
| +void SendSideCongestionController::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,
|
| + 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)
|
| @@ -221,19 +105,16 @@ void CongestionController::SetBweBitrates(int min_bitrate_bps,
|
|
|
| // TODO(holmer): Split this up and use SetBweBitrates in combination with
|
| // OnNetworkRouteChanged.
|
| -void CongestionController::OnNetworkRouteChanged(
|
| +void SendSideCongestionController::OnNetworkRouteChanged(
|
| const rtc::NetworkRoute& network_route,
|
| 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.
|
| + // no longer exposed outside SendSideCongestionController.
|
| 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);
|
| @@ -242,7 +123,7 @@ void CongestionController::OnNetworkRouteChanged(
|
| 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_);
|
| + delay_based_bwe_->SetMinBitrate(min_bitrate_bps);
|
| }
|
|
|
| probe_controller_->Reset();
|
| @@ -251,38 +132,29 @@ void CongestionController::OnNetworkRouteChanged(
|
| MaybeTriggerOnNetworkChanged();
|
| }
|
|
|
| -BitrateController* CongestionController::GetBitrateController() const {
|
| +BitrateController* SendSideCongestionController::GetBitrateController() const {
|
| return bitrate_controller_.get();
|
| }
|
|
|
| -RemoteBitrateEstimator* CongestionController::GetRemoteBitrateEstimator(
|
| - bool send_side_bwe) {
|
| - if (send_side_bwe) {
|
| - return &remote_estimator_proxy_;
|
| - } else {
|
| - return &remote_bitrate_estimator_;
|
| - }
|
| -}
|
| -
|
| -RateLimiter* CongestionController::GetRetransmissionRateLimiter() {
|
| +RateLimiter* SendSideCongestionController::GetRetransmissionRateLimiter() {
|
| return retransmission_rate_limiter_.get();
|
| }
|
|
|
| -void CongestionController::EnablePeriodicAlrProbing(bool enable) {
|
| +void SendSideCongestionController::EnablePeriodicAlrProbing(bool enable) {
|
| probe_controller_->EnablePeriodicAlrProbing(enable);
|
| }
|
|
|
| -void CongestionController::SetAllocatedSendBitrateLimits(
|
| +void SendSideCongestionController::SetAllocatedSendBitrateLimits(
|
| int min_send_bitrate_bps,
|
| int max_padding_bitrate_bps) {
|
| pacer_->SetSendBitrateLimits(min_send_bitrate_bps, max_padding_bitrate_bps);
|
| }
|
|
|
| -int64_t CongestionController::GetPacerQueuingDelayMs() const {
|
| +int64_t SendSideCongestionController::GetPacerQueuingDelayMs() const {
|
| return IsNetworkDown() ? 0 : pacer_->QueueInMs();
|
| }
|
|
|
| -void CongestionController::SignalNetworkState(NetworkState state) {
|
| +void SendSideCongestionController::SignalNetworkState(NetworkState state) {
|
| LOG(LS_INFO) << "SignalNetworkState "
|
| << (state == kNetworkUp ? "Up" : "Down");
|
| if (state == kNetworkUp) {
|
| @@ -298,13 +170,14 @@ void CongestionController::SignalNetworkState(NetworkState state) {
|
| MaybeTriggerOnNetworkChanged();
|
| }
|
|
|
| -void CongestionController::SetTransportOverhead(
|
| +void SendSideCongestionController::SetTransportOverhead(
|
| size_t transport_overhead_bytes_per_packet) {
|
| transport_feedback_adapter_.SetTransportOverhead(
|
| transport_overhead_bytes_per_packet);
|
| }
|
|
|
| -void CongestionController::OnSentPacket(const rtc::SentPacket& sent_packet) {
|
| +void SendSideCongestionController::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)
|
| @@ -313,33 +186,30 @@ void CongestionController::OnSentPacket(const rtc::SentPacket& sent_packet) {
|
| sent_packet.send_time_ms);
|
| }
|
|
|
| -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);
|
| - }
|
| +void SendSideCongestionController::OnRttUpdate(int64_t avg_rtt_ms,
|
| + int64_t max_rtt_ms) {
|
| + rtc::CritScope cs(&bwe_lock_);
|
| + delay_based_bwe_->OnRttUpdate(avg_rtt_ms, max_rtt_ms);
|
| }
|
|
|
| -int64_t CongestionController::TimeUntilNextProcess() {
|
| - return std::min(bitrate_controller_->TimeUntilNextProcess(),
|
| - remote_bitrate_estimator_.TimeUntilNextProcess());
|
| +int64_t SendSideCongestionController::TimeUntilNextProcess() {
|
| + return bitrate_controller_->TimeUntilNextProcess();
|
| }
|
|
|
| -void CongestionController::Process() {
|
| +void SendSideCongestionController::Process() {
|
| bitrate_controller_->Process();
|
| - remote_bitrate_estimator_.Process();
|
| probe_controller_->Process();
|
| MaybeTriggerOnNetworkChanged();
|
| }
|
|
|
| -void CongestionController::AddPacket(uint16_t sequence_number,
|
| - size_t length,
|
| - const PacedPacketInfo& pacing_info) {
|
| +void SendSideCongestionController::AddPacket(
|
| + uint16_t sequence_number,
|
| + size_t length,
|
| + const PacedPacketInfo& pacing_info) {
|
| transport_feedback_adapter_.AddPacket(sequence_number, length, pacing_info);
|
| }
|
|
|
| -void CongestionController::OnTransportFeedback(
|
| +void SendSideCongestionController::OnTransportFeedback(
|
| const rtcp::TransportFeedback& feedback) {
|
| RTC_DCHECK(worker_thread_checker_.CalledOnValidThread());
|
| transport_feedback_adapter_.OnTransportFeedback(feedback);
|
| @@ -356,13 +226,13 @@ void CongestionController::OnTransportFeedback(
|
| bitrate_controller_->OnDelayBasedBweResult(result);
|
| }
|
|
|
| -std::vector<PacketFeedback> CongestionController::GetTransportFeedbackVector()
|
| - const {
|
| +std::vector<PacketFeedback>
|
| +SendSideCongestionController::GetTransportFeedbackVector() const {
|
| RTC_DCHECK(worker_thread_checker_.CalledOnValidThread());
|
| return transport_feedback_adapter_.GetTransportFeedbackVector();
|
| }
|
|
|
| -void CongestionController::MaybeTriggerOnNetworkChanged() {
|
| +void SendSideCongestionController::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_)
|
| @@ -389,11 +259,10 @@ void CongestionController::MaybeTriggerOnNetworkChanged() {
|
| }
|
| observer_->OnNetworkChanged(bitrate_bps, fraction_loss, rtt,
|
| probing_interval_ms);
|
| - remote_estimator_proxy_.OnBitrateChanged(bitrate_bps);
|
| }
|
| }
|
|
|
| -bool CongestionController::HasNetworkParametersToReportChanged(
|
| +bool SendSideCongestionController::HasNetworkParametersToReportChanged(
|
| uint32_t bitrate_bps,
|
| uint8_t fraction_loss,
|
| int64_t rtt) {
|
| @@ -412,11 +281,11 @@ bool CongestionController::HasNetworkParametersToReportChanged(
|
| return changed;
|
| }
|
|
|
| -bool CongestionController::IsSendQueueFull() const {
|
| +bool SendSideCongestionController::IsSendQueueFull() const {
|
| return pacer_->ExpectedQueueTimeMs() > PacedSender::kMaxQueueLengthMs;
|
| }
|
|
|
| -bool CongestionController::IsNetworkDown() const {
|
| +bool SendSideCongestionController::IsNetworkDown() const {
|
| rtc::CritScope cs(&network_state_lock_);
|
| return network_state_ == kNetworkDown;
|
| }
|
|
|