Support REMB in combination with send-side BWE.
BUG=webrtc:4173
Review URL: https://codereview.webrtc.org/1581113006
Cr-Commit-Position: refs/heads/master@{#11322}
diff --git a/webrtc/modules/bitrate_controller/bitrate_controller_impl.cc b/webrtc/modules/bitrate_controller/bitrate_controller_impl.cc
index f8fd2bb..da51c6f 100644
--- a/webrtc/modules/bitrate_controller/bitrate_controller_impl.cc
+++ b/webrtc/modules/bitrate_controller/bitrate_controller_impl.cc
@@ -143,6 +143,15 @@
MaybeTriggerOnNetworkChanged();
}
+void BitrateControllerImpl::UpdateDelayBasedEstimate(uint32_t bitrate_bps) {
+ {
+ rtc::CritScope cs(&critsect_);
+ bandwidth_estimation_.UpdateDelayBasedEstimate(clock_->TimeInMilliseconds(),
+ bitrate_bps);
+ }
+ MaybeTriggerOnNetworkChanged();
+}
+
int64_t BitrateControllerImpl::TimeUntilNextProcess() {
const int64_t kBitrateControllerUpdateIntervalMs = 25;
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 b601899..d7888cc 100644
--- a/webrtc/modules/bitrate_controller/bitrate_controller_impl.h
+++ b/webrtc/modules/bitrate_controller/bitrate_controller_impl.h
@@ -36,8 +36,9 @@
RtcpBandwidthObserver* CreateRtcpBandwidthObserver() override;
void SetStartBitrate(int start_bitrate_bps) override;
- void SetMinMaxBitrate(int min_bitrate_bps,
- int max_bitrate_bps) override;
+ void SetMinMaxBitrate(int min_bitrate_bps, int max_bitrate_bps) override;
+
+ void UpdateDelayBasedEstimate(uint32_t bitrate_bps) override;
void SetReservedBitrate(uint32_t reserved_bitrate_bps) override;
diff --git a/webrtc/modules/bitrate_controller/bitrate_controller_unittest.cc b/webrtc/modules/bitrate_controller/bitrate_controller_unittest.cc
index 2b9e589..fd9636a 100644
--- a/webrtc/modules/bitrate_controller/bitrate_controller_unittest.cc
+++ b/webrtc/modules/bitrate_controller/bitrate_controller_unittest.cc
@@ -162,14 +162,18 @@
bandwidth_observer_->OnReceivedRtcpReceiverReport(report_blocks, 50, time_ms);
EXPECT_EQ(300000, bitrate_observer_.last_bitrate_);
- // Test that a low REMB trigger immediately.
+ // Test that a low delay-based estimate limits the combined estimate.
+ controller_->UpdateDelayBasedEstimate(280000);
+ EXPECT_EQ(280000, bitrate_observer_.last_bitrate_);
+
+ // Test that a low REMB limits the combined estimate.
bandwidth_observer_->OnReceivedEstimatedBitrate(250000);
EXPECT_EQ(250000, bitrate_observer_.last_bitrate_);
EXPECT_EQ(0, bitrate_observer_.last_fraction_loss_);
EXPECT_EQ(50, bitrate_observer_.last_rtt_);
bandwidth_observer_->OnReceivedEstimatedBitrate(1000);
- EXPECT_EQ(100000, bitrate_observer_.last_bitrate_); // Min cap.
+ EXPECT_EQ(100000, bitrate_observer_.last_bitrate_);
}
TEST_F(BitrateControllerTest, OneBitrateObserverTwoRtcpObservers) {
diff --git a/webrtc/modules/bitrate_controller/include/bitrate_controller.h b/webrtc/modules/bitrate_controller/include/bitrate_controller.h
index d1eca8e..a9c247a 100644
--- a/webrtc/modules/bitrate_controller/include/bitrate_controller.h
+++ b/webrtc/modules/bitrate_controller/include/bitrate_controller.h
@@ -57,6 +57,8 @@
virtual void SetStartBitrate(int start_bitrate_bps) = 0;
virtual void SetMinMaxBitrate(int min_bitrate_bps, int max_bitrate_bps) = 0;
+ virtual void UpdateDelayBasedEstimate(uint32_t bitrate_bps) = 0;
+
virtual void SetEventLog(RtcEventLog* event_log) = 0;
// Gets the available payload bandwidth in bits per second. Note that
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 7a7d2e4..8748696 100644
--- a/webrtc/modules/bitrate_controller/include/mock/mock_bitrate_controller.h
+++ b/webrtc/modules/bitrate_controller/include/mock/mock_bitrate_controller.h
@@ -24,6 +24,21 @@
uint8_t fraction_loss,
int64_t rtt_ms));
};
+
+class MockBitrateController : public BitrateController {
+ public:
+ MOCK_METHOD0(CreateRtcpBandwidthObserver, RtcpBandwidthObserver*());
+ MOCK_METHOD1(SetStartBitrate, void(int start_bitrate_bps));
+ MOCK_METHOD2(SetMinMaxBitrate,
+ void(int min_bitrate_bps, int max_bitrate_bps));
+ MOCK_METHOD1(UpdateDelayBasedEstimate, 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));
+
+ MOCK_METHOD0(Process, int());
+ MOCK_METHOD0(TimeUntilNextProcess, int64_t());
+};
} // namespace test
} // namespace webrtc
diff --git a/webrtc/modules/bitrate_controller/send_side_bandwidth_estimation.cc b/webrtc/modules/bitrate_controller/send_side_bandwidth_estimation.cc
index 258c4d9..6891290 100644
--- a/webrtc/modules/bitrate_controller/send_side_bandwidth_estimation.cc
+++ b/webrtc/modules/bitrate_controller/send_side_bandwidth_estimation.cc
@@ -55,6 +55,7 @@
last_fraction_loss_(0),
last_round_trip_time_ms_(0),
bwe_incoming_(0),
+ delay_based_bitrate_bps_(0),
time_last_decrease_ms_(0),
first_report_time_ms_(-1),
initially_lost_packets_(0),
@@ -104,6 +105,13 @@
bitrate_ = CapBitrateToThresholds(now_ms, bitrate_);
}
+void SendSideBandwidthEstimation::UpdateDelayBasedEstimate(
+ int64_t now_ms,
+ uint32_t bitrate_bps) {
+ delay_based_bitrate_bps_ = bitrate_bps;
+ bitrate_ = CapBitrateToThresholds(now_ms, bitrate_);
+}
+
void SendSideBandwidthEstimation::UpdateReceiverBlock(uint8_t fraction_loss,
int64_t rtt,
int number_of_packets,
@@ -268,6 +276,9 @@
if (bwe_incoming_ > 0 && bitrate > bwe_incoming_) {
bitrate = bwe_incoming_;
}
+ if (delay_based_bitrate_bps_ > 0 && bitrate > delay_based_bitrate_bps_) {
+ bitrate = delay_based_bitrate_bps_;
+ }
if (bitrate > max_bitrate_configured_) {
bitrate = max_bitrate_configured_;
}
diff --git a/webrtc/modules/bitrate_controller/send_side_bandwidth_estimation.h b/webrtc/modules/bitrate_controller/send_side_bandwidth_estimation.h
index 7ffb42c..608a5e7 100644
--- a/webrtc/modules/bitrate_controller/send_side_bandwidth_estimation.h
+++ b/webrtc/modules/bitrate_controller/send_side_bandwidth_estimation.h
@@ -35,6 +35,9 @@
// Call when we receive a RTCP message with TMMBR or REMB.
void UpdateReceiverEstimate(int64_t now_ms, uint32_t bandwidth);
+ // Call when a new delay-based estimate is available.
+ void UpdateDelayBasedEstimate(int64_t now_ms, uint32_t bitrate_bps);
+
// Call when we receive a RTCP message with a ReceiveBlock.
void UpdateReceiverBlock(uint8_t fraction_loss,
int64_t rtt,
@@ -80,6 +83,7 @@
int64_t last_round_trip_time_ms_;
uint32_t bwe_incoming_;
+ uint32_t delay_based_bitrate_bps_;
int64_t time_last_decrease_ms_;
int64_t first_report_time_ms_;
int initially_lost_packets_;
diff --git a/webrtc/modules/remote_bitrate_estimator/transport_feedback_adapter.cc b/webrtc/modules/remote_bitrate_estimator/transport_feedback_adapter.cc
index 5904594..7e45136 100644
--- a/webrtc/modules/remote_bitrate_estimator/transport_feedback_adapter.cc
+++ b/webrtc/modules/remote_bitrate_estimator/transport_feedback_adapter.cc
@@ -27,11 +27,11 @@
const int64_t kBaseTimestampRangeSizeUs = kBaseTimestampScaleFactor * (1 << 24);
TransportFeedbackAdapter::TransportFeedbackAdapter(
- RtcpBandwidthObserver* bandwidth_observer,
+ BitrateController* bitrate_controller,
Clock* clock,
ProcessThread* process_thread)
: send_time_history_(clock, kSendTimeHistoryWindowMs),
- rtcp_bandwidth_observer_(bandwidth_observer),
+ bitrate_controller_(bitrate_controller),
process_thread_(process_thread),
clock_(clock),
current_offset_ms_(kNoTimestamp),
@@ -124,7 +124,7 @@
void TransportFeedbackAdapter::OnReceiveBitrateChanged(
const std::vector<unsigned int>& ssrcs,
unsigned int bitrate) {
- rtcp_bandwidth_observer_->OnReceivedEstimatedBitrate(bitrate);
+ bitrate_controller_->UpdateDelayBasedEstimate(bitrate);
}
void TransportFeedbackAdapter::OnRttUpdate(int64_t avg_rtt_ms,
diff --git a/webrtc/modules/remote_bitrate_estimator/transport_feedback_adapter.h b/webrtc/modules/remote_bitrate_estimator/transport_feedback_adapter.h
index 93f30e6..c142eea 100644
--- a/webrtc/modules/remote_bitrate_estimator/transport_feedback_adapter.h
+++ b/webrtc/modules/remote_bitrate_estimator/transport_feedback_adapter.h
@@ -15,7 +15,7 @@
#include "webrtc/base/criticalsection.h"
#include "webrtc/base/thread_annotations.h"
-#include "webrtc/modules/rtp_rtcp/include/rtp_rtcp_defines.h"
+#include "webrtc/modules/bitrate_controller/include/bitrate_controller.h"
#include "webrtc/modules/include/module_common_types.h"
#include "webrtc/modules/remote_bitrate_estimator/include/remote_bitrate_estimator.h"
#include "webrtc/modules/remote_bitrate_estimator/include/send_time_history.h"
@@ -28,7 +28,7 @@
public CallStatsObserver,
public RemoteBitrateObserver {
public:
- TransportFeedbackAdapter(RtcpBandwidthObserver* bandwidth_observer,
+ TransportFeedbackAdapter(BitrateController* bitrate_controller,
Clock* clock,
ProcessThread* process_thread);
virtual ~TransportFeedbackAdapter();
@@ -54,7 +54,7 @@
rtc::CriticalSection lock_;
SendTimeHistory send_time_history_ GUARDED_BY(&lock_);
- rtc::scoped_ptr<RtcpBandwidthObserver> rtcp_bandwidth_observer_;
+ BitrateController* bitrate_controller_;
rtc::scoped_ptr<RemoteBitrateEstimator> bitrate_estimator_;
ProcessThread* const process_thread_;
Clock* const clock_;
diff --git a/webrtc/modules/remote_bitrate_estimator/transport_feedback_adapter_unittest.cc b/webrtc/modules/remote_bitrate_estimator/transport_feedback_adapter_unittest.cc
index 64d0e55..f2ef5d9 100644
--- a/webrtc/modules/remote_bitrate_estimator/transport_feedback_adapter_unittest.cc
+++ b/webrtc/modules/remote_bitrate_estimator/transport_feedback_adapter_unittest.cc
@@ -16,6 +16,7 @@
#include "webrtc/base/checks.h"
#include "webrtc/base/scoped_ptr.h"
+#include "webrtc/modules/bitrate_controller/include/mock/mock_bitrate_controller.h"
#include "webrtc/modules/remote_bitrate_estimator/include/mock/mock_remote_bitrate_estimator.h"
#include "webrtc/modules/remote_bitrate_estimator/transport_feedback_adapter.h"
#include "webrtc/modules/rtp_rtcp/include/rtp_rtcp_defines.h"
@@ -34,13 +35,14 @@
TransportFeedbackAdapterTest()
: clock_(0),
bitrate_estimator_(nullptr),
+ bitrate_controller_(this),
receiver_estimated_bitrate_(0) {}
virtual ~TransportFeedbackAdapterTest() {}
virtual void SetUp() {
- adapter_.reset(new TransportFeedbackAdapter(
- new RtcpBandwidthObserverAdapter(this), &clock_, &process_thread_));
+ adapter_.reset(new TransportFeedbackAdapter(&bitrate_controller_, &clock_,
+ &process_thread_));
bitrate_estimator_ = new MockRemoteBitrateEstimator();
EXPECT_CALL(process_thread_, RegisterModule(bitrate_estimator_)).Times(1);
@@ -55,19 +57,15 @@
protected:
// Proxy class used since TransportFeedbackAdapter will own the instance
// passed at construction.
- class RtcpBandwidthObserverAdapter : public RtcpBandwidthObserver {
+ class MockBitrateControllerAdapter : public MockBitrateController {
public:
- explicit RtcpBandwidthObserverAdapter(TransportFeedbackAdapterTest* owner)
- : owner_(owner) {}
+ explicit MockBitrateControllerAdapter(TransportFeedbackAdapterTest* owner)
+ : MockBitrateController(), owner_(owner) {}
- void OnReceivedEstimatedBitrate(uint32_t bitrate) override {
- owner_->receiver_estimated_bitrate_ = bitrate;
- }
+ ~MockBitrateControllerAdapter() override {}
- void OnReceivedRtcpReceiverReport(const ReportBlockList& report_blocks,
- int64_t rtt,
- int64_t now_ms) override {
- RTC_NOTREACHED();
+ void UpdateDelayBasedEstimate(uint32_t bitrate_bps) override {
+ owner_->receiver_estimated_bitrate_ = bitrate_bps;
}
TransportFeedbackAdapterTest* const owner_;
@@ -113,6 +111,7 @@
SimulatedClock clock_;
MockProcessThread process_thread_;
MockRemoteBitrateEstimator* bitrate_estimator_;
+ MockBitrateControllerAdapter bitrate_controller_;
rtc::scoped_ptr<TransportFeedbackAdapter> adapter_;
uint32_t receiver_estimated_bitrate_;