diff --git a/webrtc/BUILD.gn b/webrtc/BUILD.gn
index 58f69a1..f151f10 100644
--- a/webrtc/BUILD.gn
+++ b/webrtc/BUILD.gn
@@ -358,7 +358,7 @@
     configs += [ ":common_config" ]
     public_configs = [ ":common_inherited_config" ]
 
-    public_deps = [
+    deps = [
       ":rtc_event_log_proto",
       ":webrtc_common",
     ]
diff --git a/webrtc/tools/BUILD.gn b/webrtc/tools/BUILD.gn
index abf0ca0..2d09563 100644
--- a/webrtc/tools/BUILD.gn
+++ b/webrtc/tools/BUILD.gn
@@ -171,36 +171,6 @@
 
 # Exclude tools depending on gflags since that's not available in Chromium.
 if (rtc_include_tests) {
-  if (rtc_enable_protobuf) {
-    executable("event_log_visualizer") {
-      sources = [
-        "event_log_visualizer/analyzer.cc",
-        "event_log_visualizer/analyzer.h",
-        "event_log_visualizer/generate_timeseries.cc",
-        "event_log_visualizer/plot_base.h",
-        "event_log_visualizer/plot_python.cc",
-        "event_log_visualizer/plot_python.h",
-      ]
-
-      configs += [ "..:common_config" ]
-      public_configs = [ "..:common_inherited_config" ]
-
-      if (is_clang && !is_nacl) {
-        # Suppress warnings from the Chromium Clang plugin.
-        # See http://code.google.com/p/webrtc/issues/detail?id=163 for details.
-        configs -= [ "//build/config/clang:find_bad_constructs" ]
-      }
-
-      defines = [ "ENABLE_RTC_EVENT_LOG" ]
-      deps = [
-        "../:rtc_event_log_parser",
-        "../modules/rtp_rtcp:rtp_rtcp",
-        "../system_wrappers:system_wrappers_default",
-        "//third_party/gflags",
-      ]
-    }
-  }
-
   executable("agc_harness") {
     testonly = true
     sources = [
diff --git a/webrtc/tools/DEPS b/webrtc/tools/DEPS
index 33df89f..73073f0 100644
--- a/webrtc/tools/DEPS
+++ b/webrtc/tools/DEPS
@@ -1,9 +1,7 @@
 include_rules = [
   "+webrtc/base",
-  "+webrtc/call",
   "+webrtc/common_video",
   "+webrtc/modules/audio_processing",
-  "+webrtc/modules/rtp_rtcp",
   "+webrtc/system_wrappers",
   "+webrtc/voice_engine",
 ]
diff --git a/webrtc/tools/event_log_visualizer/analyzer.cc b/webrtc/tools/event_log_visualizer/analyzer.cc
deleted file mode 100644
index 05d94ee..0000000
--- a/webrtc/tools/event_log_visualizer/analyzer.cc
+++ /dev/null
@@ -1,710 +0,0 @@
-/*
- *  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 "webrtc/tools/event_log_visualizer/analyzer.h"
-
-#include <algorithm>
-#include <limits>
-#include <map>
-#include <sstream>
-#include <string>
-#include <utility>
-
-#include "webrtc/audio_receive_stream.h"
-#include "webrtc/audio_send_stream.h"
-#include "webrtc/base/checks.h"
-#include "webrtc/call.h"
-#include "webrtc/common_types.h"
-#include "webrtc/modules/rtp_rtcp/include/rtp_rtcp.h"
-#include "webrtc/modules/rtp_rtcp/include/rtp_rtcp_defines.h"
-#include "webrtc/modules/rtp_rtcp/source/rtp_utility.h"
-#include "webrtc/video_receive_stream.h"
-#include "webrtc/video_send_stream.h"
-
-namespace {
-
-std::string SsrcToString(uint32_t ssrc) {
-  std::stringstream ss;
-  ss << "SSRC " << ssrc;
-  return ss.str();
-}
-
-// Checks whether an SSRC is contained in the list of desired SSRCs.
-// Note that an empty SSRC list matches every SSRC.
-bool MatchingSsrc(uint32_t ssrc, const std::vector<uint32_t>& desired_ssrc) {
-  if (desired_ssrc.size() == 0)
-    return true;
-  return std::find(desired_ssrc.begin(), desired_ssrc.end(), ssrc) !=
-         desired_ssrc.end();
-}
-
-double AbsSendTimeToMicroseconds(int64_t abs_send_time) {
-  // The timestamp is a fixed point representation with 6 bits for seconds
-  // and 18 bits for fractions of a second. Thus, we divide by 2^18 to get the
-  // time in seconds and then multiply by 1000000 to convert to microseconds.
-  static constexpr double kTimestampToMicroSec =
-      1000000.0 / static_cast<double>(1 << 18);
-  return abs_send_time * kTimestampToMicroSec;
-}
-
-// Computes the difference |later| - |earlier| where |later| and |earlier|
-// are counters that wrap at |modulus|. The difference is chosen to have the
-// least absolute value. For example if |modulus| is 8, then the difference will
-// be chosen in the range [-3, 4]. If |modulus| is 9, then the difference will
-// be in [-4, 4].
-int64_t WrappingDifference(uint32_t later, uint32_t earlier, int64_t modulus) {
-  RTC_DCHECK_LE(1, modulus);
-  RTC_DCHECK_LT(later, modulus);
-  RTC_DCHECK_LT(earlier, modulus);
-  int64_t difference =
-      static_cast<int64_t>(later) - static_cast<int64_t>(earlier);
-  int64_t max_difference = modulus / 2;
-  int64_t min_difference = max_difference - modulus + 1;
-  if (difference > max_difference) {
-    difference -= modulus;
-  }
-  if (difference < min_difference) {
-    difference += modulus;
-  }
-  return difference;
-}
-
-class StreamId {
- public:
-  StreamId(uint32_t ssrc,
-           webrtc::PacketDirection direction,
-           webrtc::MediaType media_type)
-      : ssrc_(ssrc), direction_(direction), media_type_(media_type) {}
-
-  bool operator<(const StreamId& other) const {
-    if (ssrc_ < other.ssrc_) {
-      return true;
-    }
-    if (ssrc_ == other.ssrc_) {
-      if (media_type_ < other.media_type_) {
-        return true;
-      }
-      if (media_type_ == other.media_type_) {
-        if (direction_ < other.direction_) {
-          return true;
-        }
-      }
-    }
-    return false;
-  }
-
-  bool operator==(const StreamId& other) const {
-    return ssrc_ == other.ssrc_ && direction_ == other.direction_ &&
-           media_type_ == other.media_type_;
-  }
-
-  uint32_t GetSsrc() const { return ssrc_; }
-
- private:
-  uint32_t ssrc_;
-  webrtc::PacketDirection direction_;
-  webrtc::MediaType media_type_;
-};
-
-const double kXMargin = 1.02;
-const double kYMargin = 1.1;
-const double kDefaultXMin = -1;
-const double kDefaultYMin = -1;
-
-}  // namespace
-
-namespace webrtc {
-namespace plotting {
-
-EventLogAnalyzer::EventLogAnalyzer(const ParsedRtcEventLog& log)
-    : parsed_log_(log), window_duration_(250000), step_(10000) {
-  uint64_t first_timestamp = std::numeric_limits<uint64_t>::max();
-  uint64_t last_timestamp = std::numeric_limits<uint64_t>::min();
-  for (size_t i = 0; i < parsed_log_.GetNumberOfEvents(); i++) {
-    ParsedRtcEventLog::EventType event_type = parsed_log_.GetEventType(i);
-    if (event_type == ParsedRtcEventLog::EventType::VIDEO_RECEIVER_CONFIG_EVENT)
-      continue;
-    if (event_type == ParsedRtcEventLog::EventType::VIDEO_SENDER_CONFIG_EVENT)
-      continue;
-    if (event_type == ParsedRtcEventLog::EventType::AUDIO_RECEIVER_CONFIG_EVENT)
-      continue;
-    if (event_type == ParsedRtcEventLog::EventType::AUDIO_SENDER_CONFIG_EVENT)
-      continue;
-    uint64_t timestamp = parsed_log_.GetTimestamp(i);
-    first_timestamp = std::min(first_timestamp, timestamp);
-    last_timestamp = std::max(last_timestamp, timestamp);
-  }
-  if (last_timestamp < first_timestamp) {
-    // No useful events in the log.
-    first_timestamp = last_timestamp = 0;
-  }
-  begin_time_ = first_timestamp;
-  end_time_ = last_timestamp;
-}
-
-void EventLogAnalyzer::CreatePacketGraph(PacketDirection desired_direction,
-                                         Plot* plot) {
-  std::map<uint32_t, TimeSeries> time_series;
-
-  PacketDirection direction;
-  MediaType media_type;
-  uint8_t header[IP_PACKET_SIZE];
-  size_t header_length, total_length;
-  float max_y = 0;
-
-  for (size_t i = 0; i < parsed_log_.GetNumberOfEvents(); i++) {
-    ParsedRtcEventLog::EventType event_type = parsed_log_.GetEventType(i);
-    if (event_type == ParsedRtcEventLog::RTP_EVENT) {
-      parsed_log_.GetRtpHeader(i, &direction, &media_type, header,
-                               &header_length, &total_length);
-      if (direction == desired_direction) {
-        // Parse header to get SSRC.
-        RtpUtility::RtpHeaderParser rtp_parser(header, header_length);
-        RTPHeader parsed_header;
-        rtp_parser.Parse(&parsed_header);
-        // Filter on SSRC.
-        if (MatchingSsrc(parsed_header.ssrc, desired_ssrc_)) {
-          uint64_t timestamp = parsed_log_.GetTimestamp(i);
-          float x = static_cast<float>(timestamp - begin_time_) / 1000000;
-          float y = total_length;
-          max_y = std::max(max_y, y);
-          time_series[parsed_header.ssrc].points.push_back(
-              TimeSeriesPoint(x, y));
-        }
-      }
-    }
-  }
-
-  // Set labels and put in graph.
-  for (auto& kv : time_series) {
-    kv.second.label = SsrcToString(kv.first);
-    kv.second.style = BAR_GRAPH;
-    plot->series.push_back(std::move(kv.second));
-  }
-
-  plot->xaxis_min = kDefaultXMin;
-  plot->xaxis_max = (end_time_ - begin_time_) / 1000000 * kXMargin;
-  plot->xaxis_label = "Time (s)";
-  plot->yaxis_min = kDefaultYMin;
-  plot->yaxis_max = max_y * kYMargin;
-  plot->yaxis_label = "Packet size (bytes)";
-  if (desired_direction == webrtc::PacketDirection::kIncomingPacket) {
-    plot->title = "Incoming RTP packets";
-  } else if (desired_direction == webrtc::PacketDirection::kOutgoingPacket) {
-    plot->title = "Outgoing RTP packets";
-  }
-}
-
-// For each SSRC, plot the time between the consecutive playouts.
-void EventLogAnalyzer::CreatePlayoutGraph(Plot* plot) {
-  std::map<uint32_t, TimeSeries> time_series;
-  std::map<uint32_t, uint64_t> last_playout;
-
-  uint32_t ssrc;
-  float max_y = 0;
-
-  for (size_t i = 0; i < parsed_log_.GetNumberOfEvents(); i++) {
-    ParsedRtcEventLog::EventType event_type = parsed_log_.GetEventType(i);
-    if (event_type == ParsedRtcEventLog::AUDIO_PLAYOUT_EVENT) {
-      parsed_log_.GetAudioPlayout(i, &ssrc);
-      uint64_t timestamp = parsed_log_.GetTimestamp(i);
-      if (MatchingSsrc(ssrc, desired_ssrc_)) {
-        float x = static_cast<float>(timestamp - begin_time_) / 1000000;
-        float y = static_cast<float>(timestamp - last_playout[ssrc]) / 1000;
-        if (time_series[ssrc].points.size() == 0) {
-          // There were no previusly logged playout for this SSRC.
-          // Generate a point, but place it on the x-axis.
-          y = 0;
-        }
-        max_y = std::max(max_y, y);
-        time_series[ssrc].points.push_back(TimeSeriesPoint(x, y));
-        last_playout[ssrc] = timestamp;
-      }
-    }
-  }
-
-  // Set labels and put in graph.
-  for (auto& kv : time_series) {
-    kv.second.label = SsrcToString(kv.first);
-    kv.second.style = BAR_GRAPH;
-    plot->series.push_back(std::move(kv.second));
-  }
-
-  plot->xaxis_min = kDefaultXMin;
-  plot->xaxis_max = (end_time_ - begin_time_) / 1000000 * kXMargin;
-  plot->xaxis_label = "Time (s)";
-  plot->yaxis_min = kDefaultYMin;
-  plot->yaxis_max = max_y * kYMargin;
-  plot->yaxis_label = "Time since last playout (ms)";
-  plot->title = "Audio playout";
-}
-
-// For each SSRC, plot the time between the consecutive playouts.
-void EventLogAnalyzer::CreateSequenceNumberGraph(Plot* plot) {
-  std::map<uint32_t, TimeSeries> time_series;
-  std::map<uint32_t, uint16_t> last_seqno;
-
-  PacketDirection direction;
-  MediaType media_type;
-  uint8_t header[IP_PACKET_SIZE];
-  size_t header_length, total_length;
-
-  int max_y = 1;
-  int min_y = 0;
-
-  for (size_t i = 0; i < parsed_log_.GetNumberOfEvents(); i++) {
-    ParsedRtcEventLog::EventType event_type = parsed_log_.GetEventType(i);
-    if (event_type == ParsedRtcEventLog::RTP_EVENT) {
-      parsed_log_.GetRtpHeader(i, &direction, &media_type, header,
-                               &header_length, &total_length);
-      uint64_t timestamp = parsed_log_.GetTimestamp(i);
-      if (direction == PacketDirection::kIncomingPacket) {
-        // Parse header to get SSRC.
-        RtpUtility::RtpHeaderParser rtp_parser(header, header_length);
-        RTPHeader parsed_header;
-        rtp_parser.Parse(&parsed_header);
-        // Filter on SSRC.
-        if (MatchingSsrc(parsed_header.ssrc, desired_ssrc_)) {
-          float x = static_cast<float>(timestamp - begin_time_) / 1000000;
-          int y = WrappingDifference(parsed_header.sequenceNumber,
-                                     last_seqno[parsed_header.ssrc], 1ul << 16);
-          if (time_series[parsed_header.ssrc].points.size() == 0) {
-            // There were no previusly logged playout for this SSRC.
-            // Generate a point, but place it on the x-axis.
-            y = 0;
-          }
-          max_y = std::max(max_y, y);
-          min_y = std::min(min_y, y);
-          time_series[parsed_header.ssrc].points.push_back(
-              TimeSeriesPoint(x, y));
-          last_seqno[parsed_header.ssrc] = parsed_header.sequenceNumber;
-        }
-      }
-    }
-  }
-
-  // Set labels and put in graph.
-  for (auto& kv : time_series) {
-    kv.second.label = SsrcToString(kv.first);
-    kv.second.style = BAR_GRAPH;
-    plot->series.push_back(std::move(kv.second));
-  }
-
-  plot->xaxis_min = kDefaultXMin;
-  plot->xaxis_max = (end_time_ - begin_time_) / 1000000 * kXMargin;
-  plot->xaxis_label = "Time (s)";
-  plot->yaxis_min = min_y - (kYMargin - 1) / 2 * (max_y - min_y);
-  plot->yaxis_max = max_y + (kYMargin - 1) / 2 * (max_y - min_y);
-  plot->yaxis_label = "Difference since last packet";
-  plot->title = "Sequence number";
-}
-
-void EventLogAnalyzer::CreateDelayChangeGraph(Plot* plot) {
-  // Maps a stream identifier consisting of ssrc, direction and MediaType
-  // to the header extensions used by that stream,
-  std::map<StreamId, RtpHeaderExtensionMap> extension_maps;
-
-  struct SendReceiveTime {
-    SendReceiveTime() = default;
-    SendReceiveTime(uint32_t send_time, uint64_t recv_time)
-        : absolute_send_time(send_time), receive_timestamp(recv_time) {}
-    uint32_t absolute_send_time;  // 24-bit value in units of 2^-18 seconds.
-    uint64_t receive_timestamp;   // In microseconds.
-  };
-  std::map<StreamId, SendReceiveTime> last_packet;
-  std::map<StreamId, TimeSeries> time_series;
-
-  PacketDirection direction;
-  MediaType media_type;
-  uint8_t header[IP_PACKET_SIZE];
-  size_t header_length, total_length;
-
-  double max_y = 10;
-  double min_y = 0;
-
-  for (size_t i = 0; i < parsed_log_.GetNumberOfEvents(); i++) {
-    ParsedRtcEventLog::EventType event_type = parsed_log_.GetEventType(i);
-    if (event_type == ParsedRtcEventLog::VIDEO_RECEIVER_CONFIG_EVENT) {
-      VideoReceiveStream::Config config(nullptr);
-      parsed_log_.GetVideoReceiveConfig(i, &config);
-      StreamId stream(config.rtp.remote_ssrc, kIncomingPacket,
-                      MediaType::VIDEO);
-      extension_maps[stream].Erase();
-      for (size_t j = 0; j < config.rtp.extensions.size(); ++j) {
-        const std::string& extension = config.rtp.extensions[j].uri;
-        int id = config.rtp.extensions[j].id;
-        extension_maps[stream].Register(StringToRtpExtensionType(extension),
-                                        id);
-      }
-    } else if (event_type == ParsedRtcEventLog::VIDEO_SENDER_CONFIG_EVENT) {
-      VideoSendStream::Config config(nullptr);
-      parsed_log_.GetVideoSendConfig(i, &config);
-      for (auto ssrc : config.rtp.ssrcs) {
-        StreamId stream(ssrc, kIncomingPacket, MediaType::VIDEO);
-        extension_maps[stream].Erase();
-        for (size_t j = 0; j < config.rtp.extensions.size(); ++j) {
-          const std::string& extension = config.rtp.extensions[j].uri;
-          int id = config.rtp.extensions[j].id;
-          extension_maps[stream].Register(StringToRtpExtensionType(extension),
-                                          id);
-        }
-      }
-    } else if (event_type == ParsedRtcEventLog::AUDIO_RECEIVER_CONFIG_EVENT) {
-      AudioReceiveStream::Config config;
-      // TODO(terelius): Parse the audio configs once we have them
-    } else if (event_type == ParsedRtcEventLog::AUDIO_SENDER_CONFIG_EVENT) {
-      AudioSendStream::Config config(nullptr);
-      // TODO(terelius): Parse the audio configs once we have them
-    } else if (event_type == ParsedRtcEventLog::RTP_EVENT) {
-      parsed_log_.GetRtpHeader(i, &direction, &media_type, header,
-                               &header_length, &total_length);
-      if (direction == kIncomingPacket) {
-        // Parse header to get SSRC.
-        RtpUtility::RtpHeaderParser rtp_parser(header, header_length);
-        RTPHeader parsed_header;
-        rtp_parser.Parse(&parsed_header);
-        // Filter on SSRC.
-        if (MatchingSsrc(parsed_header.ssrc, desired_ssrc_)) {
-          StreamId stream(parsed_header.ssrc, direction, media_type);
-          // Look up the extension_map and parse it again to get the extensions.
-          if (extension_maps.count(stream) == 1) {
-            RtpHeaderExtensionMap* extension_map = &extension_maps[stream];
-            rtp_parser.Parse(&parsed_header, extension_map);
-            if (parsed_header.extension.hasAbsoluteSendTime) {
-              uint64_t timestamp = parsed_log_.GetTimestamp(i);
-              int64_t send_time_diff = WrappingDifference(
-                  parsed_header.extension.absoluteSendTime,
-                  last_packet[stream].absolute_send_time, 1ul << 24);
-              int64_t recv_time_diff =
-                  timestamp - last_packet[stream].receive_timestamp;
-
-              float x = static_cast<float>(timestamp - begin_time_) / 1000000;
-              double y = static_cast<double>(
-                             recv_time_diff -
-                             AbsSendTimeToMicroseconds(send_time_diff)) /
-                         1000;
-              if (time_series[stream].points.size() == 0) {
-                // There were no previusly logged playout for this SSRC.
-                // Generate a point, but place it on the x-axis.
-                y = 0;
-              }
-              max_y = std::max(max_y, y);
-              min_y = std::min(min_y, y);
-              time_series[stream].points.push_back(TimeSeriesPoint(x, y));
-              last_packet[stream] = SendReceiveTime(
-                  parsed_header.extension.absoluteSendTime, timestamp);
-            }
-          }
-        }
-      }
-    }
-  }
-
-  // Set labels and put in graph.
-  for (auto& kv : time_series) {
-    kv.second.label = SsrcToString(kv.first.GetSsrc());
-    kv.second.style = BAR_GRAPH;
-    plot->series.push_back(std::move(kv.second));
-  }
-
-  plot->xaxis_min = kDefaultXMin;
-  plot->xaxis_max = (end_time_ - begin_time_) / 1000000 * kXMargin;
-  plot->xaxis_label = "Time (s)";
-  plot->yaxis_min = min_y - (kYMargin - 1) / 2 * (max_y - min_y);
-  plot->yaxis_max = max_y + (kYMargin - 1) / 2 * (max_y - min_y);
-  plot->yaxis_label = "Latency change (ms)";
-  plot->title = "Network latency change between consecutive packets";
-}
-
-void EventLogAnalyzer::CreateAccumulatedDelayChangeGraph(Plot* plot) {
-  // TODO(terelius): Refactor
-
-  // Maps a stream identifier consisting of ssrc, direction and MediaType
-  // to the header extensions used by that stream.
-  std::map<StreamId, RtpHeaderExtensionMap> extension_maps;
-
-  struct SendReceiveTime {
-    SendReceiveTime() = default;
-    SendReceiveTime(uint32_t send_time, uint64_t recv_time, double accumulated)
-        : absolute_send_time(send_time),
-          receive_timestamp(recv_time),
-          accumulated_delay(accumulated) {}
-    uint32_t absolute_send_time;  // 24-bit value in units of 2^-18 seconds.
-    uint64_t receive_timestamp;   // In microseconds.
-    double accumulated_delay;     // In milliseconds.
-  };
-  std::map<StreamId, SendReceiveTime> last_packet;
-  std::map<StreamId, TimeSeries> time_series;
-
-  PacketDirection direction;
-  MediaType media_type;
-  uint8_t header[IP_PACKET_SIZE];
-  size_t header_length, total_length;
-
-  double max_y = 10;
-  double min_y = 0;
-
-  for (size_t i = 0; i < parsed_log_.GetNumberOfEvents(); i++) {
-    ParsedRtcEventLog::EventType event_type = parsed_log_.GetEventType(i);
-    if (event_type == ParsedRtcEventLog::VIDEO_RECEIVER_CONFIG_EVENT) {
-      VideoReceiveStream::Config config(nullptr);
-      parsed_log_.GetVideoReceiveConfig(i, &config);
-      StreamId stream(config.rtp.remote_ssrc, kIncomingPacket,
-                      MediaType::VIDEO);
-      extension_maps[stream].Erase();
-      for (size_t j = 0; j < config.rtp.extensions.size(); ++j) {
-        const std::string& extension = config.rtp.extensions[j].uri;
-        int id = config.rtp.extensions[j].id;
-        extension_maps[stream].Register(StringToRtpExtensionType(extension),
-                                        id);
-      }
-    } else if (event_type == ParsedRtcEventLog::VIDEO_SENDER_CONFIG_EVENT) {
-      VideoSendStream::Config config(nullptr);
-      parsed_log_.GetVideoSendConfig(i, &config);
-      for (auto ssrc : config.rtp.ssrcs) {
-        StreamId stream(ssrc, kIncomingPacket, MediaType::VIDEO);
-        extension_maps[stream].Erase();
-        for (size_t j = 0; j < config.rtp.extensions.size(); ++j) {
-          const std::string& extension = config.rtp.extensions[j].uri;
-          int id = config.rtp.extensions[j].id;
-          extension_maps[stream].Register(StringToRtpExtensionType(extension),
-                                          id);
-        }
-      }
-    } else if (event_type == ParsedRtcEventLog::AUDIO_RECEIVER_CONFIG_EVENT) {
-      AudioReceiveStream::Config config;
-      // TODO(terelius): Parse the audio configs once we have them
-    } else if (event_type == ParsedRtcEventLog::AUDIO_SENDER_CONFIG_EVENT) {
-      AudioSendStream::Config config(nullptr);
-      // TODO(terelius): Parse the audio configs once we have them
-    } else if (event_type == ParsedRtcEventLog::RTP_EVENT) {
-      parsed_log_.GetRtpHeader(i, &direction, &media_type, header,
-                               &header_length, &total_length);
-      if (direction == kIncomingPacket) {
-        // Parse header to get SSRC.
-        RtpUtility::RtpHeaderParser rtp_parser(header, header_length);
-        RTPHeader parsed_header;
-        rtp_parser.Parse(&parsed_header);
-        // Filter on SSRC.
-        if (MatchingSsrc(parsed_header.ssrc, desired_ssrc_)) {
-          StreamId stream(parsed_header.ssrc, direction, media_type);
-          // Look up the extension_map and parse it again to get the extensions.
-          if (extension_maps.count(stream) == 1) {
-            RtpHeaderExtensionMap* extension_map = &extension_maps[stream];
-            rtp_parser.Parse(&parsed_header, extension_map);
-            if (parsed_header.extension.hasAbsoluteSendTime) {
-              uint64_t timestamp = parsed_log_.GetTimestamp(i);
-              int64_t send_time_diff = WrappingDifference(
-                  parsed_header.extension.absoluteSendTime,
-                  last_packet[stream].absolute_send_time, 1ul << 24);
-              int64_t recv_time_diff =
-                  timestamp - last_packet[stream].receive_timestamp;
-
-              float x = static_cast<float>(timestamp - begin_time_) / 1000000;
-              double y = last_packet[stream].accumulated_delay +
-                         static_cast<double>(
-                             recv_time_diff -
-                             AbsSendTimeToMicroseconds(send_time_diff)) /
-                             1000;
-              if (time_series[stream].points.size() == 0) {
-                // There were no previusly logged playout for this SSRC.
-                // Generate a point, but place it on the x-axis.
-                y = 0;
-              }
-              max_y = std::max(max_y, y);
-              min_y = std::min(min_y, y);
-              time_series[stream].points.push_back(TimeSeriesPoint(x, y));
-              last_packet[stream] = SendReceiveTime(
-                  parsed_header.extension.absoluteSendTime, timestamp, y);
-            }
-          }
-        }
-      }
-    }
-  }
-
-  // Set labels and put in graph.
-  for (auto& kv : time_series) {
-    kv.second.label = SsrcToString(kv.first.GetSsrc());
-    kv.second.style = LINE_GRAPH;
-    plot->series.push_back(std::move(kv.second));
-  }
-
-  plot->xaxis_min = kDefaultXMin;
-  plot->xaxis_max = (end_time_ - begin_time_) / 1000000 * kXMargin;
-  plot->xaxis_label = "Time (s)";
-  plot->yaxis_min = min_y - (kYMargin - 1) / 2 * (max_y - min_y);
-  plot->yaxis_max = max_y + (kYMargin - 1) / 2 * (max_y - min_y);
-  plot->yaxis_label = "Latency change (ms)";
-  plot->title = "Accumulated network latency change";
-}
-
-// Plot the total bandwidth used by all RTP streams.
-void EventLogAnalyzer::CreateTotalBitrateGraph(
-    PacketDirection desired_direction,
-    Plot* plot) {
-  struct TimestampSize {
-    TimestampSize(uint64_t t, size_t s) : timestamp(t), size(s) {}
-    uint64_t timestamp;
-    size_t size;
-  };
-  std::vector<TimestampSize> packets;
-
-  PacketDirection direction;
-  size_t total_length;
-
-  // Extract timestamps and sizes for the relevant packets.
-  for (size_t i = 0; i < parsed_log_.GetNumberOfEvents(); i++) {
-    ParsedRtcEventLog::EventType event_type = parsed_log_.GetEventType(i);
-    if (event_type == ParsedRtcEventLog::RTP_EVENT) {
-      parsed_log_.GetRtpHeader(i, &direction, nullptr, nullptr, nullptr,
-                               &total_length);
-      if (direction == desired_direction) {
-        uint64_t timestamp = parsed_log_.GetTimestamp(i);
-        packets.push_back(TimestampSize(timestamp, total_length));
-      }
-    }
-  }
-
-  size_t window_index_begin = 0;
-  size_t window_index_end = 0;
-  size_t bytes_in_window = 0;
-  float max_y = 0;
-
-  // Calculate a moving average of the bitrate and store in a TimeSeries.
-  plot->series.push_back(TimeSeries());
-  for (uint64_t time = begin_time_; time < end_time_ + step_; time += step_) {
-    while (window_index_end < packets.size() &&
-           packets[window_index_end].timestamp < time) {
-      bytes_in_window += packets[window_index_end].size;
-      window_index_end++;
-    }
-    while (window_index_begin < packets.size() &&
-           packets[window_index_begin].timestamp < time - window_duration_) {
-      RTC_DCHECK_LE(packets[window_index_begin].size, bytes_in_window);
-      bytes_in_window -= packets[window_index_begin].size;
-      window_index_begin++;
-    }
-    float window_duration_in_seconds =
-        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;
-    max_y = std::max(max_y, y);
-    plot->series.back().points.push_back(TimeSeriesPoint(x, y));
-  }
-
-  // Set labels.
-  if (desired_direction == webrtc::PacketDirection::kIncomingPacket) {
-    plot->series.back().label = "Incoming bitrate";
-  } else if (desired_direction == webrtc::PacketDirection::kOutgoingPacket) {
-    plot->series.back().label = "Outgoing bitrate";
-  }
-  plot->series.back().style = LINE_GRAPH;
-
-  plot->xaxis_min = kDefaultXMin;
-  plot->xaxis_max = (end_time_ - begin_time_) / 1000000 * kXMargin;
-  plot->xaxis_label = "Time (s)";
-  plot->yaxis_min = kDefaultYMin;
-  plot->yaxis_max = max_y * kYMargin;
-  plot->yaxis_label = "Bitrate (kbps)";
-  if (desired_direction == webrtc::PacketDirection::kIncomingPacket) {
-    plot->title = "Incoming RTP bitrate";
-  } else if (desired_direction == webrtc::PacketDirection::kOutgoingPacket) {
-    plot->title = "Outgoing RTP bitrate";
-  }
-}
-
-// For each SSRC, plot the bandwidth used by that stream.
-void EventLogAnalyzer::CreateStreamBitrateGraph(
-    PacketDirection desired_direction,
-    Plot* plot) {
-  struct TimestampSize {
-    TimestampSize(uint64_t t, size_t s) : timestamp(t), size(s) {}
-    uint64_t timestamp;
-    size_t size;
-  };
-  std::map<uint32_t, std::vector<TimestampSize> > packets;
-
-  PacketDirection direction;
-  MediaType media_type;
-  uint8_t header[IP_PACKET_SIZE];
-  size_t header_length, total_length;
-
-  // Extract timestamps and sizes for the relevant packets.
-  for (size_t i = 0; i < parsed_log_.GetNumberOfEvents(); i++) {
-    ParsedRtcEventLog::EventType event_type = parsed_log_.GetEventType(i);
-    if (event_type == ParsedRtcEventLog::RTP_EVENT) {
-      parsed_log_.GetRtpHeader(i, &direction, &media_type, header,
-                               &header_length, &total_length);
-      if (direction == desired_direction) {
-        // Parse header to get SSRC.
-        RtpUtility::RtpHeaderParser rtp_parser(header, header_length);
-        RTPHeader parsed_header;
-        rtp_parser.Parse(&parsed_header);
-        // Filter on SSRC.
-        if (MatchingSsrc(parsed_header.ssrc, desired_ssrc_)) {
-          uint64_t timestamp = parsed_log_.GetTimestamp(i);
-          packets[parsed_header.ssrc].push_back(
-              TimestampSize(timestamp, total_length));
-        }
-      }
-    }
-  }
-
-  float max_y = 0;
-
-  for (auto& kv : packets) {
-    size_t window_index_begin = 0;
-    size_t window_index_end = 0;
-    size_t bytes_in_window = 0;
-
-    // Calculate a moving average of the bitrate and store in a TimeSeries.
-    plot->series.push_back(TimeSeries());
-    for (uint64_t time = begin_time_; time < end_time_ + step_; time += step_) {
-      while (window_index_end < kv.second.size() &&
-             kv.second[window_index_end].timestamp < time) {
-        bytes_in_window += kv.second[window_index_end].size;
-        window_index_end++;
-      }
-      while (window_index_begin < kv.second.size() &&
-             kv.second[window_index_begin].timestamp <
-                 time - window_duration_) {
-        RTC_DCHECK_LE(kv.second[window_index_begin].size, bytes_in_window);
-        bytes_in_window -= kv.second[window_index_begin].size;
-        window_index_begin++;
-      }
-      float window_duration_in_seconds =
-          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;
-      max_y = std::max(max_y, y);
-      plot->series.back().points.push_back(TimeSeriesPoint(x, y));
-    }
-
-    // Set labels.
-    plot->series.back().label = SsrcToString(kv.first);
-    plot->series.back().style = LINE_GRAPH;
-  }
-
-  plot->xaxis_min = kDefaultXMin;
-  plot->xaxis_max = (end_time_ - begin_time_) / 1000000 * kXMargin;
-  plot->xaxis_label = "Time (s)";
-  plot->yaxis_min = kDefaultYMin;
-  plot->yaxis_max = max_y * kYMargin;
-  plot->yaxis_label = "Bitrate (kbps)";
-  if (desired_direction == webrtc::PacketDirection::kIncomingPacket) {
-    plot->title = "Incoming bitrate per stream";
-  } else if (desired_direction == webrtc::PacketDirection::kOutgoingPacket) {
-    plot->title = "Outgoing bitrate per stream";
-  }
-}
-
-}  // namespace plotting
-}  // namespace webrtc
diff --git a/webrtc/tools/event_log_visualizer/analyzer.h b/webrtc/tools/event_log_visualizer/analyzer.h
deleted file mode 100644
index 08fcd5c..0000000
--- a/webrtc/tools/event_log_visualizer/analyzer.h
+++ /dev/null
@@ -1,65 +0,0 @@
-/*
- *  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.
- */
-
-#ifndef WEBRTC_TOOLS_EVENT_LOG_VISUALIZER_ANALYZER_H_
-#define WEBRTC_TOOLS_EVENT_LOG_VISUALIZER_ANALYZER_H_
-
-#include <vector>
-
-#include "webrtc/call/rtc_event_log_parser.h"
-#include "webrtc/tools/event_log_visualizer/plot_base.h"
-
-namespace webrtc {
-namespace plotting {
-
-class EventLogAnalyzer {
- public:
-  // The EventLogAnalyzer keeps a reference to the ParsedRtcEventLog for the
-  // duration of its lifetime. The ParsedRtcEventLog must not be destroyed or
-  // modified while the EventLogAnalyzer is being used.
-  explicit EventLogAnalyzer(const ParsedRtcEventLog& log);
-
-  void CreatePacketGraph(PacketDirection desired_direction, Plot* plot);
-
-  void CreatePlayoutGraph(Plot* plot);
-
-  void CreateSequenceNumberGraph(Plot* plot);
-
-  void CreateDelayChangeGraph(Plot* plot);
-
-  void CreateAccumulatedDelayChangeGraph(Plot* plot);
-
-  void CreateTotalBitrateGraph(PacketDirection desired_direction, Plot* plot);
-
-  void CreateStreamBitrateGraph(PacketDirection desired_direction, Plot* plot);
-
- private:
-  const ParsedRtcEventLog& parsed_log_;
-
-  // A list of SSRCs we are interested in analysing.
-  // If left empty, all SSRCs will be considered relevant.
-  std::vector<uint32_t> desired_ssrc_;
-
-  // Window and step size used for calculating moving averages, e.g. bitrate.
-  // The generated data points will be |step_| microseconds apart.
-  // Only events occuring at most |window_duration_| microseconds before the
-  // current data point will be part of the average.
-  uint64_t window_duration_;
-  uint64_t step_;
-
-  // First and last events of the log.
-  uint64_t begin_time_;
-  uint64_t end_time_;
-};
-
-}  // namespace plotting
-}  // namespace webrtc
-
-#endif  // WEBRTC_TOOLS_EVENT_LOG_VISUALIZER_ANALYZER_H_
diff --git a/webrtc/tools/event_log_visualizer/generate_timeseries.cc b/webrtc/tools/event_log_visualizer/generate_timeseries.cc
deleted file mode 100644
index d213947..0000000
--- a/webrtc/tools/event_log_visualizer/generate_timeseries.cc
+++ /dev/null
@@ -1,138 +0,0 @@
-/*
- *  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 <iostream>
-
-#include "gflags/gflags.h"
-#include "webrtc/call/rtc_event_log_parser.h"
-#include "webrtc/tools/event_log_visualizer/analyzer.h"
-#include "webrtc/tools/event_log_visualizer/plot_base.h"
-#include "webrtc/tools/event_log_visualizer/plot_python.h"
-
-DEFINE_bool(incoming, true, "Plot statistics for incoming packets.");
-DEFINE_bool(outgoing, true, "Plot statistics for outgoing packets.");
-DEFINE_bool(plot_all, true, "Plot all different data types.");
-DEFINE_bool(plot_packets,
-            false,
-            "Plot bar graph showing the size of each packet.");
-DEFINE_bool(plot_audio_playout,
-            false,
-            "Plot bar graph showing the time between each audio playout.");
-DEFINE_bool(
-    plot_sequence_number,
-    false,
-    "Plot the difference in sequence number between consecutive packets.");
-DEFINE_bool(
-    plot_delay_change,
-    false,
-    "Plot the difference in 1-way path delay between consecutive packets.");
-DEFINE_bool(plot_accumulated_delay_change,
-            false,
-            "Plot the accumulated 1-way path delay change, or the path delay "
-            "change compared to the first packet.");
-DEFINE_bool(plot_total_bitrate,
-            false,
-            "Plot the total bitrate used by all streams.");
-DEFINE_bool(plot_stream_bitrate,
-            false,
-            "Plot the bitrate used by each stream.");
-
-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";
-  google::SetUsageMessage(usage);
-  google::ParseCommandLineFlags(&argc, &argv, true);
-
-  if (argc != 2) {
-    // Print usage information.
-    std::cout << google::ProgramUsage();
-    return 0;
-  }
-
-  std::string filename = argv[1];
-
-  webrtc::ParsedRtcEventLog parsed_log;
-
-  if (!parsed_log.ParseFile(filename)) {
-    std::cerr << "Could not parse the entire log file." << std::endl;
-    std::cerr << "Proceeding to analyze the first "
-              << parsed_log.GetNumberOfEvents() << " events in the file."
-              << std::endl;
-  }
-
-  webrtc::plotting::EventLogAnalyzer analyzer(parsed_log);
-  std::unique_ptr<webrtc::plotting::PlotCollection> collection(
-      new webrtc::plotting::PythonPlotCollection());
-
-  if (FLAGS_plot_all || FLAGS_plot_packets) {
-    if (FLAGS_incoming) {
-      analyzer.CreatePacketGraph(webrtc::PacketDirection::kIncomingPacket,
-                                 collection->append_new_plot());
-    }
-    if (FLAGS_outgoing) {
-      analyzer.CreatePacketGraph(webrtc::PacketDirection::kOutgoingPacket,
-                                 collection->append_new_plot());
-    }
-  }
-
-  if (FLAGS_plot_all || FLAGS_plot_audio_playout) {
-    analyzer.CreatePlayoutGraph(collection->append_new_plot());
-  }
-
-  if (FLAGS_plot_all || FLAGS_plot_sequence_number) {
-    if (FLAGS_incoming) {
-      analyzer.CreateSequenceNumberGraph(collection->append_new_plot());
-    }
-  }
-
-  if (FLAGS_plot_all || FLAGS_plot_delay_change) {
-    if (FLAGS_incoming) {
-      analyzer.CreateDelayChangeGraph(collection->append_new_plot());
-    }
-  }
-
-  if (FLAGS_plot_all || FLAGS_plot_accumulated_delay_change) {
-    if (FLAGS_incoming) {
-      analyzer.CreateAccumulatedDelayChangeGraph(collection->append_new_plot());
-    }
-  }
-
-  if (FLAGS_plot_all || FLAGS_plot_total_bitrate) {
-    if (FLAGS_incoming) {
-      analyzer.CreateTotalBitrateGraph(webrtc::PacketDirection::kIncomingPacket,
-                                       collection->append_new_plot());
-    }
-    if (FLAGS_outgoing) {
-      analyzer.CreateTotalBitrateGraph(webrtc::PacketDirection::kOutgoingPacket,
-                                       collection->append_new_plot());
-    }
-  }
-
-  if (FLAGS_plot_all || FLAGS_plot_stream_bitrate) {
-    if (FLAGS_incoming) {
-      analyzer.CreateStreamBitrateGraph(
-          webrtc::PacketDirection::kIncomingPacket,
-          collection->append_new_plot());
-    }
-    if (FLAGS_outgoing) {
-      analyzer.CreateStreamBitrateGraph(
-          webrtc::PacketDirection::kOutgoingPacket,
-          collection->append_new_plot());
-    }
-  }
-
-  collection->draw();
-
-  return 0;
-}
diff --git a/webrtc/tools/event_log_visualizer/plot_base.h b/webrtc/tools/event_log_visualizer/plot_base.h
deleted file mode 100644
index 925dcec..0000000
--- a/webrtc/tools/event_log_visualizer/plot_base.h
+++ /dev/null
@@ -1,78 +0,0 @@
-/*
- *  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.
- */
-#ifndef WEBRTC_TOOLS_EVENT_LOG_VISUALIZER_PLOT_BASE_H_
-#define WEBRTC_TOOLS_EVENT_LOG_VISUALIZER_PLOT_BASE_H_
-
-#include <memory>
-#include <string>
-#include <utility>
-#include <vector>
-
-namespace webrtc {
-namespace plotting {
-
-enum PlotStyle { LINE_GRAPH, BAR_GRAPH };
-
-struct TimeSeriesPoint {
-  TimeSeriesPoint(float x, float y) : x(x), y(y) {}
-  float x;
-  float y;
-};
-
-struct TimeSeries {
-  TimeSeries() = default;
-  TimeSeries(TimeSeries&& other)
-      : label(std::move(other.label)),
-        style(other.style),
-        points(std::move(other.points)) {}
-  TimeSeries& operator=(TimeSeries&& other) {
-    label = std::move(other.label);
-    style = other.style;
-    points = std::move(other.points);
-    return *this;
-  }
-
-  std::string label;
-  PlotStyle style;
-  std::vector<TimeSeriesPoint> points;
-};
-
-// This is basically a struct that represents of a general graph, with axes,
-// title and one or more data series. We make it a class only to document that
-// it also specifies an interface for the draw()ing objects.
-class Plot {
- public:
-  virtual ~Plot() {}
-  virtual void draw() = 0;
-
-  float xaxis_min;
-  float xaxis_max;
-  std::string xaxis_label;
-  float yaxis_min;
-  float yaxis_max;
-  std::string yaxis_label;
-  std::vector<TimeSeries> series;
-  std::string title;
-};
-
-class PlotCollection {
- public:
-  virtual ~PlotCollection() {}
-  virtual void draw() = 0;
-  virtual Plot* append_new_plot() = 0;
-
- protected:
-  std::vector<std::unique_ptr<Plot> > plots;
-};
-
-}  // namespace plotting
-}  // namespace webrtc
-
-#endif  // WEBRTC_TOOLS_EVENT_LOG_VISUALIZER_PLOT_BASE_H_
diff --git a/webrtc/tools/event_log_visualizer/plot_python.cc b/webrtc/tools/event_log_visualizer/plot_python.cc
deleted file mode 100644
index 916bc2e..0000000
--- a/webrtc/tools/event_log_visualizer/plot_python.cc
+++ /dev/null
@@ -1,98 +0,0 @@
-/*
- *  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 "webrtc/tools/event_log_visualizer/plot_python.h"
-
-#include <stdio.h>
-
-namespace webrtc {
-namespace plotting {
-
-PythonPlot::PythonPlot() {}
-
-PythonPlot::~PythonPlot() {}
-
-void PythonPlot::draw() {
-  // Write python commands to stdout. Intended program usage is
-  // ./event_log_visualizer event_log160330.dump | python
-
-  if (!series.empty()) {
-    printf("color_count = %zu\n", series.size());
-    printf(
-        "hls_colors = [(i*1.0/color_count, 0.25+i*0.5/color_count, 0.8) for i "
-        "in range(color_count)]\n");
-    printf("rgb_colors = [colorsys.hls_to_rgb(*hls) for hls in hls_colors]\n");
-
-    for (size_t i = 0; i < series.size(); i++) {
-      // List x coordinates
-      printf("x%zu = [", i);
-      if (series[i].points.size() > 0)
-        printf("%G", series[i].points[0].x);
-      for (size_t j = 1; j < series[i].points.size(); j++)
-        printf(", %G", series[i].points[j].x);
-      printf("]\n");
-
-      // List y coordinates
-      printf("y%zu = [", i);
-      if (series[i].points.size() > 0)
-        printf("%G", series[i].points[0].y);
-      for (size_t j = 1; j < series[i].points.size(); j++)
-        printf(", %G", series[i].points[j].y);
-      printf("]\n");
-
-      if (series[i].style == BAR_GRAPH) {
-        // There is a plt.bar function that draws bar plots,
-        // but it is *way* too slow to be useful.
-        printf(
-            "plt.vlines(x%zu, map(lambda t: min(t,0), y%zu), map(lambda t: "
-            "max(t,0), y%zu), color=rgb_colors[%zu], "
-            "label=\'%s\')\n",
-            i, i, i, i, series[i].label.c_str());
-      } else if (series[i].style == LINE_GRAPH) {
-        printf("plt.plot(x%zu, y%zu, color=rgb_colors[%zu], label=\'%s\')\n", i,
-               i, i, series[i].label.c_str());
-      } else {
-        printf("raise Exception(\"Unknown graph type\")\n");
-      }
-    }
-  }
-
-  printf("plt.xlim(%f, %f)\n", xaxis_min, xaxis_max);
-  printf("plt.ylim(%f, %f)\n", yaxis_min, yaxis_max);
-  printf("plt.xlabel(\'%s\')\n", xaxis_label.c_str());
-  printf("plt.ylabel(\'%s\')\n", yaxis_label.c_str());
-  printf("plt.title(\'%s\')\n", title.c_str());
-  if (!series.empty()) {
-    printf("plt.legend(loc=\'best\', fontsize=\'small\')\n");
-  }
-}
-
-PythonPlotCollection::PythonPlotCollection() {}
-
-PythonPlotCollection::~PythonPlotCollection() {}
-
-void PythonPlotCollection::draw() {
-  printf("import matplotlib.pyplot as plt\n");
-  printf("import colorsys\n");
-  for (size_t i = 0; i < plots.size(); i++) {
-    printf("plt.figure(%zu)\n", i);
-    plots[i]->draw();
-  }
-  printf("plt.show()\n");
-}
-
-Plot* PythonPlotCollection::append_new_plot() {
-  Plot* plot = new PythonPlot();
-  plots.push_back(std::unique_ptr<Plot>(plot));
-  return plot;
-}
-
-}  // namespace plotting
-}  // namespace webrtc
diff --git a/webrtc/tools/event_log_visualizer/plot_python.h b/webrtc/tools/event_log_visualizer/plot_python.h
deleted file mode 100644
index 8d63f95..0000000
--- a/webrtc/tools/event_log_visualizer/plot_python.h
+++ /dev/null
@@ -1,36 +0,0 @@
-/*
- *  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.
- */
-#ifndef WEBRTC_TOOLS_EVENT_LOG_VISUALIZER_PLOT_PYTHON_H_
-#define WEBRTC_TOOLS_EVENT_LOG_VISUALIZER_PLOT_PYTHON_H_
-
-#include "webrtc/tools/event_log_visualizer/plot_base.h"
-
-namespace webrtc {
-namespace plotting {
-
-class PythonPlot final : public Plot {
- public:
-  PythonPlot();
-  ~PythonPlot() override;
-  void draw() override;
-};
-
-class PythonPlotCollection final : public PlotCollection {
- public:
-  PythonPlotCollection();
-  ~PythonPlotCollection() override;
-  void draw() override;
-  Plot* append_new_plot() override;
-};
-
-}  // namespace plotting
-}  // namespace webrtc
-
-#endif  // WEBRTC_TOOLS_EVENT_LOG_VISUALIZER_PLOT_PYTHON_H_
diff --git a/webrtc/tools/tools.gyp b/webrtc/tools/tools.gyp
index fda6b05..998319e 100644
--- a/webrtc/tools/tools.gyp
+++ b/webrtc/tools/tools.gyp
@@ -99,29 +99,6 @@
     }, # force_mic_volume_max
   ],
   'conditions': [
-    ['enable_protobuf==1', {
-      'targets': [
-        {
-          # This target should only be built if enable_protobuf is set
-          'target_name': 'event_log_visualizer',
-          'type': 'executable',
-          'dependencies': [
-            '<(webrtc_root)/webrtc.gyp:rtc_event_log_parser',
-            '<(webrtc_root)/modules/modules.gyp:rtp_rtcp',
-            '<(webrtc_root)/system_wrappers/system_wrappers.gyp:metrics_default',
-            '<(DEPTH)/third_party/gflags/gflags.gyp:gflags',
-          ],
-          'sources': [
-            'event_log_visualizer/analyzer.cc',
-            'event_log_visualizer/analyzer.h',
-            'event_log_visualizer/generate_timeseries.cc',
-            'event_log_visualizer/plot_base.h',
-            'event_log_visualizer/plot_python.cc',
-            'event_log_visualizer/plot_python.h',
-          ],
-        },
-      ],
-    }],
     ['include_tests==1', {
       'targets' : [
         {
