/*
 *  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 "rtc_tools/rtc_event_log_visualizer/analyzer.h"

#include <cstddef>
#include <memory>
#include <string>
#include <vector>

#include "absl/algorithm/container.h"
#include "absl/strings/string_view.h"
#include "api/environment/environment_factory.h"
#include "api/function_view.h"
#include "api/neteq/neteq.h"
#include "api/units/data_rate.h"
#include "api/units/time_delta.h"
#include "api/units/timestamp.h"
#include "logging/rtc_event_log/rtc_event_log_parser.h"
#include "modules/rtp_rtcp/source/rtcp_packet/report_block.h"
#include "rtc_base/logging.h"
#include "rtc_tools/rtc_event_log_visualizer/analyze_audio.h"
#include "rtc_tools/rtc_event_log_visualizer/analyze_bwe.h"
#include "rtc_tools/rtc_event_log_visualizer/analyze_connectivity.h"
#include "rtc_tools/rtc_event_log_visualizer/analyze_rtp_rtcp.h"
#include "rtc_tools/rtc_event_log_visualizer/analyzer_common.h"
#include "rtc_tools/rtc_event_log_visualizer/plot_base.h"

namespace webrtc {

EventLogAnalyzer::EventLogAnalyzer(const ParsedRtcEventLog& parsed_log,
                                   bool normalize_time)
    : parsed_log_(parsed_log),
      config_(CreateEnvironment(), parsed_log, normalize_time) {
  config_.window_duration_ = TimeDelta::Millis(250);
  config_.step_ = TimeDelta::Millis(10);
  if (config_.end_time_ < config_.begin_time_) {
    RTC_LOG(LS_WARNING) << "No useful events in the log.";
    config_.begin_time_ = config_.end_time_ = Timestamp::Zero();
  }
  neteq_simulator_ = std::make_unique<LazyNetEqSimulator>(parsed_log_, config_);

  if (parsed_log_.first_timestamp().IsFinite() &&
      parsed_log_.last_timestamp().IsFinite()) {
    RTC_LOG(LS_INFO) << "Log is "
                     << (parsed_log_.last_timestamp().ms() -
                         parsed_log_.first_timestamp().ms()) /
                            1000
                     << " seconds long.";
  }
}

EventLogAnalyzer::EventLogAnalyzer(const ParsedRtcEventLog& parsed_log,
                                   const AnalyzerConfig& config)
    : parsed_log_(parsed_log), config_(config) {
  neteq_simulator_ = std::make_unique<LazyNetEqSimulator>(parsed_log_, config_);
  if (parsed_log_.first_timestamp().IsFinite() &&
      parsed_log_.last_timestamp().IsFinite()) {
    RTC_LOG(LS_INFO) << "Log is "
                     << (parsed_log_.last_timestamp().ms() -
                         parsed_log_.first_timestamp().ms()) /
                            1000
                     << " seconds long.";
  }
}

EventLogAnalyzer::~EventLogAnalyzer() = default;

void EventLogAnalyzer::SetNetEqReplacementFile(
    absl::string_view replacement_file_name,
    int file_sample_rate_hz) {
  neteq_simulator_->SetReplacementAudioFile(replacement_file_name,
                                            file_sample_rate_hz);
}

void EventLogAnalyzer::CreateGraphsByName(const std::vector<std::string>& names,
                                          PlotCollection* collection) const {
  for (absl::string_view name : names) {
    auto plot = absl::c_find_if(plots_, [name](const PlotDeclaration& plot) {
      return plot.label == name;
    });
    if (plot != plots_.end()) {
      plot->plot_func(collection);
    }
  }
}

void EventLogAnalyzer::InitializeMapOfNamedGraphs(bool show_detector_state,
                                                  bool show_alr_state,
                                                  bool show_link_capacity) {
  plots_.RegisterPlot("incoming_packet_sizes", [this](Plot* plot) {
    this->CreatePacketGraph(kIncomingPacket, plot);
  });

  plots_.RegisterPlot("outgoing_packet_sizes", [this](Plot* plot) {
    this->CreatePacketGraph(kOutgoingPacket, plot);
  });
  plots_.RegisterPlot("incoming_rtcp_types", [this](Plot* plot) {
    this->CreateRtcpTypeGraph(kIncomingPacket, plot);
  });
  plots_.RegisterPlot("outgoing_rtcp_types", [this](Plot* plot) {
    this->CreateRtcpTypeGraph(kOutgoingPacket, plot);
  });
  plots_.RegisterPlot("incoming_packet_count", [this](Plot* plot) {
    this->CreateAccumulatedPacketsGraph(kIncomingPacket, plot);
  });
  plots_.RegisterPlot("outgoing_packet_count", [this](Plot* plot) {
    this->CreateAccumulatedPacketsGraph(kOutgoingPacket, plot);
  });
  plots_.RegisterPlot("incoming_packet_rate", [this](Plot* plot) {
    this->CreatePacketRateGraph(kIncomingPacket, plot);
  });
  plots_.RegisterPlot("outgoing_packet_rate", [this](Plot* plot) {
    this->CreatePacketRateGraph(kOutgoingPacket, plot);
  });
  plots_.RegisterPlot("total_incoming_packet_rate", [this](Plot* plot) {
    this->CreateTotalPacketRateGraph(kIncomingPacket, plot);
  });
  plots_.RegisterPlot("total_outgoing_packet_rate", [this](Plot* plot) {
    this->CreateTotalPacketRateGraph(kOutgoingPacket, plot);
  });
  plots_.RegisterPlot("audio_playout",
                      [this](Plot* plot) { this->CreatePlayoutGraph(plot); });

  plots_.RegisterPlot("neteq_set_minimum_delay", [this](Plot* plot) {
    this->CreateNetEqSetMinimumDelay(plot);
  });

  plots_.RegisterPlot("incoming_audio_level", [this](Plot* plot) {
    this->CreateAudioLevelGraph(kIncomingPacket, plot);
  });
  plots_.RegisterPlot("outgoing_audio_level", [this](Plot* plot) {
    this->CreateAudioLevelGraph(kOutgoingPacket, plot);
  });
  plots_.RegisterPlot("incoming_sequence_number_delta", [this](Plot* plot) {
    this->CreateSequenceNumberGraph(plot);
  });
  plots_.RegisterPlot("incoming_delay", [this](Plot* plot) {
    this->CreateIncomingDelayGraph(plot);
  });
  plots_.RegisterPlot("incoming_loss_rate", [this](Plot* plot) {
    this->CreateIncomingPacketLossGraph(plot);
  });
  plots_.RegisterPlot("incoming_bitrate", [this](Plot* plot) {
    this->CreateTotalIncomingBitrateGraph(plot);
  });
  plots_.RegisterPlot(
      "outgoing_bitrate", [this, show_detector_state, show_alr_state,
                           show_link_capacity](Plot* plot) {
        this->CreateTotalOutgoingBitrateGraph(
            plot, show_detector_state, show_alr_state, show_link_capacity);
      });
  plots_.RegisterPlot("incoming_stream_bitrate", [this](Plot* plot) {
    this->CreateStreamBitrateGraph(kIncomingPacket, plot);
  });
  plots_.RegisterPlot("outgoing_stream_bitrate", [this](Plot* plot) {
    this->CreateStreamBitrateGraph(kOutgoingPacket, plot);
  });
  plots_.RegisterPlot("incoming_layer_bitrate_allocation", [this](Plot* plot) {
    this->CreateBitrateAllocationGraph(kIncomingPacket, plot);
  });
  plots_.RegisterPlot("outgoing_layer_bitrate_allocation", [this](Plot* plot) {
    this->CreateBitrateAllocationGraph(kOutgoingPacket, plot);
  });
  plots_.RegisterPlot("simulated_receiveside_bwe", [this](Plot* plot) {
    this->CreateReceiveSideBweSimulationGraph(plot);
  });
  plots_.RegisterPlot("simulated_sendside_bwe", [this](Plot* plot) {
    this->CreateSendSideBweSimulationGraph(plot);
  });
  plots_.RegisterPlot("simulated_goog_cc", [this](Plot* plot) {
    this->CreateGoogCcSimulationGraph(plot);
  });
  plots_.RegisterPlot("simulated_scream_delay", [this](Plot* plot) {
    this->CreateScreamSimulationDelayGraph(plot);
  });
  plots_.RegisterPlot("simulated_scream_bitrates", [this](Plot* plot) {
    this->CreateScreamSimulationBitrateGraph(plot);
  });
  plots_.RegisterPlot("simulated_scream_ref_window", [this](Plot* plot) {
    this->CreateScreamSimulationRefWindowGraph(plot);
  });
  plots_.RegisterPlot("simulated_scream_ratios", [this](Plot* plot) {
    this->CreateScreamSimulationRatiosGraph(plot);
  });
  plots_.RegisterPlot("outgoing_loss", [this](Plot* plot) {
    this->CreateOutgoingLossRateGraph(plot);
  });
  plots_.RegisterPlot("outgoing_twcc_loss", [this](Plot* plot) {
    this->CreateOutgoingLossRateGraph(plot);
  });
  plots_.RegisterPlot("outgoing_ecn_feedback", [this](Plot* plot) {
    this->CreateOutgoingEcnFeedbackGraph(plot);
  });
  plots_.RegisterPlot("incoming_ecn_feedback", [this](Plot* plot) {
    this->CreateIncomingEcnFeedbackGraph(plot);
  });
  plots_.RegisterPlot("scream_ref_window", [this](Plot* plot) {
    this->CreateScreamRefWindowGraph(plot);
  });
  plots_.RegisterPlot("scream_delay_estimates", [this](Plot* plot) {
    this->CreateScreamDelayEstimateGraph(plot);
  });
  plots_.RegisterPlot("network_delay_feedback", [this](Plot* plot) {
    this->CreateNetworkDelayFeedbackGraph(plot);
  });
  plots_.RegisterPlot("fraction_loss_feedback", [this](Plot* plot) {
    this->CreateFractionLossGraph(plot);
  });
  plots_.RegisterPlot("incoming_timestamps", [this](Plot* plot) {
    this->CreateTimestampGraph(kIncomingPacket, plot);
  });
  plots_.RegisterPlot("outgoing_timestamps", [this](Plot* plot) {
    this->CreateTimestampGraph(kOutgoingPacket, plot);
  });

  plots_.RegisterPlot("incoming_rtcp_fraction_lost", [this](Plot* plot) {
    this->CreateSenderAndReceiverReportPlot(kIncomingPacket, GetFractionLost,
                                            "Fraction lost (incoming RTCP)",
                                            "Loss rate (percent)", plot);
  });
  plots_.RegisterPlot("outgoing_rtcp_fraction_lost", [this](Plot* plot) {
    this->CreateSenderAndReceiverReportPlot(kOutgoingPacket, GetFractionLost,
                                            "Fraction lost (outgoing RTCP)",
                                            "Loss rate (percent)", plot);
  });

  plots_.RegisterPlot("incoming_rtcp_cumulative_lost", [this](Plot* plot) {
    this->CreateSenderAndReceiverReportPlot(
        kIncomingPacket, GetCumulativeLost,
        "Cumulative lost packets (incoming RTCP)", "Packets", plot);
  });
  plots_.RegisterPlot("outgoing_rtcp_cumulative_lost", [this](Plot* plot) {
    this->CreateSenderAndReceiverReportPlot(
        kOutgoingPacket, GetCumulativeLost,
        "Cumulative lost packets (outgoing RTCP)", "Packets", plot);
  });

  plots_.RegisterPlot("incoming_rtcp_highest_seq_number", [this](Plot* plot) {
    this->CreateSenderAndReceiverReportPlot(
        kIncomingPacket, GetHighestSeqNumber,
        "Highest sequence number (incoming RTCP)", "Sequence number", plot);
  });
  plots_.RegisterPlot("outgoing_rtcp_highest_seq_number", [this](Plot* plot) {
    this->CreateSenderAndReceiverReportPlot(
        kOutgoingPacket, GetHighestSeqNumber,
        "Highest sequence number (outgoing RTCP)", "Sequence number", plot);
  });

  plots_.RegisterPlot("incoming_rtcp_delay_since_last_sr", [this](Plot* plot) {
    this->CreateSenderAndReceiverReportPlot(
        kIncomingPacket, DelaySinceLastSr,
        "Delay since last received sender report (incoming RTCP)", "Time (s)",
        plot);
  });
  plots_.RegisterPlot("outgoing_rtcp_delay_since_last_sr", [this](Plot* plot) {
    this->CreateSenderAndReceiverReportPlot(
        kOutgoingPacket, DelaySinceLastSr,
        "Delay since last received sender report (outgoing RTCP)", "Time (s)",
        plot);
  });

  plots_.RegisterPlot(
      "pacer_delay", [this](Plot* plot) { this->CreatePacerDelayGraph(plot); });

  plots_.RegisterPlot("audio_encoder_bitrate", [this](Plot* plot) {
    CreateAudioEncoderTargetBitrateGraph(this->parsed_log_, this->config_,
                                         plot);
  });
  plots_.RegisterPlot("audio_encoder_frame_length", [this](Plot* plot) {
    CreateAudioEncoderFrameLengthGraph(this->parsed_log_, this->config_, plot);
  });
  plots_.RegisterPlot("audio_encoder_packet_loss", [this](Plot* plot) {
    CreateAudioEncoderPacketLossGraph(this->parsed_log_, this->config_, plot);
  });
  plots_.RegisterPlot("audio_encoder_fec", [this](Plot* plot) {
    CreateAudioEncoderEnableFecGraph(this->parsed_log_, this->config_, plot);
  });
  plots_.RegisterPlot("audio_encoder_dtx", [this](Plot* plot) {
    CreateAudioEncoderEnableDtxGraph(this->parsed_log_, this->config_, plot);
  });
  plots_.RegisterPlot("audio_encoder_num_channels", [this](Plot* plot) {
    CreateAudioEncoderNumChannelsGraph(this->parsed_log_, this->config_, plot);
  });

  plots_.RegisterPlot("ice_candidate_pair_config", [this](Plot* plot) {
    this->CreateIceCandidatePairConfigGraph(plot);
  });
  plots_.RegisterPlot("ice_connectivity_check", [this](Plot* plot) {
    this->CreateIceConnectivityCheckGraph(plot);
  });
  plots_.RegisterPlot("dtls_transport_state", [this](Plot* plot) {
    this->CreateDtlsTransportStateGraph(plot);
  });
  plots_.RegisterPlot("dtls_writable_state", [this](Plot* plot) {
    this->CreateDtlsWritableStateGraph(plot);
  });
  plots_.RegisterPlot(
      "simulated_neteq_expand_rate", [this](PlotCollection* collection) {
        CreateNetEqNetworkStatsGraph(
            parsed_log_, config_, neteq_simulator_->GetStats(),
            [](const NetEqNetworkStatistics& stats) {
              return stats.expand_rate / 16384.f;
            },
            "Expand rate",
            collection->AppendNewPlot("simulated_neteq_expand_rate"));
      });
  plots_.RegisterPlot(
      "simulated_neteq_speech_expand_rate", [this](PlotCollection* collection) {
        CreateNetEqNetworkStatsGraph(
            parsed_log_, config_, neteq_simulator_->GetStats(),
            [](const NetEqNetworkStatistics& stats) {
              return stats.speech_expand_rate / 16384.f;
            },
            "Speech expand rate",
            collection->AppendNewPlot("simulated_neteq_speech_expand_rate"));
      });
  plots_.RegisterPlot(
      "simulated_neteq_accelerate_rate", [this](PlotCollection* collection) {
        CreateNetEqNetworkStatsGraph(
            parsed_log_, config_, neteq_simulator_->GetStats(),
            [](const NetEqNetworkStatistics& stats) {
              return stats.accelerate_rate / 16384.f;
            },
            "Accelerate rate",
            collection->AppendNewPlot("simulated_neteq_accelerate_rate"));
      });
  plots_.RegisterPlot(
      "simulated_neteq_preemptive_rate", [this](PlotCollection* collection) {
        CreateNetEqNetworkStatsGraph(
            parsed_log_, config_, neteq_simulator_->GetStats(),
            [](const NetEqNetworkStatistics& stats) {
              return stats.preemptive_rate / 16384.f;
            },
            "Preemptive rate",
            collection->AppendNewPlot("simulated_neteq_preemptive_rate"));
      });
  plots_.RegisterPlot(
      "simulated_neteq_concealment_events", [this](PlotCollection* collection) {
        CreateNetEqLifetimeStatsGraph(
            parsed_log_, config_, neteq_simulator_->GetStats(),
            [](const NetEqLifetimeStatistics& stats) {
              return static_cast<float>(stats.concealment_events);
            },
            "Concealment events",
            collection->AppendNewPlot("simulated_neteq_concealment_events"));
      });
  plots_.RegisterPlot(
      "simulated_neteq_preferred_buffer_size",
      [this](PlotCollection* collection) {
        CreateNetEqNetworkStatsGraph(
            parsed_log_, config_, neteq_simulator_->GetStats(),
            [](const NetEqNetworkStatistics& stats) {
              return stats.preferred_buffer_size_ms;
            },
            "Preferred buffer size (ms)",
            collection->AppendNewPlot("simulated_neteq_preferred_buffer_size"));
      });
  plots_.RegisterPlot(
      "simulated_neteq_jitter_buffer_delay",
      [this](PlotCollection* collection) {
        for (const auto& st : neteq_simulator_->GetStats()) {
          CreateAudioJitterBufferGraph(
              parsed_log_, config_, st.first, st.second.get(),
              collection->AppendNewPlot("simulated_neteq_jitter_buffer_delay"));
        }
      });
}
void EventLogAnalyzer::CreatePlayoutGraph(Plot* plot) const {
  webrtc::CreatePlayoutGraph(parsed_log_, config_, plot);
}

void EventLogAnalyzer::CreateNetEqSetMinimumDelay(Plot* plot) const {
  webrtc::CreateNetEqSetMinimumDelay(parsed_log_, config_, plot);
}

void EventLogAnalyzer::CreateAudioLevelGraph(PacketDirection direction,
                                             Plot* plot) const {
  webrtc::CreateAudioLevelGraph(parsed_log_, config_, direction, plot);
}

void EventLogAnalyzer::CreateIncomingDelayGraph(Plot* plot) const {
  webrtc::CreateIncomingDelayGraph(parsed_log_, config_, plot);
}

void EventLogAnalyzer::CreateFractionLossGraph(Plot* plot) const {
  webrtc::CreateFractionLossGraph(parsed_log_, config_, plot);
}

void EventLogAnalyzer::CreateTotalIncomingBitrateGraph(Plot* plot) const {
  webrtc::CreateTotalIncomingBitrateGraph(parsed_log_, config_, plot);
}

void EventLogAnalyzer::CreateTotalOutgoingBitrateGraph(
    Plot* plot,
    bool show_detector_state,
    bool show_alr_state,
    bool show_link_capacity) const {
  webrtc::CreateTotalOutgoingBitrateGraph(parsed_log_, config_, plot,
                                          show_detector_state, show_alr_state,
                                          show_link_capacity);
}

void EventLogAnalyzer::CreateGoogCcSimulationGraph(Plot* plot) const {
  webrtc::CreateGoogCcSimulationGraph(parsed_log_, config_, plot);
}

void EventLogAnalyzer::CreateScreamSimulationDelayGraph(Plot* plot) const {
  webrtc::CreateScreamSimulationDelayGraph(parsed_log_, config_, plot);
}

void EventLogAnalyzer::CreateScreamSimulationBitrateGraph(Plot* plot) const {
  webrtc::CreateScreamSimulationBitrateGraph(parsed_log_, config_, plot);
}

void EventLogAnalyzer::CreateScreamSimulationRefWindowGraph(Plot* plot) const {
  webrtc::CreateScreamSimulationRefWindowGraph(parsed_log_, config_, plot);
}

void EventLogAnalyzer::CreateScreamSimulationRatiosGraph(Plot* plot) const {
  webrtc::CreateScreamSimulationRatiosGraph(parsed_log_, config_, plot);
}

void EventLogAnalyzer::CreateScreamRefWindowGraph(Plot* plot) const {
  webrtc::CreateScreamRefWindowGraph(parsed_log_, config_, plot);
}

void EventLogAnalyzer::CreateScreamDelayEstimateGraph(Plot* plot) const {
  webrtc::CreateScreamDelayEstimateGraph(parsed_log_, config_, plot);
}

void EventLogAnalyzer::CreateSendSideBweSimulationGraph(Plot* plot) const {
  webrtc::CreateSendSideBweSimulationGraph(parsed_log_, config_, plot);
}

void EventLogAnalyzer::CreateReceiveSideBweSimulationGraph(Plot* plot) const {
  webrtc::CreateReceiveSideBweSimulationGraph(parsed_log_, config_, plot);
}

void EventLogAnalyzer::CreateNetworkDelayFeedbackGraph(Plot* plot) const {
  webrtc::CreateNetworkDelayFeedbackGraph(parsed_log_, config_, plot);
}

void EventLogAnalyzer::CreatePacerDelayGraph(Plot* plot) const {
  webrtc::CreatePacerDelayGraph(parsed_log_, config_, plot);
}

void EventLogAnalyzer::CreateIceCandidatePairConfigGraph(Plot* plot) const {
  webrtc::CreateIceCandidatePairConfigGraph(parsed_log_, config_, plot);
}

void EventLogAnalyzer::CreateIceConnectivityCheckGraph(Plot* plot) const {
  webrtc::CreateIceConnectivityCheckGraph(parsed_log_, config_, plot);
}

void EventLogAnalyzer::CreateDtlsTransportStateGraph(Plot* plot) const {
  webrtc::CreateDtlsTransportStateGraph(parsed_log_, config_, plot);
}

void EventLogAnalyzer::CreateDtlsWritableStateGraph(Plot* plot) const {
  webrtc::CreateDtlsWritableStateGraph(parsed_log_, config_, plot);
}

void EventLogAnalyzer::CreatePacketGraph(PacketDirection direction,
                                         Plot* plot) const {
  webrtc::CreatePacketGraph(direction, parsed_log_, config_, plot);
}

void EventLogAnalyzer::CreateRtcpTypeGraph(PacketDirection direction,
                                           Plot* plot) const {
  webrtc::CreateRtcpTypeGraph(direction, parsed_log_, config_, plot);
}

void EventLogAnalyzer::CreateAccumulatedPacketsGraph(PacketDirection direction,
                                                     Plot* plot) const {
  webrtc::CreateAccumulatedPacketsGraph(direction, parsed_log_, config_, plot);
}

void EventLogAnalyzer::CreatePacketRateGraph(PacketDirection direction,
                                             Plot* plot) const {
  webrtc::CreatePacketRateGraph(direction, parsed_log_, config_, plot);
}

void EventLogAnalyzer::CreateTotalPacketRateGraph(PacketDirection direction,
                                                  Plot* plot) const {
  webrtc::CreateTotalPacketRateGraph(direction, parsed_log_, config_, plot);
}

void EventLogAnalyzer::CreateSequenceNumberGraph(Plot* plot) const {
  webrtc::CreateSequenceNumberGraph(parsed_log_, config_, plot);
}

void EventLogAnalyzer::CreateIncomingPacketLossGraph(Plot* plot) const {
  webrtc::CreateIncomingPacketLossGraph(parsed_log_, config_, plot);
}

void EventLogAnalyzer::CreateStreamBitrateGraph(PacketDirection direction,
                                                Plot* plot) const {
  webrtc::CreateStreamBitrateGraph(direction, parsed_log_, config_, plot);
}

void EventLogAnalyzer::CreateBitrateAllocationGraph(PacketDirection direction,
                                                    Plot* plot) const {
  webrtc::CreateBitrateAllocationGraph(direction, parsed_log_, config_, plot);
}

void EventLogAnalyzer::CreateOutgoingEcnFeedbackGraph(Plot* plot) const {
  webrtc::CreateOutgoingEcnFeedbackGraph(parsed_log_, config_, plot);
}

void EventLogAnalyzer::CreateIncomingEcnFeedbackGraph(Plot* plot) const {
  webrtc::CreateIncomingEcnFeedbackGraph(parsed_log_, config_, plot);
}

void EventLogAnalyzer::CreateOutgoingLossRateGraph(Plot* plot) const {
  webrtc::CreateOutgoingLossRateGraph(parsed_log_, config_, plot);
}

void EventLogAnalyzer::CreateTimestampGraph(PacketDirection direction,
                                            Plot* plot) const {
  webrtc::CreateTimestampGraph(direction, parsed_log_, config_, plot);
}

void EventLogAnalyzer::CreateSenderAndReceiverReportPlot(
    PacketDirection direction,
    FunctionView<float(const rtcp::ReportBlock&)> fy,
    std::string title,
    std::string yaxis_label,
    Plot* plot) const {
  webrtc::CreateSenderAndReceiverReportPlot(direction, fy, title, yaxis_label,
                                            parsed_log_, config_, plot);
}

}  // namespace webrtc
