xref: /aosp_15_r20/external/webrtc/call/rampup_tests.h (revision d9f758449e529ab9291ac668be2861e7a55c2422)
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