blob: b47a220cc75e4d600eb6653956c24a7b99474f49 [file] [log] [blame]
/*
* 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 <optional>
#include <string>
#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 "api/video_codecs/scalability_mode.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;
// Allows the pacer to send out multiple packets in a burst.
// The number of bites that can be sent in one burst is pacer_burst_interval *
// current bwe. 40ms is the default Chrome setting.
TimeDelta pacer_burst_interval = TimeDelta::Millis(40);
};
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);
std::optional<int> width;
std::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;
std::optional<DataRate> max_data_rate;
std::optional<DataRate> min_data_rate;
std::optional<int> max_framerate;
// Counted in frame count.
std::optional<int> key_frame_interval = 3000;
bool frame_dropping = true;
struct SingleLayer {
bool denoising = true;
bool automatic_scaling = true;
} single;
std::vector<webrtc::ScalabilityMode> simulcast_streams = {
webrtc::ScalabilityMode::kL1T1};
DegradationPreference degradation_preference =
DegradationPreference::MAINTAIN_FRAMERATE;
bool suspend_below_min_bitrate = false;
} 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;
DataRate fixed_rate = DataRate::KilobitsPerSec(32);
// Overrides fixed rate.
std::optional<DataRate> min_rate;
std::optional<DataRate> max_rate;
TimeDelta initial_frame_length = TimeDelta::Millis(20);
} encoder;
struct Stream {
Stream();
Stream(const Stream&);
~Stream();
bool abs_send_time = true;
bool in_bandwidth_estimation = true;
} 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;
std::optional<int> packet_queue_length_limit;
DataSize packet_overhead = DataSize::Zero();
};
} // namespace test
} // namespace webrtc
#endif // TEST_SCENARIO_SCENARIO_CONFIG_H_