/*
* 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 <functional>
#include <optional>
#include <string>
#include <vector>
#include "api/fec_controller.h"
#include "api/field_trials.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/create_test_field_trials.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;
FieldTrials field_trials = CreateTestFieldTrials();
// 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_
Messung V0.5 in Prozent C=97 H=96 G=96
¤ Dauer der Verarbeitung: 0.13 Sekunden
(vorverarbeitet am 2026-08-26)
¤
*© Formatika GbR, Deutschland