1131bea89d6f3742e649be84c91f8fd6c43b62d28sprang@webrtc.org/*
2131bea89d6f3742e649be84c91f8fd6c43b62d28sprang@webrtc.org *  Copyright (c) 2015 The WebRTC project authors. All Rights Reserved.
3131bea89d6f3742e649be84c91f8fd6c43b62d28sprang@webrtc.org *
4131bea89d6f3742e649be84c91f8fd6c43b62d28sprang@webrtc.org *  Use of this source code is governed by a BSD-style license
5131bea89d6f3742e649be84c91f8fd6c43b62d28sprang@webrtc.org *  that can be found in the LICENSE file in the root of the source
6131bea89d6f3742e649be84c91f8fd6c43b62d28sprang@webrtc.org *  tree. An additional intellectual property rights grant can be found
7131bea89d6f3742e649be84c91f8fd6c43b62d28sprang@webrtc.org *  in the file PATENTS.  All contributing project authors may
8131bea89d6f3742e649be84c91f8fd6c43b62d28sprang@webrtc.org *  be found in the AUTHORS file in the root of the source tree.
9131bea89d6f3742e649be84c91f8fd6c43b62d28sprang@webrtc.org */
10131bea89d6f3742e649be84c91f8fd6c43b62d28sprang@webrtc.org
11131bea89d6f3742e649be84c91f8fd6c43b62d28sprang@webrtc.org#include <stdio.h>
12131bea89d6f3742e649be84c91f8fd6c43b62d28sprang@webrtc.org
13131bea89d6f3742e649be84c91f8fd6c43b62d28sprang@webrtc.org#include "gflags/gflags.h"
14131bea89d6f3742e649be84c91f8fd6c43b62d28sprang@webrtc.org#include "testing/gtest/include/gtest/gtest.h"
15131bea89d6f3742e649be84c91f8fd6c43b62d28sprang@webrtc.org
16131bea89d6f3742e649be84c91f8fd6c43b62d28sprang@webrtc.org#include "webrtc/test/field_trial.h"
17131bea89d6f3742e649be84c91f8fd6c43b62d28sprang@webrtc.org#include "webrtc/test/run_test.h"
185d6a06c1d29a2061bcf4b321ffceab477a404d51ivica#include "webrtc/video/video_quality_test.h"
19131bea89d6f3742e649be84c91f8fd6c43b62d28sprang@webrtc.org
20131bea89d6f3742e649be84c91f8fd6c43b62d28sprang@webrtc.orgnamespace webrtc {
21131bea89d6f3742e649be84c91f8fd6c43b62d28sprang@webrtc.orgnamespace flags {
22131bea89d6f3742e649be84c91f8fd6c43b62d28sprang@webrtc.org
23ce4aef16eec96862199e89b6d3ffe059558ac2c0sprang// Flags common with video loopback, with different default values.
24d63589579a66df028efe7ec63cf465082f3857fasprangDEFINE_int32(width, 1850, "Video width (crops source).");
25131bea89d6f3742e649be84c91f8fd6c43b62d28sprang@webrtc.orgsize_t Width() {
26d63589579a66df028efe7ec63cf465082f3857fasprang  return static_cast<size_t>(FLAGS_width);
27131bea89d6f3742e649be84c91f8fd6c43b62d28sprang@webrtc.org}
28d63589579a66df028efe7ec63cf465082f3857fasprang
29d63589579a66df028efe7ec63cf465082f3857fasprangDEFINE_int32(height, 1110, "Video height (crops source).");
30131bea89d6f3742e649be84c91f8fd6c43b62d28sprang@webrtc.orgsize_t Height() {
31d63589579a66df028efe7ec63cf465082f3857fasprang  return static_cast<size_t>(FLAGS_height);
32131bea89d6f3742e649be84c91f8fd6c43b62d28sprang@webrtc.org}
33131bea89d6f3742e649be84c91f8fd6c43b62d28sprang@webrtc.org
34131bea89d6f3742e649be84c91f8fd6c43b62d28sprang@webrtc.orgDEFINE_int32(fps, 5, "Frames per second.");
35131bea89d6f3742e649be84c91f8fd6c43b62d28sprang@webrtc.orgint Fps() {
36131bea89d6f3742e649be84c91f8fd6c43b62d28sprang@webrtc.org  return static_cast<int>(FLAGS_fps);
37131bea89d6f3742e649be84c91f8fd6c43b62d28sprang@webrtc.org}
38131bea89d6f3742e649be84c91f8fd6c43b62d28sprang@webrtc.org
395d6a06c1d29a2061bcf4b321ffceab477a404d51ivicaDEFINE_int32(min_bitrate, 50, "Call and stream min bitrate in kbps.");
405d6a06c1d29a2061bcf4b321ffceab477a404d51ivicaint MinBitrateKbps() {
415d6a06c1d29a2061bcf4b321ffceab477a404d51ivica  return static_cast<int>(FLAGS_min_bitrate);
42131bea89d6f3742e649be84c91f8fd6c43b62d28sprang@webrtc.org}
43131bea89d6f3742e649be84c91f8fd6c43b62d28sprang@webrtc.org
445d6a06c1d29a2061bcf4b321ffceab477a404d51ivicaDEFINE_int32(start_bitrate, 200, "Call start bitrate in kbps.");
455d6a06c1d29a2061bcf4b321ffceab477a404d51ivicaint StartBitrateKbps() {
465d6a06c1d29a2061bcf4b321ffceab477a404d51ivica  return static_cast<int>(FLAGS_start_bitrate);
47131bea89d6f3742e649be84c91f8fd6c43b62d28sprang@webrtc.org}
48131bea89d6f3742e649be84c91f8fd6c43b62d28sprang@webrtc.org
495d6a06c1d29a2061bcf4b321ffceab477a404d51ivicaDEFINE_int32(target_bitrate, 2000, "Stream target bitrate in kbps.");
505d6a06c1d29a2061bcf4b321ffceab477a404d51ivicaint TargetBitrateKbps() {
515d6a06c1d29a2061bcf4b321ffceab477a404d51ivica  return static_cast<int>(FLAGS_target_bitrate);
52131bea89d6f3742e649be84c91f8fd6c43b62d28sprang@webrtc.org}
53131bea89d6f3742e649be84c91f8fd6c43b62d28sprang@webrtc.org
545d6a06c1d29a2061bcf4b321ffceab477a404d51ivicaDEFINE_int32(max_bitrate, 2000, "Call and stream max bitrate in kbps.");
555d6a06c1d29a2061bcf4b321ffceab477a404d51ivicaint MaxBitrateKbps() {
565d6a06c1d29a2061bcf4b321ffceab477a404d51ivica  return static_cast<int>(FLAGS_max_bitrate);
57ef7228cfa00cd6eb72754e923b1ac7348c1dfb22sprang}
58ef7228cfa00cd6eb72754e923b1ac7348c1dfb22sprang
595d6a06c1d29a2061bcf4b321ffceab477a404d51ivicaDEFINE_int32(num_temporal_layers, 2, "Number of temporal layers to use.");
60ce4aef16eec96862199e89b6d3ffe059558ac2c0sprangint NumTemporalLayers() {
61ce4aef16eec96862199e89b6d3ffe059558ac2c0sprang  return static_cast<int>(FLAGS_num_temporal_layers);
62ce4aef16eec96862199e89b6d3ffe059558ac2c0sprang}
63ce4aef16eec96862199e89b6d3ffe059558ac2c0sprang
64ce4aef16eec96862199e89b6d3ffe059558ac2c0sprang// Flags common with video loopback, with equal default values.
65ce4aef16eec96862199e89b6d3ffe059558ac2c0sprangDEFINE_string(codec, "VP8", "Video codec to use.");
66ce4aef16eec96862199e89b6d3ffe059558ac2c0sprangstd::string Codec() {
67ce4aef16eec96862199e89b6d3ffe059558ac2c0sprang  return static_cast<std::string>(FLAGS_codec);
68ce4aef16eec96862199e89b6d3ffe059558ac2c0sprang}
69ce4aef16eec96862199e89b6d3ffe059558ac2c0sprang
70ce4aef16eec96862199e89b6d3ffe059558ac2c0sprangDEFINE_int32(selected_tl,
71ce4aef16eec96862199e89b6d3ffe059558ac2c0sprang             -1,
72ce4aef16eec96862199e89b6d3ffe059558ac2c0sprang             "Temporal layer to show or analyze. -1 to disable filtering.");
73ce4aef16eec96862199e89b6d3ffe059558ac2c0sprangint SelectedTL() {
74ce4aef16eec96862199e89b6d3ffe059558ac2c0sprang  return static_cast<int>(FLAGS_selected_tl);
757f6a6fc0b23795cd4f0aacbf707618c1f3d0a878ivica}
767f6a6fc0b23795cd4f0aacbf707618c1f3d0a878ivica
777f6a6fc0b23795cd4f0aacbf707618c1f3d0a878ivicaDEFINE_int32(
78ce4aef16eec96862199e89b6d3ffe059558ac2c0sprang    duration,
797f6a6fc0b23795cd4f0aacbf707618c1f3d0a878ivica    0,
80ce4aef16eec96862199e89b6d3ffe059558ac2c0sprang    "Duration of the test in seconds. If 0, rendered will be shown instead.");
81ce4aef16eec96862199e89b6d3ffe059558ac2c0sprangint DurationSecs() {
82ce4aef16eec96862199e89b6d3ffe059558ac2c0sprang  return static_cast<int>(FLAGS_duration);
837f6a6fc0b23795cd4f0aacbf707618c1f3d0a878ivica}
847f6a6fc0b23795cd4f0aacbf707618c1f3d0a878ivica
85ce4aef16eec96862199e89b6d3ffe059558ac2c0sprangDEFINE_string(output_filename, "", "Target graph data filename.");
86ce4aef16eec96862199e89b6d3ffe059558ac2c0sprangstd::string OutputFilename() {
87ce4aef16eec96862199e89b6d3ffe059558ac2c0sprang  return static_cast<std::string>(FLAGS_output_filename);
88131bea89d6f3742e649be84c91f8fd6c43b62d28sprang@webrtc.org}
89131bea89d6f3742e649be84c91f8fd6c43b62d28sprang@webrtc.org
90ce4aef16eec96862199e89b6d3ffe059558ac2c0sprangDEFINE_string(graph_title,
91ce4aef16eec96862199e89b6d3ffe059558ac2c0sprang              "",
92ce4aef16eec96862199e89b6d3ffe059558ac2c0sprang              "If empty, title will be generated automatically.");
93ce4aef16eec96862199e89b6d3ffe059558ac2c0sprangstd::string GraphTitle() {
94ce4aef16eec96862199e89b6d3ffe059558ac2c0sprang  return static_cast<std::string>(FLAGS_graph_title);
95131bea89d6f3742e649be84c91f8fd6c43b62d28sprang@webrtc.org}
96131bea89d6f3742e649be84c91f8fd6c43b62d28sprang@webrtc.org
97131bea89d6f3742e649be84c91f8fd6c43b62d28sprang@webrtc.orgDEFINE_int32(loss_percent, 0, "Percentage of packets randomly lost.");
98131bea89d6f3742e649be84c91f8fd6c43b62d28sprang@webrtc.orgint LossPercent() {
99131bea89d6f3742e649be84c91f8fd6c43b62d28sprang@webrtc.org  return static_cast<int>(FLAGS_loss_percent);
100131bea89d6f3742e649be84c91f8fd6c43b62d28sprang@webrtc.org}
101131bea89d6f3742e649be84c91f8fd6c43b62d28sprang@webrtc.org
102131bea89d6f3742e649be84c91f8fd6c43b62d28sprang@webrtc.orgDEFINE_int32(link_capacity,
103131bea89d6f3742e649be84c91f8fd6c43b62d28sprang@webrtc.org             0,
104131bea89d6f3742e649be84c91f8fd6c43b62d28sprang@webrtc.org             "Capacity (kbps) of the fake link. 0 means infinite.");
1055d6a06c1d29a2061bcf4b321ffceab477a404d51ivicaint LinkCapacityKbps() {
106131bea89d6f3742e649be84c91f8fd6c43b62d28sprang@webrtc.org  return static_cast<int>(FLAGS_link_capacity);
107131bea89d6f3742e649be84c91f8fd6c43b62d28sprang@webrtc.org}
108131bea89d6f3742e649be84c91f8fd6c43b62d28sprang@webrtc.org
109131bea89d6f3742e649be84c91f8fd6c43b62d28sprang@webrtc.orgDEFINE_int32(queue_size, 0, "Size of the bottleneck link queue in packets.");
110131bea89d6f3742e649be84c91f8fd6c43b62d28sprang@webrtc.orgint QueueSize() {
111131bea89d6f3742e649be84c91f8fd6c43b62d28sprang@webrtc.org  return static_cast<int>(FLAGS_queue_size);
112131bea89d6f3742e649be84c91f8fd6c43b62d28sprang@webrtc.org}
113131bea89d6f3742e649be84c91f8fd6c43b62d28sprang@webrtc.org
114131bea89d6f3742e649be84c91f8fd6c43b62d28sprang@webrtc.orgDEFINE_int32(avg_propagation_delay_ms,
115131bea89d6f3742e649be84c91f8fd6c43b62d28sprang@webrtc.org             0,
116131bea89d6f3742e649be84c91f8fd6c43b62d28sprang@webrtc.org             "Average link propagation delay in ms.");
117131bea89d6f3742e649be84c91f8fd6c43b62d28sprang@webrtc.orgint AvgPropagationDelayMs() {
118131bea89d6f3742e649be84c91f8fd6c43b62d28sprang@webrtc.org  return static_cast<int>(FLAGS_avg_propagation_delay_ms);
119131bea89d6f3742e649be84c91f8fd6c43b62d28sprang@webrtc.org}
120131bea89d6f3742e649be84c91f8fd6c43b62d28sprang@webrtc.org
121131bea89d6f3742e649be84c91f8fd6c43b62d28sprang@webrtc.orgDEFINE_int32(std_propagation_delay_ms,
122131bea89d6f3742e649be84c91f8fd6c43b62d28sprang@webrtc.org             0,
123131bea89d6f3742e649be84c91f8fd6c43b62d28sprang@webrtc.org             "Link propagation delay standard deviation in ms.");
124131bea89d6f3742e649be84c91f8fd6c43b62d28sprang@webrtc.orgint StdPropagationDelayMs() {
125131bea89d6f3742e649be84c91f8fd6c43b62d28sprang@webrtc.org  return static_cast<int>(FLAGS_std_propagation_delay_ms);
126131bea89d6f3742e649be84c91f8fd6c43b62d28sprang@webrtc.org}
127131bea89d6f3742e649be84c91f8fd6c43b62d28sprang@webrtc.org
128ce4aef16eec96862199e89b6d3ffe059558ac2c0sprangDEFINE_int32(selected_stream, 0, "ID of the stream to show or analyze.");
129ce4aef16eec96862199e89b6d3ffe059558ac2c0sprangint SelectedStream() {
130ce4aef16eec96862199e89b6d3ffe059558ac2c0sprang  return static_cast<int>(FLAGS_selected_stream);
131ce4aef16eec96862199e89b6d3ffe059558ac2c0sprang}
132131bea89d6f3742e649be84c91f8fd6c43b62d28sprang@webrtc.org
133ce4aef16eec96862199e89b6d3ffe059558ac2c0sprangDEFINE_int32(num_spatial_layers, 1, "Number of spatial layers to use.");
134ce4aef16eec96862199e89b6d3ffe059558ac2c0sprangint NumSpatialLayers() {
135ce4aef16eec96862199e89b6d3ffe059558ac2c0sprang  return static_cast<int>(FLAGS_num_spatial_layers);
1365d6a06c1d29a2061bcf4b321ffceab477a404d51ivica}
1375d6a06c1d29a2061bcf4b321ffceab477a404d51ivica
138ce4aef16eec96862199e89b6d3ffe059558ac2c0sprangDEFINE_int32(selected_sl,
139ce4aef16eec96862199e89b6d3ffe059558ac2c0sprang             -1,
140ce4aef16eec96862199e89b6d3ffe059558ac2c0sprang             "Spatial layer to show or analyze. -1 to disable filtering.");
141ce4aef16eec96862199e89b6d3ffe059558ac2c0sprangint SelectedSL() {
142ce4aef16eec96862199e89b6d3ffe059558ac2c0sprang  return static_cast<int>(FLAGS_selected_sl);
143ce4aef16eec96862199e89b6d3ffe059558ac2c0sprang}
144ce4aef16eec96862199e89b6d3ffe059558ac2c0sprang
145ce4aef16eec96862199e89b6d3ffe059558ac2c0sprangDEFINE_string(stream0,
146ce4aef16eec96862199e89b6d3ffe059558ac2c0sprang              "",
147ce4aef16eec96862199e89b6d3ffe059558ac2c0sprang              "Comma separated values describing VideoStream for stream #0.");
148ce4aef16eec96862199e89b6d3ffe059558ac2c0sprangstd::string Stream0() {
149ce4aef16eec96862199e89b6d3ffe059558ac2c0sprang  return static_cast<std::string>(FLAGS_stream0);
1505d6a06c1d29a2061bcf4b321ffceab477a404d51ivica}
1515d6a06c1d29a2061bcf4b321ffceab477a404d51ivica
152ce4aef16eec96862199e89b6d3ffe059558ac2c0sprangDEFINE_string(stream1,
153ce4aef16eec96862199e89b6d3ffe059558ac2c0sprang              "",
154ce4aef16eec96862199e89b6d3ffe059558ac2c0sprang              "Comma separated values describing VideoStream for stream #1.");
155ce4aef16eec96862199e89b6d3ffe059558ac2c0sprangstd::string Stream1() {
156ce4aef16eec96862199e89b6d3ffe059558ac2c0sprang  return static_cast<std::string>(FLAGS_stream1);
157ce4aef16eec96862199e89b6d3ffe059558ac2c0sprang}
158ce4aef16eec96862199e89b6d3ffe059558ac2c0sprang
159ce4aef16eec96862199e89b6d3ffe059558ac2c0sprangDEFINE_string(sl0,
160ce4aef16eec96862199e89b6d3ffe059558ac2c0sprang              "",
161ce4aef16eec96862199e89b6d3ffe059558ac2c0sprang              "Comma separated values describing SpatialLayer for layer #0.");
162ce4aef16eec96862199e89b6d3ffe059558ac2c0sprangstd::string SL0() {
163ce4aef16eec96862199e89b6d3ffe059558ac2c0sprang  return static_cast<std::string>(FLAGS_sl0);
164ce4aef16eec96862199e89b6d3ffe059558ac2c0sprang}
165ce4aef16eec96862199e89b6d3ffe059558ac2c0sprang
166ce4aef16eec96862199e89b6d3ffe059558ac2c0sprangDEFINE_string(sl1,
167ce4aef16eec96862199e89b6d3ffe059558ac2c0sprang              "",
168ce4aef16eec96862199e89b6d3ffe059558ac2c0sprang              "Comma separated values describing SpatialLayer for layer #1.");
169ce4aef16eec96862199e89b6d3ffe059558ac2c0sprangstd::string SL1() {
170ce4aef16eec96862199e89b6d3ffe059558ac2c0sprang  return static_cast<std::string>(FLAGS_sl1);
171ce4aef16eec96862199e89b6d3ffe059558ac2c0sprang}
172ce4aef16eec96862199e89b6d3ffe059558ac2c0sprang
173ce4aef16eec96862199e89b6d3ffe059558ac2c0sprangDEFINE_bool(logs, false, "print logs to stderr");
174ce4aef16eec96862199e89b6d3ffe059558ac2c0sprang
1756b8d3551681f40b880507cecc88f478a12383cc7Erik SprångDEFINE_bool(send_side_bwe, true, "Use send-side bandwidth estimation");
1766b8d3551681f40b880507cecc88f478a12383cc7Erik Språng
1775d6a06c1d29a2061bcf4b321ffceab477a404d51ivicaDEFINE_string(
178131bea89d6f3742e649be84c91f8fd6c43b62d28sprang@webrtc.org    force_fieldtrials,
179131bea89d6f3742e649be84c91f8fd6c43b62d28sprang@webrtc.org    "",
180131bea89d6f3742e649be84c91f8fd6c43b62d28sprang@webrtc.org    "Field trials control experimental feature code which can be forced. "
181131bea89d6f3742e649be84c91f8fd6c43b62d28sprang@webrtc.org    "E.g. running with --force_fieldtrials=WebRTC-FooFeature/Enable/"
182131bea89d6f3742e649be84c91f8fd6c43b62d28sprang@webrtc.org    " will assign the group Enable to field trial WebRTC-FooFeature. Multiple "
183131bea89d6f3742e649be84c91f8fd6c43b62d28sprang@webrtc.org    "trials are separated by \"/\"");
184ce4aef16eec96862199e89b6d3ffe059558ac2c0sprang
185ce4aef16eec96862199e89b6d3ffe059558ac2c0sprang// Screenshare-specific flags.
186ce4aef16eec96862199e89b6d3ffe059558ac2c0sprangDEFINE_int32(min_transmit_bitrate, 400, "Min transmit bitrate incl. padding.");
187ce4aef16eec96862199e89b6d3ffe059558ac2c0sprangint MinTransmitBitrateKbps() {
188ce4aef16eec96862199e89b6d3ffe059558ac2c0sprang  return FLAGS_min_transmit_bitrate;
189ce4aef16eec96862199e89b6d3ffe059558ac2c0sprang}
190ce4aef16eec96862199e89b6d3ffe059558ac2c0sprang
191ce4aef16eec96862199e89b6d3ffe059558ac2c0sprangDEFINE_int32(slide_change_interval,
192ce4aef16eec96862199e89b6d3ffe059558ac2c0sprang             10,
193ce4aef16eec96862199e89b6d3ffe059558ac2c0sprang             "Interval (in seconds) between simulated slide changes.");
194ce4aef16eec96862199e89b6d3ffe059558ac2c0sprangint SlideChangeInterval() {
195ce4aef16eec96862199e89b6d3ffe059558ac2c0sprang  return static_cast<int>(FLAGS_slide_change_interval);
196ce4aef16eec96862199e89b6d3ffe059558ac2c0sprang}
197ce4aef16eec96862199e89b6d3ffe059558ac2c0sprang
198ce4aef16eec96862199e89b6d3ffe059558ac2c0sprangDEFINE_int32(
199ce4aef16eec96862199e89b6d3ffe059558ac2c0sprang    scroll_duration,
200ce4aef16eec96862199e89b6d3ffe059558ac2c0sprang    0,
201ce4aef16eec96862199e89b6d3ffe059558ac2c0sprang    "Duration (in seconds) during which a slide will be scrolled into place.");
202ce4aef16eec96862199e89b6d3ffe059558ac2c0sprangint ScrollDuration() {
203ce4aef16eec96862199e89b6d3ffe059558ac2c0sprang  return static_cast<int>(FLAGS_scroll_duration);
204ce4aef16eec96862199e89b6d3ffe059558ac2c0sprang}
205ce4aef16eec96862199e89b6d3ffe059558ac2c0sprang
206131bea89d6f3742e649be84c91f8fd6c43b62d28sprang@webrtc.org}  // namespace flags
207131bea89d6f3742e649be84c91f8fd6c43b62d28sprang@webrtc.org
208131bea89d6f3742e649be84c91f8fd6c43b62d28sprang@webrtc.orgvoid Loopback() {
2095d6a06c1d29a2061bcf4b321ffceab477a404d51ivica  FakeNetworkPipe::Config pipe_config;
2105d6a06c1d29a2061bcf4b321ffceab477a404d51ivica  pipe_config.loss_percent = flags::LossPercent();
2115d6a06c1d29a2061bcf4b321ffceab477a404d51ivica  pipe_config.link_capacity_kbps = flags::LinkCapacityKbps();
2125d6a06c1d29a2061bcf4b321ffceab477a404d51ivica  pipe_config.queue_length_packets = flags::QueueSize();
2135d6a06c1d29a2061bcf4b321ffceab477a404d51ivica  pipe_config.queue_delay_ms = flags::AvgPropagationDelayMs();
2145d6a06c1d29a2061bcf4b321ffceab477a404d51ivica  pipe_config.delay_standard_deviation_ms = flags::StdPropagationDelayMs();
2155d6a06c1d29a2061bcf4b321ffceab477a404d51ivica
2165d6a06c1d29a2061bcf4b321ffceab477a404d51ivica  Call::Config::BitrateConfig call_bitrate_config;
2175d6a06c1d29a2061bcf4b321ffceab477a404d51ivica  call_bitrate_config.min_bitrate_bps = flags::MinBitrateKbps() * 1000;
2185d6a06c1d29a2061bcf4b321ffceab477a404d51ivica  call_bitrate_config.start_bitrate_bps = flags::StartBitrateKbps() * 1000;
2195d6a06c1d29a2061bcf4b321ffceab477a404d51ivica  call_bitrate_config.max_bitrate_bps = flags::MaxBitrateKbps() * 1000;
2205d6a06c1d29a2061bcf4b321ffceab477a404d51ivica
2215d6a06c1d29a2061bcf4b321ffceab477a404d51ivica  VideoQualityTest::Params params{
2226b8d3551681f40b880507cecc88f478a12383cc7Erik Språng      {flags::Width(), flags::Height(), flags::Fps(),
2236b8d3551681f40b880507cecc88f478a12383cc7Erik Språng       flags::MinBitrateKbps() * 1000, flags::TargetBitrateKbps() * 1000,
2246b8d3551681f40b880507cecc88f478a12383cc7Erik Språng       flags::MaxBitrateKbps() * 1000, flags::Codec(),
225ce4aef16eec96862199e89b6d3ffe059558ac2c0sprang       flags::NumTemporalLayers(), flags::SelectedTL(),
226ce4aef16eec96862199e89b6d3ffe059558ac2c0sprang       flags::MinTransmitBitrateKbps() * 1000, call_bitrate_config,
2276b8d3551681f40b880507cecc88f478a12383cc7Erik Språng       flags::FLAGS_send_side_bwe},
2285d6a06c1d29a2061bcf4b321ffceab477a404d51ivica      {},  // Video specific.
2295d6a06c1d29a2061bcf4b321ffceab477a404d51ivica      {true, flags::SlideChangeInterval(), flags::ScrollDuration()},
230ce4aef16eec96862199e89b6d3ffe059558ac2c0sprang      {"screenshare", 0.0, 0.0, flags::DurationSecs(), flags::OutputFilename(),
231ce4aef16eec96862199e89b6d3ffe059558ac2c0sprang       flags::GraphTitle()},
2325d6a06c1d29a2061bcf4b321ffceab477a404d51ivica      pipe_config,
2335d6a06c1d29a2061bcf4b321ffceab477a404d51ivica      flags::FLAGS_logs};
2345d6a06c1d29a2061bcf4b321ffceab477a404d51ivica
235ce4aef16eec96862199e89b6d3ffe059558ac2c0sprang  std::vector<std::string> stream_descriptors;
236ce4aef16eec96862199e89b6d3ffe059558ac2c0sprang  stream_descriptors.push_back(flags::Stream0());
237ce4aef16eec96862199e89b6d3ffe059558ac2c0sprang  stream_descriptors.push_back(flags::Stream1());
238ce4aef16eec96862199e89b6d3ffe059558ac2c0sprang  std::vector<std::string> SL_descriptors;
239ce4aef16eec96862199e89b6d3ffe059558ac2c0sprang  SL_descriptors.push_back(flags::SL0());
240ce4aef16eec96862199e89b6d3ffe059558ac2c0sprang  SL_descriptors.push_back(flags::SL1());
241ce4aef16eec96862199e89b6d3ffe059558ac2c0sprang  VideoQualityTest::FillScalabilitySettings(
242ce4aef16eec96862199e89b6d3ffe059558ac2c0sprang      &params, stream_descriptors, flags::SelectedStream(),
243ce4aef16eec96862199e89b6d3ffe059558ac2c0sprang      flags::NumSpatialLayers(), flags::SelectedSL(), SL_descriptors);
244ce4aef16eec96862199e89b6d3ffe059558ac2c0sprang
2455d6a06c1d29a2061bcf4b321ffceab477a404d51ivica  VideoQualityTest test;
246ce4aef16eec96862199e89b6d3ffe059558ac2c0sprang  if (flags::DurationSecs()) {
2477a975f75e7fa7a9335411ef22b6687f78f7b297fsprang    test.RunWithAnalyzer(params);
248ce4aef16eec96862199e89b6d3ffe059558ac2c0sprang  } else {
249ce4aef16eec96862199e89b6d3ffe059558ac2c0sprang    test.RunWithVideoRenderer(params);
250ce4aef16eec96862199e89b6d3ffe059558ac2c0sprang  }
251131bea89d6f3742e649be84c91f8fd6c43b62d28sprang@webrtc.org}
252131bea89d6f3742e649be84c91f8fd6c43b62d28sprang@webrtc.org}  // namespace webrtc
253131bea89d6f3742e649be84c91f8fd6c43b62d28sprang@webrtc.org
254131bea89d6f3742e649be84c91f8fd6c43b62d28sprang@webrtc.orgint main(int argc, char* argv[]) {
255131bea89d6f3742e649be84c91f8fd6c43b62d28sprang@webrtc.org  ::testing::InitGoogleTest(&argc, argv);
256131bea89d6f3742e649be84c91f8fd6c43b62d28sprang@webrtc.org  google::ParseCommandLineFlags(&argc, &argv, true);
257131bea89d6f3742e649be84c91f8fd6c43b62d28sprang@webrtc.org  webrtc::test::InitFieldTrialsFromString(
258131bea89d6f3742e649be84c91f8fd6c43b62d28sprang@webrtc.org      webrtc::flags::FLAGS_force_fieldtrials);
259131bea89d6f3742e649be84c91f8fd6c43b62d28sprang@webrtc.org  webrtc::test::RunTest(webrtc::Loopback);
260131bea89d6f3742e649be84c91f8fd6c43b62d28sprang@webrtc.org  return 0;
261131bea89d6f3742e649be84c91f8fd6c43b62d28sprang@webrtc.org}
262