/*
 *  Copyright (c) 2016 The WebRTC project authors. All Rights Reserved.
 *
 *  Use of this source code is governed by a BSD-style license
 *  that can be found in the LICENSE file in the root of the source
 *  tree. An additional intellectual property rights grant can be found
 *  in the file PATENTS.  All contributing project authors may
 *  be found in the AUTHORS file in the root of the source tree.
 */

#include <stdio.h>
#include <string.h>
#include <iostream>
#include <map>
#include <memory>
#include <string>
#include <utility>

#include "logging/rtc_event_log/rtc_event_log.h"
#include "logging/rtc_event_log/rtc_event_log_parser.h"
#include "modules/audio_coding/neteq/include/neteq.h"
#include "modules/rtp_rtcp/source/rtcp_packet/report_block.h"
#include "rtc_base/checks.h"
#include "rtc_base/flags.h"
#include "rtc_tools/event_log_visualizer/analyzer.h"
#include "rtc_tools/event_log_visualizer/plot_base.h"
#include "rtc_tools/event_log_visualizer/plot_protobuf.h"
#include "rtc_tools/event_log_visualizer/plot_python.h"
#include "system_wrappers/include/field_trial.h"
#include "test/field_trial.h"
#include "test/testsupport/file_utils.h"

WEBRTC_DEFINE_string(
    plot_profile,
    "default",
    "A profile that selects a certain subset of the plots. Currently "
    "defined profiles are \"all\", \"none\", \"sendside_bwe\","
    "\"receiveside_bwe\" and \"default\"");

WEBRTC_DEFINE_bool(plot_incoming_packet_sizes,
                   false,
                   "Plot bar graph showing the size of each incoming packet.");
WEBRTC_DEFINE_bool(plot_outgoing_packet_sizes,
                   false,
                   "Plot bar graph showing the size of each outgoing packet.");
WEBRTC_DEFINE_bool(plot_incoming_rtcp_types,
                   false,
                   "Plot the RTCP block types for incoming RTCP packets.");
WEBRTC_DEFINE_bool(plot_outgoing_rtcp_types,
                   false,
                   "Plot the RTCP block types for outgoing RTCP packets.");
WEBRTC_DEFINE_bool(
    plot_incoming_packet_count,
    false,
    "Plot the accumulated number of packets for each incoming stream.");
WEBRTC_DEFINE_bool(
    plot_outgoing_packet_count,
    false,
    "Plot the accumulated number of packets for each outgoing stream.");
WEBRTC_DEFINE_bool(
    plot_audio_playout,
    false,
    "Plot bar graph showing the time between each audio playout.");
WEBRTC_DEFINE_bool(
    plot_audio_level,
    false,
    "Plot line graph showing the audio level of incoming audio.");
WEBRTC_DEFINE_bool(
    plot_incoming_sequence_number_delta,
    false,
    "Plot the sequence number difference between consecutive incoming "
    "packets.");
WEBRTC_DEFINE_bool(
    plot_incoming_delay,
    true,
    "Plot the 1-way path delay for incoming packets, normalized so "
    "that the first packet has delay 0.");
WEBRTC_DEFINE_bool(
    plot_incoming_loss_rate,
    true,
    "Compute the loss rate for incoming packets using a method that's "
    "similar to the one used for RTCP SR and RR fraction lost. Note "
    "that the loss rate can be negative if packets are duplicated or "
    "reordered.");
WEBRTC_DEFINE_bool(plot_incoming_bitrate,
                   true,
                   "Plot the total bitrate used by all incoming streams.");
WEBRTC_DEFINE_bool(plot_outgoing_bitrate,
                   true,
                   "Plot the total bitrate used by all outgoing streams.");
WEBRTC_DEFINE_bool(plot_incoming_stream_bitrate,
                   true,
                   "Plot the bitrate used by each incoming stream.");
WEBRTC_DEFINE_bool(plot_outgoing_stream_bitrate,
                   true,
                   "Plot the bitrate used by each outgoing stream.");
WEBRTC_DEFINE_bool(plot_incoming_layer_bitrate_allocation,
                   false,
                   "Plot the target bitrate for each incoming layer. Requires "
                   "incoming RTCP XR with target bitrate to be populated.");
WEBRTC_DEFINE_bool(plot_outgoing_layer_bitrate_allocation,
                   false,
                   "Plot the target bitrate for each outgoing layer. Requires "
                   "outgoing RTCP XR with target bitrate to be populated.");
