blob: af475ae4eb24c60038f398ca6d2469c36b9b1f83 [file] [log] [blame]
Ilya Nikolaevskiy255d1cd2017-12-21 17:02:591/*
2 * Copyright (c) 2015 The WebRTC project authors. All Rights Reserved.
3 *
4 * Use of this source code is governed by a BSD-style license
5 * that can be found in the LICENSE file in the root of the source
6 * tree. An additional intellectual property rights grant can be found
7 * in the file PATENTS. All contributing project authors may
8 * be found in the AUTHORS file in the root of the source tree.
9 */
10
11#include <stdio.h>
Jonas Olsson5b2eda42019-06-11 12:29:4012
Yves Gerey3e707812018-11-28 15:47:4913#include <memory>
14#include <string>
15#include <vector>
Ilya Nikolaevskiy255d1cd2017-12-21 17:02:5916
Mirko Bonadei2ab97f62019-07-18 11:44:1217#include "absl/flags/flag.h"
18#include "absl/flags/parse.h"
Yves Gerey3e707812018-11-28 15:47:4919#include "absl/types/optional.h"
Yves Gerey3e707812018-11-28 15:47:4920#include "api/test/simulated_network.h"
21#include "api/test/video_quality_test_fixture.h"
Mirko Bonadei738bfa72019-09-17 12:47:3822#include "api/transport/bitrate_settings.h"
Yves Gerey3e707812018-11-28 15:47:4923#include "api/video_codecs/video_codec.h"
24#include "rtc_base/checks.h"
Mirko Bonadei45a4c412018-07-31 13:07:2825#include "rtc_base/logging.h"
Steve Anton10542f22019-01-11 17:11:0026#include "rtc_base/string_encode.h"
Mirko Bonadei17f48782018-09-28 06:51:1027#include "system_wrappers/include/field_trial.h"
Ilya Nikolaevskiy255d1cd2017-12-21 17:02:5928#include "test/field_trial.h"
29#include "test/gtest.h"
30#include "test/run_test.h"
31#include "video/video_quality_test.h"
32
Mirko Bonadei2ab97f62019-07-18 11:44:1233// Flags for video.
34ABSL_FLAG(int, vwidth, 640, "Video width.");
35
36ABSL_FLAG(int, vheight, 480, "Video height.");
37
38ABSL_FLAG(int, vfps, 30, "Video frames per second.");
39
40ABSL_FLAG(int,
41 capture_device_index,
42 0,
43 "Capture device to select for video stream");
44
45ABSL_FLAG(int, vtarget_bitrate, 400, "Video stream target bitrate in kbps.");
46
47ABSL_FLAG(int, vmin_bitrate, 100, "Video stream min bitrate in kbps.");
48
49ABSL_FLAG(int, vmax_bitrate, 2000, "Video stream max bitrate in kbps.");
50
51ABSL_FLAG(bool,
52 suspend_below_min_bitrate,
53 false,
54 "Suspends video below the configured min bitrate.");
55
56ABSL_FLAG(int,
57 vnum_temporal_layers,
58 1,
59 "Number of temporal layers for video. Set to 1-4 to override.");
60
61ABSL_FLAG(int, vnum_streams, 0, "Number of video streams to show or analyze.");
62
63ABSL_FLAG(int,
64 vnum_spatial_layers,
65 1,
66 "Number of video spatial layers to use.");
67
68ABSL_FLAG(int,
69 vinter_layer_pred,
70 2,
71 "Video inter-layer prediction mode. "
72 "0 - enabled, 1 - disabled, 2 - enabled only for key pictures.");
73
74ABSL_FLAG(std::string,
75 vstream0,
76 "",
77 "Comma separated values describing VideoStream for video stream #0.");
78
79ABSL_FLAG(std::string,
80 vstream1,
81 "",
82 "Comma separated values describing VideoStream for video stream #1.");
83
84ABSL_FLAG(std::string,
85 vsl0,
86 "",
87 "Comma separated values describing SpatialLayer for video layer #0.");
88
89ABSL_FLAG(std::string,
90 vsl1,
91 "",
92 "Comma separated values describing SpatialLayer for video layer #1.");
93
94ABSL_FLAG(int,
95 vselected_tl,
96 -1,
97 "Temporal layer to show or analyze for screenshare. -1 to disable "
98 "filtering.");
99
100ABSL_FLAG(int,
101 vselected_stream,
102 0,
103 "ID of the stream to show or analyze for screenshare."
104 "Set to the number of streams to show them all.");
105
106ABSL_FLAG(int,
107 vselected_sl,
108 -1,
109 "Spatial layer to show or analyze for screenshare. -1 to disable "
110 "filtering.");
111
112// Flags for screenshare.
113ABSL_FLAG(int,
114 min_transmit_bitrate,
115 400,
116 "Min transmit bitrate incl. padding for screenshare.");
117
118ABSL_FLAG(int, swidth, 1850, "Screenshare width (crops source).");
119
120ABSL_FLAG(int, sheight, 1110, "Screenshare height (crops source).");
121
122ABSL_FLAG(int, sfps, 5, "Frames per second for screenshare.");
123
124ABSL_FLAG(int,
125 starget_bitrate,
126 100,
127 "Screenshare stream target bitrate in kbps.");
128
129ABSL_FLAG(int, smin_bitrate, 100, "Screenshare stream min bitrate in kbps.");
130
131ABSL_FLAG(int, smax_bitrate, 2000, "Screenshare stream max bitrate in kbps.");
132
133ABSL_FLAG(int,
134 snum_temporal_layers,
135 2,
136 "Number of temporal layers to use in screenshare.");
137
138ABSL_FLAG(int,
139 snum_streams,
140 0,
141 "Number of screenshare streams to show or analyze.");
142
143ABSL_FLAG(int,
144 snum_spatial_layers,
145 1,
146 "Number of screenshare spatial layers to use.");
147
148ABSL_FLAG(int,
149 sinter_layer_pred,
150 0,
151 "Screenshare inter-layer prediction mode. "
152 "0 - enabled, 1 - disabled, 2 - enabled only for key pictures.");
153
154ABSL_FLAG(
155 std::string,
156 sstream0,
157 "",
158 "Comma separated values describing VideoStream for screenshare stream #0.");
159
160ABSL_FLAG(
161 std::string,
162 sstream1,
163 "",
164 "Comma separated values describing VideoStream for screenshare stream #1.");
165
166ABSL_FLAG(
167 std::string,
168 ssl0,
169 "",
170 "Comma separated values describing SpatialLayer for screenshare layer #0.");
171
172ABSL_FLAG(
173 std::string,
174 ssl1,
175 "",
176 "Comma separated values describing SpatialLayer for screenshare layer #1.");
177
178ABSL_FLAG(int,
179 sselected_tl,
180 -1,
181 "Temporal layer to show or analyze for screenshare. -1 to disable "
182 "filtering.");
183
184ABSL_FLAG(int,
185 sselected_stream,
186 0,
187 "ID of the stream to show or analyze for screenshare."
188 "Set to the number of streams to show them all.");
189
190ABSL_FLAG(int,
191 sselected_sl,
192 -1,
193 "Spatial layer to show or analyze for screenshare. -1 to disable "
194 "filtering.");
195
196ABSL_FLAG(bool,
197 generate_slides,
198 false,
199 "Whether to use randomly generated slides or read them from files.");
200
201ABSL_FLAG(int,
202 slide_change_interval,
203 10,
204 "Interval (in seconds) between simulated slide changes.");
205
206ABSL_FLAG(
207 int,
208 scroll_duration,
209 0,
210 "Duration (in seconds) during which a slide will be scrolled into place.");
211
212ABSL_FLAG(std::string,
213 slides,
214 "",
215 "Comma-separated list of *.yuv files to display as slides.");
216
217// Flags common with screenshare and video loopback, with equal default values.
218ABSL_FLAG(int, start_bitrate, 600, "Call start bitrate in kbps.");
219
220ABSL_FLAG(std::string, codec, "VP8", "Video codec to use.");
221
222ABSL_FLAG(bool,
223 analyze_video,
224 false,
225 "Analyze video stream (if --duration is present)");
226
227ABSL_FLAG(bool,
228 analyze_screenshare,
229 false,
230 "Analyze screenshare stream (if --duration is present)");
231
232ABSL_FLAG(
233 int,
234 duration,
235 0,
236 "Duration of the test in seconds. If 0, rendered will be shown instead.");
237
238ABSL_FLAG(std::string, output_filename, "", "Target graph data filename.");
239
240ABSL_FLAG(std::string,
241 graph_title,
242 "",
243 "If empty, title will be generated automatically.");
244
245ABSL_FLAG(int, loss_percent, 0, "Percentage of packets randomly lost.");
246
247ABSL_FLAG(int,
248 avg_burst_loss_length,
249 -1,
250 "Average burst length of lost packets.");
251
252ABSL_FLAG(int,
253 link_capacity,
254 0,
255 "Capacity (kbps) of the fake link. 0 means infinite.");
256
257ABSL_FLAG(int, queue_size, 0, "Size of the bottleneck link queue in packets.");
258
259ABSL_FLAG(int,
260 avg_propagation_delay_ms,
261 0,
262 "Average link propagation delay in ms.");
263
264ABSL_FLAG(std::string,
265 rtc_event_log_name,
266 "",
267 "Filename for rtc event log. Two files "
268 "with \"_send\" and \"_recv\" suffixes will be created. "
269 "Works only when --duration is set.");
270
271ABSL_FLAG(std::string,
272 rtp_dump_name,
273 "",
274 "Filename for dumped received RTP stream.");
275
276ABSL_FLAG(int,
277 std_propagation_delay_ms,
278 0,
279 "Link propagation delay standard deviation in ms.");
280
281ABSL_FLAG(std::string,
282 encoded_frame_path,
283 "",
284 "The base path for encoded frame logs. Created files will have "
285 "the form <encoded_frame_path>.<n>.(recv|send.<m>).ivf");
286
287ABSL_FLAG(bool, logs, false, "print logs to stderr");
288
289ABSL_FLAG(bool, send_side_bwe, true, "Use send-side bandwidth estimation");
290
291ABSL_FLAG(bool, generic_descriptor, false, "Use the generic frame descriptor.");
292
293ABSL_FLAG(bool, allow_reordering, false, "Allow packet reordering to occur");
294
295ABSL_FLAG(bool, use_ulpfec, false, "Use RED+ULPFEC forward error correction.");
296
297ABSL_FLAG(bool, use_flexfec, false, "Use FlexFEC forward error correction.");
298
299ABSL_FLAG(bool, audio, false, "Add audio stream");
300
301ABSL_FLAG(bool,
302 audio_video_sync,
303 false,
304 "Sync audio and video stream (no effect if"
305 " audio is false)");
306
307ABSL_FLAG(bool,
308 audio_dtx,
309 false,
310 "Enable audio DTX (no effect if audio is false)");
311
312ABSL_FLAG(bool, video, true, "Add video stream");
313
314ABSL_FLAG(
315 std::string,
316 force_fieldtrials,
317 "",
318 "Field trials control experimental feature code which can be forced. "
319 "E.g. running with --force_fieldtrials=WebRTC-FooFeature/Enable/"
320 " will assign the group Enable to field trial WebRTC-FooFeature. Multiple "
321 "trials are separated by \"/\"");
322
323// Video-specific flags.
324ABSL_FLAG(std::string,
325 vclip,
326 "",
327 "Name of the clip to show. If empty, the camera is used. Use "
328 "\"Generator\" for chroma generator.");
329
Ilya Nikolaevskiy255d1cd2017-12-21 17:02:59330namespace webrtc {
Mirko Bonadei2ab97f62019-07-18 11:44:12331namespace {
Ilya Nikolaevskiy255d1cd2017-12-21 17:02:59332
Sergey Silkin57027362018-05-15 07:12:05333InterLayerPredMode IntToInterLayerPredMode(int inter_layer_pred) {
334 if (inter_layer_pred == 0) {
335 return InterLayerPredMode::kOn;
336 } else if (inter_layer_pred == 1) {
337 return InterLayerPredMode::kOff;
338 } else {
339 RTC_DCHECK_EQ(inter_layer_pred, 2);
340 return InterLayerPredMode::kOnKeyPic;
341 }
342}
343
Ilya Nikolaevskiy255d1cd2017-12-21 17:02:59344size_t VideoWidth() {
Mirko Bonadei2ab97f62019-07-18 11:44:12345 return static_cast<size_t>(absl::GetFlag(FLAGS_vwidth));
Ilya Nikolaevskiy255d1cd2017-12-21 17:02:59346}
347
Ilya Nikolaevskiy255d1cd2017-12-21 17:02:59348size_t VideoHeight() {
Mirko Bonadei2ab97f62019-07-18 11:44:12349 return static_cast<size_t>(absl::GetFlag(FLAGS_vheight));
Ilya Nikolaevskiy255d1cd2017-12-21 17:02:59350}
351
Ilya Nikolaevskiy255d1cd2017-12-21 17:02:59352int VideoFps() {
Mirko Bonadei2ab97f62019-07-18 11:44:12353 return absl::GetFlag(FLAGS_vfps);
Ilya Nikolaevskiy255d1cd2017-12-21 17:02:59354}
355
Ilya Nikolaevskiy255d1cd2017-12-21 17:02:59356size_t GetCaptureDevice() {
Mirko Bonadei2ab97f62019-07-18 11:44:12357 return static_cast<size_t>(absl::GetFlag(FLAGS_capture_device_index));
Ilya Nikolaevskiy255d1cd2017-12-21 17:02:59358}
359
Ilya Nikolaevskiy255d1cd2017-12-21 17:02:59360int VideoTargetBitrateKbps() {
Mirko Bonadei2ab97f62019-07-18 11:44:12361 return absl::GetFlag(FLAGS_vtarget_bitrate);
Ilya Nikolaevskiy255d1cd2017-12-21 17:02:59362}
363
Ilya Nikolaevskiy255d1cd2017-12-21 17:02:59364int VideoMinBitrateKbps() {
Mirko Bonadei2ab97f62019-07-18 11:44:12365 return absl::GetFlag(FLAGS_vmin_bitrate);
Ilya Nikolaevskiy255d1cd2017-12-21 17:02:59366}
367
Ilya Nikolaevskiy255d1cd2017-12-21 17:02:59368int VideoMaxBitrateKbps() {
Mirko Bonadei2ab97f62019-07-18 11:44:12369 return absl::GetFlag(FLAGS_vmax_bitrate);
Ilya Nikolaevskiy255d1cd2017-12-21 17:02:59370}
371
Ilya Nikolaevskiy255d1cd2017-12-21 17:02:59372int VideoNumTemporalLayers() {
Mirko Bonadei2ab97f62019-07-18 11:44:12373 return absl::GetFlag(FLAGS_vnum_temporal_layers);
Ilya Nikolaevskiy255d1cd2017-12-21 17:02:59374}
375
Ilya Nikolaevskiy255d1cd2017-12-21 17:02:59376int VideoNumStreams() {
Mirko Bonadei2ab97f62019-07-18 11:44:12377 return absl::GetFlag(FLAGS_vnum_streams);
Ilya Nikolaevskiy255d1cd2017-12-21 17:02:59378}
379
Ilya Nikolaevskiy255d1cd2017-12-21 17:02:59380int VideoNumSpatialLayers() {
Mirko Bonadei2ab97f62019-07-18 11:44:12381 return absl::GetFlag(FLAGS_vnum_spatial_layers);
Ilya Nikolaevskiy255d1cd2017-12-21 17:02:59382}
383
Sergey Silkin57027362018-05-15 07:12:05384InterLayerPredMode VideoInterLayerPred() {
Mirko Bonadei2ab97f62019-07-18 11:44:12385 return IntToInterLayerPredMode(absl::GetFlag(FLAGS_vinter_layer_pred));
Sergey Silkin57027362018-05-15 07:12:05386}
387
Ilya Nikolaevskiy255d1cd2017-12-21 17:02:59388std::string VideoStream0() {
Mirko Bonadei2ab97f62019-07-18 11:44:12389 return absl::GetFlag(FLAGS_vstream0);
Ilya Nikolaevskiy255d1cd2017-12-21 17:02:59390}
391
Ilya Nikolaevskiy255d1cd2017-12-21 17:02:59392std::string VideoStream1() {
Mirko Bonadei2ab97f62019-07-18 11:44:12393 return absl::GetFlag(FLAGS_vstream1);
Ilya Nikolaevskiy255d1cd2017-12-21 17:02:59394}
395
Ilya Nikolaevskiy255d1cd2017-12-21 17:02:59396std::string VideoSL0() {
Mirko Bonadei2ab97f62019-07-18 11:44:12397 return absl::GetFlag(FLAGS_vsl0);
Ilya Nikolaevskiy255d1cd2017-12-21 17:02:59398}
399
Ilya Nikolaevskiy255d1cd2017-12-21 17:02:59400std::string VideoSL1() {
Mirko Bonadei2ab97f62019-07-18 11:44:12401 return absl::GetFlag(FLAGS_vsl1);
Ilya Nikolaevskiy255d1cd2017-12-21 17:02:59402}
403
Ilya Nikolaevskiy255d1cd2017-12-21 17:02:59404int VideoSelectedTL() {
Mirko Bonadei2ab97f62019-07-18 11:44:12405 return absl::GetFlag(FLAGS_vselected_tl);
Ilya Nikolaevskiy255d1cd2017-12-21 17:02:59406}
407
Ilya Nikolaevskiy255d1cd2017-12-21 17:02:59408int VideoSelectedStream() {
Mirko Bonadei2ab97f62019-07-18 11:44:12409 return absl::GetFlag(FLAGS_vselected_stream);
Ilya Nikolaevskiy255d1cd2017-12-21 17:02:59410}
411
Ilya Nikolaevskiy255d1cd2017-12-21 17:02:59412int VideoSelectedSL() {
Mirko Bonadei2ab97f62019-07-18 11:44:12413 return absl::GetFlag(FLAGS_vselected_sl);
Ilya Nikolaevskiy255d1cd2017-12-21 17:02:59414}
415
Ilya Nikolaevskiy255d1cd2017-12-21 17:02:59416int ScreenshareMinTransmitBitrateKbps() {
Mirko Bonadei2ab97f62019-07-18 11:44:12417 return absl::GetFlag(FLAGS_min_transmit_bitrate);
Ilya Nikolaevskiy255d1cd2017-12-21 17:02:59418}
419
Ilya Nikolaevskiy255d1cd2017-12-21 17:02:59420size_t ScreenshareWidth() {
Mirko Bonadei2ab97f62019-07-18 11:44:12421 return static_cast<size_t>(absl::GetFlag(FLAGS_swidth));
Ilya Nikolaevskiy255d1cd2017-12-21 17:02:59422}
423
Ilya Nikolaevskiy255d1cd2017-12-21 17:02:59424size_t ScreenshareHeight() {
Mirko Bonadei2ab97f62019-07-18 11:44:12425 return static_cast<size_t>(absl::GetFlag(FLAGS_sheight));
Ilya Nikolaevskiy255d1cd2017-12-21 17:02:59426}
427
Ilya Nikolaevskiy255d1cd2017-12-21 17:02:59428int ScreenshareFps() {
Mirko Bonadei2ab97f62019-07-18 11:44:12429 return absl::GetFlag(FLAGS_sfps);
Ilya Nikolaevskiy255d1cd2017-12-21 17:02:59430}
431
Ilya Nikolaevskiy255d1cd2017-12-21 17:02:59432int ScreenshareTargetBitrateKbps() {
Mirko Bonadei2ab97f62019-07-18 11:44:12433 return absl::GetFlag(FLAGS_starget_bitrate);
Ilya Nikolaevskiy255d1cd2017-12-21 17:02:59434}
435
Ilya Nikolaevskiy255d1cd2017-12-21 17:02:59436int ScreenshareMinBitrateKbps() {
Mirko Bonadei2ab97f62019-07-18 11:44:12437 return absl::GetFlag(FLAGS_smin_bitrate);
Ilya Nikolaevskiy255d1cd2017-12-21 17:02:59438}
439
Ilya Nikolaevskiy255d1cd2017-12-21 17:02:59440int ScreenshareMaxBitrateKbps() {
Mirko Bonadei2ab97f62019-07-18 11:44:12441 return absl::GetFlag(FLAGS_smax_bitrate);
Ilya Nikolaevskiy255d1cd2017-12-21 17:02:59442}
443
Ilya Nikolaevskiy255d1cd2017-12-21 17:02:59444int ScreenshareNumTemporalLayers() {
Mirko Bonadei2ab97f62019-07-18 11:44:12445 return absl::GetFlag(FLAGS_snum_temporal_layers);
Ilya Nikolaevskiy255d1cd2017-12-21 17:02:59446}
447
Ilya Nikolaevskiy255d1cd2017-12-21 17:02:59448int ScreenshareNumStreams() {
Mirko Bonadei2ab97f62019-07-18 11:44:12449 return absl::GetFlag(FLAGS_snum_streams);
Ilya Nikolaevskiy255d1cd2017-12-21 17:02:59450}
451
Ilya Nikolaevskiy255d1cd2017-12-21 17:02:59452int ScreenshareNumSpatialLayers() {
Mirko Bonadei2ab97f62019-07-18 11:44:12453 return absl::GetFlag(FLAGS_snum_spatial_layers);
Ilya Nikolaevskiy255d1cd2017-12-21 17:02:59454}
455
Sergey Silkin57027362018-05-15 07:12:05456InterLayerPredMode ScreenshareInterLayerPred() {
Mirko Bonadei2ab97f62019-07-18 11:44:12457 return IntToInterLayerPredMode(absl::GetFlag(FLAGS_sinter_layer_pred));
Sergey Silkin57027362018-05-15 07:12:05458}
459
Ilya Nikolaevskiy255d1cd2017-12-21 17:02:59460std::string ScreenshareStream0() {
Mirko Bonadei2ab97f62019-07-18 11:44:12461 return absl::GetFlag(FLAGS_sstream0);
Ilya Nikolaevskiy255d1cd2017-12-21 17:02:59462}
463
Ilya Nikolaevskiy255d1cd2017-12-21 17:02:59464std::string ScreenshareStream1() {
Mirko Bonadei2ab97f62019-07-18 11:44:12465 return absl::GetFlag(FLAGS_sstream1);
Ilya Nikolaevskiy255d1cd2017-12-21 17:02:59466}
467
Ilya Nikolaevskiy255d1cd2017-12-21 17:02:59468std::string ScreenshareSL0() {
Mirko Bonadei2ab97f62019-07-18 11:44:12469 return absl::GetFlag(FLAGS_ssl0);
Ilya Nikolaevskiy255d1cd2017-12-21 17:02:59470}
471
Ilya Nikolaevskiy255d1cd2017-12-21 17:02:59472std::string ScreenshareSL1() {
Mirko Bonadei2ab97f62019-07-18 11:44:12473 return absl::GetFlag(FLAGS_ssl1);
Ilya Nikolaevskiy255d1cd2017-12-21 17:02:59474}
475
Ilya Nikolaevskiy255d1cd2017-12-21 17:02:59476int ScreenshareSelectedTL() {
Mirko Bonadei2ab97f62019-07-18 11:44:12477 return absl::GetFlag(FLAGS_sselected_tl);
Ilya Nikolaevskiy255d1cd2017-12-21 17:02:59478}
479
Ilya Nikolaevskiy255d1cd2017-12-21 17:02:59480int ScreenshareSelectedStream() {
Mirko Bonadei2ab97f62019-07-18 11:44:12481 return absl::GetFlag(FLAGS_sselected_stream);
Ilya Nikolaevskiy255d1cd2017-12-21 17:02:59482}
483
Ilya Nikolaevskiy255d1cd2017-12-21 17:02:59484int ScreenshareSelectedSL() {
Mirko Bonadei2ab97f62019-07-18 11:44:12485 return absl::GetFlag(FLAGS_sselected_sl);
Ilya Nikolaevskiy255d1cd2017-12-21 17:02:59486}
487
Ilya Nikolaevskiy255d1cd2017-12-21 17:02:59488bool GenerateSlides() {
Mirko Bonadei2ab97f62019-07-18 11:44:12489 return absl::GetFlag(FLAGS_generate_slides);
Ilya Nikolaevskiy255d1cd2017-12-21 17:02:59490}
491
Ilya Nikolaevskiy255d1cd2017-12-21 17:02:59492int SlideChangeInterval() {
Mirko Bonadei2ab97f62019-07-18 11:44:12493 return absl::GetFlag(FLAGS_slide_change_interval);
Ilya Nikolaevskiy255d1cd2017-12-21 17:02:59494}
495
Ilya Nikolaevskiy255d1cd2017-12-21 17:02:59496int ScrollDuration() {
Mirko Bonadei2ab97f62019-07-18 11:44:12497 return absl::GetFlag(FLAGS_scroll_duration);
Ilya Nikolaevskiy255d1cd2017-12-21 17:02:59498}
499
Ilya Nikolaevskiy255d1cd2017-12-21 17:02:59500std::vector<std::string> Slides() {
501 std::vector<std::string> slides;
Mirko Bonadei2ab97f62019-07-18 11:44:12502 std::string slides_list = absl::GetFlag(FLAGS_slides);
Ilya Nikolaevskiy255d1cd2017-12-21 17:02:59503 rtc::tokenize(slides_list, ',', &slides);
504 return slides;
505}
506
Ilya Nikolaevskiy255d1cd2017-12-21 17:02:59507int StartBitrateKbps() {
Mirko Bonadei2ab97f62019-07-18 11:44:12508 return absl::GetFlag(FLAGS_start_bitrate);
Ilya Nikolaevskiy255d1cd2017-12-21 17:02:59509}
510
Ilya Nikolaevskiy255d1cd2017-12-21 17:02:59511std::string Codec() {
Mirko Bonadei2ab97f62019-07-18 11:44:12512 return absl::GetFlag(FLAGS_codec);
Ilya Nikolaevskiy255d1cd2017-12-21 17:02:59513}
514
Ilya Nikolaevskiy255d1cd2017-12-21 17:02:59515bool AnalyzeVideo() {
Mirko Bonadei2ab97f62019-07-18 11:44:12516 return absl::GetFlag(FLAGS_analyze_video);
Ilya Nikolaevskiy255d1cd2017-12-21 17:02:59517}
518
Ilya Nikolaevskiy255d1cd2017-12-21 17:02:59519bool AnalyzeScreenshare() {
Mirko Bonadei2ab97f62019-07-18 11:44:12520 return absl::GetFlag(FLAGS_analyze_screenshare);
Ilya Nikolaevskiy255d1cd2017-12-21 17:02:59521}
522
Ilya Nikolaevskiy255d1cd2017-12-21 17:02:59523int DurationSecs() {
Mirko Bonadei2ab97f62019-07-18 11:44:12524 return absl::GetFlag(FLAGS_duration);
Ilya Nikolaevskiy255d1cd2017-12-21 17:02:59525}
526
Ilya Nikolaevskiy255d1cd2017-12-21 17:02:59527std::string OutputFilename() {
Mirko Bonadei2ab97f62019-07-18 11:44:12528 return absl::GetFlag(FLAGS_output_filename);
Ilya Nikolaevskiy255d1cd2017-12-21 17:02:59529}
530
Ilya Nikolaevskiy255d1cd2017-12-21 17:02:59531std::string GraphTitle() {
Mirko Bonadei2ab97f62019-07-18 11:44:12532 return absl::GetFlag(FLAGS_graph_title);
Ilya Nikolaevskiy255d1cd2017-12-21 17:02:59533}
534
Ilya Nikolaevskiy255d1cd2017-12-21 17:02:59535int LossPercent() {
Mirko Bonadei2ab97f62019-07-18 11:44:12536 return absl::GetFlag(FLAGS_loss_percent);
Ilya Nikolaevskiy255d1cd2017-12-21 17:02:59537}
538
Ilya Nikolaevskiy255d1cd2017-12-21 17:02:59539int AvgBurstLossLength() {
Mirko Bonadei2ab97f62019-07-18 11:44:12540 return absl::GetFlag(FLAGS_avg_burst_loss_length);
Ilya Nikolaevskiy255d1cd2017-12-21 17:02:59541}
542
Ilya Nikolaevskiy255d1cd2017-12-21 17:02:59543int LinkCapacityKbps() {
Mirko Bonadei2ab97f62019-07-18 11:44:12544 return absl::GetFlag(FLAGS_link_capacity);
Ilya Nikolaevskiy255d1cd2017-12-21 17:02:59545}
546
Ilya Nikolaevskiy255d1cd2017-12-21 17:02:59547int QueueSize() {
Mirko Bonadei2ab97f62019-07-18 11:44:12548 return absl::GetFlag(FLAGS_queue_size);
Ilya Nikolaevskiy255d1cd2017-12-21 17:02:59549}
550
Ilya Nikolaevskiy255d1cd2017-12-21 17:02:59551int AvgPropagationDelayMs() {
Mirko Bonadei2ab97f62019-07-18 11:44:12552 return absl::GetFlag(FLAGS_avg_propagation_delay_ms);
Ilya Nikolaevskiy255d1cd2017-12-21 17:02:59553}
554
Ilya Nikolaevskiy255d1cd2017-12-21 17:02:59555std::string RtcEventLogName() {
Mirko Bonadei2ab97f62019-07-18 11:44:12556 return absl::GetFlag(FLAGS_rtc_event_log_name);
Ilya Nikolaevskiy255d1cd2017-12-21 17:02:59557}
558
Ilya Nikolaevskiy255d1cd2017-12-21 17:02:59559std::string RtpDumpName() {
Mirko Bonadei2ab97f62019-07-18 11:44:12560 return absl::GetFlag(FLAGS_rtp_dump_name);
Ilya Nikolaevskiy255d1cd2017-12-21 17:02:59561}
562
Ilya Nikolaevskiy255d1cd2017-12-21 17:02:59563int StdPropagationDelayMs() {
Mirko Bonadei2ab97f62019-07-18 11:44:12564 return absl::GetFlag(FLAGS_std_propagation_delay_ms);
Ilya Nikolaevskiy255d1cd2017-12-21 17:02:59565}
566
Ilya Nikolaevskiy255d1cd2017-12-21 17:02:59567std::string EncodedFramePath() {
Mirko Bonadei2ab97f62019-07-18 11:44:12568 return absl::GetFlag(FLAGS_encoded_frame_path);
Ilya Nikolaevskiy255d1cd2017-12-21 17:02:59569}
570
Ilya Nikolaevskiy255d1cd2017-12-21 17:02:59571std::string VideoClip() {
Mirko Bonadei2ab97f62019-07-18 11:44:12572 return absl::GetFlag(FLAGS_vclip);
Ilya Nikolaevskiy255d1cd2017-12-21 17:02:59573}
574
Mirko Bonadei2ab97f62019-07-18 11:44:12575} // namespace
Ilya Nikolaevskiy255d1cd2017-12-21 17:02:59576
577void Loopback() {
578 int camera_idx, screenshare_idx;
Mirko Bonadei2ab97f62019-07-18 11:44:12579 RTC_CHECK(!(AnalyzeScreenshare() && AnalyzeVideo()))
Ilya Nikolaevskiy255d1cd2017-12-21 17:02:59580 << "Select only one of video or screenshare.";
Mirko Bonadei2ab97f62019-07-18 11:44:12581 RTC_CHECK(!DurationSecs() || AnalyzeScreenshare() || AnalyzeVideo())
Ilya Nikolaevskiy255d1cd2017-12-21 17:02:59582 << "If duration is set, exactly one of analyze_* flags should be set.";
583 // Default: camera feed first, if nothing selected.
Mirko Bonadei2ab97f62019-07-18 11:44:12584 if (AnalyzeVideo() || !AnalyzeScreenshare()) {
Ilya Nikolaevskiy255d1cd2017-12-21 17:02:59585 camera_idx = 0;
586 screenshare_idx = 1;
587 } else {
588 camera_idx = 1;
589 screenshare_idx = 0;
590 }
591
Artem Titov75e36472018-10-08 10:28:56592 BuiltInNetworkBehaviorConfig pipe_config;
Mirko Bonadei2ab97f62019-07-18 11:44:12593 pipe_config.loss_percent = LossPercent();
594 pipe_config.avg_burst_loss_length = AvgBurstLossLength();
595 pipe_config.link_capacity_kbps = LinkCapacityKbps();
596 pipe_config.queue_length_packets = QueueSize();
597 pipe_config.queue_delay_ms = AvgPropagationDelayMs();
598 pipe_config.delay_standard_deviation_ms = StdPropagationDelayMs();
599 pipe_config.allow_reordering = absl::GetFlag(FLAGS_allow_reordering);
Ilya Nikolaevskiy255d1cd2017-12-21 17:02:59600
Sebastian Janssonfc8d26b2018-02-21 08:52:06601 BitrateConstraints call_bitrate_config;
Ilya Nikolaevskiy255d1cd2017-12-21 17:02:59602 call_bitrate_config.min_bitrate_bps =
Mirko Bonadei2ab97f62019-07-18 11:44:12603 (ScreenshareMinBitrateKbps() + VideoMinBitrateKbps()) * 1000;
604 call_bitrate_config.start_bitrate_bps = StartBitrateKbps() * 1000;
Ilya Nikolaevskiy255d1cd2017-12-21 17:02:59605 call_bitrate_config.max_bitrate_bps =
Mirko Bonadei2ab97f62019-07-18 11:44:12606 (ScreenshareMaxBitrateKbps() + VideoMaxBitrateKbps()) * 1000;
Ilya Nikolaevskiy255d1cd2017-12-21 17:02:59607
Danil Chapovalov059f4f72020-07-07 12:16:47608 VideoQualityTest::Params params;
609 params.call.send_side_bwe = absl::GetFlag(FLAGS_send_side_bwe);
610 params.call.generic_descriptor = absl::GetFlag(FLAGS_generic_descriptor);
611 params.call.call_bitrate_config = call_bitrate_config;
Ilya Nikolaevskiy255d1cd2017-12-21 17:02:59612 params.call.dual_video = true;
Danil Chapovalov059f4f72020-07-07 12:16:47613 params.video[screenshare_idx].enabled = true;
614 params.video[screenshare_idx].width = ScreenshareWidth();
615 params.video[screenshare_idx].height = ScreenshareHeight();
616 params.video[screenshare_idx].fps = ScreenshareFps();
617 params.video[screenshare_idx].min_bitrate_bps =
618 ScreenshareMinBitrateKbps() * 1000;
619 params.video[screenshare_idx].target_bitrate_bps =
620 ScreenshareTargetBitrateKbps() * 1000;
621 params.video[screenshare_idx].max_bitrate_bps =
622 ScreenshareMaxBitrateKbps() * 1000;
623 params.video[screenshare_idx].codec = Codec();
624 params.video[screenshare_idx].num_temporal_layers =
625 ScreenshareNumTemporalLayers();
626 params.video[screenshare_idx].selected_tl = ScreenshareSelectedTL();
627 params.video[screenshare_idx].min_transmit_bps =
628 ScreenshareMinTransmitBitrateKbps() * 1000;
629 params.video[camera_idx].enabled = absl::GetFlag(FLAGS_video);
630 params.video[camera_idx].width = VideoWidth();
631 params.video[camera_idx].height = VideoHeight();
632 params.video[camera_idx].fps = VideoFps();
633 params.video[camera_idx].min_bitrate_bps = VideoMinBitrateKbps() * 1000;
634 params.video[camera_idx].target_bitrate_bps = VideoTargetBitrateKbps() * 1000;
635 params.video[camera_idx].max_bitrate_bps = VideoMaxBitrateKbps() * 1000;
636 params.video[camera_idx].suspend_below_min_bitrate =
637 absl::GetFlag(FLAGS_suspend_below_min_bitrate);
638 params.video[camera_idx].codec = Codec();
639 params.video[camera_idx].num_temporal_layers = VideoNumTemporalLayers();
640 params.video[camera_idx].selected_tl = VideoSelectedTL();
641 params.video[camera_idx].ulpfec = absl::GetFlag(FLAGS_use_ulpfec);
642 params.video[camera_idx].flexfec = absl::GetFlag(FLAGS_use_flexfec);
643 params.video[camera_idx].clip_path = VideoClip();
644 params.video[camera_idx].capture_device_index = GetCaptureDevice();
645 params.audio.enabled = absl::GetFlag(FLAGS_audio);
646 params.audio.sync_video = absl::GetFlag(FLAGS_audio_video_sync);
647 params.audio.dtx = absl::GetFlag(FLAGS_audio_dtx);
648 params.logging.rtc_event_log_name = RtcEventLogName();
649 params.logging.rtp_dump_name = RtpDumpName();
650 params.logging.encoded_frame_base_path = EncodedFramePath();
651 params.analyzer.test_label = "dual_streams";
652 params.analyzer.test_durations_secs = DurationSecs();
653 params.analyzer.graph_data_output_filename = OutputFilename();
654 params.analyzer.graph_title = GraphTitle();
Artem Titovf18b3522018-08-28 14:54:24655 params.config = pipe_config;
Ilya Nikolaevskiy255d1cd2017-12-21 17:02:59656
657 params.screenshare[camera_idx].enabled = false;
Danil Chapovalov059f4f72020-07-07 12:16:47658 params.screenshare[screenshare_idx].enabled = true;
659 params.screenshare[screenshare_idx].generate_slides = GenerateSlides();
660 params.screenshare[screenshare_idx].slide_change_interval =
661 SlideChangeInterval();
662 params.screenshare[screenshare_idx].scroll_duration = ScrollDuration();
663 params.screenshare[screenshare_idx].slides = Slides();
Ilya Nikolaevskiy255d1cd2017-12-21 17:02:59664
Mirko Bonadei2ab97f62019-07-18 11:44:12665 if (VideoNumStreams() > 1 && VideoStream0().empty() &&
666 VideoStream1().empty()) {
Ilya Nikolaevskiy255d1cd2017-12-21 17:02:59667 params.ss[camera_idx].infer_streams = true;
668 }
669
Mirko Bonadei2ab97f62019-07-18 11:44:12670 if (ScreenshareNumStreams() > 1 && ScreenshareStream0().empty() &&
671 ScreenshareStream1().empty()) {
Ilya Nikolaevskiy255d1cd2017-12-21 17:02:59672 params.ss[screenshare_idx].infer_streams = true;
673 }
674
675 std::vector<std::string> stream_descriptors;
Mirko Bonadei2ab97f62019-07-18 11:44:12676 stream_descriptors.push_back(ScreenshareStream0());
677 stream_descriptors.push_back(ScreenshareStream1());
Ilya Nikolaevskiy255d1cd2017-12-21 17:02:59678 std::vector<std::string> SL_descriptors;
Mirko Bonadei2ab97f62019-07-18 11:44:12679 SL_descriptors.push_back(ScreenshareSL0());
680 SL_descriptors.push_back(ScreenshareSL1());
Ilya Nikolaevskiy255d1cd2017-12-21 17:02:59681 VideoQualityTest::FillScalabilitySettings(
Mirko Bonadei2ab97f62019-07-18 11:44:12682 &params, screenshare_idx, stream_descriptors, ScreenshareNumStreams(),
683 ScreenshareSelectedStream(), ScreenshareNumSpatialLayers(),
684 ScreenshareSelectedSL(), ScreenshareInterLayerPred(), SL_descriptors);
Ilya Nikolaevskiy255d1cd2017-12-21 17:02:59685
686 stream_descriptors.clear();
Mirko Bonadei2ab97f62019-07-18 11:44:12687 stream_descriptors.push_back(VideoStream0());
688 stream_descriptors.push_back(VideoStream1());
Ilya Nikolaevskiy255d1cd2017-12-21 17:02:59689 SL_descriptors.clear();
Mirko Bonadei2ab97f62019-07-18 11:44:12690 SL_descriptors.push_back(VideoSL0());
691 SL_descriptors.push_back(VideoSL1());
Ilya Nikolaevskiy255d1cd2017-12-21 17:02:59692 VideoQualityTest::FillScalabilitySettings(
Mirko Bonadei2ab97f62019-07-18 11:44:12693 &params, camera_idx, stream_descriptors, VideoNumStreams(),
694 VideoSelectedStream(), VideoNumSpatialLayers(), VideoSelectedSL(),
695 VideoInterLayerPred(), SL_descriptors);
Ilya Nikolaevskiy255d1cd2017-12-21 17:02:59696
Mirko Bonadei317a1f02019-09-17 15:06:18697 auto fixture = std::make_unique<VideoQualityTest>(nullptr);
Mirko Bonadei2ab97f62019-07-18 11:44:12698 if (DurationSecs()) {
Patrik Höglundb6b29e02018-06-21 14:58:01699 fixture->RunWithAnalyzer(params);
Ilya Nikolaevskiy255d1cd2017-12-21 17:02:59700 } else {
Patrik Höglundb6b29e02018-06-21 14:58:01701 fixture->RunWithRenderers(params);
Ilya Nikolaevskiy255d1cd2017-12-21 17:02:59702 }
703}
704} // namespace webrtc
705
706int main(int argc, char* argv[]) {
707 ::testing::InitGoogleTest(&argc, argv);
Mirko Bonadei2ab97f62019-07-18 11:44:12708 absl::ParseCommandLine(argc, argv);
Ilya Nikolaevskiy255d1cd2017-12-21 17:02:59709
Mirko Bonadei2ab97f62019-07-18 11:44:12710 rtc::LogMessage::SetLogToStderr(absl::GetFlag(FLAGS_logs));
Mirko Bonadei45a4c412018-07-31 13:07:28711
Bjorn Tereliusedab3012018-01-31 16:23:40712 // InitFieldTrialsFromString stores the char*, so the char array must outlive
713 // the application.
Mirko Bonadei2ab97f62019-07-18 11:44:12714 const std::string field_trials = absl::GetFlag(FLAGS_force_fieldtrials);
715 webrtc::field_trial::InitFieldTrialsFromString(field_trials.c_str());
Ilya Nikolaevskiy255d1cd2017-12-21 17:02:59716
717 webrtc::test::RunTest(webrtc::Loopback);
718 return 0;
719}