123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231 |
- /*
- * Copyright 2018 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 TEST_SCENARIO_SCENARIO_CONFIG_H_
- #define TEST_SCENARIO_SCENARIO_CONFIG_H_
- #include <stddef.h>
- #include <string>
- #include "absl/types/optional.h"
- #include "api/fec_controller.h"
- #include "api/rtp_parameters.h"
- #include "api/test/frame_generator_interface.h"
- #include "api/transport/network_control.h"
- #include "api/units/data_rate.h"
- #include "api/units/data_size.h"
- #include "api/units/time_delta.h"
- #include "api/video/video_codec_type.h"
- #include "test/scenario/performance_stats.h"
- namespace webrtc {
- namespace test {
- struct PacketOverhead {
- static constexpr size_t kSrtp = 10;
- static constexpr size_t kStun = 4;
- // TURN messages can be sent either with or without an establieshed channel.
- // In the latter case, a TURN Send/Data Indication is sent which has
- // significantly more overhead.
- static constexpr size_t kTurnChannelMessage = 4;
- static constexpr size_t kTurnIndicationMessage = 36;
- static constexpr size_t kDefault = kSrtp;
- };
- struct TransportControllerConfig {
- struct Rates {
- Rates();
- Rates(const Rates&);
- ~Rates();
- DataRate min_rate = DataRate::KilobitsPerSec(30);
- DataRate max_rate = DataRate::KilobitsPerSec(3000);
- DataRate start_rate = DataRate::KilobitsPerSec(300);
- } rates;
- NetworkControllerFactoryInterface* cc_factory = nullptr;
- TimeDelta state_log_interval = TimeDelta::Millis(100);
- };
- struct CallClientConfig {
- TransportControllerConfig transport;
- const WebRtcKeyValueConfig* field_trials = nullptr;
- };
- struct PacketStreamConfig {
- PacketStreamConfig();
- PacketStreamConfig(const PacketStreamConfig&);
- ~PacketStreamConfig();
- int frame_rate = 30;
- DataRate max_data_rate = DataRate::Infinity();
- DataSize max_packet_size = DataSize::Bytes(1400);
- DataSize min_frame_size = DataSize::Bytes(100);
- double keyframe_multiplier = 1;
- DataSize packet_overhead = DataSize::Bytes(PacketOverhead::kDefault);
- };
- struct VideoStreamConfig {
- bool autostart = true;
- struct Source {
- enum Capture {
- kGenerator,
- kVideoFile,
- kGenerateSlides,
- kImageSlides,
- // Support for explicit frame triggers should be added here if needed.
- } capture = Capture::kGenerator;
- struct Slides {
- TimeDelta change_interval = TimeDelta::Seconds(10);
- struct Generator {
- int width = 1600;
- int height = 1200;
- } generator;
- struct Images {
- struct Crop {
- TimeDelta scroll_duration = TimeDelta::Seconds(0);
- absl::optional<int> width;
- absl::optional<int> height;
- } crop;
- int width = 1850;
- int height = 1110;
- std::vector<std::string> paths = {
- "web_screenshot_1850_1110",
- "presentation_1850_1110",
- "photo_1850_1110",
- "difficult_photo_1850_1110",
- };
- } images;
- } slides;
- struct Generator {
- using PixelFormat = FrameGeneratorInterface::OutputType;
- PixelFormat pixel_format = PixelFormat::kI420;
- int width = 320;
- int height = 180;
- } generator;
- struct VideoFile {
- std::string name;
- // Must be set to width and height of the source video file.
- int width = 0;
- int height = 0;
- } video_file;
- int framerate = 30;
- } source;
- struct Encoder {
- Encoder();
- Encoder(const Encoder&);
- ~Encoder();
- enum class ContentType {
- kVideo,
- kScreen,
- } content_type = ContentType::kVideo;
- enum Implementation { kFake, kSoftware, kHardware } implementation = kFake;
- struct Fake {
- DataRate max_rate = DataRate::Infinity();
- } fake;
- using Codec = VideoCodecType;
- Codec codec = Codec::kVideoCodecGeneric;
- absl::optional<DataRate> max_data_rate;
- absl::optional<int> max_framerate;
- // Counted in frame count.
- absl::optional<int> key_frame_interval = 3000;
- bool frame_dropping = true;
- struct SingleLayer {
- bool denoising = true;
- bool automatic_scaling = true;
- } single;
- struct Layers {
- int temporal = 1;
- int spatial = 1;
- enum class Prediction {
- kTemporalOnly,
- kSpatialOnKey,
- kFull,
- } prediction = Prediction::kFull;
- } layers;
- DegradationPreference degradation_preference =
- DegradationPreference::MAINTAIN_FRAMERATE;
- } encoder;
- struct Stream {
- Stream();
- Stream(const Stream&);
- ~Stream();
- bool abs_send_time = false;
- bool packet_feedback = true;
- bool use_rtx = true;
- DataRate pad_to_rate = DataRate::Zero();
- TimeDelta nack_history_time = TimeDelta::Millis(1000);
- bool use_flexfec = false;
- bool use_ulpfec = false;
- FecControllerFactoryInterface* fec_controller_factory = nullptr;
- } stream;
- struct Rendering {
- enum Type { kFake } type = kFake;
- std::string sync_group;
- } render;
- struct Hooks {
- std::vector<std::function<void(const VideoFramePair&)>> frame_pair_handlers;
- } hooks;
- };
- struct AudioStreamConfig {
- AudioStreamConfig();
- AudioStreamConfig(const AudioStreamConfig&);
- ~AudioStreamConfig();
- bool autostart = true;
- struct Source {
- int channels = 1;
- } source;
- bool network_adaptation = false;
- struct NetworkAdaptation {
- struct FrameLength {
- double min_packet_loss_for_decrease = 0;
- double max_packet_loss_for_increase = 1;
- DataRate min_rate_for_20_ms = DataRate::Zero();
- DataRate max_rate_for_60_ms = DataRate::Infinity();
- DataRate min_rate_for_60_ms = DataRate::Zero();
- DataRate max_rate_for_120_ms = DataRate::Infinity();
- } frame;
- std::string binary_proto;
- } adapt;
- struct Encoder {
- Encoder();
- Encoder(const Encoder&);
- ~Encoder();
- bool allocate_bitrate = false;
- bool enable_dtx = false;
- absl::optional<DataRate> fixed_rate;
- absl::optional<DataRate> min_rate;
- absl::optional<DataRate> max_rate;
- TimeDelta initial_frame_length = TimeDelta::Millis(20);
- } encoder;
- struct Stream {
- Stream();
- Stream(const Stream&);
- ~Stream();
- bool abs_send_time = false;
- bool in_bandwidth_estimation = false;
- } stream;
- struct Rendering {
- std::string sync_group;
- } render;
- };
- // TODO(srte): Merge this with BuiltInNetworkBehaviorConfig.
- struct NetworkSimulationConfig {
- DataRate bandwidth = DataRate::Infinity();
- TimeDelta delay = TimeDelta::Zero();
- TimeDelta delay_std_dev = TimeDelta::Zero();
- double loss_rate = 0;
- bool codel_active_queue_management = false;
- absl::optional<int> packet_queue_length_limit;
- DataSize packet_overhead = DataSize::Zero();
- };
- } // namespace test
- } // namespace webrtc
- #endif // TEST_SCENARIO_SCENARIO_CONFIG_H_
|