Index: webrtc/call/call.cc |
diff --git a/webrtc/call/call.cc b/webrtc/call/call.cc |
index c512d54c73cb5f3839568c8e196350a1902ad3db..6e620b6a6eda0889441f43811f32e6d37db7e12b 100644 |
--- a/webrtc/call/call.cc |
+++ b/webrtc/call/call.cc |
@@ -36,7 +36,8 @@ |
#include "webrtc/config.h" |
#include "webrtc/logging/rtc_event_log/rtc_event_log.h" |
#include "webrtc/modules/bitrate_controller/include/bitrate_controller.h" |
-#include "webrtc/modules/congestion_controller/include/congestion_controller.h" |
+#include "webrtc/modules/congestion_controller/include/receive_side_congestion_controller.h" |
+#include "webrtc/modules/congestion_controller/include/send_side_congestion_controller.h" |
#include "webrtc/modules/pacing/paced_sender.h" |
#include "webrtc/modules/rtp_rtcp/include/flexfec_receiver.h" |
#include "webrtc/modules/rtp_rtcp/include/rtp_header_parser.h" |
@@ -94,7 +95,7 @@ namespace internal { |
class Call : public webrtc::Call, |
public PacketReceiver, |
public RecoveredPacketReceiver, |
- public CongestionController::Observer, |
+ public SendSideCongestionController::Observer, |
public BitrateAllocator::LimitObserver { |
public: |
explicit Call(const Call::Config& config); |
@@ -273,9 +274,8 @@ class Call : public webrtc::Call, |
VieRemb remb_; |
PacketRouter packet_router_; |
- // TODO(nisse): Could be a direct member, except for constness |
- // issues with GetRemoteBitrateEstimator (and maybe others). |
- const std::unique_ptr<CongestionController> congestion_controller_; |
+ SendSideCongestionController send_side_cc_; |
+ ReceiveSideCongestionController receive_side_cc_; |
const std::unique_ptr<SendDelayStats> video_send_delay_stats_; |
const int64_t start_ms_; |
// TODO(perkj): |worker_queue_| is supposed to replace |
@@ -329,11 +329,8 @@ Call::Call(const Call::Config& config) |
estimated_send_bitrate_kbps_counter_(clock_, nullptr, true), |
pacer_bitrate_kbps_counter_(clock_, nullptr, true), |
remb_(clock_), |
- congestion_controller_(new CongestionController(clock_, |
- this, |
- &remb_, |
- event_log_, |
- &packet_router_)), |
+ send_side_cc_(clock_, this, event_log_, &packet_router_), |
+ receive_side_cc_(clock_, &remb_, &packet_router_), |
video_send_delay_stats_(new SendDelayStats(clock_)), |
start_ms_(clock_->TimeInMilliseconds()), |
worker_queue_("call_worker_queue") { |
@@ -347,21 +344,20 @@ Call::Call(const Call::Config& config) |
config.bitrate_config.start_bitrate_bps); |
} |
Trace::CreateTrace(); |
- call_stats_->RegisterStatsObserver(congestion_controller_.get()); |
+ call_stats_->RegisterStatsObserver(&send_side_cc_); |
- congestion_controller_->SignalNetworkState(kNetworkDown); |
- congestion_controller_->SetBweBitrates( |
- config_.bitrate_config.min_bitrate_bps, |
- config_.bitrate_config.start_bitrate_bps, |
- config_.bitrate_config.max_bitrate_bps); |
+ send_side_cc_.SignalNetworkState(kNetworkDown); |
+ send_side_cc_.SetBweBitrates(config_.bitrate_config.min_bitrate_bps, |
+ config_.bitrate_config.start_bitrate_bps, |
+ config_.bitrate_config.max_bitrate_bps); |
module_process_thread_->Start(); |
module_process_thread_->RegisterModule(call_stats_.get(), RTC_FROM_HERE); |
- module_process_thread_->RegisterModule(congestion_controller_.get(), |
- RTC_FROM_HERE); |
- pacer_thread_->RegisterModule(congestion_controller_->pacer(), RTC_FROM_HERE); |
+ module_process_thread_->RegisterModule(&send_side_cc_, RTC_FROM_HERE); |
+ module_process_thread_->RegisterModule(&receive_side_cc_, RTC_FROM_HERE); |
+ pacer_thread_->RegisterModule(send_side_cc_.pacer(), RTC_FROM_HERE); |
pacer_thread_->RegisterModule( |
- congestion_controller_->GetRemoteBitrateEstimator(true), RTC_FROM_HERE); |
+ receive_side_cc_.GetRemoteBitrateEstimator(true), RTC_FROM_HERE); |
pacer_thread_->Start(); |
} |
@@ -377,13 +373,14 @@ Call::~Call() { |
RTC_CHECK(video_receive_streams_.empty()); |
pacer_thread_->Stop(); |
- pacer_thread_->DeRegisterModule(congestion_controller_->pacer()); |
+ pacer_thread_->DeRegisterModule(send_side_cc_.pacer()); |
pacer_thread_->DeRegisterModule( |
- congestion_controller_->GetRemoteBitrateEstimator(true)); |
- module_process_thread_->DeRegisterModule(congestion_controller_.get()); |
+ receive_side_cc_.GetRemoteBitrateEstimator(true)); |
+ module_process_thread_->DeRegisterModule(&send_side_cc_); |
+ module_process_thread_->DeRegisterModule(&receive_side_cc_); |
module_process_thread_->DeRegisterModule(call_stats_.get()); |
module_process_thread_->Stop(); |
- call_stats_->DeregisterStatsObserver(congestion_controller_.get()); |
+ call_stats_->DeregisterStatsObserver(&send_side_cc_); |
// Only update histograms after process threads have been shut down, so that |
// they won't try to concurrently update stats. |
@@ -502,7 +499,7 @@ webrtc::AudioSendStream* Call::CreateAudioSendStream( |
event_log_->LogAudioSendStreamConfig(config); |
AudioSendStream* send_stream = new AudioSendStream( |
config, config_.audio_state, &worker_queue_, &packet_router_, |
- congestion_controller_.get(), bitrate_allocator_.get(), event_log_, |
+ &send_side_cc_, bitrate_allocator_.get(), event_log_, |
call_stats_->rtcp_rtt_stats()); |
{ |
WriteLockScoped write_lock(*send_crit_); |
@@ -591,7 +588,7 @@ void Call::DestroyAudioReceiveStream( |
WriteLockScoped write_lock(*receive_crit_); |
const AudioReceiveStream::Config& config = audio_receive_stream->config(); |
uint32_t ssrc = config.rtp.remote_ssrc; |
- congestion_controller_->GetRemoteBitrateEstimator(UseSendSideBwe(config)) |
+ receive_side_cc_.GetRemoteBitrateEstimator(UseSendSideBwe(config)) |
->RemoveStream(ssrc); |
size_t num_deleted = audio_receive_ssrcs_.erase(ssrc); |
RTC_DCHECK(num_deleted == 1); |
@@ -623,7 +620,7 @@ webrtc::VideoSendStream* Call::CreateVideoSendStream( |
std::vector<uint32_t> ssrcs = config.rtp.ssrcs; |
VideoSendStream* send_stream = new VideoSendStream( |
num_cpu_cores_, module_process_thread_.get(), &worker_queue_, |
- call_stats_.get(), congestion_controller_.get(), &packet_router_, |
+ call_stats_.get(), &send_side_cc_, &packet_router_, |
bitrate_allocator_.get(), video_send_delay_stats_.get(), &remb_, |
event_log_, std::move(config), std::move(encoder_config), |
suspended_video_send_ssrcs_); |
@@ -740,7 +737,7 @@ void Call::DestroyVideoReceiveStream( |
} |
const VideoReceiveStream::Config& config = receive_stream_impl->config(); |
- congestion_controller_->GetRemoteBitrateEstimator(UseSendSideBwe(config)) |
+ receive_side_cc_.GetRemoteBitrateEstimator(UseSendSideBwe(config)) |
->RemoveStream(config.rtp.remote_ssrc); |
UpdateAggregateNetworkState(); |
@@ -816,7 +813,7 @@ void Call::DestroyFlexfecReceiveStream(FlexfecReceiveStream* receive_stream) { |
++media_it; |
} |
- congestion_controller_->GetRemoteBitrateEstimator(UseSendSideBwe(config)) |
+ receive_side_cc_.GetRemoteBitrateEstimator(UseSendSideBwe(config)) |
->RemoveStream(ssrc); |
flexfec_receive_streams_.erase(receive_stream_impl); |
@@ -832,15 +829,14 @@ Call::Stats Call::GetStats() const { |
Stats stats; |
// Fetch available send/receive bitrates. |
uint32_t send_bandwidth = 0; |
- congestion_controller_->GetBitrateController()->AvailableBandwidth( |
- &send_bandwidth); |
+ send_side_cc_.GetBitrateController()->AvailableBandwidth(&send_bandwidth); |
std::vector<unsigned int> ssrcs; |
uint32_t recv_bandwidth = 0; |
- congestion_controller_->GetRemoteBitrateEstimator(false)->LatestEstimate( |
+ receive_side_cc_.GetRemoteBitrateEstimator(false)->LatestEstimate( |
&ssrcs, &recv_bandwidth); |
stats.send_bandwidth_bps = send_bandwidth; |
stats.recv_bandwidth_bps = recv_bandwidth; |
- stats.pacer_delay_ms = congestion_controller_->GetPacerQueuingDelayMs(); |
+ stats.pacer_delay_ms = send_side_cc_.GetPacerQueuingDelayMs(); |
stats.rtt_ms = call_stats_->rtcp_rtt_stats()->LastProcessedRtt(); |
{ |
rtc::CritScope cs(&bitrate_crit_); |
@@ -873,9 +869,9 @@ void Call::SetBitrateConfig( |
config_.bitrate_config.start_bitrate_bps = bitrate_config.start_bitrate_bps; |
config_.bitrate_config.max_bitrate_bps = bitrate_config.max_bitrate_bps; |
RTC_DCHECK_NE(bitrate_config.start_bitrate_bps, 0); |
- congestion_controller_->SetBweBitrates(bitrate_config.min_bitrate_bps, |
- bitrate_config.start_bitrate_bps, |
- bitrate_config.max_bitrate_bps); |
+ send_side_cc_.SetBweBitrates(bitrate_config.min_bitrate_bps, |
+ bitrate_config.start_bitrate_bps, |
+ bitrate_config.max_bitrate_bps); |
} |
void Call::SignalChannelNetworkState(MediaType media, NetworkState state) { |
@@ -970,7 +966,7 @@ void Call::OnNetworkRouteChanged(const std::string& transport_name, |
<< " bps, max: " << config_.bitrate_config.start_bitrate_bps |
<< " bps."; |
RTC_DCHECK_GT(config_.bitrate_config.start_bitrate_bps, 0); |
- congestion_controller_->OnNetworkRouteChanged( |
+ send_side_cc_.OnNetworkRouteChanged( |
network_route, config_.bitrate_config.start_bitrate_bps, |
config_.bitrate_config.min_bitrate_bps, |
config_.bitrate_config.max_bitrate_bps); |
@@ -1006,7 +1002,7 @@ void Call::UpdateAggregateNetworkState() { |
LOG(LS_INFO) << "UpdateAggregateNetworkState: aggregate_state=" |
<< (aggregate_state == kNetworkUp ? "up" : "down"); |
- congestion_controller_->SignalNetworkState(aggregate_state); |
+ send_side_cc_.SignalNetworkState(aggregate_state); |
} |
void Call::OnSentPacket(const rtc::SentPacket& sent_packet) { |
@@ -1014,7 +1010,7 @@ void Call::OnSentPacket(const rtc::SentPacket& sent_packet) { |
first_packet_sent_ms_ = clock_->TimeInMilliseconds(); |
video_send_delay_stats_->OnSentPacket(sent_packet.packet_id, |
clock_->TimeInMilliseconds()); |
- congestion_controller_->OnSentPacket(sent_packet); |
+ send_side_cc_.OnSentPacket(sent_packet); |
} |
void Call::OnNetworkChanged(uint32_t target_bitrate_bps, |
@@ -1032,6 +1028,8 @@ void Call::OnNetworkChanged(uint32_t target_bitrate_bps, |
return; |
} |
RTC_DCHECK_RUN_ON(&worker_queue_); |
+ // For controlling the rate of feedback messages. |
+ receive_side_cc_.OnBitrateChanged(target_bitrate_bps); |
bitrate_allocator_->OnNetworkChanged(target_bitrate_bps, fraction_loss, |
rtt_ms, probing_interval_ms); |
@@ -1065,8 +1063,8 @@ void Call::OnNetworkChanged(uint32_t target_bitrate_bps, |
void Call::OnAllocationLimitsChanged(uint32_t min_send_bitrate_bps, |
uint32_t max_padding_bitrate_bps) { |
- congestion_controller_->SetAllocatedSendBitrateLimits( |
- min_send_bitrate_bps, max_padding_bitrate_bps); |
+ send_side_cc_.SetAllocatedSendBitrateLimits(min_send_bitrate_bps, |
+ max_padding_bitrate_bps); |
rtc::CritScope lock(&bitrate_crit_); |
min_allocated_send_bitrate_bps_ = min_send_bitrate_bps; |
configured_max_padding_bitrate_bps_ = max_padding_bitrate_bps; |
@@ -1278,7 +1276,7 @@ void Call::NotifyBweOfReceivedPacket(const RtpPacketReceived& packet, |
// should be fixed to use the same MediaType as the production code. |
if (media_type != MediaType::AUDIO || |
(use_send_side_bwe && header.extension.hasTransportSequenceNumber)) { |
- congestion_controller_->OnReceivedPacket( |
+ receive_side_cc_.OnReceivedPacket( |
packet.arrival_time_ms(), packet.payload_size() + packet.padding_size(), |
header); |
} |