WEBRTC_DEFINE_bool(
    plot_simulated_receiveside_bwe,
    false,
    "Run the receive-side bandwidth estimator with the incoming rtp "
    "packets and plot the resulting estimate.");
WEBRTC_DEFINE_bool(
    plot_simulated_sendside_bwe,
    false,
    "Run the send-side bandwidth estimator with the outgoing rtp and "
    "incoming rtcp and plot the resulting estimate.");
WEBRTC_DEFINE_bool(plot_simulated_goog_cc,
                   false,
                   "Run the GoogCC congestion controller based on the logged "
                   "events and plot the target bitrate.");
WEBRTC_DEFINE_bool(
    plot_network_delay_feedback,
    true,
    "Compute network delay based on sent packets and the received "
    "transport feedback.");
WEBRTC_DEFINE_bool(
    plot_fraction_loss_feedback,
    true,
    "Plot packet loss in percent for outgoing packets (as perceived by "
    "the send-side bandwidth estimator).");
WEBRTC_DEFINE_bool(
    plot_pacer_delay,
    false,
    "Plot the time each sent packet has spent in the pacer (based on "
    "the difference between the RTP timestamp and the send "
    "timestamp).");
WEBRTC_DEFINE_bool(
    plot_timestamps,
    false,
    "Plot the rtp timestamps of all rtp and rtcp packets over time.");
WEBRTC_DEFINE_bool(
    plot_rtcp_details,
    false,
    "Plot the contents of all report blocks in all sender and receiver "
    "reports. This includes fraction lost, cumulative number of lost "
    "packets, extended highest sequence number and time since last "
    "received SR.");
WEBRTC_DEFINE_bool(plot_audio_encoder_bitrate_bps,
                   false,
                   "Plot the audio encoder target bitrate.");
WEBRTC_DEFINE_bool(plot_audio_encoder_frame_length_ms,
                   false,
                   "Plot the audio encoder frame length.");
WEBRTC_DEFINE_bool(
    plot_audio_encoder_packet_loss,
    false,
    "Plot the uplink packet loss fraction which is sent to the audio encoder.");
WEBRTC_DEFINE_bool(plot_audio_encoder_fec,
                   false,
                   "Plot the audio encoder FEC.");
WEBRTC_DEFINE_bool(plot_audio_encoder_dtx,
                   false,
                   "Plot the audio encoder DTX.");
WEBRTC_DEFINE_bool(plot_audio_encoder_num_channels,
                   false,
                   "Plot the audio encoder number of channels.");
WEBRTC_DEFINE_bool(plot_neteq_stats, false, "Plot the NetEq statistics.");
WEBRTC_DEFINE_bool(plot_ice_candidate_pair_config,
                   false,
                   "Plot the ICE candidate pair config events.");
WEBRTC_DEFINE_bool(plot_ice_connectivity_check,
                   false,
                   "Plot the ICE candidate pair connectivity checks.");
WEBRTC_DEFINE_bool(plot_dtls_transport_state,
                   false,
                   "Plot DTLS transport state changes.");
WEBRTC_DEFINE_bool(plot_dtls_writable_state,
                   false,
                   "Plot DTLS writable state changes.");

WEBRTC_DEFINE_string(
    force_fieldtrials,
    "",
    "Field trials control experimental feature code which can be forced. "
    "E.g. running with --force_fieldtrials=WebRTC-FooFeature/Enabled/"
    " will assign the group Enabled to field trial WebRTC-FooFeature. Multiple "
    "trials are separated by \"/\"");
WEBRTC_DEFINE_string(wav_filename,
                     "",
                     "Path to wav file used for simulation of jitter buffer");
WEBRTC_DEFINE_bool(help, false, "prints this message");

WEBRTC_DEFINE_bool(
    show_detector_state,
    false,
    "Show the state of the delay based BWE detector on the total "
    "bitrate graph");

WEBRTC_DEFINE_bool(show_alr_state,
                   false,
                   "Show the state ALR state on the total bitrate graph");

WEBRTC_DEFINE_bool(
    parse_unconfigured_header_extensions,
    true,
    "Attempt to parse unconfigured header extensions using the default "
    "WebRTC mapping. This can give very misleading results if the "
    "application negotiates a different mapping.");

WEBRTC_DEFINE_bool(print_triage_alerts,
                   false,
                   "Print triage alerts, i.e. a list of potential problems.");

