From af839b28b073be3c58a76433d7a4d96013e869f3 Mon Sep 17 00:00:00 2001 From: "stefan@webrtc.org" Date: Mon, 24 Mar 2014 09:42:08 +0000 Subject: [PATCH] Add AIMD option to BWE API. TEST=trybots R=mflodman@webrtc.org Review URL: https://webrtc-codereview.appspot.com/10319005 git-svn-id: http://webrtc.googlecode.com/svn/trunk@5755 4adac7df-926f-26a2-2b94-8c16560cd09d --- webrtc/modules/remote_bitrate_estimator/bwe_simulations.cc | 5 +++-- .../include/remote_bitrate_estimator.h | 7 +++++++ .../remote_bitrate_estimator_single_stream.cc | 2 ++ .../remote_bitrate_estimator_single_stream_unittest.cc | 3 ++- .../remote_bitrate_estimator_unittest_helper.cc | 7 ++++--- .../remote_bitrate_estimator_unittest_helper.h | 2 +- webrtc/modules/remote_bitrate_estimator/test/bwe_test.cc | 3 ++- webrtc/modules/remote_bitrate_estimator/test/bwe_test.h | 6 ++++++ .../test/bwe_test_framework_unittest.cc | 2 +- webrtc/modules/remote_bitrate_estimator/tools/bwe_rtp.cc | 6 ++++-- .../modules/rtp_rtcp/source/rtcp_format_remb_unittest.cc | 1 + webrtc/modules/rtp_rtcp/source/rtcp_receiver_unittest.cc | 1 + webrtc/modules/rtp_rtcp/source/rtcp_sender_unittest.cc | 1 + webrtc/video/rampup_tests.cc | 6 ++++-- webrtc/video_engine/vie_channel_group.cc | 5 +++-- 15 files changed, 42 insertions(+), 15 deletions(-) diff --git a/webrtc/modules/remote_bitrate_estimator/bwe_simulations.cc b/webrtc/modules/remote_bitrate_estimator/bwe_simulations.cc index 976f2a87d8..9e71ead663 100644 --- a/webrtc/modules/remote_bitrate_estimator/bwe_simulations.cc +++ b/webrtc/modules/remote_bitrate_estimator/bwe_simulations.cc @@ -17,11 +17,12 @@ namespace testing { namespace bwe { #if BWE_TEST_LOGGING_COMPILE_TIME_ENABLE std::vector SingleEstimatorConfig() { - static const RemoteBitrateEstimatorFactory factory = + static const AbsoluteSendTimeRemoteBitrateEstimatorFactory factory = AbsoluteSendTimeRemoteBitrateEstimatorFactory(); std::vector result; - result.push_back(BweTestConfig::EstimatorConfig("AST", &factory)); + result.push_back(BweTestConfig::EstimatorConfig("AST", &factory, kAimdControl, + false)); return result; } 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 a68879acde..7dc4f270f7 100644 --- a/webrtc/modules/remote_bitrate_estimator/include/remote_bitrate_estimator.h +++ b/webrtc/modules/remote_bitrate_estimator/include/remote_bitrate_estimator.h @@ -25,6 +25,11 @@ namespace webrtc { class Clock; +enum RateControlType { + kMimdControl, + kAimdControl +}; + // RemoteBitrateObserver is used to signal changes in bitrate estimates for // the incoming streams. class RemoteBitrateObserver { @@ -94,6 +99,7 @@ struct RemoteBitrateEstimatorFactory { virtual RemoteBitrateEstimator* Create( RemoteBitrateObserver* observer, Clock* clock, + RateControlType control_type, uint32_t min_bitrate_bps) const; }; @@ -105,6 +111,7 @@ struct AbsoluteSendTimeRemoteBitrateEstimatorFactory virtual RemoteBitrateEstimator* Create( RemoteBitrateObserver* observer, Clock* clock, + RateControlType control_type, uint32_t min_bitrate_bps) const; }; } // namespace webrtc diff --git a/webrtc/modules/remote_bitrate_estimator/remote_bitrate_estimator_single_stream.cc b/webrtc/modules/remote_bitrate_estimator/remote_bitrate_estimator_single_stream.cc index b0f906487c..af20b000f0 100644 --- a/webrtc/modules/remote_bitrate_estimator/remote_bitrate_estimator_single_stream.cc +++ b/webrtc/modules/remote_bitrate_estimator/remote_bitrate_estimator_single_stream.cc @@ -234,6 +234,7 @@ void RemoteBitrateEstimatorSingleStream::GetSsrcs( RemoteBitrateEstimator* RemoteBitrateEstimatorFactory::Create( RemoteBitrateObserver* observer, Clock* clock, + RateControlType control_type, uint32_t min_bitrate_bps) const { WEBRTC_TRACE(kTraceStateInfo, kTraceRemoteBitrateEstimator, -1, "RemoteBitrateEstimatorFactory: Instantiating."); @@ -244,6 +245,7 @@ RemoteBitrateEstimator* RemoteBitrateEstimatorFactory::Create( RemoteBitrateEstimator* AbsoluteSendTimeRemoteBitrateEstimatorFactory::Create( RemoteBitrateObserver* observer, Clock* clock, + RateControlType control_type, uint32_t min_bitrate_bps) const { WEBRTC_TRACE(kTraceStateInfo, kTraceRemoteBitrateEstimator, -1, "AbsoluteSendTimeRemoteBitrateEstimatorFactory: Instantiating."); diff --git a/webrtc/modules/remote_bitrate_estimator/remote_bitrate_estimator_single_stream_unittest.cc b/webrtc/modules/remote_bitrate_estimator/remote_bitrate_estimator_single_stream_unittest.cc index a3e44d87ef..795089de29 100644 --- a/webrtc/modules/remote_bitrate_estimator/remote_bitrate_estimator_single_stream_unittest.cc +++ b/webrtc/modules/remote_bitrate_estimator/remote_bitrate_estimator_single_stream_unittest.cc @@ -24,6 +24,7 @@ class RemoteBitrateEstimatorSingleTest : public RemoteBitrateEstimatorTest { bitrate_estimator_.reset(RemoteBitrateEstimatorFactory().Create( bitrate_observer_.get(), &clock_, + kMimdControl, kRemoteBitrateEstimatorMinBitrateBps)); } protected: @@ -35,7 +36,7 @@ TEST_F(RemoteBitrateEstimatorSingleTest, InitialBehavior) { } TEST_F(RemoteBitrateEstimatorSingleTest, RateIncreaseReordering) { - RateIncreaseReorderingTestHelper(); + RateIncreaseReorderingTestHelper(498136); } TEST_F(RemoteBitrateEstimatorSingleTest, RateIncreaseRtpTimestamps) { diff --git a/webrtc/modules/remote_bitrate_estimator/remote_bitrate_estimator_unittest_helper.cc b/webrtc/modules/remote_bitrate_estimator/remote_bitrate_estimator_unittest_helper.cc index 88ffe061b9..af8a6729f3 100644 --- a/webrtc/modules/remote_bitrate_estimator/remote_bitrate_estimator_unittest_helper.cc +++ b/webrtc/modules/remote_bitrate_estimator/remote_bitrate_estimator_unittest_helper.cc @@ -343,7 +343,8 @@ void RemoteBitrateEstimatorTest::InitialBehaviorTestHelper( EXPECT_EQ(bitrate_observer_->latest_bitrate(), bitrate_bps); } -void RemoteBitrateEstimatorTest::RateIncreaseReorderingTestHelper() { +void RemoteBitrateEstimatorTest::RateIncreaseReorderingTestHelper( + uint32_t expected_bitrate_bps) { const int kFramerate = 50; // 50 fps to avoid rounding errors. const int kFrameIntervalMs = 1000 / kFramerate; const uint32_t kFrameIntervalAbsSendTime = AbsSendTime(1, kFramerate); @@ -364,7 +365,7 @@ void RemoteBitrateEstimatorTest::RateIncreaseReorderingTestHelper() { } bitrate_estimator_->Process(); EXPECT_TRUE(bitrate_observer_->updated()); - EXPECT_EQ(498136u, bitrate_observer_->latest_bitrate()); + EXPECT_EQ(expected_bitrate_bps, bitrate_observer_->latest_bitrate()); for (int i = 0; i < 10; ++i) { clock_.AdvanceTimeMilliseconds(2 * kFrameIntervalMs); timestamp += 2 * 90 * kFrameIntervalMs; @@ -379,7 +380,7 @@ void RemoteBitrateEstimatorTest::RateIncreaseReorderingTestHelper() { } bitrate_estimator_->Process(); EXPECT_TRUE(bitrate_observer_->updated()); - EXPECT_EQ(498136u, bitrate_observer_->latest_bitrate()); + EXPECT_EQ(expected_bitrate_bps, bitrate_observer_->latest_bitrate()); } // Make sure we initially increase the bitrate as expected. diff --git a/webrtc/modules/remote_bitrate_estimator/remote_bitrate_estimator_unittest_helper.h b/webrtc/modules/remote_bitrate_estimator/remote_bitrate_estimator_unittest_helper.h index 64830dab70..5071deb701 100644 --- a/webrtc/modules/remote_bitrate_estimator/remote_bitrate_estimator_unittest_helper.h +++ b/webrtc/modules/remote_bitrate_estimator/remote_bitrate_estimator_unittest_helper.h @@ -190,7 +190,7 @@ class RemoteBitrateEstimatorTest : public ::testing::Test { unsigned int target_bitrate); void InitialBehaviorTestHelper(unsigned int expected_converge_bitrate); - void RateIncreaseReorderingTestHelper(); + void RateIncreaseReorderingTestHelper(unsigned int expected_bitrate); void RateIncreaseRtpTimestampsTestHelper(); void CapacityDropTestHelper(int number_of_streams, bool wrap_time_stamp, diff --git a/webrtc/modules/remote_bitrate_estimator/test/bwe_test.cc b/webrtc/modules/remote_bitrate_estimator/test/bwe_test.cc index 88ee8716cc..c500291060 100644 --- a/webrtc/modules/remote_bitrate_estimator/test/bwe_test.cc +++ b/webrtc/modules/remote_bitrate_estimator/test/bwe_test.cc @@ -46,7 +46,8 @@ class BweTest::TestedEstimator : public RemoteBitrateObserver { relative_estimator_stats_(), latest_estimate_bps_(-1), estimator_(config.estimator_factory->Create( - this, &clock_, kRemoteBitrateEstimatorMinBitrateBps)), + this, &clock_, config.control_type, + kRemoteBitrateEstimatorMinBitrateBps)), relative_estimator_(NULL), baseline_(BaseLineFileInterface::Create(test_name + "_" + debug_name_, config.update_baseline)) { diff --git a/webrtc/modules/remote_bitrate_estimator/test/bwe_test.h b/webrtc/modules/remote_bitrate_estimator/test/bwe_test.h index 286720b0c2..cb708f421e 100644 --- a/webrtc/modules/remote_bitrate_estimator/test/bwe_test.h +++ b/webrtc/modules/remote_bitrate_estimator/test/bwe_test.h @@ -11,6 +11,7 @@ #include #include #include "gtest/gtest.h" +#include "webrtc/modules/remote_bitrate_estimator/include/remote_bitrate_estimator.h" #include "webrtc/modules/remote_bitrate_estimator/test/bwe_test_framework.h" #include "webrtc/system_wrappers/interface/constructor_magic.h" @@ -26,23 +27,28 @@ struct BweTestConfig { EstimatorConfig() : debug_name(), estimator_factory(NULL), + control_type(kMimdControl), update_baseline(false) { } EstimatorConfig(std::string debug_name, const RemoteBitrateEstimatorFactory* estimator_factory) : debug_name(debug_name), estimator_factory(estimator_factory), + control_type(kMimdControl), update_baseline(false) { } EstimatorConfig(std::string debug_name, const RemoteBitrateEstimatorFactory* estimator_factory, + RateControlType control_type, bool update_baseline) : debug_name(debug_name), estimator_factory(estimator_factory), + control_type(control_type), update_baseline(update_baseline) { } std::string debug_name; const RemoteBitrateEstimatorFactory* estimator_factory; + RateControlType control_type; bool update_baseline; }; diff --git a/webrtc/modules/remote_bitrate_estimator/test/bwe_test_framework_unittest.cc b/webrtc/modules/remote_bitrate_estimator/test/bwe_test_framework_unittest.cc index 4259651946..d91a05b351 100644 --- a/webrtc/modules/remote_bitrate_estimator/test/bwe_test_framework_unittest.cc +++ b/webrtc/modules/remote_bitrate_estimator/test/bwe_test_framework_unittest.cc @@ -766,7 +766,7 @@ void TestVideoSender(VideoSender* sender, int64_t run_for_ms, EXPECT_GE(1u, rtp_timestamp_wraps); } -TEST(BweTestFramework_VideoSenderTest, Fps1Kpbs80_1s) { +TEST(BweTestFramework_VideoSenderTest, Fps1Kbps80_1s) { // 1 fps, 80 kbps VideoSender sender(NULL, 1.0f, 80, 0x1234, 0); EXPECT_EQ(10000u, sender.bytes_per_second()); diff --git a/webrtc/modules/remote_bitrate_estimator/tools/bwe_rtp.cc b/webrtc/modules/remote_bitrate_estimator/tools/bwe_rtp.cc index 1c563cd8f2..40fa6df8ff 100644 --- a/webrtc/modules/remote_bitrate_estimator/tools/bwe_rtp.cc +++ b/webrtc/modules/remote_bitrate_estimator/tools/bwe_rtp.cc @@ -54,13 +54,15 @@ bool ParseArgsAndSetupEstimator(int argc, switch (extension) { case webrtc::kRtpExtensionAbsoluteSendTime: { webrtc::AbsoluteSendTimeRemoteBitrateEstimatorFactory factory; - *estimator = factory.Create(observer, clock, kMinBitrateBps); + *estimator = factory.Create(observer, clock, webrtc::kAimdControl, + kMinBitrateBps); *estimator_used = "AbsoluteSendTimeRemoteBitrateEstimator"; break; } case webrtc::kRtpExtensionTransmissionTimeOffset: { webrtc::RemoteBitrateEstimatorFactory factory; - *estimator = factory.Create(observer, clock, kMinBitrateBps); + *estimator = factory.Create(observer, clock, webrtc::kAimdControl, + kMinBitrateBps); *estimator_used = "RemoteBitrateEstimator"; break; } diff --git a/webrtc/modules/rtp_rtcp/source/rtcp_format_remb_unittest.cc b/webrtc/modules/rtp_rtcp/source/rtcp_format_remb_unittest.cc index 68f6137139..88463e4718 100644 --- a/webrtc/modules/rtp_rtcp/source/rtcp_format_remb_unittest.cc +++ b/webrtc/modules/rtp_rtcp/source/rtcp_format_remb_unittest.cc @@ -69,6 +69,7 @@ class RtcpFormatRembTest : public ::testing::Test { RemoteBitrateEstimatorFactory().Create( &remote_bitrate_observer_, system_clock_, + kMimdControl, kRemoteBitrateEstimatorMinBitrateBps)) {} virtual void SetUp(); virtual void TearDown(); diff --git a/webrtc/modules/rtp_rtcp/source/rtcp_receiver_unittest.cc b/webrtc/modules/rtp_rtcp/source/rtcp_receiver_unittest.cc index b3f15bb966..399c133cd1 100644 --- a/webrtc/modules/rtp_rtcp/source/rtcp_receiver_unittest.cc +++ b/webrtc/modules/rtp_rtcp/source/rtcp_receiver_unittest.cc @@ -261,6 +261,7 @@ class RtcpReceiverTest : public ::testing::Test { RemoteBitrateEstimatorFactory().Create( &remote_bitrate_observer_, &system_clock_, + kMimdControl, kRemoteBitrateEstimatorMinBitrateBps)) { test_transport_ = new TestTransport(); diff --git a/webrtc/modules/rtp_rtcp/source/rtcp_sender_unittest.cc b/webrtc/modules/rtp_rtcp/source/rtcp_sender_unittest.cc index a8b5275fa2..8474390d23 100644 --- a/webrtc/modules/rtp_rtcp/source/rtcp_sender_unittest.cc +++ b/webrtc/modules/rtp_rtcp/source/rtcp_sender_unittest.cc @@ -284,6 +284,7 @@ class RtcpSenderTest : public ::testing::Test { RemoteBitrateEstimatorFactory().Create( &remote_bitrate_observer_, &clock_, + kMimdControl, kRemoteBitrateEstimatorMinBitrateBps)), receive_statistics_(ReceiveStatistics::Create(&clock_)) { test_transport_ = new TestTransport(); diff --git a/webrtc/video/rampup_tests.cc b/webrtc/video/rampup_tests.cc index 1b4ebf67ff..1cffed03b4 100644 --- a/webrtc/video/rampup_tests.cc +++ b/webrtc/video/rampup_tests.cc @@ -81,7 +81,8 @@ class StreamObserver : public newapi::Transport, public RemoteBitrateObserver { AbsoluteSendTimeRemoteBitrateEstimatorFactory rbe_factory; const uint32_t kRemoteBitrateEstimatorMinBitrateBps = 30000; remote_bitrate_estimator_.reset( - rbe_factory.Create(this, clock, kRemoteBitrateEstimatorMinBitrateBps)); + rbe_factory.Create(this, clock, kMimdControl, + kRemoteBitrateEstimatorMinBitrateBps)); } void set_expected_bitrate_bps(unsigned int expected_bitrate_bps) { @@ -221,7 +222,8 @@ class LowRateStreamObserver : public test::DirectTransport, AbsoluteSendTimeRemoteBitrateEstimatorFactory rbe_factory; const uint32_t kRemoteBitrateEstimatorMinBitrateBps = 10000; remote_bitrate_estimator_.reset( - rbe_factory.Create(this, clock, kRemoteBitrateEstimatorMinBitrateBps)); + rbe_factory.Create(this, clock, kMimdControl, + kRemoteBitrateEstimatorMinBitrateBps)); forward_transport_config_.link_capacity_kbps = kHighBandwidthLimitBps / 1000; forward_transport_config_.queue_length = 100; // Something large. diff --git a/webrtc/video_engine/vie_channel_group.cc b/webrtc/video_engine/vie_channel_group.cc index cc89bec0c2..f4055e46aa 100644 --- a/webrtc/video_engine/vie_channel_group.cc +++ b/webrtc/video_engine/vie_channel_group.cc @@ -41,6 +41,7 @@ class WrappingBitrateEstimator : public RemoteBitrateEstimator { engine_id_(engine_id), min_bitrate_bps_(config.Get().min_rate), rbe_(RemoteBitrateEstimatorFactory().Create(observer_, clock_, + kMimdControl, min_bitrate_bps_)), using_absolute_send_time_(false), packets_since_absolute_send_time_(0) { @@ -100,7 +101,7 @@ class WrappingBitrateEstimator : public RemoteBitrateEstimator { WEBRTC_TRACE(kTraceStateInfo, kTraceVideo, ViEId(engine_id_), "WrappingBitrateEstimator: Switching to absolute send time RBE."); rbe_.reset(AbsoluteSendTimeRemoteBitrateEstimatorFactory().Create( - observer_, clock_, min_bitrate_bps_)); + observer_, clock_, kMimdControl, min_bitrate_bps_)); process_thread_->RegisterModule(rbe_.get()); using_absolute_send_time_ = true; } @@ -115,7 +116,7 @@ class WrappingBitrateEstimator : public RemoteBitrateEstimator { "WrappingBitrateEstimator: Switching to transmission time offset " "RBE."); rbe_.reset(RemoteBitrateEstimatorFactory().Create(observer_, clock_, - min_bitrate_bps_)); + kMimdControl, min_bitrate_bps_)); process_thread_->RegisterModule(rbe_.get()); using_absolute_send_time_ = false; }