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
This commit is contained in:
stefan@webrtc.org 2014-03-24 09:42:08 +00:00
parent ba5a6c3d89
commit af839b28b0
15 changed files with 42 additions and 15 deletions

View File

@ -17,11 +17,12 @@ namespace testing {
namespace bwe {
#if BWE_TEST_LOGGING_COMPILE_TIME_ENABLE
std::vector<BweTestConfig::EstimatorConfig> SingleEstimatorConfig() {
static const RemoteBitrateEstimatorFactory factory =
static const AbsoluteSendTimeRemoteBitrateEstimatorFactory factory =
AbsoluteSendTimeRemoteBitrateEstimatorFactory();
std::vector<BweTestConfig::EstimatorConfig> result;
result.push_back(BweTestConfig::EstimatorConfig("AST", &factory));
result.push_back(BweTestConfig::EstimatorConfig("AST", &factory, kAimdControl,
false));
return result;
}

View File

@ -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

View File

@ -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.");

View File

@ -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) {

View File

@ -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.

View File

@ -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,

View File

@ -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)) {

View File

@ -11,6 +11,7 @@
#include <string>
#include <vector>
#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;
};

View File

@ -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());

View File

@ -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;
}

View File

@ -69,6 +69,7 @@ class RtcpFormatRembTest : public ::testing::Test {
RemoteBitrateEstimatorFactory().Create(
&remote_bitrate_observer_,
system_clock_,
kMimdControl,
kRemoteBitrateEstimatorMinBitrateBps)) {}
virtual void SetUp();
virtual void TearDown();

View File

@ -261,6 +261,7 @@ class RtcpReceiverTest : public ::testing::Test {
RemoteBitrateEstimatorFactory().Create(
&remote_bitrate_observer_,
&system_clock_,
kMimdControl,
kRemoteBitrateEstimatorMinBitrateBps)) {
test_transport_ = new TestTransport();

View File

@ -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();

View File

@ -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.

View File

@ -41,6 +41,7 @@ class WrappingBitrateEstimator : public RemoteBitrateEstimator {
engine_id_(engine_id),
min_bitrate_bps_(config.Get<RemoteBitrateEstimatorMinRate>().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;
}