| Index: webrtc/video/video_loopback.cc | 
| diff --git a/webrtc/video/video_loopback.cc b/webrtc/video/video_loopback.cc | 
| index 9656434f5c901396a65fceb4da1152411a01191e..0c06f85fccd9e109a32f48c5d7c614754ace7fa7 100644 | 
| --- a/webrtc/video/video_loopback.cc | 
| +++ b/webrtc/video/video_loopback.cc | 
| @@ -20,7 +20,6 @@ | 
| namespace webrtc { | 
| namespace flags { | 
|  | 
| -// Flags common with screenshare loopback, with different default values. | 
| DEFINE_int32(width, 640, "Video width."); | 
| size_t Width() { | 
| return static_cast<size_t>(FLAGS_width); | 
| @@ -56,43 +55,9 @@ | 
| return static_cast<int>(FLAGS_max_bitrate); | 
| } | 
|  | 
| -DEFINE_int32(num_temporal_layers, | 
| -             1, | 
| -             "Number of temporal layers. Set to 1-4 to override."); | 
| -int NumTemporalLayers() { | 
| -  return static_cast<int>(FLAGS_num_temporal_layers); | 
| -} | 
| - | 
| -// Flags common with screenshare loopback, with equal default values. | 
| DEFINE_string(codec, "VP8", "Video codec to use."); | 
| std::string Codec() { | 
| return static_cast<std::string>(FLAGS_codec); | 
| -} | 
| - | 
| -DEFINE_int32(selected_tl, | 
| -             -1, | 
| -             "Temporal layer to show or analyze. -1 to disable filtering."); | 
| -int SelectedTL() { | 
| -  return static_cast<int>(FLAGS_selected_tl); | 
| -} | 
| - | 
| -DEFINE_int32( | 
| -    duration, | 
| -    0, | 
| -    "Duration of the test in seconds. If 0, rendered will be shown instead."); | 
| -int DurationSecs() { | 
| -  return static_cast<int>(FLAGS_duration); | 
| -} | 
| - | 
| -DEFINE_string(output_filename, "", "Target graph data filename."); | 
| -std::string OutputFilename() { | 
| -  return static_cast<std::string>(FLAGS_output_filename); | 
| -} | 
| - | 
| -DEFINE_string( | 
| -    graph_title, "", "If empty, title will be generated automatically."); | 
| -std::string GraphTitle() { | 
| -  return static_cast<std::string>(FLAGS_graph_title); | 
| } | 
|  | 
| DEFINE_int32(loss_percent, 0, "Percentage of packets randomly lost."); | 
| @@ -126,52 +91,7 @@ | 
| return static_cast<int>(FLAGS_std_propagation_delay_ms); | 
| } | 
|  | 
| -DEFINE_int32(selected_stream, 0, "ID of the stream to show or analyze."); | 
| -int SelectedStream() { | 
| -  return static_cast<int>(FLAGS_selected_stream); | 
| -} | 
| - | 
| -DEFINE_int32(num_spatial_layers, 1, "Number of spatial layers to use."); | 
| -int NumSpatialLayers() { | 
| -  return static_cast<int>(FLAGS_num_spatial_layers); | 
| -} | 
| - | 
| -DEFINE_int32(selected_sl, | 
| -             -1, | 
| -             "Spatial layer to show or analyze. -1 to disable filtering."); | 
| -int SelectedSL() { | 
| -  return static_cast<int>(FLAGS_selected_sl); | 
| -} | 
| - | 
| -DEFINE_string(stream0, | 
| -              "", | 
| -              "Comma separated values describing VideoStream for stream #0."); | 
| -std::string Stream0() { | 
| -  return static_cast<std::string>(FLAGS_stream0); | 
| -} | 
| - | 
| -DEFINE_string(stream1, | 
| -              "", | 
| -              "Comma separated values describing VideoStream for stream #1."); | 
| -std::string Stream1() { | 
| -  return static_cast<std::string>(FLAGS_stream1); | 
| -} | 
| - | 
| -DEFINE_string( | 
| -    sl0, "", "Comma separated values describing SpatialLayer for layer #0."); | 
| -std::string SL0() { | 
| -  return static_cast<std::string>(FLAGS_sl0); | 
| -} | 
| - | 
| -DEFINE_string( | 
| -    sl1, "", "Comma separated values describing SpatialLayer for layer #1."); | 
| -std::string SL1() { | 
| -  return static_cast<std::string>(FLAGS_sl1); | 
| -} | 
| - | 
| DEFINE_bool(logs, false, "print logs to stderr"); | 
| - | 
| -DEFINE_bool(send_side_bwe, true, "Use send-side bandwidth estimation"); | 
|  | 
| DEFINE_string( | 
| force_fieldtrials, | 
| @@ -181,13 +101,42 @@ | 
| " will assign the group Enable to field trial WebRTC-FooFeature. Multiple " | 
| "trials are separated by \"/\""); | 
|  | 
| -// Video-specific flags. | 
| +DEFINE_int32(num_temporal_layers, | 
| +             1, | 
| +             "Number of temporal layers. Set to 1-4 to override."); | 
| +size_t NumTemporalLayers() { | 
| +  return static_cast<size_t>(FLAGS_num_temporal_layers); | 
| +} | 
| + | 
| +DEFINE_int32( | 
| +    tl_discard_threshold, | 
| +    0, | 
| +    "Discard TLs with id greater or equal the threshold. 0 to disable."); | 
| +size_t TLDiscardThreshold() { | 
| +  return static_cast<size_t>(FLAGS_tl_discard_threshold); | 
| +} | 
| + | 
| DEFINE_string(clip, | 
| "", | 
| "Name of the clip to show. If empty, using chroma generator."); | 
| std::string Clip() { | 
| return static_cast<std::string>(FLAGS_clip); | 
| } | 
| + | 
| +DEFINE_string( | 
| +    output_filename, | 
| +    "", | 
| +    "Name of a target graph data file. If set, no preview will be shown."); | 
| +std::string OutputFilename() { | 
| +  return static_cast<std::string>(FLAGS_output_filename); | 
| +} | 
| + | 
| +DEFINE_int32(duration, 60, "Duration of the test in seconds."); | 
| +int DurationSecs() { | 
| +  return static_cast<int>(FLAGS_duration); | 
| +} | 
| + | 
| +DEFINE_bool(send_side_bwe, true, "Use send-side bandwidth estimation"); | 
|  | 
| }  // namespace flags | 
|  | 
| @@ -204,35 +153,27 @@ | 
| call_bitrate_config.start_bitrate_bps = flags::StartBitrateKbps() * 1000; | 
| call_bitrate_config.max_bitrate_bps = flags::MaxBitrateKbps() * 1000; | 
|  | 
| +  std::string clip = flags::Clip(); | 
| +  std::string graph_title = clip.empty() ? "" : "video " + clip; | 
| VideoQualityTest::Params params{ | 
| {flags::Width(), flags::Height(), flags::Fps(), | 
| flags::MinBitrateKbps() * 1000, flags::TargetBitrateKbps() * 1000, | 
| flags::MaxBitrateKbps() * 1000, flags::Codec(), | 
| -       flags::NumTemporalLayers(), flags::SelectedTL(), | 
| +       flags::NumTemporalLayers(), | 
| 0,  // No min transmit bitrate. | 
| -       call_bitrate_config, flags::FLAGS_send_side_bwe}, | 
| -      {flags::Clip()}, | 
| +       call_bitrate_config, flags::TLDiscardThreshold(), | 
| +       flags::FLAGS_send_side_bwe}, | 
| +      {clip}, | 
| {},  // Screenshare specific. | 
| -      {"video", 0.0, 0.0, flags::DurationSecs(), flags::OutputFilename(), | 
| -       flags::GraphTitle()}, | 
| +      {graph_title, 0.0, 0.0, flags::DurationSecs(), flags::OutputFilename()}, | 
| pipe_config, | 
| flags::FLAGS_logs}; | 
|  | 
| -  std::vector<std::string> stream_descriptors; | 
| -  stream_descriptors.push_back(flags::Stream0()); | 
| -  stream_descriptors.push_back(flags::Stream1()); | 
| -  std::vector<std::string> SL_descriptors; | 
| -  SL_descriptors.push_back(flags::SL0()); | 
| -  SL_descriptors.push_back(flags::SL1()); | 
| -  VideoQualityTest::FillScalabilitySettings(¶ms, stream_descriptors, | 
| -      flags::SelectedStream(), flags::NumSpatialLayers(), flags::SelectedSL(), | 
| -      SL_descriptors); | 
| - | 
| VideoQualityTest test; | 
| -  if (flags::DurationSecs()) | 
| +  if (flags::OutputFilename().empty()) | 
| +    test.RunWithVideoRenderer(params); | 
| +  else | 
| test.RunWithAnalyzer(params); | 
| -  else | 
| -    test.RunWithVideoRenderer(params); | 
| } | 
| }  // namespace webrtc | 
|  | 
|  |