WEBRTC_DEFINE_bool(
    normalize_time,
    true,
    "Normalize the log timestamps so that the call starts at time 0.");

WEBRTC_DEFINE_bool(protobuf_output,
                   false,
                   "Output charts as protobuf instead of python code.");

void SetAllPlotFlags(bool setting);

int main(int argc, char* argv[]) {
  std::string program_name = argv[0];
  std::string usage =
      "A tool for visualizing WebRTC event logs.\n"
      "Example usage:\n" +
      program_name + " <logfile> | python\n" + "Run " + program_name +
      " --help for a list of command line options\n";

  // Parse command line flags without removing them. We're only interested in
  // the |plot_profile| flag.
  rtc::FlagList::SetFlagsFromCommandLine(&argc, argv, false);
  if (strcmp(FLAG_plot_profile, "all") == 0) {
    SetAllPlotFlags(true);
  } else if (strcmp(FLAG_plot_profile, "none") == 0) {
    SetAllPlotFlags(false);
  } else if (strcmp(FLAG_plot_profile, "sendside_bwe") == 0) {
    SetAllPlotFlags(false);
    FLAG_plot_outgoing_packet_sizes = true;
    FLAG_plot_outgoing_bitrate = true;
    FLAG_plot_outgoing_stream_bitrate = true;
    FLAG_plot_simulated_sendside_bwe = true;
    FLAG_plot_network_delay_feedback = true;
    FLAG_plot_fraction_loss_feedback = true;
  } else if (strcmp(FLAG_plot_profile, "receiveside_bwe") == 0) {
    SetAllPlotFlags(false);
    FLAG_plot_incoming_packet_sizes = true;
    FLAG_plot_incoming_delay = true;
    FLAG_plot_incoming_loss_rate = true;
    FLAG_plot_incoming_bitrate = true;
    FLAG_plot_incoming_stream_bitrate = true;
    FLAG_plot_simulated_receiveside_bwe = true;
  } else if (strcmp(FLAG_plot_profile, "default") == 0) {
    // Do nothing.
  } else {
    rtc::Flag* plot_profile_flag = rtc::FlagList::Lookup("plot_profile");
    RTC_CHECK(plot_profile_flag);
    plot_profile_flag->Print(false);
  }
  // Parse the remaining flags. They are applied relative to the chosen profile.
  rtc::FlagList::SetFlagsFromCommandLine(&argc, argv, true);

  if (argc != 2 || FLAG_help) {
    // Print usage information.
    std::cout << usage;
    if (FLAG_help)
      rtc::FlagList::Print(nullptr, false);
    return 0;
  }

  webrtc::test::ValidateFieldTrialsStringOrDie(FLAG_force_fieldtrials);
  // InitFieldTrialsFromString stores the char*, so the char array must outlive
  // the application.
  webrtc::field_trial::InitFieldTrialsFromString(FLAG_force_fieldtrials);

  std::string filename = argv[1];

  webrtc::ParsedRtcEventLog::UnconfiguredHeaderExtensions header_extensions =
      webrtc::ParsedRtcEventLog::UnconfiguredHeaderExtensions::kDontParse;
  if (FLAG_parse_unconfigured_header_extensions) {
    header_extensions = webrtc::ParsedRtcEventLog::
        UnconfiguredHeaderExtensions::kAttemptWebrtcDefaultConfig;
  }
  webrtc::ParsedRtcEventLog parsed_log(header_extensions);

  if (!parsed_log.ParseFile(filename)) {
    std::cerr << "Could not parse the entire log file." << std::endl;
    std::cerr << "Only the parsable events will be analyzed." << std::endl;
  }

  webrtc::EventLogAnalyzer analyzer(parsed_log, FLAG_normalize_time);
  std::unique_ptr<webrtc::PlotCollection> collection;
  if (FLAG_protobuf_output) {
    collection.reset(new webrtc::ProtobufPlotCollection());
  } else {
    collection.reset(new webrtc::PythonPlotCollection());
  }

  if (FLAG_plot_incoming_packet_sizes) {
    analyzer.CreatePacketGraph(webrtc::kIncomingPacket,
                               collection->AppendNewPlot());
  }
  if (FLAG_plot_outgoing_packet_sizes) {
    analyzer.CreatePacketGraph(webrtc::kOutgoingPacket,
                               collection->AppendNewPlot());
  }
  if (FLAG_plot_incoming_rtcp_types) {
    analyzer.CreateRtcpTypeGraph(webrtc::kIncomingPacket,
                                 collection->AppendNewPlot());
  }
  if (FLAG_plot_outgoing_rtcp_types) {
    analyzer.CreateRtcpTypeGraph(webrtc::kOutgoingPacket,
                                 collection->AppendNewPlot());
  }
  if (FLAG_plot_incoming_packet_count) {
    analyzer.CreateAccumulatedPacketsGraph(webrtc::kIncomingPacket,
                                           collection->AppendNewPlot());
  }
  if (FLAG_plot_outgoing_packet_count) {
    analyzer.CreateAccumulatedPacketsGraph(webrtc::kOutgoingPacket,
                                           collection->AppendNewPlot());
  }
  if (FLAG_plot_audio_playout) {
    analyzer.CreatePlayoutGraph(collection->AppendNewPlot());
  }
  if (FLAG_plot_audio_level) {
    analyzer.CreateAudioLevelGraph(webrtc::kIncomingPacket,
                                   collection->AppendNewPlot());
    analyzer.CreateAudioLevelGraph(webrtc::kOutgoingPacket,
                                   collection->AppendNewPlot());
  }
  if (FLAG_plot_incoming_sequence_number_delta) {
    analyzer.CreateSequenceNumberGraph(collection->AppendNewPlot());
  }
  if (FLAG_plot_incoming_delay) {
    analyzer.CreateIncomingDelayGraph(collection->AppendNewPlot());
  }
  if (FLAG_plot_incoming_loss_rate) {
    analyzer.CreateIncomingPacketLossGraph(collection->AppendNewPlot());
  }
  if (FLAG_plot_incoming_bitrate) {
    analyzer.CreateTotalIncomingBitrateGraph(collection->AppendNewPlot());
  }
  if (FLAG_plot_outgoing_bitrate) {
    analyzer.CreateTotalOutgoingBitrateGraph(collection->AppendNewPlot(),
                                             FLAG_show_detector_state,
                                             FLAG_show_alr_state);
  }
  if (FLAG_plot_incoming_stream_bitrate) {
    analyzer.CreateStreamBitrateGraph(webrtc::kIncomingPacket,
                                      collection->AppendNewPlot());
  }
  if (FLAG_plot_outgoing_stream_bitrate) {
    analyzer.CreateStreamBitrateGraph(webrtc::kOutgoingPacket,
                                      collection->AppendNewPlot());
  }
  if (FLAG_plot_incoming_layer_bitrate_allocation) {
    analyzer.CreateBitrateAllocationGraph(webrtc::kIncomingPacket,
                                          collection->AppendNewPlot());
  }
  if (FLAG_plot_outgoing_layer_bitrate_allocation) {
    analyzer.CreateBitrateAllocationGraph(webrtc::kOutgoingPacket,
                                          collection->AppendNewPlot());
  }
  if (FLAG_plot_simulated_receiveside_bwe) {
    analyzer.CreateReceiveSideBweSimulationGraph(collection->AppendNewPlot());
  }
  if (FLAG_plot_simulated_sendside_bwe) {
    analyzer.CreateSendSideBweSimulationGraph(collection->AppendNewPlot());
  }
  if (FLAG_plot_simulated_goog_cc) {
    analyzer.CreateGoogCcSimulationGraph(collection->AppendNewPlot());
  }
  if (FLAG_plot_network_delay_feedback) {
    analyzer.CreateNetworkDelayFeedbackGraph(collection->AppendNewPlot());
  }
  if (FLAG_plot_fraction_loss_feedback) {
    analyzer.CreateFractionLossGraph(collection->AppendNewPlot());
  }
  if (FLAG_plot_timestamps) {
    analyzer.CreateTimestampGraph(webrtc::kIncomingPacket,
                                  collection->AppendNewPlot());
    analyzer.CreateTimestampGraph(webrtc::kOutgoingPacket,
                                  collection->AppendNewPlot());
  }
  if (FLAG_plot_rtcp_details) {
    auto GetFractionLost = [](const webrtc::rtcp::ReportBlock& block) -> float {
      return static_cast<double>(block.fraction_lost()) / 256 * 100;
    };
    analyzer.CreateSenderAndReceiverReportPlot(
        webrtc::kIncomingPacket, GetFractionLost,
        "Fraction lost (incoming RTCP)", "Loss rate (percent)",
        collection->AppendNewPlot());
    analyzer.CreateSenderAndReceiverReportPlot(
        webrtc::kOutgoingPacket, GetFractionLost,
        "Fraction lost (outgoing RTCP)", "Loss rate (percent)",
        collection->AppendNewPlot());

    auto GetCumulativeLost =
        [](const webrtc::rtcp::ReportBlock& block) -> float {
      return block.cumulative_lost_signed();
    };
    analyzer.CreateSenderAndReceiverReportPlot(
        webrtc::kIncomingPacket, GetCumulativeLost,
        "Cumulative lost packets (incoming RTCP)", "Packets",
        collection->AppendNewPlot());
    analyzer.CreateSenderAndReceiverReportPlot(
        webrtc::kOutgoingPacket, GetCumulativeLost,
        "Cumulative lost packets (outgoing RTCP)", "Packets",
        collection->AppendNewPlot());

    auto GetHighestSeqNumber =
        [](const webrtc::rtcp::ReportBlock& block) -> float {
      return block.extended_high_seq_num();
    };
    analyzer.CreateSenderAndReceiverReportPlot(
        webrtc::kIncomingPacket, GetHighestSeqNumber,
        "Highest sequence number (incoming RTCP)", "Sequence number",
        collection->AppendNewPlot());
    analyzer.CreateSenderAndReceiverReportPlot(
        webrtc::kOutgoingPacket, GetHighestSeqNumber,
        "Highest sequence number (outgoing RTCP)", "Sequence number",
        collection->AppendNewPlot());

    auto DelaySinceLastSr =
        [](const webrtc::rtcp::ReportBlock& block) -> float {
      return static_cast<double>(block.delay_since_last_sr()) / 65536;
    };
    analyzer.CreateSenderAndReceiverReportPlot(
        webrtc::kIncomingPacket, DelaySinceLastSr,
        "Delay since last received sender report (incoming RTCP)", "Time (s)",
        collection->AppendNewPlot());
    analyzer.CreateSenderAndReceiverReportPlot(
        webrtc::kOutgoingPacket, DelaySinceLastSr,
        "Delay since last received sender report (outgoing RTCP)", "Time (s)",
        collection->AppendNewPlot());
  }

  if (FLAG_plot_pacer_delay) {
    analyzer.CreatePacerDelayGraph(collection->AppendNewPlot());
  }
  if (FLAG_plot_audio_encoder_bitrate_bps) {
    analyzer.CreateAudioEncoderTargetBitrateGraph(collection->AppendNewPlot());
  }
  if (FLAG_plot_audio_encoder_frame_length_ms) {
    analyzer.CreateAudioEncoderFrameLengthGraph(collection->AppendNewPlot());
  }
  if (FLAG_plot_audio_encoder_packet_loss) {
    analyzer.CreateAudioEncoderPacketLossGraph(collection->AppendNewPlot());
  }
  if (FLAG_plot_audio_encoder_fec) {
    analyzer.CreateAudioEncoderEnableFecGraph(collection->AppendNewPlot());
  }
  if (FLAG_plot_audio_encoder_dtx) {
    analyzer.CreateAudioEncoderEnableDtxGraph(collection->AppendNewPlot());
  }
  if (FLAG_plot_audio_encoder_num_channels) {
    analyzer.CreateAudioEncoderNumChannelsGraph(collection->AppendNewPlot());
  }
  if (FLAG_plot_neteq_stats) {
    std::string wav_path;
    if (FLAG_wav_filename[0] != '\0') {
      wav_path = FLAG_wav_filename;
    } else {
      wav_path = webrtc::test::ResourcePath(
          "audio_processing/conversational_speech/EN_script2_F_sp2_B1", "wav");
    }
    auto neteq_stats = analyzer.SimulateNetEq(wav_path, 48000);
    for (webrtc::EventLogAnalyzer::NetEqStatsGetterMap::const_iterator it =
             neteq_stats.cbegin();
         it != neteq_stats.cend(); ++it) {
      analyzer.CreateAudioJitterBufferGraph(it->first, it->second.get(),
                                            collection->AppendNewPlot());
    }
    analyzer.CreateNetEqNetworkStatsGraph(
        neteq_stats,
        [](const webrtc::NetEqNetworkStatistics& stats) {
          return stats.expand_rate / 16384.f;
        },
        "Expand rate", collection->AppendNewPlot());
    analyzer.CreateNetEqNetworkStatsGraph(
        neteq_stats,
        [](const webrtc::NetEqNetworkStatistics& stats) {
          return stats.speech_expand_rate / 16384.f;
        },
        "Speech expand rate", collection->AppendNewPlot());
    analyzer.CreateNetEqNetworkStatsGraph(
        neteq_stats,
        [](const webrtc::NetEqNetworkStatistics& stats) {
          return stats.accelerate_rate / 16384.f;
        },
        "Accelerate rate", collection->AppendNewPlot());
    analyzer.CreateNetEqNetworkStatsGraph(
        neteq_stats,
        [](const webrtc::NetEqNetworkStatistics& stats) {
          return stats.preemptive_rate / 16384.f;
        },
        "Preemptive rate", collection->AppendNewPlot());
    analyzer.CreateNetEqNetworkStatsGraph(
        neteq_stats,
        [](const webrtc::NetEqNetworkStatistics& stats) {
          return stats.packet_loss_rate / 16384.f;
        },
        "Packet loss rate", collection->AppendNewPlot());
    analyzer.CreateNetEqLifetimeStatsGraph(
        neteq_stats,
        [](const webrtc::NetEqLifetimeStatistics& stats) {
          return static_cast<float>(stats.concealment_events);
        },
        "Concealment events", collection->AppendNewPlot());
    analyzer.CreateNetEqNetworkStatsGraph(
        neteq_stats,
        [](const webrtc::NetEqNetworkStatistics& stats) {
          return stats.preferred_buffer_size_ms;
        },
        "Preferred buffer size (ms)", collection->AppendNewPlot());
  }

  if (FLAG_plot_ice_candidate_pair_config) {
    analyzer.CreateIceCandidatePairConfigGraph(collection->AppendNewPlot());
  }
  if (FLAG_plot_ice_connectivity_check) {
    analyzer.CreateIceConnectivityCheckGraph(collection->AppendNewPlot());
  }

  if (FLAG_plot_dtls_transport_state) {
    analyzer.CreateDtlsTransportStateGraph(collection->AppendNewPlot());
  }
  if (FLAG_plot_dtls_writable_state) {
    analyzer.CreateDtlsWritableStateGraph(collection->AppendNewPlot());
  }

  collection->Draw();

  if (FLAG_print_triage_alerts) {
    analyzer.CreateTriageNotifications();
    analyzer.PrintNotifications(stderr);
  }

  return 0;
}

