From 0aa9d1808b81cc949a66d0fb6adbd1c0e1d74eb3 Mon Sep 17 00:00:00 2001 From: philipel Date: Wed, 24 Aug 2016 02:45:35 -0700 Subject: [PATCH] Set send side bitrate estimate on successful probing attempt. BUG=webrtc:5859 Review-Url: https://codereview.webrtc.org/2263973004 Cr-Commit-Position: refs/heads/master@{#13887} --- .../modules/bitrate_controller/bitrate_controller_impl.cc | 8 ++++++++ .../modules/bitrate_controller/bitrate_controller_impl.h | 2 ++ .../bitrate_controller/include/bitrate_controller.h | 2 ++ .../include/mock/mock_bitrate_controller.h | 1 + webrtc/modules/congestion_controller/delay_based_bwe.cc | 1 + .../include/remote_bitrate_estimator.h | 2 ++ .../transport_feedback_adapter.cc | 4 ++++ .../remote_bitrate_estimator/transport_feedback_adapter.h | 2 ++ 8 files changed, 22 insertions(+) diff --git a/webrtc/modules/bitrate_controller/bitrate_controller_impl.cc b/webrtc/modules/bitrate_controller/bitrate_controller_impl.cc index d283796953..1231c782a9 100644 --- a/webrtc/modules/bitrate_controller/bitrate_controller_impl.cc +++ b/webrtc/modules/bitrate_controller/bitrate_controller_impl.cc @@ -182,6 +182,14 @@ void BitrateControllerImpl::OnReceivedEstimatedBitrate(uint32_t bitrate) { MaybeTriggerOnNetworkChanged(); } +void BitrateControllerImpl::UpdateProbeBitrate(uint32_t bitrate_bps) { + { + rtc::CritScope cs(&critsect_); + bandwidth_estimation_.SetSendBitrate(bitrate_bps); + } + MaybeTriggerOnNetworkChanged(); +} + void BitrateControllerImpl::UpdateDelayBasedEstimate(uint32_t bitrate_bps) { { rtc::CritScope cs(&critsect_); diff --git a/webrtc/modules/bitrate_controller/bitrate_controller_impl.h b/webrtc/modules/bitrate_controller/bitrate_controller_impl.h index 114e1a6789..e5f595d09e 100644 --- a/webrtc/modules/bitrate_controller/bitrate_controller_impl.h +++ b/webrtc/modules/bitrate_controller/bitrate_controller_impl.h @@ -61,6 +61,8 @@ class BitrateControllerImpl : public BitrateController { uint8_t* fraction_loss, int64_t* rtt) override; + void UpdateProbeBitrate(uint32_t bitrate_bps) override; + int64_t TimeUntilNextProcess() override; void Process() override; diff --git a/webrtc/modules/bitrate_controller/include/bitrate_controller.h b/webrtc/modules/bitrate_controller/include/bitrate_controller.h index f06314cd4a..4c4578adf0 100644 --- a/webrtc/modules/bitrate_controller/include/bitrate_controller.h +++ b/webrtc/modules/bitrate_controller/include/bitrate_controller.h @@ -79,6 +79,8 @@ class BitrateController : public Module { virtual void UpdateDelayBasedEstimate(uint32_t bitrate_bps) = 0; + virtual void UpdateProbeBitrate(uint32_t bitrate_bps) = 0; + // Gets the available payload bandwidth in bits per second. Note that // this bandwidth excludes packet headers. virtual bool AvailableBandwidth(uint32_t* bandwidth) const = 0; diff --git a/webrtc/modules/bitrate_controller/include/mock/mock_bitrate_controller.h b/webrtc/modules/bitrate_controller/include/mock/mock_bitrate_controller.h index 7e9b4ece31..dc7e286b10 100644 --- a/webrtc/modules/bitrate_controller/include/mock/mock_bitrate_controller.h +++ b/webrtc/modules/bitrate_controller/include/mock/mock_bitrate_controller.h @@ -38,6 +38,7 @@ class MockBitrateController : public BitrateController { MOCK_METHOD3(ResetBitrates, void(int bitrate_bps, int min_bitrate_bps, int max_bitrate_bps)); MOCK_METHOD1(UpdateDelayBasedEstimate, void(uint32_t bitrate_bps)); + MOCK_METHOD1(UpdateProbeBitrate, void(uint32_t bitrate_bps)); MOCK_METHOD1(SetEventLog, void(RtcEventLog* event_log)); MOCK_CONST_METHOD1(AvailableBandwidth, bool(uint32_t* bandwidth)); MOCK_METHOD1(SetReservedBitrate, void(uint32_t reserved_bitrate_bps)); diff --git a/webrtc/modules/congestion_controller/delay_based_bwe.cc b/webrtc/modules/congestion_controller/delay_based_bwe.cc index 641f15d986..86ef6f2749 100644 --- a/webrtc/modules/congestion_controller/delay_based_bwe.cc +++ b/webrtc/modules/congestion_controller/delay_based_bwe.cc @@ -95,6 +95,7 @@ void DelayBasedBwe::IncomingPacketInfo(const PacketInfo& info) { int bps = probe_bitrate_estimator_.HandleProbeAndEstimateBitrate(info); if (bps > 0) { remote_rate_.SetEstimate(bps, info.arrival_time_ms); + observer_->OnProbeBitrate(bps); update_estimate = true; } } diff --git a/webrtc/modules/remote_bitrate_estimator/include/remote_bitrate_estimator.h b/webrtc/modules/remote_bitrate_estimator/include/remote_bitrate_estimator.h index d7d8d2c8d2..738570c718 100644 --- a/webrtc/modules/remote_bitrate_estimator/include/remote_bitrate_estimator.h +++ b/webrtc/modules/remote_bitrate_estimator/include/remote_bitrate_estimator.h @@ -35,6 +35,8 @@ class RemoteBitrateObserver { virtual void OnReceiveBitrateChanged(const std::vector& ssrcs, uint32_t bitrate) = 0; + virtual void OnProbeBitrate(uint32_t bitrate) {} + virtual ~RemoteBitrateObserver() {} }; diff --git a/webrtc/modules/remote_bitrate_estimator/transport_feedback_adapter.cc b/webrtc/modules/remote_bitrate_estimator/transport_feedback_adapter.cc index 94ea9dd395..217307b86c 100644 --- a/webrtc/modules/remote_bitrate_estimator/transport_feedback_adapter.cc +++ b/webrtc/modules/remote_bitrate_estimator/transport_feedback_adapter.cc @@ -142,6 +142,10 @@ void TransportFeedbackAdapter::OnReceiveBitrateChanged( bitrate_controller_->UpdateDelayBasedEstimate(bitrate); } +void TransportFeedbackAdapter::OnProbeBitrate(uint32_t bitrate) { + bitrate_controller_->UpdateProbeBitrate(bitrate); +} + void TransportFeedbackAdapter::OnRttUpdate(int64_t avg_rtt_ms, int64_t max_rtt_ms) { RTC_DCHECK(bitrate_estimator_.get() != nullptr); diff --git a/webrtc/modules/remote_bitrate_estimator/transport_feedback_adapter.h b/webrtc/modules/remote_bitrate_estimator/transport_feedback_adapter.h index b15185f4a2..215011044a 100644 --- a/webrtc/modules/remote_bitrate_estimator/transport_feedback_adapter.h +++ b/webrtc/modules/remote_bitrate_estimator/transport_feedback_adapter.h @@ -56,6 +56,8 @@ class TransportFeedbackAdapter : public TransportFeedbackObserver, void OnReceiveBitrateChanged(const std::vector& ssrcs, uint32_t bitrate) override; + void OnProbeBitrate(uint32_t bitrate) override; + rtc::CriticalSection lock_; SendTimeHistory send_time_history_ GUARDED_BY(&lock_); BitrateController* bitrate_controller_;