| Index: webrtc/tools/event_log_visualizer/analyzer.cc
 | 
| diff --git a/webrtc/tools/event_log_visualizer/analyzer.cc b/webrtc/tools/event_log_visualizer/analyzer.cc
 | 
| index d44d7a6f8774d249484f1ea7529c1bfcae38a414..fa772d705fb77cc5ebeb2e42565be8d57a7ed8d9 100644
 | 
| --- a/webrtc/tools/event_log_visualizer/analyzer.cc
 | 
| +++ b/webrtc/tools/event_log_visualizer/analyzer.cc
 | 
| @@ -572,9 +572,7 @@ void EventLogAnalyzer::CreatePacketGraph(PacketDirection desired_direction,
 | 
|        continue;
 | 
|      }
 | 
|  
 | 
| -    TimeSeries time_series;
 | 
| -    time_series.label = GetStreamName(stream_id);
 | 
| -    time_series.style = BAR_GRAPH;
 | 
| +    TimeSeries time_series(GetStreamName(stream_id), BAR_GRAPH);
 | 
|      ProcessPoints<LoggedRtpPacket>(
 | 
|          [](const LoggedRtpPacket& packet) -> rtc::Optional<float> {
 | 
|            return rtc::Optional<float>(packet.total_length);
 | 
| @@ -608,10 +606,8 @@ void EventLogAnalyzer::CreateAccumulatedPacketsTimeSeries(
 | 
|        continue;
 | 
|      }
 | 
|  
 | 
| -    TimeSeries time_series;
 | 
| -    time_series.label = label_prefix + " " + GetStreamName(stream_id);
 | 
| -    time_series.style = LINE_STEP_GRAPH;
 | 
| -
 | 
| +    std::string label = label_prefix + " " + GetStreamName(stream_id);
 | 
| +    TimeSeries time_series(label, LINE_STEP_GRAPH);
 | 
|      for (size_t i = 0; i < packet_stream.size(); i++) {
 | 
|        float x = static_cast<float>(packet_stream[i].timestamp - begin_time_) /
 | 
|                  1000000;
 | 
| @@ -722,9 +718,7 @@ void EventLogAnalyzer::CreateSequenceNumberGraph(Plot* plot) {
 | 
|        continue;
 | 
|      }
 | 
|  
 | 
| -    TimeSeries time_series;
 | 
| -    time_series.label = GetStreamName(stream_id);
 | 
| -    time_series.style = BAR_GRAPH;
 | 
| +    TimeSeries time_series(GetStreamName(stream_id), BAR_GRAPH);
 | 
|      ProcessPairs<LoggedRtpPacket, float>(
 | 
|          [](const LoggedRtpPacket& old_packet,
 | 
|             const LoggedRtpPacket& new_packet) {
 | 
| @@ -754,9 +748,7 @@ void EventLogAnalyzer::CreateIncomingPacketLossGraph(Plot* plot) {
 | 
|        continue;
 | 
|      }
 | 
|  
 | 
| -    TimeSeries time_series;
 | 
| -    time_series.label = GetStreamName(stream_id);
 | 
| -    time_series.style = LINE_DOT_GRAPH;
 | 
| +    TimeSeries time_series(GetStreamName(stream_id), LINE_DOT_GRAPH);
 | 
|      const uint64_t kWindowUs = 1000000;
 | 
|      const uint64_t kStep = 1000000;
 | 
|      SequenceNumberUnwrapper unwrapper_;
 | 
| @@ -814,17 +806,15 @@ void EventLogAnalyzer::CreateDelayChangeGraph(Plot* plot) {
 | 
|        continue;
 | 
|      }
 | 
|  
 | 
| -    TimeSeries capture_time_data;
 | 
| -    capture_time_data.label = GetStreamName(stream_id) + " capture-time";
 | 
| -    capture_time_data.style = BAR_GRAPH;
 | 
| +    TimeSeries capture_time_data(GetStreamName(stream_id) + " capture-time",
 | 
| +                                 BAR_GRAPH);
 | 
|      ProcessPairs<LoggedRtpPacket, double>(NetworkDelayDiff_CaptureTime,
 | 
|                                            packet_stream, begin_time_,
 | 
|                                            &capture_time_data);
 | 
|      plot->series_list_.push_back(std::move(capture_time_data));
 | 
|  
 | 
| -    TimeSeries send_time_data;
 | 
| -    send_time_data.label = GetStreamName(stream_id) + " abs-send-time";
 | 
| -    send_time_data.style = BAR_GRAPH;
 | 
| +    TimeSeries send_time_data(GetStreamName(stream_id) + " abs-send-time",
 | 
| +                              BAR_GRAPH);
 | 
|      ProcessPairs<LoggedRtpPacket, double>(NetworkDelayDiff_AbsSendTime,
 | 
|                                            packet_stream, begin_time_,
 | 
|                                            &send_time_data);
 | 
| @@ -849,17 +839,15 @@ void EventLogAnalyzer::CreateAccumulatedDelayChangeGraph(Plot* plot) {
 | 
|        continue;
 | 
|      }
 | 
|  
 | 
| -    TimeSeries capture_time_data;
 | 
| -    capture_time_data.label = GetStreamName(stream_id) + " capture-time";
 | 
| -    capture_time_data.style = LINE_GRAPH;
 | 
| +    TimeSeries capture_time_data(GetStreamName(stream_id) + " capture-time",
 | 
| +                                 LINE_GRAPH);
 | 
|      AccumulatePairs<LoggedRtpPacket, double>(NetworkDelayDiff_CaptureTime,
 | 
|                                               packet_stream, begin_time_,
 | 
|                                               &capture_time_data);
 | 
|      plot->series_list_.push_back(std::move(capture_time_data));
 | 
|  
 | 
| -    TimeSeries send_time_data;
 | 
| -    send_time_data.label = GetStreamName(stream_id) + " abs-send-time";
 | 
| -    send_time_data.style = LINE_GRAPH;
 | 
| +    TimeSeries send_time_data(GetStreamName(stream_id) + " abs-send-time",
 | 
| +                              LINE_GRAPH);
 | 
|      AccumulatePairs<LoggedRtpPacket, double>(NetworkDelayDiff_AbsSendTime,
 | 
|                                               packet_stream, begin_time_,
 | 
|                                               &send_time_data);
 | 
| @@ -874,14 +862,13 @@ void EventLogAnalyzer::CreateAccumulatedDelayChangeGraph(Plot* plot) {
 | 
|  
 | 
|  // Plot the fraction of packets lost (as perceived by the loss-based BWE).
 | 
|  void EventLogAnalyzer::CreateFractionLossGraph(Plot* plot) {
 | 
| -  plot->series_list_.push_back(TimeSeries());
 | 
| +  TimeSeries* time_series =
 | 
| +      plot->AddTimeSeries("Fraction lost", LINE_DOT_GRAPH);
 | 
|    for (auto& bwe_update : bwe_loss_updates_) {
 | 
|      float x = static_cast<float>(bwe_update.timestamp - begin_time_) / 1000000;
 | 
|      float y = static_cast<float>(bwe_update.fraction_loss) / 255 * 100;
 | 
| -    plot->series_list_.back().points.emplace_back(x, y);
 | 
| +    time_series->points.emplace_back(x, y);
 | 
|    }
 | 
| -  plot->series_list_.back().label = "Fraction lost";
 | 
| -  plot->series_list_.back().style = LINE_DOT_GRAPH;
 | 
|  
 | 
|    plot->SetXAxis(0, call_duration_s_, "Time (s)", kLeftMargin, kRightMargin);
 | 
|    plot->SetSuggestedYAxis(0, 10, "Percent lost packets", kBottomMargin,
 | 
| @@ -921,7 +908,7 @@ void EventLogAnalyzer::CreateTotalBitrateGraph(
 | 
|    size_t bytes_in_window = 0;
 | 
|  
 | 
|    // Calculate a moving average of the bitrate and store in a TimeSeries.
 | 
| -  plot->series_list_.push_back(TimeSeries());
 | 
| +  TimeSeries* time_series = plot->AddTimeSeries("Bitrate", LINE_GRAPH);
 | 
|    for (uint64_t time = begin_time_; time < end_time_ + step_; time += step_) {
 | 
|      while (window_index_end < packets.size() &&
 | 
|             packets[window_index_end].timestamp < time) {
 | 
| @@ -938,28 +925,19 @@ void EventLogAnalyzer::CreateTotalBitrateGraph(
 | 
|          static_cast<float>(window_duration_) / 1000000;
 | 
|      float x = static_cast<float>(time - begin_time_) / 1000000;
 | 
|      float y = bytes_in_window * 8 / window_duration_in_seconds / 1000;
 | 
| -    plot->series_list_.back().points.push_back(TimeSeriesPoint(x, y));
 | 
| -  }
 | 
| -
 | 
| -  // Set labels.
 | 
| -  if (desired_direction == webrtc::PacketDirection::kIncomingPacket) {
 | 
| -    plot->series_list_.back().label = "Incoming bitrate";
 | 
| -  } else if (desired_direction == webrtc::PacketDirection::kOutgoingPacket) {
 | 
| -    plot->series_list_.back().label = "Outgoing bitrate";
 | 
| +    time_series->points.emplace_back(x, y);
 | 
|    }
 | 
| -  plot->series_list_.back().style = LINE_GRAPH;
 | 
|  
 | 
|    // Overlay the send-side bandwidth estimate over the outgoing bitrate.
 | 
|    if (desired_direction == kOutgoingPacket) {
 | 
| -    plot->series_list_.push_back(TimeSeries());
 | 
| +    TimeSeries* time_series =
 | 
| +        plot->AddTimeSeries("Loss-based estimate", LINE_STEP_GRAPH);
 | 
|      for (auto& bwe_update : bwe_loss_updates_) {
 | 
|        float x =
 | 
|            static_cast<float>(bwe_update.timestamp - begin_time_) / 1000000;
 | 
|        float y = static_cast<float>(bwe_update.new_bitrate) / 1000;
 | 
| -      plot->series_list_.back().points.emplace_back(x, y);
 | 
| +      time_series->points.emplace_back(x, y);
 | 
|      }
 | 
| -    plot->series_list_.back().label = "Loss-based estimate";
 | 
| -    plot->series_list_.back().style = LINE_STEP_GRAPH;
 | 
|    }
 | 
|    plot->SetXAxis(0, call_duration_s_, "Time (s)", kLeftMargin, kRightMargin);
 | 
|    plot->SetSuggestedYAxis(0, 1, "Bitrate (kbps)", kBottomMargin, kTopMargin);
 | 
| @@ -983,9 +961,7 @@ void EventLogAnalyzer::CreateStreamBitrateGraph(
 | 
|        continue;
 | 
|      }
 | 
|  
 | 
| -    TimeSeries time_series;
 | 
| -    time_series.label = GetStreamName(stream_id);
 | 
| -    time_series.style = LINE_GRAPH;
 | 
| +    TimeSeries time_series(GetStreamName(stream_id), LINE_GRAPH);
 | 
|      MovingAverage<LoggedRtpPacket, double>(
 | 
|          [](const LoggedRtpPacket& packet) {
 | 
|            return rtc::Optional<double>(packet.total_length * 8.0 / 1000.0);
 | 
| @@ -1033,12 +1009,8 @@ void EventLogAnalyzer::CreateBweSimulationGraph(Plot* plot) {
 | 
|    static const uint32_t kDefaultStartBitrateBps = 300000;
 | 
|    cc.SetBweBitrates(0, kDefaultStartBitrateBps, -1);
 | 
|  
 | 
| -  TimeSeries time_series;
 | 
| -  time_series.label = "Delay-based estimate";
 | 
| -  time_series.style = LINE_DOT_GRAPH;
 | 
| -  TimeSeries acked_time_series;
 | 
| -  acked_time_series.label = "Acked bitrate";
 | 
| -  acked_time_series.style = LINE_DOT_GRAPH;
 | 
| +  TimeSeries time_series("Delay-based estimate", LINE_DOT_GRAPH);
 | 
| +  TimeSeries acked_time_series("Acked bitrate", LINE_DOT_GRAPH);
 | 
|  
 | 
|    auto rtp_iterator = outgoing_rtp.begin();
 | 
|    auto rtcp_iterator = incoming_rtcp.begin();
 | 
| @@ -1151,9 +1123,7 @@ void EventLogAnalyzer::CreateNetworkDelayFeedbackGraph(Plot* plot) {
 | 
|    SimulatedClock clock(0);
 | 
|    TransportFeedbackAdapter feedback_adapter(&clock);
 | 
|  
 | 
| -  TimeSeries time_series;
 | 
| -  time_series.label = "Network Delay Change";
 | 
| -  time_series.style = LINE_DOT_GRAPH;
 | 
| +  TimeSeries time_series("Network Delay Change", LINE_DOT_GRAPH);
 | 
|    int64_t estimated_base_delay_ms = std::numeric_limits<int64_t>::max();
 | 
|  
 | 
|    auto rtp_iterator = outgoing_rtp.begin();
 | 
| @@ -1254,9 +1224,8 @@ void EventLogAnalyzer::CreateTimestampGraph(Plot* plot) {
 | 
|      StreamId stream_id = kv.first;
 | 
|  
 | 
|      {
 | 
| -      TimeSeries timestamp_data;
 | 
| -      timestamp_data.label = GetStreamName(stream_id) + " capture-time";
 | 
| -      timestamp_data.style = LINE_DOT_GRAPH;
 | 
| +      TimeSeries timestamp_data(GetStreamName(stream_id) + " capture-time",
 | 
| +                                LINE_DOT_GRAPH);
 | 
|        for (LoggedRtpPacket packet : rtp_packets) {
 | 
|          float x = static_cast<float>(packet.timestamp - begin_time_) / 1000000;
 | 
|          float y = packet.header.timestamp;
 | 
| @@ -1269,9 +1238,8 @@ void EventLogAnalyzer::CreateTimestampGraph(Plot* plot) {
 | 
|        auto kv = rtcp_packets_.find(stream_id);
 | 
|        if (kv != rtcp_packets_.end()) {
 | 
|          const auto& packets = kv->second;
 | 
| -        TimeSeries timestamp_data;
 | 
| -        timestamp_data.label = GetStreamName(stream_id) + " rtcp capture-time";
 | 
| -        timestamp_data.style = LINE_DOT_GRAPH;
 | 
| +        TimeSeries timestamp_data(
 | 
| +            GetStreamName(stream_id) + " rtcp capture-time", LINE_DOT_GRAPH);
 | 
|          for (const LoggedRtcpPacket& rtcp : packets) {
 | 
|            if (rtcp.type != kRtcpSr)
 | 
|              continue;
 | 
| @@ -1292,9 +1260,8 @@ void EventLogAnalyzer::CreateTimestampGraph(Plot* plot) {
 | 
|  }
 | 
|  
 | 
|  void EventLogAnalyzer::CreateAudioEncoderTargetBitrateGraph(Plot* plot) {
 | 
| -  plot->series_list_.push_back(TimeSeries());
 | 
| -  plot->series_list_.back().style = LINE_DOT_GRAPH;
 | 
| -  plot->series_list_.back().label = "Audio encoder target bitrate";
 | 
| +  TimeSeries* time_series =
 | 
| +      plot->AddTimeSeries("Audio encoder target bitrate", LINE_DOT_GRAPH);
 | 
|    ProcessPoints<AudioNetworkAdaptationEvent>(
 | 
|        [](const AudioNetworkAdaptationEvent& ana_event) -> rtc::Optional<float> {
 | 
|          if (ana_event.config.bitrate_bps)
 | 
| @@ -1302,17 +1269,15 @@ void EventLogAnalyzer::CreateAudioEncoderTargetBitrateGraph(Plot* plot) {
 | 
|                static_cast<float>(*ana_event.config.bitrate_bps));
 | 
|          return rtc::Optional<float>();
 | 
|        },
 | 
| -      audio_network_adaptation_events_, begin_time_,
 | 
| -      &plot->series_list_.back());
 | 
| +      audio_network_adaptation_events_, begin_time_, time_series);
 | 
|    plot->SetXAxis(0, call_duration_s_, "Time (s)", kLeftMargin, kRightMargin);
 | 
|    plot->SetSuggestedYAxis(0, 1, "Bitrate (bps)", kBottomMargin, kTopMargin);
 | 
|    plot->SetTitle("Reported audio encoder target bitrate");
 | 
|  }
 | 
|  
 | 
|  void EventLogAnalyzer::CreateAudioEncoderFrameLengthGraph(Plot* plot) {
 | 
| -  plot->series_list_.push_back(TimeSeries());
 | 
| -  plot->series_list_.back().style = LINE_DOT_GRAPH;
 | 
| -  plot->series_list_.back().label = "Audio encoder frame length";
 | 
| +  TimeSeries* time_series =
 | 
| +      plot->AddTimeSeries("Audio encoder frame length", LINE_DOT_GRAPH);
 | 
|    ProcessPoints<AudioNetworkAdaptationEvent>(
 | 
|        [](const AudioNetworkAdaptationEvent& ana_event) {
 | 
|          if (ana_event.config.frame_length_ms)
 | 
| @@ -1320,8 +1285,7 @@ void EventLogAnalyzer::CreateAudioEncoderFrameLengthGraph(Plot* plot) {
 | 
|                static_cast<float>(*ana_event.config.frame_length_ms));
 | 
|          return rtc::Optional<float>();
 | 
|        },
 | 
| -      audio_network_adaptation_events_, begin_time_,
 | 
| -      &plot->series_list_.back());
 | 
| +      audio_network_adaptation_events_, begin_time_, time_series);
 | 
|    plot->SetXAxis(0, call_duration_s_, "Time (s)", kLeftMargin, kRightMargin);
 | 
|    plot->SetSuggestedYAxis(0, 1, "Frame length (ms)", kBottomMargin, kTopMargin);
 | 
|    plot->SetTitle("Reported audio encoder frame length");
 | 
| @@ -1329,9 +1293,8 @@ void EventLogAnalyzer::CreateAudioEncoderFrameLengthGraph(Plot* plot) {
 | 
|  
 | 
|  void EventLogAnalyzer::CreateAudioEncoderUplinkPacketLossFractionGraph(
 | 
|      Plot* plot) {
 | 
| -  plot->series_list_.push_back(TimeSeries());
 | 
| -  plot->series_list_.back().style = LINE_DOT_GRAPH;
 | 
| -  plot->series_list_.back().label = "Audio encoder uplink packet loss fraction";
 | 
| +  TimeSeries* time_series = plot->AddTimeSeries(
 | 
| +      "Audio encoder uplink packet loss fraction", LINE_DOT_GRAPH);
 | 
|    ProcessPoints<AudioNetworkAdaptationEvent>(
 | 
|        [](const AudioNetworkAdaptationEvent& ana_event) {
 | 
|          if (ana_event.config.uplink_packet_loss_fraction)
 | 
| @@ -1339,8 +1302,7 @@ void EventLogAnalyzer::CreateAudioEncoderUplinkPacketLossFractionGraph(
 | 
|                *ana_event.config.uplink_packet_loss_fraction));
 | 
|          return rtc::Optional<float>();
 | 
|        },
 | 
| -      audio_network_adaptation_events_, begin_time_,
 | 
| -      &plot->series_list_.back());
 | 
| +      audio_network_adaptation_events_, begin_time_, time_series);
 | 
|    plot->SetXAxis(0, call_duration_s_, "Time (s)", kLeftMargin, kRightMargin);
 | 
|    plot->SetSuggestedYAxis(0, 10, "Percent lost packets", kBottomMargin,
 | 
|                            kTopMargin);
 | 
| @@ -1348,9 +1310,8 @@ void EventLogAnalyzer::CreateAudioEncoderUplinkPacketLossFractionGraph(
 | 
|  }
 | 
|  
 | 
|  void EventLogAnalyzer::CreateAudioEncoderEnableFecGraph(Plot* plot) {
 | 
| -  plot->series_list_.push_back(TimeSeries());
 | 
| -  plot->series_list_.back().style = LINE_DOT_GRAPH;
 | 
| -  plot->series_list_.back().label = "Audio encoder FEC";
 | 
| +  TimeSeries* time_series =
 | 
| +      plot->AddTimeSeries("Audio encoder FEC", LINE_DOT_GRAPH);
 | 
|    ProcessPoints<AudioNetworkAdaptationEvent>(
 | 
|        [](const AudioNetworkAdaptationEvent& ana_event) {
 | 
|          if (ana_event.config.enable_fec)
 | 
| @@ -1358,17 +1319,15 @@ void EventLogAnalyzer::CreateAudioEncoderEnableFecGraph(Plot* plot) {
 | 
|                static_cast<float>(*ana_event.config.enable_fec));
 | 
|          return rtc::Optional<float>();
 | 
|        },
 | 
| -      audio_network_adaptation_events_, begin_time_,
 | 
| -      &plot->series_list_.back());
 | 
| +      audio_network_adaptation_events_, begin_time_, time_series);
 | 
|    plot->SetXAxis(0, call_duration_s_, "Time (s)", kLeftMargin, kRightMargin);
 | 
|    plot->SetSuggestedYAxis(0, 1, "FEC (false/true)", kBottomMargin, kTopMargin);
 | 
|    plot->SetTitle("Reported audio encoder FEC");
 | 
|  }
 | 
|  
 | 
|  void EventLogAnalyzer::CreateAudioEncoderEnableDtxGraph(Plot* plot) {
 | 
| -  plot->series_list_.push_back(TimeSeries());
 | 
| -  plot->series_list_.back().style = LINE_DOT_GRAPH;
 | 
| -  plot->series_list_.back().label = "Audio encoder DTX";
 | 
| +  TimeSeries* time_series =
 | 
| +      plot->AddTimeSeries("Audio encoder DTX", LINE_DOT_GRAPH);
 | 
|    ProcessPoints<AudioNetworkAdaptationEvent>(
 | 
|        [](const AudioNetworkAdaptationEvent& ana_event) {
 | 
|          if (ana_event.config.enable_dtx)
 | 
| @@ -1376,17 +1335,15 @@ void EventLogAnalyzer::CreateAudioEncoderEnableDtxGraph(Plot* plot) {
 | 
|                static_cast<float>(*ana_event.config.enable_dtx));
 | 
|          return rtc::Optional<float>();
 | 
|        },
 | 
| -      audio_network_adaptation_events_, begin_time_,
 | 
| -      &plot->series_list_.back());
 | 
| +      audio_network_adaptation_events_, begin_time_, time_series);
 | 
|    plot->SetXAxis(0, call_duration_s_, "Time (s)", kLeftMargin, kRightMargin);
 | 
|    plot->SetSuggestedYAxis(0, 1, "DTX (false/true)", kBottomMargin, kTopMargin);
 | 
|    plot->SetTitle("Reported audio encoder DTX");
 | 
|  }
 | 
|  
 | 
|  void EventLogAnalyzer::CreateAudioEncoderNumChannelsGraph(Plot* plot) {
 | 
| -  plot->series_list_.push_back(TimeSeries());
 | 
| -  plot->series_list_.back().style = LINE_DOT_GRAPH;
 | 
| -  plot->series_list_.back().label = "Audio encoder number of channels";
 | 
| +  TimeSeries* time_series =
 | 
| +      plot->AddTimeSeries("Audio encoder number of channels", LINE_DOT_GRAPH);
 | 
|    ProcessPoints<AudioNetworkAdaptationEvent>(
 | 
|        [](const AudioNetworkAdaptationEvent& ana_event) {
 | 
|          if (ana_event.config.num_channels)
 | 
| @@ -1394,8 +1351,7 @@ void EventLogAnalyzer::CreateAudioEncoderNumChannelsGraph(Plot* plot) {
 | 
|                static_cast<float>(*ana_event.config.num_channels));
 | 
|          return rtc::Optional<float>();
 | 
|        },
 | 
| -      audio_network_adaptation_events_, begin_time_,
 | 
| -      &plot->series_list_.back());
 | 
| +      audio_network_adaptation_events_, begin_time_, time_series);
 | 
|    plot->SetXAxis(0, call_duration_s_, "Time (s)", kLeftMargin, kRightMargin);
 | 
|    plot->SetSuggestedYAxis(0, 1, "Number of channels (1 (mono)/2 (stereo))",
 | 
|                            kBottomMargin, kTopMargin);
 | 
| 
 |