void SetAllPlotFlags(bool setting) {
  FLAG_plot_incoming_packet_sizes = setting;
  FLAG_plot_outgoing_packet_sizes = setting;
  FLAG_plot_incoming_rtcp_types = setting;
  FLAG_plot_outgoing_rtcp_types = setting;
  FLAG_plot_incoming_packet_count = setting;
  FLAG_plot_outgoing_packet_count = setting;
  FLAG_plot_audio_playout = setting;
  FLAG_plot_audio_level = setting;
  FLAG_plot_incoming_sequence_number_delta = setting;
  FLAG_plot_incoming_delay = setting;
  FLAG_plot_incoming_loss_rate = setting;
  FLAG_plot_incoming_bitrate = setting;
  FLAG_plot_outgoing_bitrate = setting;
  FLAG_plot_incoming_stream_bitrate = setting;
  FLAG_plot_outgoing_stream_bitrate = setting;
  FLAG_plot_incoming_layer_bitrate_allocation = setting;
  FLAG_plot_outgoing_layer_bitrate_allocation = setting;
  FLAG_plot_simulated_receiveside_bwe = setting;
  FLAG_plot_simulated_sendside_bwe = setting;
  FLAG_plot_simulated_goog_cc = setting;
  FLAG_plot_network_delay_feedback = setting;
  FLAG_plot_fraction_loss_feedback = setting;
  FLAG_plot_timestamps = setting;
  FLAG_plot_rtcp_details = setting;
  FLAG_plot_audio_encoder_bitrate_bps = setting;
  FLAG_plot_audio_encoder_frame_length_ms = setting;
  FLAG_plot_audio_encoder_packet_loss = setting;
  FLAG_plot_audio_encoder_fec = setting;
  FLAG_plot_audio_encoder_dtx = setting;
  FLAG_plot_audio_encoder_num_channels = setting;
  FLAG_plot_neteq_stats = setting;
  FLAG_plot_ice_candidate_pair_config = setting;
  FLAG_plot_ice_connectivity_check = setting;
  FLAG_plot_pacer_delay = setting;
}
