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:
parent
ba5a6c3d89
commit
af839b28b0
@ -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;
|
||||
}
|
||||
|
||||
|
||||
@ -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
|
||||
|
||||
@ -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.");
|
||||
|
||||
@ -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) {
|
||||
|
||||
@ -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.
|
||||
|
||||
@ -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,
|
||||
|
||||
@ -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)) {
|
||||
|
||||
@ -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;
|
||||
};
|
||||
|
||||
|
||||
@ -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());
|
||||
|
||||
@ -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;
|
||||
}
|
||||
|
||||
@ -69,6 +69,7 @@ class RtcpFormatRembTest : public ::testing::Test {
|
||||
RemoteBitrateEstimatorFactory().Create(
|
||||
&remote_bitrate_observer_,
|
||||
system_clock_,
|
||||
kMimdControl,
|
||||
kRemoteBitrateEstimatorMinBitrateBps)) {}
|
||||
virtual void SetUp();
|
||||
virtual void TearDown();
|
||||
|
||||
@ -261,6 +261,7 @@ class RtcpReceiverTest : public ::testing::Test {
|
||||
RemoteBitrateEstimatorFactory().Create(
|
||||
&remote_bitrate_observer_,
|
||||
&system_clock_,
|
||||
kMimdControl,
|
||||
kRemoteBitrateEstimatorMinBitrateBps)) {
|
||||
test_transport_ = new TestTransport();
|
||||
|
||||
|
||||
@ -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();
|
||||
|
||||
@ -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.
|
||||
|
||||
@ -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;
|
||||
}
|
||||
|
||||
Loading…
x
Reference in New Issue
Block a user