Home | History | Annotate | Download | only in remote_bitrate_estimator
      1 /*
      2  *  Copyright (c) 2013 The WebRTC project authors. All Rights Reserved.
      3  *
      4  *  Use of this source code is governed by a BSD-style license
      5  *  that can be found in the LICENSE file in the root of the source
      6  *  tree. An additional intellectual property rights grant can be found
      7  *  in the file PATENTS.  All contributing project authors may
      8  *  be found in the AUTHORS file in the root of the source tree.
      9  */
     10 
     11 #include <sstream>
     12 
     13 #include "webrtc/modules/remote_bitrate_estimator/include/remote_bitrate_estimator.h"
     14 #include "webrtc/modules/remote_bitrate_estimator/test/bwe_test.h"
     15 #include "webrtc/test/testsupport/fileutils.h"
     16 #include "webrtc/test/testsupport/perf_test.h"
     17 
     18 using std::string;
     19 
     20 namespace webrtc {
     21 namespace testing {
     22 namespace bwe {
     23 enum Estimator { kAbsSendTime, kTransmissionOffset };
     24 
     25 BweTestConfig::EstimatorConfig EstimatorConfigs(Estimator estimator,
     26                                                 int flow_id) {
     27   static const RemoteBitrateEstimatorFactory factories[] = {
     28     RemoteBitrateEstimatorFactory(),
     29     AbsoluteSendTimeRemoteBitrateEstimatorFactory()
     30   };
     31   switch (estimator) {
     32     case kTransmissionOffset:
     33       return BweTestConfig::EstimatorConfig("TOF", flow_id, &factories[0],
     34                                             kMimdControl, false, false);
     35     case kAbsSendTime:
     36       return BweTestConfig::EstimatorConfig("AST", flow_id, &factories[1],
     37                                             kMimdControl, false, false);
     38   }
     39   assert(false);
     40   return BweTestConfig::EstimatorConfig();
     41 }
     42 
     43 struct DefaultBweTestConfig {
     44   BweTestConfig bwe_test_config;
     45   size_t number_of_senders;
     46 };
     47 
     48 DefaultBweTestConfig MakeBweTestConfig(uint32_t sender_count,
     49                                        Estimator estimator) {
     50   DefaultBweTestConfig result;
     51   result.bwe_test_config.estimator_configs.push_back(
     52       EstimatorConfigs(estimator, 0));
     53   result.number_of_senders = sender_count;
     54   return result;
     55 }
     56 
     57 class DefaultBweTest : public BweTest,
     58                        public ::testing::TestWithParam<DefaultBweTestConfig> {
     59  public:
     60   DefaultBweTest() : packet_senders_() {}
     61   virtual ~DefaultBweTest() {}
     62 
     63   virtual void SetUp() {
     64     const DefaultBweTestConfig& config = GetParam();
     65     SetupTestFromConfig(config.bwe_test_config);
     66     for (size_t i = 0; i < config.number_of_senders; ++i) {
     67       packet_senders_.push_back(new VideoSender(0, this, 30, 300, 0, 0));
     68     }
     69   }
     70 
     71   virtual void TearDown() {
     72     while (!packet_senders_.empty()) {
     73       delete packet_senders_.front();
     74       packet_senders_.pop_front();
     75     }
     76   }
     77 
     78  protected:
     79   std::list<PacketSender*> packet_senders_;
     80 };
     81 
     82 INSTANTIATE_TEST_CASE_P(VideoSendersTest, DefaultBweTest,
     83     ::testing::Values(MakeBweTestConfig(1, kAbsSendTime),
     84                       MakeBweTestConfig(3, kAbsSendTime),
     85                       MakeBweTestConfig(1, kTransmissionOffset),
     86                       MakeBweTestConfig(3, kTransmissionOffset)));
     87 
     88 TEST_P(DefaultBweTest, UnlimitedSpeed) {
     89   VerboseLogging(false);
     90   RunFor(10 * 60 * 1000);
     91 }
     92 
     93 TEST_P(DefaultBweTest, DISABLED_SteadyLoss) {
     94   LossFilter loss(this);
     95   loss.SetLoss(20.0);
     96   RunFor(10 * 60 * 1000);
     97 }
     98 
     99 TEST_P(DefaultBweTest, IncreasingLoss1) {
    100   LossFilter loss(this);
    101   for (int i = 0; i < 76; ++i) {
    102     loss.SetLoss(i);
    103     RunFor(5000);
    104   }
    105 }
    106 
    107 TEST_P(DefaultBweTest, SteadyDelay) {
    108   DelayFilter delay(this);
    109   delay.SetDelay(1000);
    110   RunFor(10 * 60 * 1000);
    111 }
    112 
    113 TEST_P(DefaultBweTest, DISABLED_IncreasingDelay1) {
    114   DelayFilter delay(this);
    115   RunFor(10 * 60 * 1000);
    116   for (int i = 0; i < 30 * 2; ++i) {
    117     delay.SetDelay(i);
    118     RunFor(10 * 1000);
    119   }
    120   RunFor(10 * 60 * 1000);
    121 }
    122 
    123 TEST_P(DefaultBweTest, IncreasingDelay2) {
    124   DelayFilter delay(this);
    125   RateCounterFilter counter(this);
    126   RunFor(1 * 60 * 1000);
    127   for (int i = 1; i < 51; ++i) {
    128     delay.SetDelay(10.0f * i);
    129     RunFor(10 * 1000);
    130   }
    131   delay.SetDelay(0.0f);
    132   RunFor(10 * 60 * 1000);
    133 }
    134 
    135 TEST_P(DefaultBweTest, JumpyDelay1) {
    136   DelayFilter delay(this);
    137   RunFor(10 * 60 * 1000);
    138   for (int i = 1; i < 200; ++i) {
    139     delay.SetDelay((10 * i) % 500);
    140     RunFor(1000);
    141     delay.SetDelay(1.0f);
    142     RunFor(1000);
    143   }
    144   delay.SetDelay(0.0f);
    145   RunFor(10 * 60 * 1000);
    146 }
    147 
    148 TEST_P(DefaultBweTest, SteadyJitter) {
    149   JitterFilter jitter(this);
    150   RateCounterFilter counter(this);
    151   jitter.SetJitter(20);
    152   RunFor(2 * 60 * 1000);
    153 }
    154 
    155 TEST_P(DefaultBweTest, IncreasingJitter1) {
    156   JitterFilter jitter(this);
    157   for (int i = 0; i < 2 * 60 * 2; ++i) {
    158     jitter.SetJitter(i);
    159     RunFor(10 * 1000);
    160   }
    161   RunFor(10 * 60 * 1000);
    162 }
    163 
    164 TEST_P(DefaultBweTest, IncreasingJitter2) {
    165   JitterFilter jitter(this);
    166   RunFor(30 * 1000);
    167   for (int i = 1; i < 51; ++i) {
    168     jitter.SetJitter(10.0f * i);
    169     RunFor(10 * 1000);
    170   }
    171   jitter.SetJitter(0.0f);
    172   RunFor(10 * 60 * 1000);
    173 }
    174 
    175 TEST_P(DefaultBweTest, SteadyReorder) {
    176   ReorderFilter reorder(this);
    177   reorder.SetReorder(20.0);
    178   RunFor(10 * 60 * 1000);
    179 }
    180 
    181 TEST_P(DefaultBweTest, IncreasingReorder1) {
    182   ReorderFilter reorder(this);
    183   for (int i = 0; i < 76; ++i) {
    184     reorder.SetReorder(i);
    185     RunFor(5000);
    186   }
    187 }
    188 
    189 TEST_P(DefaultBweTest, DISABLED_SteadyChoke) {
    190   ChokeFilter choke(this);
    191   choke.SetCapacity(140);
    192   RunFor(10 * 60 * 1000);
    193 }
    194 
    195 TEST_P(DefaultBweTest, DISABLED_IncreasingChoke1) {
    196   ChokeFilter choke(this);
    197   for (int i = 1200; i >= 100; i -= 100) {
    198     choke.SetCapacity(i);
    199     RunFor(5000);
    200   }
    201 }
    202 
    203 TEST_P(DefaultBweTest, DISABLED_IncreasingChoke2) {
    204   ChokeFilter choke(this);
    205   RunFor(60 * 1000);
    206   for (int i = 1200; i >= 100; i -= 20) {
    207     choke.SetCapacity(i);
    208     RunFor(1000);
    209   }
    210 }
    211 
    212 TEST_P(DefaultBweTest, DISABLED_Multi1) {
    213   DelayFilter delay(this);
    214   ChokeFilter choke(this);
    215   RateCounterFilter counter(this);
    216   choke.SetCapacity(1000);
    217   RunFor(1 * 60 * 1000);
    218   for (int i = 1; i < 51; ++i) {
    219     delay.SetDelay(100.0f * i);
    220     RunFor(10 * 1000);
    221   }
    222   RunFor(500 * 1000);
    223   delay.SetDelay(0.0f);
    224   RunFor(5 * 60 * 1000);
    225 }
    226 
    227 TEST_P(DefaultBweTest, Multi2) {
    228   ChokeFilter choke(this);
    229   JitterFilter jitter(this);
    230   RateCounterFilter counter(this);
    231   choke.SetCapacity(2000);
    232   jitter.SetJitter(120);
    233   RunFor(5 * 60 * 1000);
    234 }
    235 
    236 // This test fixture is used to instantiate tests running with adaptive video
    237 // senders.
    238 class BweFeedbackTest : public BweTest,
    239                         public ::testing::TestWithParam<BweTestConfig> {
    240  public:
    241   BweFeedbackTest() : BweTest() {}
    242   virtual ~BweFeedbackTest() {}
    243 
    244   virtual void SetUp() {
    245     BweTestConfig config;
    246     config.estimator_configs.push_back(EstimatorConfigs(kAbsSendTime, 0));
    247     SetupTestFromConfig(config);
    248   }
    249 
    250   void PrintResults(double max_throughput_kbps, Stats<double> throughput_kbps,
    251                     Stats<double> delay_ms) {
    252     double utilization = throughput_kbps.GetMean() / max_throughput_kbps;
    253     webrtc::test::PrintResult("BwePerformance",
    254                               GetTestName(),
    255                               "Utilization",
    256                               utilization * 100.0,
    257                               "%",
    258                               false);
    259     std::stringstream ss;
    260     ss << throughput_kbps.GetStdDev() / throughput_kbps.GetMean();
    261     webrtc::test::PrintResult("BwePerformance",
    262                               GetTestName(),
    263                               "Utilization var coeff",
    264                               ss.str(),
    265                               "",
    266                               false);
    267     webrtc::test::PrintResult("BwePerformance",
    268                               GetTestName(),
    269                               "Average delay",
    270                               delay_ms.AsString(),
    271                               "ms",
    272                               false);
    273   }
    274 
    275  private:
    276   DISALLOW_COPY_AND_ASSIGN(BweFeedbackTest);
    277 };
    278 
    279 TEST_F(BweFeedbackTest, Choke1000kbps500kbps1000kbps) {
    280   AdaptiveVideoSender sender(0, this, 30, 300, 0, 0);
    281   ChokeFilter filter(this);
    282   RateCounterFilter counter(this, "receiver_input");
    283   const int kHighCapacityKbps = 1000;
    284   const int kLowCapacityKbps = 500;
    285   filter.SetCapacity(kHighCapacityKbps);
    286   filter.SetMaxDelay(500);
    287   RunFor(60 * 1000);
    288   filter.SetCapacity(kLowCapacityKbps);
    289   RunFor(60 * 1000);
    290   filter.SetCapacity(kHighCapacityKbps);
    291   RunFor(60 * 1000);
    292   PrintResults((2 * kHighCapacityKbps + kLowCapacityKbps) / 3.0,
    293                counter.GetBitrateStats(), filter.GetDelayStats());
    294 }
    295 
    296 TEST_F(BweFeedbackTest, Choke200kbps30kbps200kbps) {
    297   AdaptiveVideoSender sender(0, this, 30, 300, 0, 0);
    298   ChokeFilter filter(this);
    299   RateCounterFilter counter(this, "receiver_input");
    300   const int kHighCapacityKbps = 200;
    301   const int kLowCapacityKbps = 30;
    302   filter.SetCapacity(kHighCapacityKbps);
    303   filter.SetMaxDelay(500);
    304   RunFor(60 * 1000);
    305   filter.SetCapacity(kLowCapacityKbps);
    306   RunFor(60 * 1000);
    307   filter.SetCapacity(kHighCapacityKbps);
    308   RunFor(60 * 1000);
    309 
    310   PrintResults((2 * kHighCapacityKbps + kLowCapacityKbps) / 3.0,
    311                counter.GetBitrateStats(), filter.GetDelayStats());
    312 }
    313 
    314 TEST_F(BweFeedbackTest, Verizon4gDownlinkTest) {
    315   AdaptiveVideoSender sender(0, this, 30, 300, 0, 0);
    316   RateCounterFilter counter1(this, "sender_output");
    317   TraceBasedDeliveryFilter filter(this, "link_capacity");
    318   RateCounterFilter counter2(this, "receiver_input");
    319   ASSERT_TRUE(filter.Init(test::ResourcePath("verizon4g-downlink", "rx")));
    320   RunFor(22 * 60 * 1000);
    321   PrintResults(filter.GetBitrateStats().GetMean(), counter2.GetBitrateStats(),
    322                filter.GetDelayStats());
    323 }
    324 
    325 // webrtc:3277
    326 TEST_F(BweFeedbackTest, DISABLED_GoogleWifiTrace3Mbps) {
    327   AdaptiveVideoSender sender(0, this, 30, 300, 0, 0);
    328   RateCounterFilter counter1(this, "sender_output");
    329   TraceBasedDeliveryFilter filter(this, "link_capacity");
    330   filter.SetMaxDelay(500);
    331   RateCounterFilter counter2(this, "receiver_input");
    332   ASSERT_TRUE(filter.Init(test::ResourcePath("google-wifi-3mbps", "rx")));
    333   RunFor(300 * 1000);
    334   PrintResults(filter.GetBitrateStats().GetMean(), counter2.GetBitrateStats(),
    335                filter.GetDelayStats());
    336 }
    337 }  // namespace bwe
    338 }  // namespace testing
    339 }  // namespace webrtc
    340