aboutsummaryrefslogtreecommitdiff
path: root/webrtc/modules/remote_bitrate_estimator/remote_bitrate_estimators_test.cc
diff options
context:
space:
mode:
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.cc434
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