xref: /aosp_15_r20/external/webrtc/video/screenshare_loopback.cc (revision d9f758449e529ab9291ac668be2861e7a55c2422)
1*d9f75844SAndroid Build Coastguard Worker /*
2*d9f75844SAndroid Build Coastguard Worker  *  Copyright (c) 2015 The WebRTC project authors. All Rights Reserved.
3*d9f75844SAndroid Build Coastguard Worker  *
4*d9f75844SAndroid Build Coastguard Worker  *  Use of this source code is governed by a BSD-style license
5*d9f75844SAndroid Build Coastguard Worker  *  that can be found in the LICENSE file in the root of the source
6*d9f75844SAndroid Build Coastguard Worker  *  tree. An additional intellectual property rights grant can be found
7*d9f75844SAndroid Build Coastguard Worker  *  in the file PATENTS.  All contributing project authors may
8*d9f75844SAndroid Build Coastguard Worker  *  be found in the AUTHORS file in the root of the source tree.
9*d9f75844SAndroid Build Coastguard Worker  */
10*d9f75844SAndroid Build Coastguard Worker 
11*d9f75844SAndroid Build Coastguard Worker #include <stdio.h>
12*d9f75844SAndroid Build Coastguard Worker 
13*d9f75844SAndroid Build Coastguard Worker #include <memory>
14*d9f75844SAndroid Build Coastguard Worker #include <string>
15*d9f75844SAndroid Build Coastguard Worker #include <vector>
16*d9f75844SAndroid Build Coastguard Worker 
17*d9f75844SAndroid Build Coastguard Worker #include "absl/flags/flag.h"
18*d9f75844SAndroid Build Coastguard Worker #include "absl/flags/parse.h"
19*d9f75844SAndroid Build Coastguard Worker #include "absl/types/optional.h"
20*d9f75844SAndroid Build Coastguard Worker #include "api/test/simulated_network.h"
21*d9f75844SAndroid Build Coastguard Worker #include "api/test/video_quality_test_fixture.h"
22*d9f75844SAndroid Build Coastguard Worker #include "api/transport/bitrate_settings.h"
23*d9f75844SAndroid Build Coastguard Worker #include "api/video_codecs/video_codec.h"
24*d9f75844SAndroid Build Coastguard Worker #include "rtc_base/checks.h"
25*d9f75844SAndroid Build Coastguard Worker #include "rtc_base/logging.h"
26*d9f75844SAndroid Build Coastguard Worker #include "rtc_base/string_encode.h"
27*d9f75844SAndroid Build Coastguard Worker #include "system_wrappers/include/field_trial.h"
28*d9f75844SAndroid Build Coastguard Worker #include "test/field_trial.h"
29*d9f75844SAndroid Build Coastguard Worker #include "test/gtest.h"
30*d9f75844SAndroid Build Coastguard Worker #include "test/run_test.h"
31*d9f75844SAndroid Build Coastguard Worker #include "video/video_quality_test.h"
32*d9f75844SAndroid Build Coastguard Worker 
33*d9f75844SAndroid Build Coastguard Worker using ::webrtc::BitrateConstraints;
34*d9f75844SAndroid Build Coastguard Worker using ::webrtc::BuiltInNetworkBehaviorConfig;
35*d9f75844SAndroid Build Coastguard Worker using ::webrtc::InterLayerPredMode;
36*d9f75844SAndroid Build Coastguard Worker using ::webrtc::SdpVideoFormat;
37*d9f75844SAndroid Build Coastguard Worker using ::webrtc::VideoQualityTest;
38*d9f75844SAndroid Build Coastguard Worker 
39*d9f75844SAndroid Build Coastguard Worker // Flags common with video loopback, with different default values.
40*d9f75844SAndroid Build Coastguard Worker ABSL_FLAG(int, width, 1850, "Video width (crops source).");
Width()41*d9f75844SAndroid Build Coastguard Worker size_t Width() {
42*d9f75844SAndroid Build Coastguard Worker   return static_cast<size_t>(absl::GetFlag(FLAGS_width));
43*d9f75844SAndroid Build Coastguard Worker }
44*d9f75844SAndroid Build Coastguard Worker 
45*d9f75844SAndroid Build Coastguard Worker ABSL_FLAG(int, height, 1110, "Video height (crops source).");
Height()46*d9f75844SAndroid Build Coastguard Worker size_t Height() {
47*d9f75844SAndroid Build Coastguard Worker   return static_cast<size_t>(absl::GetFlag(FLAGS_height));
48*d9f75844SAndroid Build Coastguard Worker }
49*d9f75844SAndroid Build Coastguard Worker 
50*d9f75844SAndroid Build Coastguard Worker ABSL_FLAG(int, fps, 5, "Frames per second.");
Fps()51*d9f75844SAndroid Build Coastguard Worker int Fps() {
52*d9f75844SAndroid Build Coastguard Worker   return absl::GetFlag(FLAGS_fps);
53*d9f75844SAndroid Build Coastguard Worker }
54*d9f75844SAndroid Build Coastguard Worker 
55*d9f75844SAndroid Build Coastguard Worker ABSL_FLAG(int, min_bitrate, 50, "Call and stream min bitrate in kbps.");
MinBitrateKbps()56*d9f75844SAndroid Build Coastguard Worker int MinBitrateKbps() {
57*d9f75844SAndroid Build Coastguard Worker   return absl::GetFlag(FLAGS_min_bitrate);
58*d9f75844SAndroid Build Coastguard Worker }
59*d9f75844SAndroid Build Coastguard Worker 
60*d9f75844SAndroid Build Coastguard Worker ABSL_FLAG(int, start_bitrate, 300, "Call start bitrate in kbps.");
StartBitrateKbps()61*d9f75844SAndroid Build Coastguard Worker int StartBitrateKbps() {
62*d9f75844SAndroid Build Coastguard Worker   return absl::GetFlag(FLAGS_start_bitrate);
63*d9f75844SAndroid Build Coastguard Worker }
64*d9f75844SAndroid Build Coastguard Worker 
65*d9f75844SAndroid Build Coastguard Worker ABSL_FLAG(int, target_bitrate, 200, "Stream target bitrate in kbps.");
TargetBitrateKbps()66*d9f75844SAndroid Build Coastguard Worker int TargetBitrateKbps() {
67*d9f75844SAndroid Build Coastguard Worker   return absl::GetFlag(FLAGS_target_bitrate);
68*d9f75844SAndroid Build Coastguard Worker }
69*d9f75844SAndroid Build Coastguard Worker 
70*d9f75844SAndroid Build Coastguard Worker ABSL_FLAG(int, max_bitrate, 1000, "Call and stream max bitrate in kbps.");
MaxBitrateKbps()71*d9f75844SAndroid Build Coastguard Worker int MaxBitrateKbps() {
72*d9f75844SAndroid Build Coastguard Worker   return absl::GetFlag(FLAGS_max_bitrate);
73*d9f75844SAndroid Build Coastguard Worker }
74*d9f75844SAndroid Build Coastguard Worker 
75*d9f75844SAndroid Build Coastguard Worker ABSL_FLAG(int, num_temporal_layers, 2, "Number of temporal layers to use.");
NumTemporalLayers()76*d9f75844SAndroid Build Coastguard Worker int NumTemporalLayers() {
77*d9f75844SAndroid Build Coastguard Worker   return absl::GetFlag(FLAGS_num_temporal_layers);
78*d9f75844SAndroid Build Coastguard Worker }
79*d9f75844SAndroid Build Coastguard Worker 
80*d9f75844SAndroid Build Coastguard Worker // Flags common with video loopback, with equal default values.
81*d9f75844SAndroid Build Coastguard Worker ABSL_FLAG(std::string, codec, "VP8", "Video codec to use.");
Codec()82*d9f75844SAndroid Build Coastguard Worker std::string Codec() {
83*d9f75844SAndroid Build Coastguard Worker   return absl::GetFlag(FLAGS_codec);
84*d9f75844SAndroid Build Coastguard Worker }
85*d9f75844SAndroid Build Coastguard Worker 
86*d9f75844SAndroid Build Coastguard Worker ABSL_FLAG(std::string,
87*d9f75844SAndroid Build Coastguard Worker           rtc_event_log_name,
88*d9f75844SAndroid Build Coastguard Worker           "",
89*d9f75844SAndroid Build Coastguard Worker           "Filename for rtc event log. Two files "
90*d9f75844SAndroid Build Coastguard Worker           "with \"_send\" and \"_recv\" suffixes will be created.");
RtcEventLogName()91*d9f75844SAndroid Build Coastguard Worker std::string RtcEventLogName() {
92*d9f75844SAndroid Build Coastguard Worker   return absl::GetFlag(FLAGS_rtc_event_log_name);
93*d9f75844SAndroid Build Coastguard Worker }
94*d9f75844SAndroid Build Coastguard Worker 
95*d9f75844SAndroid Build Coastguard Worker ABSL_FLAG(std::string,
96*d9f75844SAndroid Build Coastguard Worker           rtp_dump_name,
97*d9f75844SAndroid Build Coastguard Worker           "",
98*d9f75844SAndroid Build Coastguard Worker           "Filename for dumped received RTP stream.");
RtpDumpName()99*d9f75844SAndroid Build Coastguard Worker std::string RtpDumpName() {
100*d9f75844SAndroid Build Coastguard Worker   return absl::GetFlag(FLAGS_rtp_dump_name);
101*d9f75844SAndroid Build Coastguard Worker }
102*d9f75844SAndroid Build Coastguard Worker 
103*d9f75844SAndroid Build Coastguard Worker ABSL_FLAG(int,
104*d9f75844SAndroid Build Coastguard Worker           selected_tl,
105*d9f75844SAndroid Build Coastguard Worker           -1,
106*d9f75844SAndroid Build Coastguard Worker           "Temporal layer to show or analyze. -1 to disable filtering.");
SelectedTL()107*d9f75844SAndroid Build Coastguard Worker int SelectedTL() {
108*d9f75844SAndroid Build Coastguard Worker   return absl::GetFlag(FLAGS_selected_tl);
109*d9f75844SAndroid Build Coastguard Worker }
110*d9f75844SAndroid Build Coastguard Worker 
111*d9f75844SAndroid Build Coastguard Worker ABSL_FLAG(
112*d9f75844SAndroid Build Coastguard Worker     int,
113*d9f75844SAndroid Build Coastguard Worker     duration,
114*d9f75844SAndroid Build Coastguard Worker     0,
115*d9f75844SAndroid Build Coastguard Worker     "Duration of the test in seconds. If 0, rendered will be shown instead.");
DurationSecs()116*d9f75844SAndroid Build Coastguard Worker int DurationSecs() {
117*d9f75844SAndroid Build Coastguard Worker   return absl::GetFlag(FLAGS_duration);
118*d9f75844SAndroid Build Coastguard Worker }
119*d9f75844SAndroid Build Coastguard Worker 
120*d9f75844SAndroid Build Coastguard Worker ABSL_FLAG(std::string, output_filename, "", "Target graph data filename.");
OutputFilename()121*d9f75844SAndroid Build Coastguard Worker std::string OutputFilename() {
122*d9f75844SAndroid Build Coastguard Worker   return absl::GetFlag(FLAGS_output_filename);
123*d9f75844SAndroid Build Coastguard Worker }
124*d9f75844SAndroid Build Coastguard Worker 
125*d9f75844SAndroid Build Coastguard Worker ABSL_FLAG(std::string,
126*d9f75844SAndroid Build Coastguard Worker           graph_title,
127*d9f75844SAndroid Build Coastguard Worker           "",
128*d9f75844SAndroid Build Coastguard Worker           "If empty, title will be generated automatically.");
GraphTitle()129*d9f75844SAndroid Build Coastguard Worker std::string GraphTitle() {
130*d9f75844SAndroid Build Coastguard Worker   return absl::GetFlag(FLAGS_graph_title);
131*d9f75844SAndroid Build Coastguard Worker }
132*d9f75844SAndroid Build Coastguard Worker 
133*d9f75844SAndroid Build Coastguard Worker ABSL_FLAG(int, loss_percent, 0, "Percentage of packets randomly lost.");
LossPercent()134*d9f75844SAndroid Build Coastguard Worker int LossPercent() {
135*d9f75844SAndroid Build Coastguard Worker   return absl::GetFlag(FLAGS_loss_percent);
136*d9f75844SAndroid Build Coastguard Worker }
137*d9f75844SAndroid Build Coastguard Worker 
138*d9f75844SAndroid Build Coastguard Worker ABSL_FLAG(int,
139*d9f75844SAndroid Build Coastguard Worker           link_capacity,
140*d9f75844SAndroid Build Coastguard Worker           0,
141*d9f75844SAndroid Build Coastguard Worker           "Capacity (kbps) of the fake link. 0 means infinite.");
LinkCapacityKbps()142*d9f75844SAndroid Build Coastguard Worker int LinkCapacityKbps() {
143*d9f75844SAndroid Build Coastguard Worker   return absl::GetFlag(FLAGS_link_capacity);
144*d9f75844SAndroid Build Coastguard Worker }
145*d9f75844SAndroid Build Coastguard Worker 
146*d9f75844SAndroid Build Coastguard Worker ABSL_FLAG(int, queue_size, 0, "Size of the bottleneck link queue in packets.");
QueueSize()147*d9f75844SAndroid Build Coastguard Worker int QueueSize() {
148*d9f75844SAndroid Build Coastguard Worker   return absl::GetFlag(FLAGS_queue_size);
149*d9f75844SAndroid Build Coastguard Worker }
150*d9f75844SAndroid Build Coastguard Worker 
151*d9f75844SAndroid Build Coastguard Worker ABSL_FLAG(int,
152*d9f75844SAndroid Build Coastguard Worker           avg_propagation_delay_ms,
153*d9f75844SAndroid Build Coastguard Worker           0,
154*d9f75844SAndroid Build Coastguard Worker           "Average link propagation delay in ms.");
AvgPropagationDelayMs()155*d9f75844SAndroid Build Coastguard Worker int AvgPropagationDelayMs() {
156*d9f75844SAndroid Build Coastguard Worker   return absl::GetFlag(FLAGS_avg_propagation_delay_ms);
157*d9f75844SAndroid Build Coastguard Worker }
158*d9f75844SAndroid Build Coastguard Worker 
159*d9f75844SAndroid Build Coastguard Worker ABSL_FLAG(int,
160*d9f75844SAndroid Build Coastguard Worker           std_propagation_delay_ms,
161*d9f75844SAndroid Build Coastguard Worker           0,
162*d9f75844SAndroid Build Coastguard Worker           "Link propagation delay standard deviation in ms.");
StdPropagationDelayMs()163*d9f75844SAndroid Build Coastguard Worker int StdPropagationDelayMs() {
164*d9f75844SAndroid Build Coastguard Worker   return absl::GetFlag(FLAGS_std_propagation_delay_ms);
165*d9f75844SAndroid Build Coastguard Worker }
166*d9f75844SAndroid Build Coastguard Worker 
167*d9f75844SAndroid Build Coastguard Worker ABSL_FLAG(int, num_streams, 0, "Number of streams to show or analyze.");
NumStreams()168*d9f75844SAndroid Build Coastguard Worker int NumStreams() {
169*d9f75844SAndroid Build Coastguard Worker   return absl::GetFlag(FLAGS_num_streams);
170*d9f75844SAndroid Build Coastguard Worker }
171*d9f75844SAndroid Build Coastguard Worker 
172*d9f75844SAndroid Build Coastguard Worker ABSL_FLAG(int,
173*d9f75844SAndroid Build Coastguard Worker           selected_stream,
174*d9f75844SAndroid Build Coastguard Worker           0,
175*d9f75844SAndroid Build Coastguard Worker           "ID of the stream to show or analyze. "
176*d9f75844SAndroid Build Coastguard Worker           "Set to the number of streams to show them all.");
SelectedStream()177*d9f75844SAndroid Build Coastguard Worker int SelectedStream() {
178*d9f75844SAndroid Build Coastguard Worker   return absl::GetFlag(FLAGS_selected_stream);
179*d9f75844SAndroid Build Coastguard Worker }
180*d9f75844SAndroid Build Coastguard Worker 
181*d9f75844SAndroid Build Coastguard Worker ABSL_FLAG(int, num_spatial_layers, 1, "Number of spatial layers to use.");
NumSpatialLayers()182*d9f75844SAndroid Build Coastguard Worker int NumSpatialLayers() {
183*d9f75844SAndroid Build Coastguard Worker   return absl::GetFlag(FLAGS_num_spatial_layers);
184*d9f75844SAndroid Build Coastguard Worker }
185*d9f75844SAndroid Build Coastguard Worker 
186*d9f75844SAndroid Build Coastguard Worker ABSL_FLAG(int,
187*d9f75844SAndroid Build Coastguard Worker           inter_layer_pred,
188*d9f75844SAndroid Build Coastguard Worker           0,
189*d9f75844SAndroid Build Coastguard Worker           "Inter-layer prediction mode. "
190*d9f75844SAndroid Build Coastguard Worker           "0 - enabled, 1 - disabled, 2 - enabled only for key pictures.");
InterLayerPred()191*d9f75844SAndroid Build Coastguard Worker InterLayerPredMode InterLayerPred() {
192*d9f75844SAndroid Build Coastguard Worker   if (absl::GetFlag(FLAGS_inter_layer_pred) == 0) {
193*d9f75844SAndroid Build Coastguard Worker     return webrtc::InterLayerPredMode::kOn;
194*d9f75844SAndroid Build Coastguard Worker   } else if (absl::GetFlag(FLAGS_inter_layer_pred) == 1) {
195*d9f75844SAndroid Build Coastguard Worker     return webrtc::InterLayerPredMode::kOff;
196*d9f75844SAndroid Build Coastguard Worker   } else {
197*d9f75844SAndroid Build Coastguard Worker     RTC_DCHECK_EQ(absl::GetFlag(FLAGS_inter_layer_pred), 2);
198*d9f75844SAndroid Build Coastguard Worker     return webrtc::InterLayerPredMode::kOnKeyPic;
199*d9f75844SAndroid Build Coastguard Worker   }
200*d9f75844SAndroid Build Coastguard Worker }
201*d9f75844SAndroid Build Coastguard Worker 
202*d9f75844SAndroid Build Coastguard Worker ABSL_FLAG(int,
203*d9f75844SAndroid Build Coastguard Worker           selected_sl,
204*d9f75844SAndroid Build Coastguard Worker           -1,
205*d9f75844SAndroid Build Coastguard Worker           "Spatial layer to show or analyze. -1 to disable filtering.");
SelectedSL()206*d9f75844SAndroid Build Coastguard Worker int SelectedSL() {
207*d9f75844SAndroid Build Coastguard Worker   return absl::GetFlag(FLAGS_selected_sl);
208*d9f75844SAndroid Build Coastguard Worker }
209*d9f75844SAndroid Build Coastguard Worker 
210*d9f75844SAndroid Build Coastguard Worker ABSL_FLAG(std::string,
211*d9f75844SAndroid Build Coastguard Worker           stream0,
212*d9f75844SAndroid Build Coastguard Worker           "",
213*d9f75844SAndroid Build Coastguard Worker           "Comma separated values describing VideoStream for stream #0.");
Stream0()214*d9f75844SAndroid Build Coastguard Worker std::string Stream0() {
215*d9f75844SAndroid Build Coastguard Worker   return absl::GetFlag(FLAGS_stream0);
216*d9f75844SAndroid Build Coastguard Worker }
217*d9f75844SAndroid Build Coastguard Worker 
218*d9f75844SAndroid Build Coastguard Worker ABSL_FLAG(std::string,
219*d9f75844SAndroid Build Coastguard Worker           stream1,
220*d9f75844SAndroid Build Coastguard Worker           "",
221*d9f75844SAndroid Build Coastguard Worker           "Comma separated values describing VideoStream for stream #1.");
Stream1()222*d9f75844SAndroid Build Coastguard Worker std::string Stream1() {
223*d9f75844SAndroid Build Coastguard Worker   return absl::GetFlag(FLAGS_stream1);
224*d9f75844SAndroid Build Coastguard Worker }
225*d9f75844SAndroid Build Coastguard Worker 
226*d9f75844SAndroid Build Coastguard Worker ABSL_FLAG(std::string,
227*d9f75844SAndroid Build Coastguard Worker           sl0,
228*d9f75844SAndroid Build Coastguard Worker           "",
229*d9f75844SAndroid Build Coastguard Worker           "Comma separated values describing SpatialLayer for layer #0.");
SL0()230*d9f75844SAndroid Build Coastguard Worker std::string SL0() {
231*d9f75844SAndroid Build Coastguard Worker   return absl::GetFlag(FLAGS_sl0);
232*d9f75844SAndroid Build Coastguard Worker }
233*d9f75844SAndroid Build Coastguard Worker 
234*d9f75844SAndroid Build Coastguard Worker ABSL_FLAG(std::string,
235*d9f75844SAndroid Build Coastguard Worker           sl1,
236*d9f75844SAndroid Build Coastguard Worker           "",
237*d9f75844SAndroid Build Coastguard Worker           "Comma separated values describing SpatialLayer for layer #1.");
SL1()238*d9f75844SAndroid Build Coastguard Worker std::string SL1() {
239*d9f75844SAndroid Build Coastguard Worker   return absl::GetFlag(FLAGS_sl1);
240*d9f75844SAndroid Build Coastguard Worker }
241*d9f75844SAndroid Build Coastguard Worker 
242*d9f75844SAndroid Build Coastguard Worker ABSL_FLAG(std::string,
243*d9f75844SAndroid Build Coastguard Worker           encoded_frame_path,
244*d9f75844SAndroid Build Coastguard Worker           "",
245*d9f75844SAndroid Build Coastguard Worker           "The base path for encoded frame logs. Created files will have "
246*d9f75844SAndroid Build Coastguard Worker           "the form <encoded_frame_path>.<n>.(recv|send.<m>).ivf");
EncodedFramePath()247*d9f75844SAndroid Build Coastguard Worker std::string EncodedFramePath() {
248*d9f75844SAndroid Build Coastguard Worker   return absl::GetFlag(FLAGS_encoded_frame_path);
249*d9f75844SAndroid Build Coastguard Worker }
250*d9f75844SAndroid Build Coastguard Worker 
251*d9f75844SAndroid Build Coastguard Worker ABSL_FLAG(bool, logs, false, "print logs to stderr");
252*d9f75844SAndroid Build Coastguard Worker 
253*d9f75844SAndroid Build Coastguard Worker ABSL_FLAG(bool, send_side_bwe, true, "Use send-side bandwidth estimation");
254*d9f75844SAndroid Build Coastguard Worker 
255*d9f75844SAndroid Build Coastguard Worker ABSL_FLAG(bool, generic_descriptor, false, "Use the generic frame descriptor.");
256*d9f75844SAndroid Build Coastguard Worker 
257*d9f75844SAndroid Build Coastguard Worker ABSL_FLAG(bool, allow_reordering, false, "Allow packet reordering to occur");
258*d9f75844SAndroid Build Coastguard Worker 
259*d9f75844SAndroid Build Coastguard Worker ABSL_FLAG(
260*d9f75844SAndroid Build Coastguard Worker     std::string,
261*d9f75844SAndroid Build Coastguard Worker     force_fieldtrials,
262*d9f75844SAndroid Build Coastguard Worker     "",
263*d9f75844SAndroid Build Coastguard Worker     "Field trials control experimental feature code which can be forced. "
264*d9f75844SAndroid Build Coastguard Worker     "E.g. running with --force_fieldtrials=WebRTC-FooFeature/Enable/"
265*d9f75844SAndroid Build Coastguard Worker     " will assign the group Enable to field trial WebRTC-FooFeature. Multiple "
266*d9f75844SAndroid Build Coastguard Worker     "trials are separated by \"/\"");
267*d9f75844SAndroid Build Coastguard Worker 
268*d9f75844SAndroid Build Coastguard Worker // Screenshare-specific flags.
269*d9f75844SAndroid Build Coastguard Worker ABSL_FLAG(int,
270*d9f75844SAndroid Build Coastguard Worker           min_transmit_bitrate,
271*d9f75844SAndroid Build Coastguard Worker           400,
272*d9f75844SAndroid Build Coastguard Worker           "Min transmit bitrate incl. padding.");
MinTransmitBitrateKbps()273*d9f75844SAndroid Build Coastguard Worker int MinTransmitBitrateKbps() {
274*d9f75844SAndroid Build Coastguard Worker   return absl::GetFlag(FLAGS_min_transmit_bitrate);
275*d9f75844SAndroid Build Coastguard Worker }
276*d9f75844SAndroid Build Coastguard Worker 
277*d9f75844SAndroid Build Coastguard Worker ABSL_FLAG(bool,
278*d9f75844SAndroid Build Coastguard Worker           generate_slides,
279*d9f75844SAndroid Build Coastguard Worker           false,
280*d9f75844SAndroid Build Coastguard Worker           "Whether to use randomly generated slides or read them from files.");
GenerateSlides()281*d9f75844SAndroid Build Coastguard Worker bool GenerateSlides() {
282*d9f75844SAndroid Build Coastguard Worker   return absl::GetFlag(FLAGS_generate_slides);
283*d9f75844SAndroid Build Coastguard Worker }
284*d9f75844SAndroid Build Coastguard Worker 
285*d9f75844SAndroid Build Coastguard Worker ABSL_FLAG(int,
286*d9f75844SAndroid Build Coastguard Worker           slide_change_interval,
287*d9f75844SAndroid Build Coastguard Worker           10,
288*d9f75844SAndroid Build Coastguard Worker           "Interval (in seconds) between simulated slide changes.");
SlideChangeInterval()289*d9f75844SAndroid Build Coastguard Worker int SlideChangeInterval() {
290*d9f75844SAndroid Build Coastguard Worker   return absl::GetFlag(FLAGS_slide_change_interval);
291*d9f75844SAndroid Build Coastguard Worker }
292*d9f75844SAndroid Build Coastguard Worker 
293*d9f75844SAndroid Build Coastguard Worker ABSL_FLAG(
294*d9f75844SAndroid Build Coastguard Worker     int,
295*d9f75844SAndroid Build Coastguard Worker     scroll_duration,
296*d9f75844SAndroid Build Coastguard Worker     0,
297*d9f75844SAndroid Build Coastguard Worker     "Duration (in seconds) during which a slide will be scrolled into place.");
ScrollDuration()298*d9f75844SAndroid Build Coastguard Worker int ScrollDuration() {
299*d9f75844SAndroid Build Coastguard Worker   return absl::GetFlag(FLAGS_scroll_duration);
300*d9f75844SAndroid Build Coastguard Worker }
301*d9f75844SAndroid Build Coastguard Worker 
302*d9f75844SAndroid Build Coastguard Worker ABSL_FLAG(std::string,
303*d9f75844SAndroid Build Coastguard Worker           slides,
304*d9f75844SAndroid Build Coastguard Worker           "",
305*d9f75844SAndroid Build Coastguard Worker           "Comma-separated list of *.yuv files to display as slides.");
Slides()306*d9f75844SAndroid Build Coastguard Worker std::vector<std::string> Slides() {
307*d9f75844SAndroid Build Coastguard Worker   std::vector<std::string> slides;
308*d9f75844SAndroid Build Coastguard Worker   std::string slides_list = absl::GetFlag(FLAGS_slides);
309*d9f75844SAndroid Build Coastguard Worker   rtc::tokenize(slides_list, ',', &slides);
310*d9f75844SAndroid Build Coastguard Worker   return slides;
311*d9f75844SAndroid Build Coastguard Worker }
312*d9f75844SAndroid Build Coastguard Worker 
Loopback()313*d9f75844SAndroid Build Coastguard Worker void Loopback() {
314*d9f75844SAndroid Build Coastguard Worker   BuiltInNetworkBehaviorConfig pipe_config;
315*d9f75844SAndroid Build Coastguard Worker   pipe_config.loss_percent = LossPercent();
316*d9f75844SAndroid Build Coastguard Worker   pipe_config.link_capacity_kbps = LinkCapacityKbps();
317*d9f75844SAndroid Build Coastguard Worker   pipe_config.queue_length_packets = QueueSize();
318*d9f75844SAndroid Build Coastguard Worker   pipe_config.queue_delay_ms = AvgPropagationDelayMs();
319*d9f75844SAndroid Build Coastguard Worker   pipe_config.delay_standard_deviation_ms = StdPropagationDelayMs();
320*d9f75844SAndroid Build Coastguard Worker   pipe_config.allow_reordering = absl::GetFlag(FLAGS_allow_reordering);
321*d9f75844SAndroid Build Coastguard Worker 
322*d9f75844SAndroid Build Coastguard Worker   BitrateConstraints call_bitrate_config;
323*d9f75844SAndroid Build Coastguard Worker   call_bitrate_config.min_bitrate_bps = MinBitrateKbps() * 1000;
324*d9f75844SAndroid Build Coastguard Worker   call_bitrate_config.start_bitrate_bps = StartBitrateKbps() * 1000;
325*d9f75844SAndroid Build Coastguard Worker   call_bitrate_config.max_bitrate_bps = -1;  // Don't cap bandwidth estimate.
326*d9f75844SAndroid Build Coastguard Worker 
327*d9f75844SAndroid Build Coastguard Worker   VideoQualityTest::Params params;
328*d9f75844SAndroid Build Coastguard Worker   params.call.send_side_bwe = absl::GetFlag(FLAGS_send_side_bwe);
329*d9f75844SAndroid Build Coastguard Worker   params.call.generic_descriptor = absl::GetFlag(FLAGS_generic_descriptor);
330*d9f75844SAndroid Build Coastguard Worker   params.call.call_bitrate_config = call_bitrate_config;
331*d9f75844SAndroid Build Coastguard Worker   params.video[0].enabled = true;
332*d9f75844SAndroid Build Coastguard Worker   params.video[0].width = Width();
333*d9f75844SAndroid Build Coastguard Worker   params.video[0].height = Height();
334*d9f75844SAndroid Build Coastguard Worker   params.video[0].fps = Fps();
335*d9f75844SAndroid Build Coastguard Worker   params.video[0].min_bitrate_bps = MinBitrateKbps() * 1000;
336*d9f75844SAndroid Build Coastguard Worker   params.video[0].target_bitrate_bps = TargetBitrateKbps() * 1000;
337*d9f75844SAndroid Build Coastguard Worker   params.video[0].max_bitrate_bps = MaxBitrateKbps() * 1000;
338*d9f75844SAndroid Build Coastguard Worker   params.video[0].codec = Codec();
339*d9f75844SAndroid Build Coastguard Worker   params.video[0].num_temporal_layers = NumTemporalLayers();
340*d9f75844SAndroid Build Coastguard Worker   params.video[0].selected_tl = SelectedTL();
341*d9f75844SAndroid Build Coastguard Worker   params.video[0].min_transmit_bps = MinTransmitBitrateKbps() * 1000;
342*d9f75844SAndroid Build Coastguard Worker   params.screenshare[0].enabled = true;
343*d9f75844SAndroid Build Coastguard Worker   params.screenshare[0].generate_slides = GenerateSlides();
344*d9f75844SAndroid Build Coastguard Worker   params.screenshare[0].slide_change_interval = SlideChangeInterval();
345*d9f75844SAndroid Build Coastguard Worker   params.screenshare[0].scroll_duration = ScrollDuration();
346*d9f75844SAndroid Build Coastguard Worker   params.screenshare[0].slides = Slides();
347*d9f75844SAndroid Build Coastguard Worker   params.config = pipe_config;
348*d9f75844SAndroid Build Coastguard Worker   params.logging.rtc_event_log_name = RtcEventLogName();
349*d9f75844SAndroid Build Coastguard Worker   params.logging.rtp_dump_name = RtpDumpName();
350*d9f75844SAndroid Build Coastguard Worker   params.logging.encoded_frame_base_path = EncodedFramePath();
351*d9f75844SAndroid Build Coastguard Worker 
352*d9f75844SAndroid Build Coastguard Worker   if (NumStreams() > 1 && Stream0().empty() && Stream1().empty()) {
353*d9f75844SAndroid Build Coastguard Worker     params.ss[0].infer_streams = true;
354*d9f75844SAndroid Build Coastguard Worker   }
355*d9f75844SAndroid Build Coastguard Worker 
356*d9f75844SAndroid Build Coastguard Worker   std::vector<std::string> stream_descriptors;
357*d9f75844SAndroid Build Coastguard Worker   stream_descriptors.push_back(Stream0());
358*d9f75844SAndroid Build Coastguard Worker   stream_descriptors.push_back(Stream1());
359*d9f75844SAndroid Build Coastguard Worker   std::vector<std::string> SL_descriptors;
360*d9f75844SAndroid Build Coastguard Worker   SL_descriptors.push_back(SL0());
361*d9f75844SAndroid Build Coastguard Worker   SL_descriptors.push_back(SL1());
362*d9f75844SAndroid Build Coastguard Worker   VideoQualityTest::FillScalabilitySettings(
363*d9f75844SAndroid Build Coastguard Worker       &params, 0, stream_descriptors, NumStreams(), SelectedStream(),
364*d9f75844SAndroid Build Coastguard Worker       NumSpatialLayers(), SelectedSL(), InterLayerPred(), SL_descriptors);
365*d9f75844SAndroid Build Coastguard Worker 
366*d9f75844SAndroid Build Coastguard Worker   auto fixture = std::make_unique<VideoQualityTest>(nullptr);
367*d9f75844SAndroid Build Coastguard Worker   if (DurationSecs()) {
368*d9f75844SAndroid Build Coastguard Worker     fixture->RunWithAnalyzer(params);
369*d9f75844SAndroid Build Coastguard Worker   } else {
370*d9f75844SAndroid Build Coastguard Worker     fixture->RunWithRenderers(params);
371*d9f75844SAndroid Build Coastguard Worker   }
372*d9f75844SAndroid Build Coastguard Worker }
373*d9f75844SAndroid Build Coastguard Worker 
main(int argc,char * argv[])374*d9f75844SAndroid Build Coastguard Worker int main(int argc, char* argv[]) {
375*d9f75844SAndroid Build Coastguard Worker   ::testing::InitGoogleTest(&argc, argv);
376*d9f75844SAndroid Build Coastguard Worker   absl::ParseCommandLine(argc, argv);
377*d9f75844SAndroid Build Coastguard Worker 
378*d9f75844SAndroid Build Coastguard Worker   rtc::LogMessage::SetLogToStderr(absl::GetFlag(FLAGS_logs));
379*d9f75844SAndroid Build Coastguard Worker 
380*d9f75844SAndroid Build Coastguard Worker   // InitFieldTrialsFromString stores the char*, so the char array must outlive
381*d9f75844SAndroid Build Coastguard Worker   // the application.
382*d9f75844SAndroid Build Coastguard Worker   const std::string field_trials = absl::GetFlag(FLAGS_force_fieldtrials);
383*d9f75844SAndroid Build Coastguard Worker   webrtc::field_trial::InitFieldTrialsFromString(field_trials.c_str());
384*d9f75844SAndroid Build Coastguard Worker 
385*d9f75844SAndroid Build Coastguard Worker   webrtc::test::RunTest(Loopback);
386*d9f75844SAndroid Build Coastguard Worker   return 0;
387*d9f75844SAndroid Build Coastguard Worker }
388