xref: /aosp_15_r20/external/webrtc/video/video_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 #include "video/video_loopback.h"
11*d9f75844SAndroid Build Coastguard Worker 
12*d9f75844SAndroid Build Coastguard Worker #include <stdio.h>
13*d9f75844SAndroid Build Coastguard Worker 
14*d9f75844SAndroid Build Coastguard Worker #include <memory>
15*d9f75844SAndroid Build Coastguard Worker #include <string>
16*d9f75844SAndroid Build Coastguard Worker #include <vector>
17*d9f75844SAndroid Build Coastguard Worker 
18*d9f75844SAndroid Build Coastguard Worker #include "absl/flags/flag.h"
19*d9f75844SAndroid Build Coastguard Worker #include "absl/flags/parse.h"
20*d9f75844SAndroid Build Coastguard Worker #include "absl/types/optional.h"
21*d9f75844SAndroid Build Coastguard Worker #include "api/test/simulated_network.h"
22*d9f75844SAndroid Build Coastguard Worker #include "api/test/video_quality_test_fixture.h"
23*d9f75844SAndroid Build Coastguard Worker #include "api/transport/bitrate_settings.h"
24*d9f75844SAndroid Build Coastguard Worker #include "api/video_codecs/video_codec.h"
25*d9f75844SAndroid Build Coastguard Worker #include "rtc_base/checks.h"
26*d9f75844SAndroid Build Coastguard Worker #include "rtc_base/logging.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 // Flags common with screenshare loopback, with different default values.
34*d9f75844SAndroid Build Coastguard Worker ABSL_FLAG(int, width, 640, "Video width.");
35*d9f75844SAndroid Build Coastguard Worker 
36*d9f75844SAndroid Build Coastguard Worker ABSL_FLAG(int, height, 480, "Video height.");
37*d9f75844SAndroid Build Coastguard Worker 
38*d9f75844SAndroid Build Coastguard Worker ABSL_FLAG(int, fps, 30, "Frames per second.");
39*d9f75844SAndroid Build Coastguard Worker 
40*d9f75844SAndroid Build Coastguard Worker ABSL_FLAG(int, capture_device_index, 0, "Capture device to select");
41*d9f75844SAndroid Build Coastguard Worker 
42*d9f75844SAndroid Build Coastguard Worker ABSL_FLAG(int, min_bitrate, 50, "Call and stream min bitrate in kbps.");
43*d9f75844SAndroid Build Coastguard Worker 
44*d9f75844SAndroid Build Coastguard Worker ABSL_FLAG(int, start_bitrate, 300, "Call start bitrate in kbps.");
45*d9f75844SAndroid Build Coastguard Worker 
46*d9f75844SAndroid Build Coastguard Worker ABSL_FLAG(int, target_bitrate, 800, "Stream target bitrate in kbps.");
47*d9f75844SAndroid Build Coastguard Worker 
48*d9f75844SAndroid Build Coastguard Worker ABSL_FLAG(int, max_bitrate, 800, "Call and stream max bitrate in kbps.");
49*d9f75844SAndroid Build Coastguard Worker 
50*d9f75844SAndroid Build Coastguard Worker ABSL_FLAG(bool,
51*d9f75844SAndroid Build Coastguard Worker           suspend_below_min_bitrate,
52*d9f75844SAndroid Build Coastguard Worker           false,
53*d9f75844SAndroid Build Coastguard Worker           "Suspends video below the configured min bitrate.");
54*d9f75844SAndroid Build Coastguard Worker 
55*d9f75844SAndroid Build Coastguard Worker ABSL_FLAG(int,
56*d9f75844SAndroid Build Coastguard Worker           num_temporal_layers,
57*d9f75844SAndroid Build Coastguard Worker           1,
58*d9f75844SAndroid Build Coastguard Worker           "Number of temporal layers. Set to 1-4 to override.");
59*d9f75844SAndroid Build Coastguard Worker 
60*d9f75844SAndroid Build Coastguard Worker ABSL_FLAG(int,
61*d9f75844SAndroid Build Coastguard Worker           inter_layer_pred,
62*d9f75844SAndroid Build Coastguard Worker           2,
63*d9f75844SAndroid Build Coastguard Worker           "Inter-layer prediction mode. "
64*d9f75844SAndroid Build Coastguard Worker           "0 - enabled, 1 - disabled, 2 - enabled only for key pictures.");
65*d9f75844SAndroid Build Coastguard Worker 
66*d9f75844SAndroid Build Coastguard Worker // Flags common with screenshare loopback, with equal default values.
67*d9f75844SAndroid Build Coastguard Worker ABSL_FLAG(std::string, codec, "VP8", "Video codec to use.");
68*d9f75844SAndroid Build Coastguard Worker 
69*d9f75844SAndroid Build Coastguard Worker ABSL_FLAG(int,
70*d9f75844SAndroid Build Coastguard Worker           selected_tl,
71*d9f75844SAndroid Build Coastguard Worker           -1,
72*d9f75844SAndroid Build Coastguard Worker           "Temporal layer to show or analyze. -1 to disable filtering.");
73*d9f75844SAndroid Build Coastguard Worker 
74*d9f75844SAndroid Build Coastguard Worker ABSL_FLAG(
75*d9f75844SAndroid Build Coastguard Worker     int,
76*d9f75844SAndroid Build Coastguard Worker     duration,
77*d9f75844SAndroid Build Coastguard Worker     0,
78*d9f75844SAndroid Build Coastguard Worker     "Duration of the test in seconds. If 0, rendered will be shown instead.");
79*d9f75844SAndroid Build Coastguard Worker 
80*d9f75844SAndroid Build Coastguard Worker ABSL_FLAG(std::string, output_filename, "", "Target graph data filename.");
81*d9f75844SAndroid Build Coastguard Worker 
82*d9f75844SAndroid Build Coastguard Worker ABSL_FLAG(std::string,
83*d9f75844SAndroid Build Coastguard Worker           graph_title,
84*d9f75844SAndroid Build Coastguard Worker           "",
85*d9f75844SAndroid Build Coastguard Worker           "If empty, title will be generated automatically.");
86*d9f75844SAndroid Build Coastguard Worker 
87*d9f75844SAndroid Build Coastguard Worker ABSL_FLAG(int, loss_percent, 0, "Percentage of packets randomly lost.");
88*d9f75844SAndroid Build Coastguard Worker 
89*d9f75844SAndroid Build Coastguard Worker ABSL_FLAG(int,
90*d9f75844SAndroid Build Coastguard Worker           avg_burst_loss_length,
91*d9f75844SAndroid Build Coastguard Worker           -1,
92*d9f75844SAndroid Build Coastguard Worker           "Average burst length of lost packets.");
93*d9f75844SAndroid Build Coastguard Worker 
94*d9f75844SAndroid Build Coastguard Worker ABSL_FLAG(int,
95*d9f75844SAndroid Build Coastguard Worker           link_capacity,
96*d9f75844SAndroid Build Coastguard Worker           0,
97*d9f75844SAndroid Build Coastguard Worker           "Capacity (kbps) of the fake link. 0 means infinite.");
98*d9f75844SAndroid Build Coastguard Worker 
99*d9f75844SAndroid Build Coastguard Worker ABSL_FLAG(int, queue_size, 0, "Size of the bottleneck link queue in packets.");
100*d9f75844SAndroid Build Coastguard Worker 
101*d9f75844SAndroid Build Coastguard Worker ABSL_FLAG(int,
102*d9f75844SAndroid Build Coastguard Worker           avg_propagation_delay_ms,
103*d9f75844SAndroid Build Coastguard Worker           0,
104*d9f75844SAndroid Build Coastguard Worker           "Average link propagation delay in ms.");
105*d9f75844SAndroid Build Coastguard Worker 
106*d9f75844SAndroid Build Coastguard Worker ABSL_FLAG(std::string,
107*d9f75844SAndroid Build Coastguard Worker           rtc_event_log_name,
108*d9f75844SAndroid Build Coastguard Worker           "",
109*d9f75844SAndroid Build Coastguard Worker           "Filename for rtc event log. Two files "
110*d9f75844SAndroid Build Coastguard Worker           "with \"_send\" and \"_recv\" suffixes will be created.");
111*d9f75844SAndroid Build Coastguard Worker 
112*d9f75844SAndroid Build Coastguard Worker ABSL_FLAG(std::string,
113*d9f75844SAndroid Build Coastguard Worker           rtp_dump_name,
114*d9f75844SAndroid Build Coastguard Worker           "",
115*d9f75844SAndroid Build Coastguard Worker           "Filename for dumped received RTP stream.");
116*d9f75844SAndroid Build Coastguard Worker 
117*d9f75844SAndroid Build Coastguard Worker ABSL_FLAG(int,
118*d9f75844SAndroid Build Coastguard Worker           std_propagation_delay_ms,
119*d9f75844SAndroid Build Coastguard Worker           0,
120*d9f75844SAndroid Build Coastguard Worker           "Link propagation delay standard deviation in ms.");
121*d9f75844SAndroid Build Coastguard Worker 
122*d9f75844SAndroid Build Coastguard Worker ABSL_FLAG(int, num_streams, 0, "Number of streams to show or analyze.");
123*d9f75844SAndroid Build Coastguard Worker 
124*d9f75844SAndroid Build Coastguard Worker ABSL_FLAG(int,
125*d9f75844SAndroid Build Coastguard Worker           selected_stream,
126*d9f75844SAndroid Build Coastguard Worker           0,
127*d9f75844SAndroid Build Coastguard Worker           "ID of the stream to show or analyze. "
128*d9f75844SAndroid Build Coastguard Worker           "Set to the number of streams to show them all.");
129*d9f75844SAndroid Build Coastguard Worker 
130*d9f75844SAndroid Build Coastguard Worker ABSL_FLAG(int, num_spatial_layers, 1, "Number of spatial layers to use.");
131*d9f75844SAndroid Build Coastguard Worker 
132*d9f75844SAndroid Build Coastguard Worker ABSL_FLAG(int,
133*d9f75844SAndroid Build Coastguard Worker           selected_sl,
134*d9f75844SAndroid Build Coastguard Worker           -1,
135*d9f75844SAndroid Build Coastguard Worker           "Spatial layer to show or analyze. -1 to disable filtering.");
136*d9f75844SAndroid Build Coastguard Worker 
137*d9f75844SAndroid Build Coastguard Worker ABSL_FLAG(std::string,
138*d9f75844SAndroid Build Coastguard Worker           stream0,
139*d9f75844SAndroid Build Coastguard Worker           "",
140*d9f75844SAndroid Build Coastguard Worker           "Comma separated values describing VideoStream for stream #0.");
141*d9f75844SAndroid Build Coastguard Worker 
142*d9f75844SAndroid Build Coastguard Worker ABSL_FLAG(std::string,
143*d9f75844SAndroid Build Coastguard Worker           stream1,
144*d9f75844SAndroid Build Coastguard Worker           "",
145*d9f75844SAndroid Build Coastguard Worker           "Comma separated values describing VideoStream for stream #1.");
146*d9f75844SAndroid Build Coastguard Worker 
147*d9f75844SAndroid Build Coastguard Worker ABSL_FLAG(std::string,
148*d9f75844SAndroid Build Coastguard Worker           sl0,
149*d9f75844SAndroid Build Coastguard Worker           "",
150*d9f75844SAndroid Build Coastguard Worker           "Comma separated values describing SpatialLayer for layer #0.");
151*d9f75844SAndroid Build Coastguard Worker 
152*d9f75844SAndroid Build Coastguard Worker ABSL_FLAG(std::string,
153*d9f75844SAndroid Build Coastguard Worker           sl1,
154*d9f75844SAndroid Build Coastguard Worker           "",
155*d9f75844SAndroid Build Coastguard Worker           "Comma separated values describing SpatialLayer for layer #1.");
156*d9f75844SAndroid Build Coastguard Worker 
157*d9f75844SAndroid Build Coastguard Worker ABSL_FLAG(std::string,
158*d9f75844SAndroid Build Coastguard Worker           sl2,
159*d9f75844SAndroid Build Coastguard Worker           "",
160*d9f75844SAndroid Build Coastguard Worker           "Comma separated values describing SpatialLayer for layer #2.");
161*d9f75844SAndroid Build Coastguard Worker 
162*d9f75844SAndroid Build Coastguard Worker ABSL_FLAG(std::string,
163*d9f75844SAndroid Build Coastguard Worker           encoded_frame_path,
164*d9f75844SAndroid Build Coastguard Worker           "",
165*d9f75844SAndroid Build Coastguard Worker           "The base path for encoded frame logs. Created files will have "
166*d9f75844SAndroid Build Coastguard Worker           "the form <encoded_frame_path>.<n>.(recv|send.<m>).ivf");
167*d9f75844SAndroid Build Coastguard Worker 
168*d9f75844SAndroid Build Coastguard Worker ABSL_FLAG(bool, logs, false, "print logs to stderr");
169*d9f75844SAndroid Build Coastguard Worker 
170*d9f75844SAndroid Build Coastguard Worker ABSL_FLAG(bool, send_side_bwe, true, "Use send-side bandwidth estimation");
171*d9f75844SAndroid Build Coastguard Worker 
172*d9f75844SAndroid Build Coastguard Worker ABSL_FLAG(bool, generic_descriptor, false, "Use the generic frame descriptor.");
173*d9f75844SAndroid Build Coastguard Worker 
174*d9f75844SAndroid Build Coastguard Worker ABSL_FLAG(bool, allow_reordering, false, "Allow packet reordering to occur");
175*d9f75844SAndroid Build Coastguard Worker 
176*d9f75844SAndroid Build Coastguard Worker ABSL_FLAG(bool, use_ulpfec, false, "Use RED+ULPFEC forward error correction.");
177*d9f75844SAndroid Build Coastguard Worker 
178*d9f75844SAndroid Build Coastguard Worker ABSL_FLAG(bool, use_flexfec, false, "Use FlexFEC forward error correction.");
179*d9f75844SAndroid Build Coastguard Worker 
180*d9f75844SAndroid Build Coastguard Worker ABSL_FLAG(bool, audio, false, "Add audio stream");
181*d9f75844SAndroid Build Coastguard Worker 
182*d9f75844SAndroid Build Coastguard Worker ABSL_FLAG(bool,
183*d9f75844SAndroid Build Coastguard Worker           use_real_adm,
184*d9f75844SAndroid Build Coastguard Worker           false,
185*d9f75844SAndroid Build Coastguard Worker           "Use real ADM instead of fake (no effect if audio is false)");
186*d9f75844SAndroid Build Coastguard Worker 
187*d9f75844SAndroid Build Coastguard Worker ABSL_FLAG(bool,
188*d9f75844SAndroid Build Coastguard Worker           audio_video_sync,
189*d9f75844SAndroid Build Coastguard Worker           false,
190*d9f75844SAndroid Build Coastguard Worker           "Sync audio and video stream (no effect if"
191*d9f75844SAndroid Build Coastguard Worker           " audio is false)");
192*d9f75844SAndroid Build Coastguard Worker 
193*d9f75844SAndroid Build Coastguard Worker ABSL_FLAG(bool,
194*d9f75844SAndroid Build Coastguard Worker           audio_dtx,
195*d9f75844SAndroid Build Coastguard Worker           false,
196*d9f75844SAndroid Build Coastguard Worker           "Enable audio DTX (no effect if audio is false)");
197*d9f75844SAndroid Build Coastguard Worker 
198*d9f75844SAndroid Build Coastguard Worker ABSL_FLAG(bool, video, true, "Add video stream");
199*d9f75844SAndroid Build Coastguard Worker 
200*d9f75844SAndroid Build Coastguard Worker ABSL_FLAG(
201*d9f75844SAndroid Build Coastguard Worker     std::string,
202*d9f75844SAndroid Build Coastguard Worker     force_fieldtrials,
203*d9f75844SAndroid Build Coastguard Worker     "",
204*d9f75844SAndroid Build Coastguard Worker     "Field trials control experimental feature code which can be forced. "
205*d9f75844SAndroid Build Coastguard Worker     "E.g. running with --force_fieldtrials=WebRTC-FooFeature/Enabled/"
206*d9f75844SAndroid Build Coastguard Worker     " will assign the group Enable to field trial WebRTC-FooFeature. Multiple "
207*d9f75844SAndroid Build Coastguard Worker     "trials are separated by \"/\"");
208*d9f75844SAndroid Build Coastguard Worker 
209*d9f75844SAndroid Build Coastguard Worker // Video-specific flags.
210*d9f75844SAndroid Build Coastguard Worker ABSL_FLAG(std::string,
211*d9f75844SAndroid Build Coastguard Worker           clip,
212*d9f75844SAndroid Build Coastguard Worker           "",
213*d9f75844SAndroid Build Coastguard Worker           "Name of the clip to show. If empty, using chroma generator.");
214*d9f75844SAndroid Build Coastguard Worker 
215*d9f75844SAndroid Build Coastguard Worker namespace webrtc {
216*d9f75844SAndroid Build Coastguard Worker namespace {
217*d9f75844SAndroid Build Coastguard Worker 
Width()218*d9f75844SAndroid Build Coastguard Worker size_t Width() {
219*d9f75844SAndroid Build Coastguard Worker   return static_cast<size_t>(absl::GetFlag(FLAGS_width));
220*d9f75844SAndroid Build Coastguard Worker }
221*d9f75844SAndroid Build Coastguard Worker 
Height()222*d9f75844SAndroid Build Coastguard Worker size_t Height() {
223*d9f75844SAndroid Build Coastguard Worker   return static_cast<size_t>(absl::GetFlag(FLAGS_height));
224*d9f75844SAndroid Build Coastguard Worker }
225*d9f75844SAndroid Build Coastguard Worker 
Fps()226*d9f75844SAndroid Build Coastguard Worker int Fps() {
227*d9f75844SAndroid Build Coastguard Worker   return absl::GetFlag(FLAGS_fps);
228*d9f75844SAndroid Build Coastguard Worker }
229*d9f75844SAndroid Build Coastguard Worker 
GetCaptureDevice()230*d9f75844SAndroid Build Coastguard Worker size_t GetCaptureDevice() {
231*d9f75844SAndroid Build Coastguard Worker   return static_cast<size_t>(absl::GetFlag(FLAGS_capture_device_index));
232*d9f75844SAndroid Build Coastguard Worker }
233*d9f75844SAndroid Build Coastguard Worker 
MinBitrateKbps()234*d9f75844SAndroid Build Coastguard Worker int MinBitrateKbps() {
235*d9f75844SAndroid Build Coastguard Worker   return absl::GetFlag(FLAGS_min_bitrate);
236*d9f75844SAndroid Build Coastguard Worker }
237*d9f75844SAndroid Build Coastguard Worker 
StartBitrateKbps()238*d9f75844SAndroid Build Coastguard Worker int StartBitrateKbps() {
239*d9f75844SAndroid Build Coastguard Worker   return absl::GetFlag(FLAGS_start_bitrate);
240*d9f75844SAndroid Build Coastguard Worker }
241*d9f75844SAndroid Build Coastguard Worker 
TargetBitrateKbps()242*d9f75844SAndroid Build Coastguard Worker int TargetBitrateKbps() {
243*d9f75844SAndroid Build Coastguard Worker   return absl::GetFlag(FLAGS_target_bitrate);
244*d9f75844SAndroid Build Coastguard Worker }
245*d9f75844SAndroid Build Coastguard Worker 
MaxBitrateKbps()246*d9f75844SAndroid Build Coastguard Worker int MaxBitrateKbps() {
247*d9f75844SAndroid Build Coastguard Worker   return absl::GetFlag(FLAGS_max_bitrate);
248*d9f75844SAndroid Build Coastguard Worker }
249*d9f75844SAndroid Build Coastguard Worker 
NumTemporalLayers()250*d9f75844SAndroid Build Coastguard Worker int NumTemporalLayers() {
251*d9f75844SAndroid Build Coastguard Worker   return absl::GetFlag(FLAGS_num_temporal_layers);
252*d9f75844SAndroid Build Coastguard Worker }
253*d9f75844SAndroid Build Coastguard Worker 
InterLayerPred()254*d9f75844SAndroid Build Coastguard Worker InterLayerPredMode InterLayerPred() {
255*d9f75844SAndroid Build Coastguard Worker   if (absl::GetFlag(FLAGS_inter_layer_pred) == 0) {
256*d9f75844SAndroid Build Coastguard Worker     return InterLayerPredMode::kOn;
257*d9f75844SAndroid Build Coastguard Worker   } else if (absl::GetFlag(FLAGS_inter_layer_pred) == 1) {
258*d9f75844SAndroid Build Coastguard Worker     return InterLayerPredMode::kOff;
259*d9f75844SAndroid Build Coastguard Worker   } else {
260*d9f75844SAndroid Build Coastguard Worker     RTC_DCHECK_EQ(absl::GetFlag(FLAGS_inter_layer_pred), 2);
261*d9f75844SAndroid Build Coastguard Worker     return InterLayerPredMode::kOnKeyPic;
262*d9f75844SAndroid Build Coastguard Worker   }
263*d9f75844SAndroid Build Coastguard Worker }
264*d9f75844SAndroid Build Coastguard Worker 
Codec()265*d9f75844SAndroid Build Coastguard Worker std::string Codec() {
266*d9f75844SAndroid Build Coastguard Worker   return absl::GetFlag(FLAGS_codec);
267*d9f75844SAndroid Build Coastguard Worker }
268*d9f75844SAndroid Build Coastguard Worker 
SelectedTL()269*d9f75844SAndroid Build Coastguard Worker int SelectedTL() {
270*d9f75844SAndroid Build Coastguard Worker   return absl::GetFlag(FLAGS_selected_tl);
271*d9f75844SAndroid Build Coastguard Worker }
272*d9f75844SAndroid Build Coastguard Worker 
DurationSecs()273*d9f75844SAndroid Build Coastguard Worker int DurationSecs() {
274*d9f75844SAndroid Build Coastguard Worker   return absl::GetFlag(FLAGS_duration);
275*d9f75844SAndroid Build Coastguard Worker }
276*d9f75844SAndroid Build Coastguard Worker 
OutputFilename()277*d9f75844SAndroid Build Coastguard Worker std::string OutputFilename() {
278*d9f75844SAndroid Build Coastguard Worker   return absl::GetFlag(FLAGS_output_filename);
279*d9f75844SAndroid Build Coastguard Worker }
280*d9f75844SAndroid Build Coastguard Worker 
GraphTitle()281*d9f75844SAndroid Build Coastguard Worker std::string GraphTitle() {
282*d9f75844SAndroid Build Coastguard Worker   return absl::GetFlag(FLAGS_graph_title);
283*d9f75844SAndroid Build Coastguard Worker }
284*d9f75844SAndroid Build Coastguard Worker 
LossPercent()285*d9f75844SAndroid Build Coastguard Worker int LossPercent() {
286*d9f75844SAndroid Build Coastguard Worker   return static_cast<int>(absl::GetFlag(FLAGS_loss_percent));
287*d9f75844SAndroid Build Coastguard Worker }
288*d9f75844SAndroid Build Coastguard Worker 
AvgBurstLossLength()289*d9f75844SAndroid Build Coastguard Worker int AvgBurstLossLength() {
290*d9f75844SAndroid Build Coastguard Worker   return static_cast<int>(absl::GetFlag(FLAGS_avg_burst_loss_length));
291*d9f75844SAndroid Build Coastguard Worker }
292*d9f75844SAndroid Build Coastguard Worker 
LinkCapacityKbps()293*d9f75844SAndroid Build Coastguard Worker int LinkCapacityKbps() {
294*d9f75844SAndroid Build Coastguard Worker   return static_cast<int>(absl::GetFlag(FLAGS_link_capacity));
295*d9f75844SAndroid Build Coastguard Worker }
296*d9f75844SAndroid Build Coastguard Worker 
QueueSize()297*d9f75844SAndroid Build Coastguard Worker int QueueSize() {
298*d9f75844SAndroid Build Coastguard Worker   return static_cast<int>(absl::GetFlag(FLAGS_queue_size));
299*d9f75844SAndroid Build Coastguard Worker }
300*d9f75844SAndroid Build Coastguard Worker 
AvgPropagationDelayMs()301*d9f75844SAndroid Build Coastguard Worker int AvgPropagationDelayMs() {
302*d9f75844SAndroid Build Coastguard Worker   return static_cast<int>(absl::GetFlag(FLAGS_avg_propagation_delay_ms));
303*d9f75844SAndroid Build Coastguard Worker }
304*d9f75844SAndroid Build Coastguard Worker 
RtcEventLogName()305*d9f75844SAndroid Build Coastguard Worker std::string RtcEventLogName() {
306*d9f75844SAndroid Build Coastguard Worker   return absl::GetFlag(FLAGS_rtc_event_log_name);
307*d9f75844SAndroid Build Coastguard Worker }
308*d9f75844SAndroid Build Coastguard Worker 
RtpDumpName()309*d9f75844SAndroid Build Coastguard Worker std::string RtpDumpName() {
310*d9f75844SAndroid Build Coastguard Worker   return absl::GetFlag(FLAGS_rtp_dump_name);
311*d9f75844SAndroid Build Coastguard Worker }
312*d9f75844SAndroid Build Coastguard Worker 
StdPropagationDelayMs()313*d9f75844SAndroid Build Coastguard Worker int StdPropagationDelayMs() {
314*d9f75844SAndroid Build Coastguard Worker   return absl::GetFlag(FLAGS_std_propagation_delay_ms);
315*d9f75844SAndroid Build Coastguard Worker }
316*d9f75844SAndroid Build Coastguard Worker 
NumStreams()317*d9f75844SAndroid Build Coastguard Worker int NumStreams() {
318*d9f75844SAndroid Build Coastguard Worker   return absl::GetFlag(FLAGS_num_streams);
319*d9f75844SAndroid Build Coastguard Worker }
320*d9f75844SAndroid Build Coastguard Worker 
SelectedStream()321*d9f75844SAndroid Build Coastguard Worker int SelectedStream() {
322*d9f75844SAndroid Build Coastguard Worker   return absl::GetFlag(FLAGS_selected_stream);
323*d9f75844SAndroid Build Coastguard Worker }
324*d9f75844SAndroid Build Coastguard Worker 
NumSpatialLayers()325*d9f75844SAndroid Build Coastguard Worker int NumSpatialLayers() {
326*d9f75844SAndroid Build Coastguard Worker   return absl::GetFlag(FLAGS_num_spatial_layers);
327*d9f75844SAndroid Build Coastguard Worker }
328*d9f75844SAndroid Build Coastguard Worker 
SelectedSL()329*d9f75844SAndroid Build Coastguard Worker int SelectedSL() {
330*d9f75844SAndroid Build Coastguard Worker   return absl::GetFlag(FLAGS_selected_sl);
331*d9f75844SAndroid Build Coastguard Worker }
332*d9f75844SAndroid Build Coastguard Worker 
Stream0()333*d9f75844SAndroid Build Coastguard Worker std::string Stream0() {
334*d9f75844SAndroid Build Coastguard Worker   return absl::GetFlag(FLAGS_stream0);
335*d9f75844SAndroid Build Coastguard Worker }
336*d9f75844SAndroid Build Coastguard Worker 
Stream1()337*d9f75844SAndroid Build Coastguard Worker std::string Stream1() {
338*d9f75844SAndroid Build Coastguard Worker   return absl::GetFlag(FLAGS_stream1);
339*d9f75844SAndroid Build Coastguard Worker }
340*d9f75844SAndroid Build Coastguard Worker 
SL0()341*d9f75844SAndroid Build Coastguard Worker std::string SL0() {
342*d9f75844SAndroid Build Coastguard Worker   return absl::GetFlag(FLAGS_sl0);
343*d9f75844SAndroid Build Coastguard Worker }
344*d9f75844SAndroid Build Coastguard Worker 
SL1()345*d9f75844SAndroid Build Coastguard Worker std::string SL1() {
346*d9f75844SAndroid Build Coastguard Worker   return absl::GetFlag(FLAGS_sl1);
347*d9f75844SAndroid Build Coastguard Worker }
348*d9f75844SAndroid Build Coastguard Worker 
SL2()349*d9f75844SAndroid Build Coastguard Worker std::string SL2() {
350*d9f75844SAndroid Build Coastguard Worker   return absl::GetFlag(FLAGS_sl2);
351*d9f75844SAndroid Build Coastguard Worker }
352*d9f75844SAndroid Build Coastguard Worker 
EncodedFramePath()353*d9f75844SAndroid Build Coastguard Worker std::string EncodedFramePath() {
354*d9f75844SAndroid Build Coastguard Worker   return absl::GetFlag(FLAGS_encoded_frame_path);
355*d9f75844SAndroid Build Coastguard Worker }
356*d9f75844SAndroid Build Coastguard Worker 
Clip()357*d9f75844SAndroid Build Coastguard Worker std::string Clip() {
358*d9f75844SAndroid Build Coastguard Worker   return absl::GetFlag(FLAGS_clip);
359*d9f75844SAndroid Build Coastguard Worker }
360*d9f75844SAndroid Build Coastguard Worker 
361*d9f75844SAndroid Build Coastguard Worker }  // namespace
362*d9f75844SAndroid Build Coastguard Worker 
Loopback()363*d9f75844SAndroid Build Coastguard Worker void Loopback() {
364*d9f75844SAndroid Build Coastguard Worker   BuiltInNetworkBehaviorConfig pipe_config;
365*d9f75844SAndroid Build Coastguard Worker   pipe_config.loss_percent = LossPercent();
366*d9f75844SAndroid Build Coastguard Worker   pipe_config.avg_burst_loss_length = AvgBurstLossLength();
367*d9f75844SAndroid Build Coastguard Worker   pipe_config.link_capacity_kbps = LinkCapacityKbps();
368*d9f75844SAndroid Build Coastguard Worker   pipe_config.queue_length_packets = QueueSize();
369*d9f75844SAndroid Build Coastguard Worker   pipe_config.queue_delay_ms = AvgPropagationDelayMs();
370*d9f75844SAndroid Build Coastguard Worker   pipe_config.delay_standard_deviation_ms = StdPropagationDelayMs();
371*d9f75844SAndroid Build Coastguard Worker   pipe_config.allow_reordering = absl::GetFlag(FLAGS_allow_reordering);
372*d9f75844SAndroid Build Coastguard Worker 
373*d9f75844SAndroid Build Coastguard Worker   BitrateConstraints call_bitrate_config;
374*d9f75844SAndroid Build Coastguard Worker   call_bitrate_config.min_bitrate_bps = MinBitrateKbps() * 1000;
375*d9f75844SAndroid Build Coastguard Worker   call_bitrate_config.start_bitrate_bps = StartBitrateKbps() * 1000;
376*d9f75844SAndroid Build Coastguard Worker   call_bitrate_config.max_bitrate_bps = -1;  // Don't cap bandwidth estimate.
377*d9f75844SAndroid Build Coastguard Worker 
378*d9f75844SAndroid Build Coastguard Worker   VideoQualityTest::Params params;
379*d9f75844SAndroid Build Coastguard Worker   params.call.send_side_bwe = absl::GetFlag(FLAGS_send_side_bwe);
380*d9f75844SAndroid Build Coastguard Worker   params.call.generic_descriptor = absl::GetFlag(FLAGS_generic_descriptor);
381*d9f75844SAndroid Build Coastguard Worker   params.call.call_bitrate_config = call_bitrate_config;
382*d9f75844SAndroid Build Coastguard Worker 
383*d9f75844SAndroid Build Coastguard Worker   params.video[0].enabled = absl::GetFlag(FLAGS_video);
384*d9f75844SAndroid Build Coastguard Worker   params.video[0].width = Width();
385*d9f75844SAndroid Build Coastguard Worker   params.video[0].height = Height();
386*d9f75844SAndroid Build Coastguard Worker   params.video[0].fps = Fps();
387*d9f75844SAndroid Build Coastguard Worker   params.video[0].min_bitrate_bps = MinBitrateKbps() * 1000;
388*d9f75844SAndroid Build Coastguard Worker   params.video[0].target_bitrate_bps = TargetBitrateKbps() * 1000;
389*d9f75844SAndroid Build Coastguard Worker   params.video[0].max_bitrate_bps = MaxBitrateKbps() * 1000;
390*d9f75844SAndroid Build Coastguard Worker   params.video[0].suspend_below_min_bitrate =
391*d9f75844SAndroid Build Coastguard Worker       absl::GetFlag(FLAGS_suspend_below_min_bitrate);
392*d9f75844SAndroid Build Coastguard Worker   params.video[0].codec = Codec();
393*d9f75844SAndroid Build Coastguard Worker   params.video[0].num_temporal_layers = NumTemporalLayers();
394*d9f75844SAndroid Build Coastguard Worker   params.video[0].selected_tl = SelectedTL();
395*d9f75844SAndroid Build Coastguard Worker   params.video[0].min_transmit_bps = 0;
396*d9f75844SAndroid Build Coastguard Worker   params.video[0].ulpfec = absl::GetFlag(FLAGS_use_ulpfec);
397*d9f75844SAndroid Build Coastguard Worker   params.video[0].flexfec = absl::GetFlag(FLAGS_use_flexfec);
398*d9f75844SAndroid Build Coastguard Worker   params.video[0].automatic_scaling = NumStreams() < 2;
399*d9f75844SAndroid Build Coastguard Worker   params.video[0].clip_path = Clip();
400*d9f75844SAndroid Build Coastguard Worker   params.video[0].capture_device_index = GetCaptureDevice();
401*d9f75844SAndroid Build Coastguard Worker   params.audio.enabled = absl::GetFlag(FLAGS_audio);
402*d9f75844SAndroid Build Coastguard Worker   params.audio.sync_video = absl::GetFlag(FLAGS_audio_video_sync);
403*d9f75844SAndroid Build Coastguard Worker   params.audio.dtx = absl::GetFlag(FLAGS_audio_dtx);
404*d9f75844SAndroid Build Coastguard Worker   params.audio.use_real_adm = absl::GetFlag(FLAGS_use_real_adm);
405*d9f75844SAndroid Build Coastguard Worker   params.logging.rtc_event_log_name = RtcEventLogName();
406*d9f75844SAndroid Build Coastguard Worker   params.logging.rtp_dump_name = RtpDumpName();
407*d9f75844SAndroid Build Coastguard Worker   params.logging.encoded_frame_base_path = EncodedFramePath();
408*d9f75844SAndroid Build Coastguard Worker   params.screenshare[0].enabled = false;
409*d9f75844SAndroid Build Coastguard Worker   params.analyzer.test_label = "video";
410*d9f75844SAndroid Build Coastguard Worker   params.analyzer.test_durations_secs = DurationSecs();
411*d9f75844SAndroid Build Coastguard Worker   params.analyzer.graph_data_output_filename = OutputFilename();
412*d9f75844SAndroid Build Coastguard Worker   params.analyzer.graph_title = GraphTitle();
413*d9f75844SAndroid Build Coastguard Worker   params.config = pipe_config;
414*d9f75844SAndroid Build Coastguard Worker 
415*d9f75844SAndroid Build Coastguard Worker   if (NumStreams() > 1 && Stream0().empty() && Stream1().empty()) {
416*d9f75844SAndroid Build Coastguard Worker     params.ss[0].infer_streams = true;
417*d9f75844SAndroid Build Coastguard Worker   }
418*d9f75844SAndroid Build Coastguard Worker 
419*d9f75844SAndroid Build Coastguard Worker   std::vector<std::string> stream_descriptors;
420*d9f75844SAndroid Build Coastguard Worker   stream_descriptors.push_back(Stream0());
421*d9f75844SAndroid Build Coastguard Worker   stream_descriptors.push_back(Stream1());
422*d9f75844SAndroid Build Coastguard Worker   std::vector<std::string> SL_descriptors;
423*d9f75844SAndroid Build Coastguard Worker   SL_descriptors.push_back(SL0());
424*d9f75844SAndroid Build Coastguard Worker   SL_descriptors.push_back(SL1());
425*d9f75844SAndroid Build Coastguard Worker   SL_descriptors.push_back(SL2());
426*d9f75844SAndroid Build Coastguard Worker   VideoQualityTest::FillScalabilitySettings(
427*d9f75844SAndroid Build Coastguard Worker       &params, 0, stream_descriptors, NumStreams(), SelectedStream(),
428*d9f75844SAndroid Build Coastguard Worker       NumSpatialLayers(), SelectedSL(), InterLayerPred(), SL_descriptors);
429*d9f75844SAndroid Build Coastguard Worker 
430*d9f75844SAndroid Build Coastguard Worker   auto fixture = std::make_unique<VideoQualityTest>(nullptr);
431*d9f75844SAndroid Build Coastguard Worker   if (DurationSecs()) {
432*d9f75844SAndroid Build Coastguard Worker     fixture->RunWithAnalyzer(params);
433*d9f75844SAndroid Build Coastguard Worker   } else {
434*d9f75844SAndroid Build Coastguard Worker     fixture->RunWithRenderers(params);
435*d9f75844SAndroid Build Coastguard Worker   }
436*d9f75844SAndroid Build Coastguard Worker }
437*d9f75844SAndroid Build Coastguard Worker 
RunLoopbackTest(int argc,char * argv[])438*d9f75844SAndroid Build Coastguard Worker int RunLoopbackTest(int argc, char* argv[]) {
439*d9f75844SAndroid Build Coastguard Worker   ::testing::InitGoogleTest(&argc, argv);
440*d9f75844SAndroid Build Coastguard Worker   absl::ParseCommandLine(argc, argv);
441*d9f75844SAndroid Build Coastguard Worker 
442*d9f75844SAndroid Build Coastguard Worker   rtc::LogMessage::SetLogToStderr(absl::GetFlag(FLAGS_logs));
443*d9f75844SAndroid Build Coastguard Worker 
444*d9f75844SAndroid Build Coastguard Worker   // InitFieldTrialsFromString stores the char*, so the char array must outlive
445*d9f75844SAndroid Build Coastguard Worker   // the application.
446*d9f75844SAndroid Build Coastguard Worker   const std::string field_trials = absl::GetFlag(FLAGS_force_fieldtrials);
447*d9f75844SAndroid Build Coastguard Worker   webrtc::field_trial::InitFieldTrialsFromString(field_trials.c_str());
448*d9f75844SAndroid Build Coastguard Worker 
449*d9f75844SAndroid Build Coastguard Worker   webrtc::test::RunTest(webrtc::Loopback);
450*d9f75844SAndroid Build Coastguard Worker   return 0;
451*d9f75844SAndroid Build Coastguard Worker }
452*d9f75844SAndroid Build Coastguard Worker }  // namespace webrtc
453