Move PacedSender ownership to RtpTransportControllerSend.

BUG=webrtc:8089
R=nisse@webrtc.org, terelius@webrtc.org

Review-Url: https://codereview.webrtc.org/3000773002 .
Cr-Commit-Position: refs/heads/master@{#19451}
This commit is contained in:
Stefan Holmer
2017-08-22 16:16:44 +02:00
parent ee42d19b70
commit 5c8942aee1
15 changed files with 121 additions and 73 deletions

View File

@ -22,7 +22,7 @@
#include "webrtc/modules/audio_processing/include/mock_audio_processing.h" #include "webrtc/modules/audio_processing/include/mock_audio_processing.h"
#include "webrtc/modules/congestion_controller/include/mock/mock_congestion_observer.h" #include "webrtc/modules/congestion_controller/include/mock/mock_congestion_observer.h"
#include "webrtc/modules/congestion_controller/include/send_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/pacing/mock/mock_paced_sender.h"
#include "webrtc/modules/rtp_rtcp/mocks/mock_rtcp_rtt_stats.h" #include "webrtc/modules/rtp_rtcp/mocks/mock_rtcp_rtt_stats.h"
#include "webrtc/modules/rtp_rtcp/mocks/mock_rtp_rtcp.h" #include "webrtc/modules/rtp_rtcp/mocks/mock_rtp_rtcp.h"
#include "webrtc/rtc_base/ptr_util.h" #include "webrtc/rtc_base/ptr_util.h"
@ -139,8 +139,8 @@ struct ConfigHelper {
&simulated_clock_, &simulated_clock_,
nullptr /* observer */, nullptr /* observer */,
&event_log_, &event_log_,
&packet_router_)), &pacer_)),
fake_transport_(&packet_router_, send_side_cc_.get()), fake_transport_(&packet_router_, &pacer_, send_side_cc_.get()),
bitrate_allocator_(&limit_observer_), bitrate_allocator_(&limit_observer_),
worker_queue_("ConfigHelper_worker_queue"), worker_queue_("ConfigHelper_worker_queue"),
audio_encoder_(nullptr) { audio_encoder_(nullptr) {
@ -335,6 +335,7 @@ struct ConfigHelper {
AudioProcessing::AudioProcessingStatistics audio_processing_stats_; AudioProcessing::AudioProcessingStatistics audio_processing_stats_;
SimulatedClock simulated_clock_; SimulatedClock simulated_clock_;
PacketRouter packet_router_; PacketRouter packet_router_;
testing::NiceMock<MockPacedSender> pacer_;
std::unique_ptr<SendSideCongestionController> send_side_cc_; std::unique_ptr<SendSideCongestionController> send_side_cc_;
FakeRtpTransportControllerSend fake_transport_; FakeRtpTransportControllerSend fake_transport_;
MockRtcEventLog event_log_; MockRtcEventLog event_log_;

View File

@ -30,7 +30,6 @@
#include "webrtc/logging/rtc_event_log/rtc_event_log.h" #include "webrtc/logging/rtc_event_log/rtc_event_log.h"
#include "webrtc/modules/bitrate_controller/include/bitrate_controller.h" #include "webrtc/modules/bitrate_controller/include/bitrate_controller.h"
#include "webrtc/modules/congestion_controller/include/receive_side_congestion_controller.h" #include "webrtc/modules/congestion_controller/include/receive_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/flexfec_receiver.h"
#include "webrtc/modules/rtp_rtcp/include/rtp_header_extension_map.h" #include "webrtc/modules/rtp_rtcp/include/rtp_header_extension_map.h"
#include "webrtc/modules/rtp_rtcp/include/rtp_header_parser.h" #include "webrtc/modules/rtp_rtcp/include/rtp_header_parser.h"
@ -438,8 +437,7 @@ Call::Call(const Call::Config& config,
// We have to attach the pacer to the pacer thread before starting the // We have to attach the pacer to the pacer thread before starting the
// module process thread to avoid a race accessing the process thread // module process thread to avoid a race accessing the process thread
// both from the process thread and the pacer thread. // both from the process thread and the pacer thread.
pacer_thread_->RegisterModule(transport_send_->send_side_cc()->pacer(), pacer_thread_->RegisterModule(transport_send_->pacer(), RTC_FROM_HERE);
RTC_FROM_HERE);
pacer_thread_->RegisterModule( pacer_thread_->RegisterModule(
receive_side_cc_.GetRemoteBitrateEstimator(true), RTC_FROM_HERE); receive_side_cc_.GetRemoteBitrateEstimator(true), RTC_FROM_HERE);
pacer_thread_->Start(); pacer_thread_->Start();
@ -466,7 +464,7 @@ Call::~Call() {
// the pacer thread is stopped. // the pacer thread is stopped.
module_process_thread_->DeRegisterModule(transport_send_->send_side_cc()); module_process_thread_->DeRegisterModule(transport_send_->send_side_cc());
pacer_thread_->Stop(); pacer_thread_->Stop();
pacer_thread_->DeRegisterModule(transport_send_->send_side_cc()->pacer()); pacer_thread_->DeRegisterModule(transport_send_->pacer());
pacer_thread_->DeRegisterModule( pacer_thread_->DeRegisterModule(
receive_side_cc_.GetRemoteBitrateEstimator(true)); receive_side_cc_.GetRemoteBitrateEstimator(true));
module_process_thread_->DeRegisterModule(&receive_side_cc_); module_process_thread_->DeRegisterModule(&receive_side_cc_);
@ -1198,8 +1196,8 @@ void Call::OnNetworkChanged(uint32_t target_bitrate_bps,
void Call::OnAllocationLimitsChanged(uint32_t min_send_bitrate_bps, void Call::OnAllocationLimitsChanged(uint32_t min_send_bitrate_bps,
uint32_t max_padding_bitrate_bps) { uint32_t max_padding_bitrate_bps) {
transport_send_->send_side_cc()->SetAllocatedSendBitrateLimits( transport_send_->SetAllocatedSendBitrateLimits(min_send_bitrate_bps,
min_send_bitrate_bps, max_padding_bitrate_bps); max_padding_bitrate_bps);
rtc::CritScope lock(&bitrate_crit_); rtc::CritScope lock(&bitrate_crit_);
min_allocated_send_bitrate_bps_ = min_send_bitrate_bps; min_allocated_send_bitrate_bps_ = min_send_bitrate_bps;
configured_max_padding_bitrate_bps_ = max_padding_bitrate_bps; configured_max_padding_bitrate_bps_ = max_padding_bitrate_bps;

View File

@ -21,6 +21,7 @@
#include "webrtc/modules/audio_device/include/mock_audio_device.h" #include "webrtc/modules/audio_device/include/mock_audio_device.h"
#include "webrtc/modules/audio_mixer/audio_mixer_impl.h" #include "webrtc/modules/audio_mixer/audio_mixer_impl.h"
#include "webrtc/modules/congestion_controller/include/mock/mock_send_side_congestion_controller.h" #include "webrtc/modules/congestion_controller/include/mock/mock_send_side_congestion_controller.h"
#include "webrtc/modules/pacing/mock/mock_paced_sender.h"
#include "webrtc/modules/rtp_rtcp/include/rtp_rtcp.h" #include "webrtc/modules/rtp_rtcp/include/rtp_rtcp.h"
#include "webrtc/rtc_base/ptr_util.h" #include "webrtc/rtc_base/ptr_util.h"
#include "webrtc/test/fake_encoder.h" #include "webrtc/test/fake_encoder.h"
@ -324,12 +325,12 @@ struct CallBitrateHelper {
CallBitrateHelper() : CallBitrateHelper(Call::Config::BitrateConfig()) {} CallBitrateHelper() : CallBitrateHelper(Call::Config::BitrateConfig()) {}
explicit CallBitrateHelper(const Call::Config::BitrateConfig& bitrate_config) explicit CallBitrateHelper(const Call::Config::BitrateConfig& bitrate_config)
: mock_cc_(Clock::GetRealTimeClock(), &event_log_, &packet_router_) { : mock_cc_(Clock::GetRealTimeClock(), &event_log_, &pacer_) {
Call::Config config(&event_log_); Call::Config config(&event_log_);
config.bitrate_config = bitrate_config; config.bitrate_config = bitrate_config;
call_.reset( call_.reset(
Call::Create(config, rtc::MakeUnique<FakeRtpTransportControllerSend>( Call::Create(config, rtc::MakeUnique<FakeRtpTransportControllerSend>(
&packet_router_, &mock_cc_))); &packet_router_, &pacer_, &mock_cc_)));
} }
webrtc::Call* operator->() { return call_.get(); } webrtc::Call* operator->() { return call_.get(); }
@ -340,6 +341,7 @@ struct CallBitrateHelper {
private: private:
webrtc::RtcEventLogNullImpl event_log_; webrtc::RtcEventLogNullImpl event_log_;
PacketRouter packet_router_; PacketRouter packet_router_;
testing::NiceMock<MockPacedSender> pacer_;
testing::NiceMock<test::MockSendSideCongestionController> mock_cc_; testing::NiceMock<test::MockSendSideCongestionController> mock_cc_;
std::unique_ptr<Call> call_; std::unique_ptr<Call> call_;
}; };

View File

@ -23,8 +23,11 @@ class FakeRtpTransportControllerSend
public: public:
explicit FakeRtpTransportControllerSend( explicit FakeRtpTransportControllerSend(
PacketRouter* packet_router, PacketRouter* packet_router,
PacedSender* paced_sender,
SendSideCongestionController* send_side_cc) SendSideCongestionController* send_side_cc)
: packet_router_(packet_router), send_side_cc_(send_side_cc) { : packet_router_(packet_router),
paced_sender_(paced_sender),
send_side_cc_(send_side_cc) {
RTC_DCHECK(send_side_cc); RTC_DCHECK(send_side_cc);
} }
@ -38,18 +41,24 @@ class FakeRtpTransportControllerSend
return send_side_cc_; return send_side_cc_;
} }
RtpPacketSender* packet_sender() override { return send_side_cc_->pacer(); } PacedSender* pacer() override { return paced_sender_; }
RtpPacketSender* packet_sender() override { return paced_sender_; }
const RtpKeepAliveConfig& keepalive_config() const override { const RtpKeepAliveConfig& keepalive_config() const override {
return keepalive_; return keepalive_;
} }
void SetAllocatedSendBitrateLimits(int min_send_bitrate_bps,
int max_padding_bitrate_bps) override {}
void set_keepalive_config(const RtpKeepAliveConfig& keepalive_config) { void set_keepalive_config(const RtpKeepAliveConfig& keepalive_config) {
keepalive_ = keepalive_config; keepalive_ = keepalive_config;
} }
private: private:
PacketRouter* packet_router_; PacketRouter* packet_router_;
PacedSender* paced_sender_;
SendSideCongestionController* send_side_cc_; SendSideCongestionController* send_side_cc_;
RtpKeepAliveConfig keepalive_; RtpKeepAliveConfig keepalive_;
}; };

View File

@ -15,13 +15,17 @@ namespace webrtc {
RtpTransportControllerSend::RtpTransportControllerSend( RtpTransportControllerSend::RtpTransportControllerSend(
Clock* clock, Clock* clock,
webrtc::RtcEventLog* event_log) webrtc::RtcEventLog* event_log)
: send_side_cc_(clock, nullptr /* observer */, event_log, &packet_router_) { : pacer_(clock, &packet_router_, event_log),
} send_side_cc_(clock, nullptr /* observer */, event_log, &pacer_) {}
PacketRouter* RtpTransportControllerSend::packet_router() { PacketRouter* RtpTransportControllerSend::packet_router() {
return &packet_router_; return &packet_router_;
} }
PacedSender* RtpTransportControllerSend::pacer() {
return &pacer_;
}
SendSideCongestionController* RtpTransportControllerSend::send_side_cc() { SendSideCongestionController* RtpTransportControllerSend::send_side_cc() {
return &send_side_cc_; return &send_side_cc_;
} }
@ -32,13 +36,19 @@ RtpTransportControllerSend::transport_feedback_observer() {
} }
RtpPacketSender* RtpTransportControllerSend::packet_sender() { RtpPacketSender* RtpTransportControllerSend::packet_sender() {
return send_side_cc_.pacer(); return &pacer_;
} }
const RtpKeepAliveConfig& RtpTransportControllerSend::keepalive_config() const { const RtpKeepAliveConfig& RtpTransportControllerSend::keepalive_config() const {
return keepalive_; return keepalive_;
} }
void RtpTransportControllerSend::SetAllocatedSendBitrateLimits(
int min_send_bitrate_bps,
int max_padding_bitrate_bps) {
pacer_.SetSendBitrateLimits(min_send_bitrate_bps, max_padding_bitrate_bps);
}
void RtpTransportControllerSend::SetKeepAliveConfig( void RtpTransportControllerSend::SetKeepAliveConfig(
const RtpKeepAliveConfig& config) { const RtpKeepAliveConfig& config) {
keepalive_ = config; keepalive_ = config;

View File

@ -29,15 +29,24 @@ class RtpTransportControllerSend : public RtpTransportControllerSendInterface {
// Implements RtpTransportControllerSendInterface // Implements RtpTransportControllerSendInterface
PacketRouter* packet_router() override; PacketRouter* packet_router() override;
// TODO(holmer): Temporarily exposed, should be removed and the
// appropriate methods should be added to this class instead.
// In addition the PacedSender should be driven by this class, either
// by owning the process thread, or later by using a task queue.
PacedSender* pacer() override;
SendSideCongestionController* send_side_cc() override; SendSideCongestionController* send_side_cc() override;
TransportFeedbackObserver* transport_feedback_observer() override; TransportFeedbackObserver* transport_feedback_observer() override;
RtpPacketSender* packet_sender() override; RtpPacketSender* packet_sender() override;
const RtpKeepAliveConfig& keepalive_config() const override; const RtpKeepAliveConfig& keepalive_config() const override;
void SetAllocatedSendBitrateLimits(int min_send_bitrate_bps,
int max_padding_bitrate_bps) override;
void SetKeepAliveConfig(const RtpKeepAliveConfig& config); void SetKeepAliveConfig(const RtpKeepAliveConfig& config);
private: private:
PacketRouter packet_router_; PacketRouter packet_router_;
PacedSender pacer_;
SendSideCongestionController send_side_cc_; SendSideCongestionController send_side_cc_;
RtpKeepAliveConfig keepalive_; RtpKeepAliveConfig keepalive_;

View File

@ -13,6 +13,7 @@
namespace webrtc { namespace webrtc {
class PacedSender;
class PacketRouter; class PacketRouter;
class RtpPacketSender; class RtpPacketSender;
struct RtpKeepAliveConfig; struct RtpKeepAliveConfig;
@ -46,12 +47,25 @@ class RtpTransportControllerSendInterface {
public: public:
virtual ~RtpTransportControllerSendInterface() {} virtual ~RtpTransportControllerSendInterface() {}
virtual PacketRouter* packet_router() = 0; virtual PacketRouter* packet_router() = 0;
virtual PacedSender* pacer() = 0;
// Currently returning the same pointer, but with different types. // Currently returning the same pointer, but with different types.
virtual SendSideCongestionController* send_side_cc() = 0; virtual SendSideCongestionController* send_side_cc() = 0;
virtual TransportFeedbackObserver* transport_feedback_observer() = 0; virtual TransportFeedbackObserver* transport_feedback_observer() = 0;
virtual RtpPacketSender* packet_sender() = 0; virtual RtpPacketSender* packet_sender() = 0;
virtual const RtpKeepAliveConfig& keepalive_config() const = 0; virtual const RtpKeepAliveConfig& keepalive_config() const = 0;
// SetAllocatedSendBitrateLimits sets bitrates limits imposed by send codec
// settings.
// |min_send_bitrate_bps| is the total minimum send bitrate required by all
// sending streams. This is the minimum bitrate the PacedSender will use.
// Note that SendSideCongestionController::OnNetworkChanged can still be
// called with a lower bitrate estimate. |max_padding_bitrate_bps| is the max
// bitrate the send streams request for padding. This can be higher than the
// current network estimate and tells the PacedSender how much it should max
// pad unless there is real packets to send.
virtual void SetAllocatedSendBitrateLimits(int min_send_bitrate_bps,
int max_padding_bitrate_bps) = 0;
}; };
} // namespace webrtc } // namespace webrtc

View File

@ -21,11 +21,11 @@ class MockSendSideCongestionController : public SendSideCongestionController {
public: public:
MockSendSideCongestionController(const Clock* clock, MockSendSideCongestionController(const Clock* clock,
RtcEventLog* event_log, RtcEventLog* event_log,
PacketRouter* packet_router) PacedSender* paced_sender)
: SendSideCongestionController(clock, : SendSideCongestionController(clock,
nullptr /* observer */, nullptr /* observer */,
event_log, event_log,
packet_router) {} paced_sender) {}
MOCK_METHOD3(SetBweBitrates, MOCK_METHOD3(SetBweBitrates,
void(int min_bitrate_bps, void(int min_bitrate_bps,

View File

@ -58,16 +58,17 @@ class SendSideCongestionController : public CallStatsObserver,
protected: protected:
virtual ~Observer() {} virtual ~Observer() {}
}; };
// TODO(holmer): Delete after fixing upstream projects.
RTC_DEPRECATED SendSideCongestionController(const Clock* clock,
Observer* observer,
RtcEventLog* event_log,
PacketRouter* packet_router);
// TODO(nisse): Consider deleting the |observer| argument to constructors // TODO(nisse): Consider deleting the |observer| argument to constructors
// once CongestionController is deleted. // once CongestionController is deleted.
SendSideCongestionController(const Clock* clock, SendSideCongestionController(const Clock* clock,
Observer* observer, Observer* observer,
RtcEventLog* event_log, RtcEventLog* event_log,
PacketRouter* packet_router); PacedSender* pacer);
SendSideCongestionController(const Clock* clock,
Observer* observer,
RtcEventLog* event_log,
std::unique_ptr<PacedSender> pacer);
~SendSideCongestionController() override; ~SendSideCongestionController() override;
void RegisterPacketFeedbackObserver(PacketFeedbackObserver* observer); void RegisterPacketFeedbackObserver(PacketFeedbackObserver* observer);
@ -91,26 +92,12 @@ class SendSideCongestionController : public CallStatsObserver,
virtual BitrateController* GetBitrateController() const; virtual BitrateController* GetBitrateController() const;
virtual int64_t GetPacerQueuingDelayMs() const; virtual int64_t GetPacerQueuingDelayMs() const;
virtual int64_t GetFirstPacketTimeMs() const; virtual int64_t GetFirstPacketTimeMs() const;
// TODO(nisse): Delete this accessor function. The pacer should be
// internal to the congestion controller.
virtual PacedSender* pacer();
virtual TransportFeedbackObserver* GetTransportFeedbackObserver(); virtual TransportFeedbackObserver* GetTransportFeedbackObserver();
RateLimiter* GetRetransmissionRateLimiter(); RateLimiter* GetRetransmissionRateLimiter();
void EnablePeriodicAlrProbing(bool enable); void EnablePeriodicAlrProbing(bool enable);
// SetAllocatedSendBitrateLimits sets bitrates limits imposed by send codec
// settings.
// |min_send_bitrate_bps| is the total minimum send bitrate required by all
// sending streams. This is the minimum bitrate the PacedSender will use.
// Note that SendSideCongestionController::OnNetworkChanged can still be
// called with a lower bitrate estimate. |max_padding_bitrate_bps| is the max
// bitrate the send streams request for padding. This can be higher than the
// current network estimate and tells the PacedSender how much it should max
// pad unless there is real packets to send.
void SetAllocatedSendBitrateLimits(int min_send_bitrate_bps,
int max_padding_bitrate_bps);
virtual void OnSentPacket(const rtc::SentPacket& sent_packet); virtual void OnSentPacket(const rtc::SentPacket& sent_packet);
// Implements CallStatsObserver. // Implements CallStatsObserver.
@ -141,7 +128,8 @@ class SendSideCongestionController : public CallStatsObserver,
rtc::CriticalSection observer_lock_; rtc::CriticalSection observer_lock_;
Observer* observer_ GUARDED_BY(observer_lock_); Observer* observer_ GUARDED_BY(observer_lock_);
RtcEventLog* const event_log_; RtcEventLog* const event_log_;
const std::unique_ptr<PacedSender> pacer_; std::unique_ptr<PacedSender> owned_pacer_;
PacedSender* pacer_;
const std::unique_ptr<BitrateController> bitrate_controller_; const std::unique_ptr<BitrateController> bitrate_controller_;
std::unique_ptr<AcknowledgedBitrateEstimator> acknowledged_bitrate_estimator_; std::unique_ptr<AcknowledgedBitrateEstimator> acknowledged_bitrate_estimator_;
const std::unique_ptr<ProbeController> probe_controller_; const std::unique_ptr<ProbeController> probe_controller_;

View File

@ -98,27 +98,54 @@ SendSideCongestionController::SendSideCongestionController(
Observer* observer, Observer* observer,
RtcEventLog* event_log, RtcEventLog* event_log,
PacketRouter* packet_router) PacketRouter* packet_router)
: SendSideCongestionController( : clock_(clock),
clock, observer_(observer),
observer, event_log_(event_log),
event_log, owned_pacer_(
std::unique_ptr<PacedSender>( rtc::MakeUnique<PacedSender>(clock, packet_router, event_log)),
new PacedSender(clock, packet_router, event_log))) {} pacer_(owned_pacer_.get()),
bitrate_controller_(
BitrateController::CreateBitrateController(clock_, event_log)),
acknowledged_bitrate_estimator_(
rtc::MakeUnique<AcknowledgedBitrateEstimator>()),
probe_controller_(new ProbeController(pacer_, clock_)),
retransmission_rate_limiter_(
new RateLimiter(clock, kRetransmitWindowSizeMs)),
transport_feedback_adapter_(clock_),
last_reported_bitrate_bps_(0),
last_reported_fraction_loss_(0),
last_reported_rtt_(0),
network_state_(kNetworkUp),
pause_pacer_(false),
pacer_paused_(false),
min_bitrate_bps_(congestion_controller::GetMinBitrateBps()),
delay_based_bwe_(new DelayBasedBwe(event_log_, clock_)),
in_cwnd_experiment_(CwndExperimentEnabled()),
accepted_queue_ms_(kDefaultAcceptedQueueMs),
was_in_alr_(0) {
delay_based_bwe_->SetMinBitrate(min_bitrate_bps_);
if (in_cwnd_experiment_ &&
!ReadCwndExperimentParameter(&accepted_queue_ms_)) {
LOG(LS_WARNING) << "Failed to parse parameters for CwndExperiment "
"from field trial string. Experiment disabled.";
in_cwnd_experiment_ = false;
}
}
SendSideCongestionController::SendSideCongestionController( SendSideCongestionController::SendSideCongestionController(
const Clock* clock, const Clock* clock,
Observer* observer, Observer* observer,
RtcEventLog* event_log, RtcEventLog* event_log,
std::unique_ptr<PacedSender> pacer) PacedSender* pacer)
: clock_(clock), : clock_(clock),
observer_(observer), observer_(observer),
event_log_(event_log), event_log_(event_log),
pacer_(std::move(pacer)), pacer_(pacer),
bitrate_controller_( bitrate_controller_(
BitrateController::CreateBitrateController(clock_, event_log)), BitrateController::CreateBitrateController(clock_, event_log)),
acknowledged_bitrate_estimator_( acknowledged_bitrate_estimator_(
rtc::MakeUnique<AcknowledgedBitrateEstimator>()), rtc::MakeUnique<AcknowledgedBitrateEstimator>()),
probe_controller_(new ProbeController(pacer_.get(), clock_)), probe_controller_(new ProbeController(pacer_, clock_)),
retransmission_rate_limiter_( retransmission_rate_limiter_(
new RateLimiter(clock, kRetransmitWindowSizeMs)), new RateLimiter(clock, kRetransmitWindowSizeMs)),
transport_feedback_adapter_(clock_), transport_feedback_adapter_(clock_),
@ -229,12 +256,6 @@ void SendSideCongestionController::EnablePeriodicAlrProbing(bool enable) {
probe_controller_->EnablePeriodicAlrProbing(enable); probe_controller_->EnablePeriodicAlrProbing(enable);
} }
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 SendSideCongestionController::GetPacerQueuingDelayMs() const { int64_t SendSideCongestionController::GetPacerQueuingDelayMs() const {
return IsNetworkDown() ? 0 : pacer_->QueueInMs(); return IsNetworkDown() ? 0 : pacer_->QueueInMs();
} }
@ -243,10 +264,6 @@ int64_t SendSideCongestionController::GetFirstPacketTimeMs() const {
return pacer_->FirstSentPacketTimeMs(); return pacer_->FirstSentPacketTimeMs();
} }
PacedSender* SendSideCongestionController::pacer() {
return pacer_.get();
}
TransportFeedbackObserver* TransportFeedbackObserver*
SendSideCongestionController::GetTransportFeedbackObserver() { SendSideCongestionController::GetTransportFeedbackObserver() {
return this; return this;

View File

@ -54,10 +54,9 @@ class SendSideCongestionControllerTest : public ::testing::Test {
~SendSideCongestionControllerTest() override {} ~SendSideCongestionControllerTest() override {}
void SetUp() override { void SetUp() override {
pacer_ = new NiceMock<MockPacedSender>(); pacer_.reset(new NiceMock<MockPacedSender>());
std::unique_ptr<PacedSender> pacer(pacer_); // Passes ownership.
controller_.reset(new SendSideCongestionController( controller_.reset(new SendSideCongestionController(
&clock_, &observer_, &event_log_, std::move(pacer))); &clock_, &observer_, &event_log_, pacer_.get()));
bandwidth_observer_.reset( bandwidth_observer_.reset(
controller_->GetBitrateController()->CreateRtcpBandwidthObserver()); controller_->GetBitrateController()->CreateRtcpBandwidthObserver());
@ -73,9 +72,9 @@ class SendSideCongestionControllerTest : public ::testing::Test {
// Custom setup - use an observer that tracks the target bitrate, without // Custom setup - use an observer that tracks the target bitrate, without
// prescribing on which iterations it must change (like a mock would). // prescribing on which iterations it must change (like a mock would).
void TargetBitrateTrackingSetup() { void TargetBitrateTrackingSetup() {
std::unique_ptr<PacedSender> pacer(new NiceMock<MockPacedSender>()); pacer_.reset(new NiceMock<MockPacedSender>());
controller_.reset(new SendSideCongestionController( controller_.reset(new SendSideCongestionController(
&clock_, &target_bitrate_observer_, &event_log_, std::move(pacer))); &clock_, &target_bitrate_observer_, &event_log_, pacer_.get()));
controller_->SetBweBitrates(0, kInitialBitrateBps, 5 * kInitialBitrateBps); controller_->SetBweBitrates(0, kInitialBitrateBps, 5 * kInitialBitrateBps);
} }
@ -138,9 +137,10 @@ class SendSideCongestionControllerTest : public ::testing::Test {
SimulatedClock clock_; SimulatedClock clock_;
StrictMock<MockCongestionObserver> observer_; StrictMock<MockCongestionObserver> observer_;
TargetBitrateObserver target_bitrate_observer_; TargetBitrateObserver target_bitrate_observer_;
NiceMock<MockPacedSender>* pacer_;
NiceMock<MockRtcEventLog> event_log_; NiceMock<MockRtcEventLog> event_log_;
std::unique_ptr<RtcpBandwidthObserver> bandwidth_observer_; std::unique_ptr<RtcpBandwidthObserver> bandwidth_observer_;
PacketRouter packet_router_;
std::unique_ptr<NiceMock<MockPacedSender>> pacer_;
std::unique_ptr<SendSideCongestionController> controller_; std::unique_ptr<SendSideCongestionController> controller_;
rtc::Optional<uint32_t> target_bitrate_bps_; rtc::Optional<uint32_t> target_bitrate_bps_;
@ -216,7 +216,7 @@ TEST_F(SendSideCongestionControllerTest, SignalNetworkState) {
TEST_F(SendSideCongestionControllerTest, OnNetworkRouteChanged) { TEST_F(SendSideCongestionControllerTest, OnNetworkRouteChanged) {
int new_bitrate = 200000; int new_bitrate = 200000;
testing::Mock::VerifyAndClearExpectations(pacer_); testing::Mock::VerifyAndClearExpectations(pacer_.get());
EXPECT_CALL(observer_, OnNetworkChanged(new_bitrate, _, _, _)); EXPECT_CALL(observer_, OnNetworkChanged(new_bitrate, _, _, _));
EXPECT_CALL(*pacer_, SetEstimatedBitrate(new_bitrate)); EXPECT_CALL(*pacer_, SetEstimatedBitrate(new_bitrate));
rtc::NetworkRoute route; rtc::NetworkRoute route;
@ -236,7 +236,7 @@ TEST_F(SendSideCongestionControllerTest, OnNetworkRouteChanged) {
TEST_F(SendSideCongestionControllerTest, OldFeedback) { TEST_F(SendSideCongestionControllerTest, OldFeedback) {
int new_bitrate = 200000; int new_bitrate = 200000;
testing::Mock::VerifyAndClearExpectations(pacer_); testing::Mock::VerifyAndClearExpectations(pacer_.get());
EXPECT_CALL(observer_, OnNetworkChanged(new_bitrate, _, _, _)); EXPECT_CALL(observer_, OnNetworkChanged(new_bitrate, _, _, _));
EXPECT_CALL(*pacer_, SetEstimatedBitrate(new_bitrate)); EXPECT_CALL(*pacer_, SetEstimatedBitrate(new_bitrate));
@ -334,7 +334,7 @@ TEST_F(SendSideCongestionControllerTest, GetProbingInterval) {
} }
TEST_F(SendSideCongestionControllerTest, ProbeOnRouteChange) { TEST_F(SendSideCongestionControllerTest, ProbeOnRouteChange) {
testing::Mock::VerifyAndClearExpectations(pacer_); testing::Mock::VerifyAndClearExpectations(pacer_.get());
EXPECT_CALL(*pacer_, CreateProbeCluster(kInitialBitrateBps * 6)); EXPECT_CALL(*pacer_, CreateProbeCluster(kInitialBitrateBps * 6));
EXPECT_CALL(*pacer_, CreateProbeCluster(kInitialBitrateBps * 12)); EXPECT_CALL(*pacer_, CreateProbeCluster(kInitialBitrateBps * 12));
EXPECT_CALL(observer_, OnNetworkChanged(kInitialBitrateBps * 2, _, _, _)); EXPECT_CALL(observer_, OnNetworkChanged(kInitialBitrateBps * 2, _, _, _));

View File

@ -36,6 +36,7 @@ class MockPacedSender : public PacedSender {
MOCK_CONST_METHOD0(ExpectedQueueTimeMs, int64_t()); MOCK_CONST_METHOD0(ExpectedQueueTimeMs, int64_t());
MOCK_CONST_METHOD0(GetApplicationLimitedRegionStartTime, MOCK_CONST_METHOD0(GetApplicationLimitedRegionStartTime,
rtc::Optional<int64_t>()); rtc::Optional<int64_t>());
MOCK_METHOD0(Process, void());
}; };
} // namespace webrtc } // namespace webrtc

View File

@ -9,6 +9,7 @@ include_rules = [
"+webrtc/modules/audio_processing", "+webrtc/modules/audio_processing",
"+webrtc/modules/bitrate_controller", "+webrtc/modules/bitrate_controller",
"+webrtc/modules/congestion_controller", "+webrtc/modules/congestion_controller",
"+webrtc/modules/pacing",
"+webrtc/modules/rtp_rtcp", "+webrtc/modules/rtp_rtcp",
"+webrtc/system_wrappers", "+webrtc/system_wrappers",
"+webrtc/p2p", "+webrtc/p2p",

View File

@ -1126,8 +1126,8 @@ void EventLogAnalyzer::CreateBweSimulationGraph(Plot* plot) {
BitrateObserver observer; BitrateObserver observer;
RtcEventLogNullImpl null_event_log; RtcEventLogNullImpl null_event_log;
PacketRouter packet_router; PacketRouter packet_router;
SendSideCongestionController cc(&clock, &observer, &null_event_log, PacedSender pacer(&clock, &packet_router, &null_event_log);
&packet_router); SendSideCongestionController cc(&clock, &observer, &null_event_log, &pacer);
// TODO(holmer): Log the call config and use that here instead. // TODO(holmer): Log the call config and use that here instead.
static const uint32_t kDefaultStartBitrateBps = 300000; static const uint32_t kDefaultStartBitrateBps = 300000;
cc.SetBweBitrates(0, kDefaultStartBitrateBps, -1); cc.SetBweBitrates(0, kDefaultStartBitrateBps, -1);

View File

@ -715,10 +715,8 @@ VideoSendStreamImpl::VideoSendStreamImpl(
} }
if (alr_settings) { if (alr_settings) {
transport->send_side_cc()->EnablePeriodicAlrProbing(true); transport->send_side_cc()->EnablePeriodicAlrProbing(true);
transport->send_side_cc()->pacer()->SetPacingFactor( transport->pacer()->SetPacingFactor(alr_settings->pacing_factor);
alr_settings->pacing_factor); transport->pacer()->SetQueueTimeLimit(alr_settings->max_paced_queue_time);
transport->send_side_cc()->pacer()->SetQueueTimeLimit(
alr_settings->max_paced_queue_time);
} }
if (config_->periodic_alr_bandwidth_probing) { if (config_->periodic_alr_bandwidth_probing) {