1*d9f75844SAndroid Build Coastguard Worker /* 2*d9f75844SAndroid Build Coastguard Worker * Copyright 2018 The WebRTC project authors. All Rights Reserved. 3*d9f75844SAndroid Build Coastguard Worker * 4*d9f75844SAndroid Build Coastguard Worker * Use of this source code is governed by a BSD-style license 5*d9f75844SAndroid Build Coastguard Worker * that can be found in the LICENSE file in the root of the source 6*d9f75844SAndroid Build Coastguard Worker * tree. An additional intellectual property rights grant can be found 7*d9f75844SAndroid Build Coastguard Worker * in the file PATENTS. All contributing project authors may 8*d9f75844SAndroid Build Coastguard Worker * be found in the AUTHORS file in the root of the source tree. 9*d9f75844SAndroid Build Coastguard Worker */ 10*d9f75844SAndroid Build Coastguard Worker #ifndef TEST_SCENARIO_SCENARIO_CONFIG_H_ 11*d9f75844SAndroid Build Coastguard Worker #define TEST_SCENARIO_SCENARIO_CONFIG_H_ 12*d9f75844SAndroid Build Coastguard Worker 13*d9f75844SAndroid Build Coastguard Worker #include <stddef.h> 14*d9f75844SAndroid Build Coastguard Worker 15*d9f75844SAndroid Build Coastguard Worker #include <string> 16*d9f75844SAndroid Build Coastguard Worker 17*d9f75844SAndroid Build Coastguard Worker #include "absl/types/optional.h" 18*d9f75844SAndroid Build Coastguard Worker #include "api/fec_controller.h" 19*d9f75844SAndroid Build Coastguard Worker #include "api/rtp_parameters.h" 20*d9f75844SAndroid Build Coastguard Worker #include "api/test/frame_generator_interface.h" 21*d9f75844SAndroid Build Coastguard Worker #include "api/transport/network_control.h" 22*d9f75844SAndroid Build Coastguard Worker #include "api/units/data_rate.h" 23*d9f75844SAndroid Build Coastguard Worker #include "api/units/data_size.h" 24*d9f75844SAndroid Build Coastguard Worker #include "api/units/time_delta.h" 25*d9f75844SAndroid Build Coastguard Worker #include "api/video/video_codec_type.h" 26*d9f75844SAndroid Build Coastguard Worker #include "api/video_codecs/scalability_mode.h" 27*d9f75844SAndroid Build Coastguard Worker #include "test/scenario/performance_stats.h" 28*d9f75844SAndroid Build Coastguard Worker 29*d9f75844SAndroid Build Coastguard Worker namespace webrtc { 30*d9f75844SAndroid Build Coastguard Worker namespace test { 31*d9f75844SAndroid Build Coastguard Worker struct PacketOverhead { 32*d9f75844SAndroid Build Coastguard Worker static constexpr size_t kSrtp = 10; 33*d9f75844SAndroid Build Coastguard Worker static constexpr size_t kStun = 4; 34*d9f75844SAndroid Build Coastguard Worker // TURN messages can be sent either with or without an establieshed channel. 35*d9f75844SAndroid Build Coastguard Worker // In the latter case, a TURN Send/Data Indication is sent which has 36*d9f75844SAndroid Build Coastguard Worker // significantly more overhead. 37*d9f75844SAndroid Build Coastguard Worker static constexpr size_t kTurnChannelMessage = 4; 38*d9f75844SAndroid Build Coastguard Worker static constexpr size_t kTurnIndicationMessage = 36; 39*d9f75844SAndroid Build Coastguard Worker static constexpr size_t kDefault = kSrtp; 40*d9f75844SAndroid Build Coastguard Worker }; 41*d9f75844SAndroid Build Coastguard Worker struct TransportControllerConfig { 42*d9f75844SAndroid Build Coastguard Worker struct Rates { 43*d9f75844SAndroid Build Coastguard Worker Rates(); 44*d9f75844SAndroid Build Coastguard Worker Rates(const Rates&); 45*d9f75844SAndroid Build Coastguard Worker ~Rates(); 46*d9f75844SAndroid Build Coastguard Worker DataRate min_rate = DataRate::KilobitsPerSec(30); 47*d9f75844SAndroid Build Coastguard Worker DataRate max_rate = DataRate::KilobitsPerSec(3000); 48*d9f75844SAndroid Build Coastguard Worker DataRate start_rate = DataRate::KilobitsPerSec(300); 49*d9f75844SAndroid Build Coastguard Worker } rates; 50*d9f75844SAndroid Build Coastguard Worker NetworkControllerFactoryInterface* cc_factory = nullptr; 51*d9f75844SAndroid Build Coastguard Worker TimeDelta state_log_interval = TimeDelta::Millis(100); 52*d9f75844SAndroid Build Coastguard Worker }; 53*d9f75844SAndroid Build Coastguard Worker 54*d9f75844SAndroid Build Coastguard Worker struct CallClientConfig { 55*d9f75844SAndroid Build Coastguard Worker TransportControllerConfig transport; 56*d9f75844SAndroid Build Coastguard Worker const FieldTrialsView* field_trials = nullptr; 57*d9f75844SAndroid Build Coastguard Worker }; 58*d9f75844SAndroid Build Coastguard Worker 59*d9f75844SAndroid Build Coastguard Worker struct PacketStreamConfig { 60*d9f75844SAndroid Build Coastguard Worker PacketStreamConfig(); 61*d9f75844SAndroid Build Coastguard Worker PacketStreamConfig(const PacketStreamConfig&); 62*d9f75844SAndroid Build Coastguard Worker ~PacketStreamConfig(); 63*d9f75844SAndroid Build Coastguard Worker int frame_rate = 30; 64*d9f75844SAndroid Build Coastguard Worker DataRate max_data_rate = DataRate::Infinity(); 65*d9f75844SAndroid Build Coastguard Worker DataSize max_packet_size = DataSize::Bytes(1400); 66*d9f75844SAndroid Build Coastguard Worker DataSize min_frame_size = DataSize::Bytes(100); 67*d9f75844SAndroid Build Coastguard Worker double keyframe_multiplier = 1; 68*d9f75844SAndroid Build Coastguard Worker DataSize packet_overhead = DataSize::Bytes(PacketOverhead::kDefault); 69*d9f75844SAndroid Build Coastguard Worker }; 70*d9f75844SAndroid Build Coastguard Worker 71*d9f75844SAndroid Build Coastguard Worker struct VideoStreamConfig { 72*d9f75844SAndroid Build Coastguard Worker bool autostart = true; 73*d9f75844SAndroid Build Coastguard Worker struct Source { 74*d9f75844SAndroid Build Coastguard Worker enum Capture { 75*d9f75844SAndroid Build Coastguard Worker kGenerator, 76*d9f75844SAndroid Build Coastguard Worker kVideoFile, 77*d9f75844SAndroid Build Coastguard Worker kGenerateSlides, 78*d9f75844SAndroid Build Coastguard Worker kImageSlides, 79*d9f75844SAndroid Build Coastguard Worker // Support for explicit frame triggers should be added here if needed. 80*d9f75844SAndroid Build Coastguard Worker } capture = Capture::kGenerator; 81*d9f75844SAndroid Build Coastguard Worker struct Slides { 82*d9f75844SAndroid Build Coastguard Worker TimeDelta change_interval = TimeDelta::Seconds(10); 83*d9f75844SAndroid Build Coastguard Worker struct Generator { 84*d9f75844SAndroid Build Coastguard Worker int width = 1600; 85*d9f75844SAndroid Build Coastguard Worker int height = 1200; 86*d9f75844SAndroid Build Coastguard Worker } generator; 87*d9f75844SAndroid Build Coastguard Worker struct Images { 88*d9f75844SAndroid Build Coastguard Worker struct Crop { 89*d9f75844SAndroid Build Coastguard Worker TimeDelta scroll_duration = TimeDelta::Seconds(0); 90*d9f75844SAndroid Build Coastguard Worker absl::optional<int> width; 91*d9f75844SAndroid Build Coastguard Worker absl::optional<int> height; 92*d9f75844SAndroid Build Coastguard Worker } crop; 93*d9f75844SAndroid Build Coastguard Worker int width = 1850; 94*d9f75844SAndroid Build Coastguard Worker int height = 1110; 95*d9f75844SAndroid Build Coastguard Worker std::vector<std::string> paths = { 96*d9f75844SAndroid Build Coastguard Worker "web_screenshot_1850_1110", 97*d9f75844SAndroid Build Coastguard Worker "presentation_1850_1110", 98*d9f75844SAndroid Build Coastguard Worker "photo_1850_1110", 99*d9f75844SAndroid Build Coastguard Worker "difficult_photo_1850_1110", 100*d9f75844SAndroid Build Coastguard Worker }; 101*d9f75844SAndroid Build Coastguard Worker } images; 102*d9f75844SAndroid Build Coastguard Worker } slides; 103*d9f75844SAndroid Build Coastguard Worker struct Generator { 104*d9f75844SAndroid Build Coastguard Worker using PixelFormat = FrameGeneratorInterface::OutputType; 105*d9f75844SAndroid Build Coastguard Worker PixelFormat pixel_format = PixelFormat::kI420; 106*d9f75844SAndroid Build Coastguard Worker int width = 320; 107*d9f75844SAndroid Build Coastguard Worker int height = 180; 108*d9f75844SAndroid Build Coastguard Worker } generator; 109*d9f75844SAndroid Build Coastguard Worker struct VideoFile { 110*d9f75844SAndroid Build Coastguard Worker std::string name; 111*d9f75844SAndroid Build Coastguard Worker // Must be set to width and height of the source video file. 112*d9f75844SAndroid Build Coastguard Worker int width = 0; 113*d9f75844SAndroid Build Coastguard Worker int height = 0; 114*d9f75844SAndroid Build Coastguard Worker } video_file; 115*d9f75844SAndroid Build Coastguard Worker int framerate = 30; 116*d9f75844SAndroid Build Coastguard Worker } source; 117*d9f75844SAndroid Build Coastguard Worker struct Encoder { 118*d9f75844SAndroid Build Coastguard Worker Encoder(); 119*d9f75844SAndroid Build Coastguard Worker Encoder(const Encoder&); 120*d9f75844SAndroid Build Coastguard Worker ~Encoder(); 121*d9f75844SAndroid Build Coastguard Worker enum class ContentType { 122*d9f75844SAndroid Build Coastguard Worker kVideo, 123*d9f75844SAndroid Build Coastguard Worker kScreen, 124*d9f75844SAndroid Build Coastguard Worker } content_type = ContentType::kVideo; 125*d9f75844SAndroid Build Coastguard Worker enum Implementation { kFake, kSoftware, kHardware } implementation = kFake; 126*d9f75844SAndroid Build Coastguard Worker struct Fake { 127*d9f75844SAndroid Build Coastguard Worker DataRate max_rate = DataRate::Infinity(); 128*d9f75844SAndroid Build Coastguard Worker } fake; 129*d9f75844SAndroid Build Coastguard Worker 130*d9f75844SAndroid Build Coastguard Worker using Codec = VideoCodecType; 131*d9f75844SAndroid Build Coastguard Worker Codec codec = Codec::kVideoCodecGeneric; 132*d9f75844SAndroid Build Coastguard Worker absl::optional<DataRate> max_data_rate; 133*d9f75844SAndroid Build Coastguard Worker absl::optional<DataRate> min_data_rate; 134*d9f75844SAndroid Build Coastguard Worker absl::optional<int> max_framerate; 135*d9f75844SAndroid Build Coastguard Worker // Counted in frame count. 136*d9f75844SAndroid Build Coastguard Worker absl::optional<int> key_frame_interval = 3000; 137*d9f75844SAndroid Build Coastguard Worker bool frame_dropping = true; 138*d9f75844SAndroid Build Coastguard Worker struct SingleLayer { 139*d9f75844SAndroid Build Coastguard Worker bool denoising = true; 140*d9f75844SAndroid Build Coastguard Worker bool automatic_scaling = true; 141*d9f75844SAndroid Build Coastguard Worker } single; 142*d9f75844SAndroid Build Coastguard Worker std::vector<webrtc::ScalabilityMode> simulcast_streams = { 143*d9f75844SAndroid Build Coastguard Worker webrtc::ScalabilityMode::kL1T1}; 144*d9f75844SAndroid Build Coastguard Worker 145*d9f75844SAndroid Build Coastguard Worker DegradationPreference degradation_preference = 146*d9f75844SAndroid Build Coastguard Worker DegradationPreference::MAINTAIN_FRAMERATE; 147*d9f75844SAndroid Build Coastguard Worker bool suspend_below_min_bitrate = false; 148*d9f75844SAndroid Build Coastguard Worker } encoder; 149*d9f75844SAndroid Build Coastguard Worker struct Stream { 150*d9f75844SAndroid Build Coastguard Worker Stream(); 151*d9f75844SAndroid Build Coastguard Worker Stream(const Stream&); 152*d9f75844SAndroid Build Coastguard Worker ~Stream(); 153*d9f75844SAndroid Build Coastguard Worker bool abs_send_time = false; 154*d9f75844SAndroid Build Coastguard Worker bool packet_feedback = true; 155*d9f75844SAndroid Build Coastguard Worker bool use_rtx = true; 156*d9f75844SAndroid Build Coastguard Worker DataRate pad_to_rate = DataRate::Zero(); 157*d9f75844SAndroid Build Coastguard Worker TimeDelta nack_history_time = TimeDelta::Millis(1000); 158*d9f75844SAndroid Build Coastguard Worker bool use_flexfec = false; 159*d9f75844SAndroid Build Coastguard Worker bool use_ulpfec = false; 160*d9f75844SAndroid Build Coastguard Worker FecControllerFactoryInterface* fec_controller_factory = nullptr; 161*d9f75844SAndroid Build Coastguard Worker } stream; 162*d9f75844SAndroid Build Coastguard Worker struct Rendering { 163*d9f75844SAndroid Build Coastguard Worker enum Type { kFake } type = kFake; 164*d9f75844SAndroid Build Coastguard Worker std::string sync_group; 165*d9f75844SAndroid Build Coastguard Worker } render; 166*d9f75844SAndroid Build Coastguard Worker struct Hooks { 167*d9f75844SAndroid Build Coastguard Worker std::vector<std::function<void(const VideoFramePair&)>> frame_pair_handlers; 168*d9f75844SAndroid Build Coastguard Worker } hooks; 169*d9f75844SAndroid Build Coastguard Worker }; 170*d9f75844SAndroid Build Coastguard Worker 171*d9f75844SAndroid Build Coastguard Worker struct AudioStreamConfig { 172*d9f75844SAndroid Build Coastguard Worker AudioStreamConfig(); 173*d9f75844SAndroid Build Coastguard Worker AudioStreamConfig(const AudioStreamConfig&); 174*d9f75844SAndroid Build Coastguard Worker ~AudioStreamConfig(); 175*d9f75844SAndroid Build Coastguard Worker bool autostart = true; 176*d9f75844SAndroid Build Coastguard Worker struct Source { 177*d9f75844SAndroid Build Coastguard Worker int channels = 1; 178*d9f75844SAndroid Build Coastguard Worker } source; 179*d9f75844SAndroid Build Coastguard Worker bool network_adaptation = false; 180*d9f75844SAndroid Build Coastguard Worker struct NetworkAdaptation { 181*d9f75844SAndroid Build Coastguard Worker struct FrameLength { 182*d9f75844SAndroid Build Coastguard Worker double min_packet_loss_for_decrease = 0; 183*d9f75844SAndroid Build Coastguard Worker double max_packet_loss_for_increase = 1; 184*d9f75844SAndroid Build Coastguard Worker DataRate min_rate_for_20_ms = DataRate::Zero(); 185*d9f75844SAndroid Build Coastguard Worker DataRate max_rate_for_60_ms = DataRate::Infinity(); 186*d9f75844SAndroid Build Coastguard Worker DataRate min_rate_for_60_ms = DataRate::Zero(); 187*d9f75844SAndroid Build Coastguard Worker DataRate max_rate_for_120_ms = DataRate::Infinity(); 188*d9f75844SAndroid Build Coastguard Worker } frame; 189*d9f75844SAndroid Build Coastguard Worker std::string binary_proto; 190*d9f75844SAndroid Build Coastguard Worker } adapt; 191*d9f75844SAndroid Build Coastguard Worker struct Encoder { 192*d9f75844SAndroid Build Coastguard Worker Encoder(); 193*d9f75844SAndroid Build Coastguard Worker Encoder(const Encoder&); 194*d9f75844SAndroid Build Coastguard Worker ~Encoder(); 195*d9f75844SAndroid Build Coastguard Worker bool allocate_bitrate = false; 196*d9f75844SAndroid Build Coastguard Worker bool enable_dtx = false; 197*d9f75844SAndroid Build Coastguard Worker absl::optional<DataRate> fixed_rate; 198*d9f75844SAndroid Build Coastguard Worker absl::optional<DataRate> min_rate; 199*d9f75844SAndroid Build Coastguard Worker absl::optional<DataRate> max_rate; 200*d9f75844SAndroid Build Coastguard Worker TimeDelta initial_frame_length = TimeDelta::Millis(20); 201*d9f75844SAndroid Build Coastguard Worker } encoder; 202*d9f75844SAndroid Build Coastguard Worker struct Stream { 203*d9f75844SAndroid Build Coastguard Worker Stream(); 204*d9f75844SAndroid Build Coastguard Worker Stream(const Stream&); 205*d9f75844SAndroid Build Coastguard Worker ~Stream(); 206*d9f75844SAndroid Build Coastguard Worker bool abs_send_time = false; 207*d9f75844SAndroid Build Coastguard Worker bool in_bandwidth_estimation = false; 208*d9f75844SAndroid Build Coastguard Worker } stream; 209*d9f75844SAndroid Build Coastguard Worker struct Rendering { 210*d9f75844SAndroid Build Coastguard Worker std::string sync_group; 211*d9f75844SAndroid Build Coastguard Worker } render; 212*d9f75844SAndroid Build Coastguard Worker }; 213*d9f75844SAndroid Build Coastguard Worker 214*d9f75844SAndroid Build Coastguard Worker // TODO(srte): Merge this with BuiltInNetworkBehaviorConfig. 215*d9f75844SAndroid Build Coastguard Worker struct NetworkSimulationConfig { 216*d9f75844SAndroid Build Coastguard Worker DataRate bandwidth = DataRate::Infinity(); 217*d9f75844SAndroid Build Coastguard Worker TimeDelta delay = TimeDelta::Zero(); 218*d9f75844SAndroid Build Coastguard Worker TimeDelta delay_std_dev = TimeDelta::Zero(); 219*d9f75844SAndroid Build Coastguard Worker double loss_rate = 0; 220*d9f75844SAndroid Build Coastguard Worker absl::optional<int> packet_queue_length_limit; 221*d9f75844SAndroid Build Coastguard Worker DataSize packet_overhead = DataSize::Zero(); 222*d9f75844SAndroid Build Coastguard Worker }; 223*d9f75844SAndroid Build Coastguard Worker } // namespace test 224*d9f75844SAndroid Build Coastguard Worker } // namespace webrtc 225*d9f75844SAndroid Build Coastguard Worker 226*d9f75844SAndroid Build Coastguard Worker #endif // TEST_SCENARIO_SCENARIO_CONFIG_H_ 227