1 /* 2 * Copyright (c) 2014 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 #ifndef CALL_RAMPUP_TESTS_H_ 12 #define CALL_RAMPUP_TESTS_H_ 13 14 #include <map> 15 #include <memory> 16 #include <string> 17 #include <utility> 18 #include <vector> 19 20 #include "absl/strings/string_view.h" 21 #include "api/rtc_event_log/rtc_event_log.h" 22 #include "api/task_queue/task_queue_base.h" 23 #include "api/test/metrics/metric.h" 24 #include "api/test/simulated_network.h" 25 #include "call/call.h" 26 #include "call/simulated_network.h" 27 #include "rtc_base/event.h" 28 #include "rtc_base/task_utils/repeating_task.h" 29 #include "test/call_test.h" 30 31 namespace webrtc { 32 33 static const int kTransmissionTimeOffsetExtensionId = 6; 34 static const int kAbsSendTimeExtensionId = 7; 35 static const int kTransportSequenceNumberExtensionId = 8; 36 static const unsigned int kSingleStreamTargetBps = 1000000; 37 38 class Clock; 39 40 class RampUpTester : public test::EndToEndTest { 41 public: 42 RampUpTester(size_t num_video_streams, 43 size_t num_audio_streams, 44 size_t num_flexfec_streams, 45 unsigned int start_bitrate_bps, 46 int64_t min_run_time_ms, 47 absl::string_view extension_type, 48 bool rtx, 49 bool red, 50 bool report_perf_stats, 51 TaskQueueBase* task_queue); 52 ~RampUpTester() override; 53 54 size_t GetNumVideoStreams() const override; 55 size_t GetNumAudioStreams() const override; 56 size_t GetNumFlexfecStreams() const override; 57 58 void PerformTest() override; 59 60 protected: 61 virtual void PollStats(); 62 63 void AccumulateStats(const VideoSendStream::StreamStats& stream, 64 size_t* total_packets_sent, 65 size_t* total_sent, 66 size_t* padding_sent, 67 size_t* media_sent) const; 68 69 void ReportResult(absl::string_view measurement, 70 size_t value, 71 test::Unit unit, 72 test::ImprovementDirection improvement_direction) const; 73 void TriggerTestDone(); 74 75 Clock* const clock_; 76 BuiltInNetworkBehaviorConfig forward_transport_config_; 77 const size_t num_video_streams_; 78 const size_t num_audio_streams_; 79 const size_t num_flexfec_streams_; 80 const bool rtx_; 81 const bool red_; 82 const bool report_perf_stats_; 83 Call* sender_call_; 84 VideoSendStream* send_stream_; 85 test::PacketTransport* send_transport_; 86 SimulatedNetwork* send_simulated_network_; 87 88 private: 89 typedef std::map<uint32_t, uint32_t> SsrcMap; 90 class VideoStreamFactory; 91 92 void ModifySenderBitrateConfig(BitrateConstraints* bitrate_config) override; 93 void OnVideoStreamsCreated(VideoSendStream* send_stream, 94 const std::vector<VideoReceiveStreamInterface*>& 95 receive_streams) override; 96 std::unique_ptr<test::PacketTransport> CreateSendTransport( 97 TaskQueueBase* task_queue, 98 Call* sender_call) override; 99 void ModifyVideoConfigs( 100 VideoSendStream::Config* send_config, 101 std::vector<VideoReceiveStreamInterface::Config>* receive_configs, 102 VideoEncoderConfig* encoder_config) override; 103 void ModifyAudioConfigs(AudioSendStream::Config* send_config, 104 std::vector<AudioReceiveStreamInterface::Config>* 105 receive_configs) override; 106 void ModifyFlexfecConfigs( 107 std::vector<FlexfecReceiveStream::Config>* receive_configs) override; 108 void OnCallsCreated(Call* sender_call, Call* receiver_call) override; 109 110 const int start_bitrate_bps_; 111 const int64_t min_run_time_ms_; 112 int expected_bitrate_bps_; 113 int64_t test_start_ms_; 114 int64_t ramp_up_finished_ms_; 115 116 const std::string extension_type_; 117 std::vector<uint32_t> video_ssrcs_; 118 std::vector<uint32_t> video_rtx_ssrcs_; 119 std::vector<uint32_t> audio_ssrcs_; 120 121 protected: 122 TaskQueueBase* const task_queue_; 123 RepeatingTaskHandle pending_task_; 124 }; 125 126 class RampUpDownUpTester : public RampUpTester { 127 public: 128 RampUpDownUpTester(size_t num_video_streams, 129 size_t num_audio_streams, 130 size_t num_flexfec_streams, 131 unsigned int start_bitrate_bps, 132 absl::string_view extension_type, 133 bool rtx, 134 bool red, 135 const std::vector<int>& loss_rates, 136 bool report_perf_stats, 137 TaskQueueBase* task_queue); 138 ~RampUpDownUpTester() override; 139 140 protected: 141 void PollStats() override; 142 143 private: 144 enum TestStates { 145 kFirstRampup = 0, 146 kLowRate, 147 kSecondRampup, 148 kTestEnd, 149 kTransitionToNextState, 150 }; 151 152 void ModifyReceiverBitrateConfig(BitrateConstraints* bitrate_config) override; 153 154 std::string GetModifierString() const; 155 int GetExpectedHighBitrate() const; 156 int GetHighLinkCapacity() const; 157 size_t GetFecBytes() const; 158 bool ExpectingFec() const; 159 void EvolveTestState(int bitrate_bps, bool suspended); 160 161 const std::vector<int> link_rates_; 162 TestStates test_state_; 163 TestStates next_state_; 164 int64_t state_start_ms_; 165 int64_t interval_start_ms_; 166 int sent_bytes_; 167 std::vector<int> loss_rates_; 168 }; 169 170 } // namespace webrtc 171 #endif // CALL_RAMPUP_TESTS_H_ 172