diff options
Diffstat (limited to 'webrtc/modules/remote_bitrate_estimator/remote_bitrate_estimators_test.cc')
-rw-r--r-- | webrtc/modules/remote_bitrate_estimator/remote_bitrate_estimators_test.cc | 434 |
1 files changed, 434 insertions, 0 deletions
diff --git a/webrtc/modules/remote_bitrate_estimator/remote_bitrate_estimators_test.cc b/webrtc/modules/remote_bitrate_estimator/remote_bitrate_estimators_test.cc new file mode 100644 index 0000000000..d6f049f6ac --- /dev/null +++ b/webrtc/modules/remote_bitrate_estimator/remote_bitrate_estimators_test.cc @@ -0,0 +1,434 @@ +/* + * Copyright (c) 2013 The WebRTC project authors. All Rights Reserved. + * + * Use of this source code is governed by a BSD-style license + * that can be found in the LICENSE file in the root of the source + * tree. An additional intellectual property rights grant can be found + * in the file PATENTS. All contributing project authors may + * be found in the AUTHORS file in the root of the source tree. + */ + +#ifndef WEBRTC_WIN +#include <sys/types.h> +#include <unistd.h> +#endif + +#include <sstream> + +#include "webrtc/modules/remote_bitrate_estimator/include/remote_bitrate_estimator.h" +#include "webrtc/modules/remote_bitrate_estimator/test/bwe_test.h" +#include "webrtc/modules/remote_bitrate_estimator/test/packet_receiver.h" +#include "webrtc/modules/remote_bitrate_estimator/test/packet_sender.h" +#include "webrtc/test/testsupport/fileutils.h" + +using std::string; + +namespace webrtc { +namespace testing { +namespace bwe { + +class DefaultBweTest : public BweTest, + public ::testing::TestWithParam<BandwidthEstimatorType> { + public: + virtual ~DefaultBweTest() {} +}; + +INSTANTIATE_TEST_CASE_P(VideoSendersTest, + DefaultBweTest, + ::testing::Values(kRembEstimator, + kFullSendSideEstimator)); + +TEST_P(DefaultBweTest, UnlimitedSpeed) { + VideoSource source(0, 30, 300, 0, 0); + VideoSender sender(&uplink_, &source, GetParam()); + PacketReceiver receiver(&uplink_, 0, GetParam(), false, false); + RunFor(10 * 60 * 1000); +} + +TEST_P(DefaultBweTest, SteadyLoss) { + VideoSource source(0, 30, 300, 0, 0); + VideoSender sender(&uplink_, &source, GetParam()); + LossFilter loss(&uplink_, 0); + PacketReceiver receiver(&uplink_, 0, GetParam(), false, false); + loss.SetLoss(20.0); + RunFor(10 * 60 * 1000); +} + +TEST_P(DefaultBweTest, IncreasingLoss1) { + VideoSource source(0, 30, 300, 0, 0); + VideoSender sender(&uplink_, &source, GetParam()); + LossFilter loss(&uplink_, 0); + PacketReceiver receiver(&uplink_, 0, GetParam(), false, false); + for (int i = 0; i < 76; ++i) { + loss.SetLoss(i); + RunFor(5000); + } +} + +TEST_P(DefaultBweTest, SteadyDelay) { + VideoSource source(0, 30, 300, 0, 0); + VideoSender sender(&uplink_, &source, GetParam()); + DelayFilter delay(&uplink_, 0); + PacketReceiver receiver(&uplink_, 0, GetParam(), false, false); + delay.SetOneWayDelayMs(1000); + RunFor(10 * 60 * 1000); +} + +TEST_P(DefaultBweTest, IncreasingDelay1) { + VideoSource source(0, 30, 300, 0, 0); + VideoSender sender(&uplink_, &source, GetParam()); + DelayFilter delay(&uplink_, 0); + PacketReceiver receiver(&uplink_, 0, GetParam(), false, false); + RunFor(10 * 60 * 1000); + for (int i = 0; i < 30 * 2; ++i) { + delay.SetOneWayDelayMs(i); + RunFor(10 * 1000); + } + RunFor(10 * 60 * 1000); +} + +TEST_P(DefaultBweTest, IncreasingDelay2) { + VideoSource source(0, 30, 300, 0, 0); + VideoSender sender(&uplink_, &source, GetParam()); + DelayFilter delay(&uplink_, 0); + RateCounterFilter counter(&uplink_, 0, "", ""); + PacketReceiver receiver(&uplink_, 0, GetParam(), false, false); + RunFor(1 * 60 * 1000); + for (int i = 1; i < 51; ++i) { + delay.SetOneWayDelayMs(10.0f * i); + RunFor(10 * 1000); + } + delay.SetOneWayDelayMs(0.0f); + RunFor(10 * 60 * 1000); +} + +TEST_P(DefaultBweTest, JumpyDelay1) { + VideoSource source(0, 30, 300, 0, 0); + VideoSender sender(&uplink_, &source, GetParam()); + DelayFilter delay(&uplink_, 0); + PacketReceiver receiver(&uplink_, 0, GetParam(), false, false); + RunFor(10 * 60 * 1000); + for (int i = 1; i < 200; ++i) { + delay.SetOneWayDelayMs((10 * i) % 500); + RunFor(1000); + delay.SetOneWayDelayMs(1.0f); + RunFor(1000); + } + delay.SetOneWayDelayMs(0.0f); + RunFor(10 * 60 * 1000); +} + +TEST_P(DefaultBweTest, SteadyJitter) { + VideoSource source(0, 30, 300, 0, 0); + VideoSender sender(&uplink_, &source, GetParam()); + JitterFilter jitter(&uplink_, 0); + RateCounterFilter counter(&uplink_, 0, "", ""); + PacketReceiver receiver(&uplink_, 0, GetParam(), false, false); + jitter.SetMaxJitter(20); + RunFor(2 * 60 * 1000); +} + +TEST_P(DefaultBweTest, IncreasingJitter1) { + VideoSource source(0, 30, 300, 0, 0); + VideoSender sender(&uplink_, &source, GetParam()); + JitterFilter jitter(&uplink_, 0); + PacketReceiver receiver(&uplink_, 0, GetParam(), false, false); + for (int i = 0; i < 2 * 60 * 2; ++i) { + jitter.SetMaxJitter(i); + RunFor(10 * 1000); + } + RunFor(10 * 60 * 1000); +} + +TEST_P(DefaultBweTest, IncreasingJitter2) { + VideoSource source(0, 30, 300, 0, 0); + VideoSender sender(&uplink_, &source, GetParam()); + JitterFilter jitter(&uplink_, 0); + PacketReceiver receiver(&uplink_, 0, GetParam(), false, false); + RunFor(30 * 1000); + for (int i = 1; i < 51; ++i) { + jitter.SetMaxJitter(10.0f * i); + RunFor(10 * 1000); + } + jitter.SetMaxJitter(0.0f); + RunFor(10 * 60 * 1000); +} + +TEST_P(DefaultBweTest, SteadyReorder) { + VideoSource source(0, 30, 300, 0, 0); + VideoSender sender(&uplink_, &source, GetParam()); + ReorderFilter reorder(&uplink_, 0); + PacketReceiver receiver(&uplink_, 0, GetParam(), false, false); + reorder.SetReorder(20.0); + RunFor(10 * 60 * 1000); +} + +TEST_P(DefaultBweTest, IncreasingReorder1) { + VideoSource source(0, 30, 300, 0, 0); + VideoSender sender(&uplink_, &source, GetParam()); + ReorderFilter reorder(&uplink_, 0); + PacketReceiver receiver(&uplink_, 0, GetParam(), false, false); + for (int i = 0; i < 76; ++i) { + reorder.SetReorder(i); + RunFor(5000); + } +} + +TEST_P(DefaultBweTest, SteadyChoke) { + VideoSource source(0, 30, 300, 0, 0); + VideoSender sender(&uplink_, &source, GetParam()); + ChokeFilter choke(&uplink_, 0); + PacketReceiver receiver(&uplink_, 0, GetParam(), false, false); + choke.set_capacity_kbps(140); + RunFor(10 * 60 * 1000); +} + +TEST_P(DefaultBweTest, IncreasingChoke1) { + VideoSource source(0, 30, 300, 0, 0); + VideoSender sender(&uplink_, &source, GetParam()); + ChokeFilter choke(&uplink_, 0); + PacketReceiver receiver(&uplink_, 0, GetParam(), false, false); + for (int i = 1200; i >= 100; i -= 100) { + choke.set_capacity_kbps(i); + RunFor(5000); + } +} + +TEST_P(DefaultBweTest, IncreasingChoke2) { + VideoSource source(0, 30, 300, 0, 0); + VideoSender sender(&uplink_, &source, GetParam()); + ChokeFilter choke(&uplink_, 0); + PacketReceiver receiver(&uplink_, 0, GetParam(), false, false); + RunFor(60 * 1000); + for (int i = 1200; i >= 100; i -= 20) { + choke.set_capacity_kbps(i); + RunFor(1000); + } +} + +TEST_P(DefaultBweTest, Multi1) { + VideoSource source(0, 30, 300, 0, 0); + VideoSender sender(&uplink_, &source, GetParam()); + DelayFilter delay(&uplink_, 0); + ChokeFilter choke(&uplink_, 0); + RateCounterFilter counter(&uplink_, 0, "", ""); + PacketReceiver receiver(&uplink_, 0, GetParam(), false, false); + choke.set_capacity_kbps(1000); + RunFor(1 * 60 * 1000); + for (int i = 1; i < 51; ++i) { + delay.SetOneWayDelayMs(100.0f * i); + RunFor(10 * 1000); + } + RunFor(500 * 1000); + delay.SetOneWayDelayMs(0.0f); + RunFor(5 * 60 * 1000); +} + +TEST_P(DefaultBweTest, Multi2) { + VideoSource source(0, 30, 300, 0, 0); + VideoSender sender(&uplink_, &source, GetParam()); + ChokeFilter choke(&uplink_, 0); + JitterFilter jitter(&uplink_, 0); + RateCounterFilter counter(&uplink_, 0, "", ""); + PacketReceiver receiver(&uplink_, 0, GetParam(), false, false); + choke.set_capacity_kbps(2000); + jitter.SetMaxJitter(120); + RunFor(5 * 60 * 1000); +} + +// This test fixture is used to instantiate tests running with adaptive video +// senders. +class BweFeedbackTest + : public BweTest, + public ::testing::TestWithParam<BandwidthEstimatorType> { + public: + BweFeedbackTest() : BweTest() {} + virtual ~BweFeedbackTest() {} + + protected: + void SetUp() override { + unsigned int seed = Clock::GetRealTimeClock()->TimeInMicroseconds(); +#ifndef WEBRTC_WIN + seed *= getpid(); +#endif + srand(seed); + BweTest::SetUp(); + } + + private: + RTC_DISALLOW_COPY_AND_ASSIGN(BweFeedbackTest); +}; + +INSTANTIATE_TEST_CASE_P(VideoSendersTest, + BweFeedbackTest, + ::testing::Values(kRembEstimator, + kFullSendSideEstimator)); + +TEST_P(BweFeedbackTest, ConstantCapacity) { + AdaptiveVideoSource source(0, 30, 300, 0, 0); + PacedVideoSender sender(&uplink_, &source, GetParam()); + ChokeFilter filter(&uplink_, 0); + RateCounterFilter counter(&uplink_, 0, "Receiver", bwe_names[GetParam()]); + PacketReceiver receiver(&uplink_, 0, GetParam(), false, false); + const int kCapacityKbps = 1000; + filter.set_capacity_kbps(kCapacityKbps); + filter.set_max_delay_ms(500); + RunFor(180 * 1000); + PrintResults(kCapacityKbps, counter.GetBitrateStats(), 0, + receiver.GetDelayStats(), counter.GetBitrateStats()); +} + +TEST_P(BweFeedbackTest, Choke1000kbps500kbps1000kbps) { + AdaptiveVideoSource source(0, 30, 300, 0, 0); + PacedVideoSender sender(&uplink_, &source, GetParam()); + ChokeFilter filter(&uplink_, 0); + RateCounterFilter counter(&uplink_, 0, "Receiver", bwe_names[GetParam()]); + PacketReceiver receiver(&uplink_, 0, GetParam(), false, false); + const int kHighCapacityKbps = 1000; + const int kLowCapacityKbps = 500; + filter.set_capacity_kbps(kHighCapacityKbps); + filter.set_max_delay_ms(500); + RunFor(60 * 1000); + filter.set_capacity_kbps(kLowCapacityKbps); + RunFor(60 * 1000); + filter.set_capacity_kbps(kHighCapacityKbps); + RunFor(60 * 1000); + PrintResults((2 * kHighCapacityKbps + kLowCapacityKbps) / 3.0, + counter.GetBitrateStats(), 0, receiver.GetDelayStats(), + counter.GetBitrateStats()); +} + +TEST_P(BweFeedbackTest, Choke200kbps30kbps200kbps) { + AdaptiveVideoSource source(0, 30, 300, 0, 0); + PacedVideoSender sender(&uplink_, &source, GetParam()); + ChokeFilter filter(&uplink_, 0); + RateCounterFilter counter(&uplink_, 0, "Receiver", bwe_names[GetParam()]); + PacketReceiver receiver(&uplink_, 0, GetParam(), false, false); + const int kHighCapacityKbps = 200; + const int kLowCapacityKbps = 30; + filter.set_capacity_kbps(kHighCapacityKbps); + filter.set_max_delay_ms(500); + RunFor(60 * 1000); + filter.set_capacity_kbps(kLowCapacityKbps); + RunFor(60 * 1000); + filter.set_capacity_kbps(kHighCapacityKbps); + RunFor(60 * 1000); + + PrintResults((2 * kHighCapacityKbps + kLowCapacityKbps) / 3.0, + counter.GetBitrateStats(), 0, receiver.GetDelayStats(), + counter.GetBitrateStats()); +} + +TEST_P(BweFeedbackTest, Verizon4gDownlinkTest) { + AdaptiveVideoSource source(0, 30, 300, 0, 0); + VideoSender sender(&uplink_, &source, GetParam()); + RateCounterFilter counter1(&uplink_, 0, "sender_output", + bwe_names[GetParam()]); + TraceBasedDeliveryFilter filter(&uplink_, 0, "link_capacity"); + RateCounterFilter counter2(&uplink_, 0, "Receiver", bwe_names[GetParam()]); + PacketReceiver receiver(&uplink_, 0, GetParam(), false, false); + ASSERT_TRUE(filter.Init(test::ResourcePath("verizon4g-downlink", "rx"))); + RunFor(22 * 60 * 1000); + PrintResults(filter.GetBitrateStats().GetMean(), counter2.GetBitrateStats(), + 0, receiver.GetDelayStats(), counter2.GetBitrateStats()); +} + +// webrtc:3277 +TEST_P(BweFeedbackTest, GoogleWifiTrace3Mbps) { + AdaptiveVideoSource source(0, 30, 300, 0, 0); + VideoSender sender(&uplink_, &source, GetParam()); + RateCounterFilter counter1(&uplink_, 0, "sender_output", + bwe_names[GetParam()]); + TraceBasedDeliveryFilter filter(&uplink_, 0, "link_capacity"); + filter.set_max_delay_ms(500); + RateCounterFilter counter2(&uplink_, 0, "Receiver", bwe_names[GetParam()]); + PacketReceiver receiver(&uplink_, 0, GetParam(), false, false); + ASSERT_TRUE(filter.Init(test::ResourcePath("google-wifi-3mbps", "rx"))); + RunFor(300 * 1000); + PrintResults(filter.GetBitrateStats().GetMean(), counter2.GetBitrateStats(), + 0, receiver.GetDelayStats(), counter2.GetBitrateStats()); +} + +TEST_P(BweFeedbackTest, PacedSelfFairness50msTest) { + int64_t kRttMs = 100; + int64_t kMaxJitterMs = 15; + + const int kNumRmcatFlows = 4; + int64_t offset_ms[kNumRmcatFlows]; + for (int i = 0; i < kNumRmcatFlows; ++i) { + offset_ms[i] = std::max(0, 5000 * i + rand() % 2001 - 1000); + } + + RunFairnessTest(GetParam(), kNumRmcatFlows, 0, 300, 3000, 50, kRttMs, + kMaxJitterMs, offset_ms); +} + +TEST_P(BweFeedbackTest, PacedSelfFairness500msTest) { + int64_t kRttMs = 100; + int64_t kMaxJitterMs = 15; + + const int kNumRmcatFlows = 4; + int64_t offset_ms[kNumRmcatFlows]; + for (int i = 0; i < kNumRmcatFlows; ++i) { + offset_ms[i] = std::max(0, 5000 * i + rand() % 2001 - 1000); + } + + RunFairnessTest(GetParam(), kNumRmcatFlows, 0, 300, 3000, 500, kRttMs, + kMaxJitterMs, offset_ms); +} + +TEST_P(BweFeedbackTest, PacedSelfFairness1000msTest) { + int64_t kRttMs = 100; + int64_t kMaxJitterMs = 15; + + const int kNumRmcatFlows = 4; + int64_t offset_ms[kNumRmcatFlows]; + for (int i = 0; i < kNumRmcatFlows; ++i) { + offset_ms[i] = std::max(0, 5000 * i + rand() % 2001 - 1000); + } + + RunFairnessTest(GetParam(), kNumRmcatFlows, 0, 300, 3000, 1000, kRttMs, + kMaxJitterMs, offset_ms); +} + +TEST_P(BweFeedbackTest, TcpFairness50msTest) { + int64_t kRttMs = 100; + int64_t kMaxJitterMs = 15; + + int64_t offset_ms[2]; // One TCP, one RMCAT flow. + for (int i = 0; i < 2; ++i) { + offset_ms[i] = std::max(0, 5000 * i + rand() % 2001 - 1000); + } + + RunFairnessTest(GetParam(), 1, 1, 300, 2000, 50, kRttMs, kMaxJitterMs, + offset_ms); +} + +TEST_P(BweFeedbackTest, TcpFairness500msTest) { + int64_t kRttMs = 100; + int64_t kMaxJitterMs = 15; + + int64_t offset_ms[2]; // One TCP, one RMCAT flow. + for (int i = 0; i < 2; ++i) { + offset_ms[i] = std::max(0, 5000 * i + rand() % 2001 - 1000); + } + + RunFairnessTest(GetParam(), 1, 1, 300, 2000, 500, kRttMs, kMaxJitterMs, + offset_ms); +} + +TEST_P(BweFeedbackTest, TcpFairness1000msTest) { + int64_t kRttMs = 100; + int64_t kMaxJitterMs = 15; + + int64_t offset_ms[2]; // One TCP, one RMCAT flow. + for (int i = 0; i < 2; ++i) { + offset_ms[i] = std::max(0, 5000 * i + rand() % 2001 - 1000); + } + + RunFairnessTest(GetParam(), 1, 1, 300, 2000, 1000, kRttMs, kMaxJitterMs, + offset_ms); +} +} // namespace bwe +} // namespace testing +} // namespace webrtc |