232 lines
6.9 KiB
C++
232 lines
6.9 KiB
C++
/*
|
|
* 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_
|