Plot accumelated packets over time.

BUG=

Review-Url: https://codereview.webrtc.org/2295063006
Cr-Commit-Position: refs/heads/master@{#14066}
diff --git a/webrtc/tools/event_log_visualizer/analyzer.cc b/webrtc/tools/event_log_visualizer/analyzer.cc
index 2a23c94..7db82ae 100644
--- a/webrtc/tools/event_log_visualizer/analyzer.cc
+++ b/webrtc/tools/event_log_visualizer/analyzer.cc
@@ -498,6 +498,53 @@
   }
 }
 
+template <typename T>
+void EventLogAnalyzer::CreateAccumulatedPacketsTimeSeries(
+    PacketDirection desired_direction,
+    Plot* plot,
+    const std::map<StreamId, std::vector<T>>& packets,
+    const std::string& label_prefix) {
+  for (auto& kv : packets) {
+    StreamId stream_id = kv.first;
+    const std::vector<T>& packet_stream = kv.second;
+    // Filter on direction and SSRC.
+    if (stream_id.GetDirection() != desired_direction ||
+        !MatchingSsrc(stream_id.GetSsrc(), desired_ssrc_)) {
+      continue;
+    }
+
+    TimeSeries time_series;
+    time_series.label = label_prefix + " " + SsrcToString(stream_id.GetSsrc());
+    time_series.style = LINE_GRAPH;
+
+    for (size_t i = 0; i < packet_stream.size(); i++) {
+      float x = static_cast<float>(packet_stream[i].timestamp - begin_time_) /
+                1000000;
+      time_series.points.emplace_back(x, i);
+      time_series.points.emplace_back(x, i + 1);
+    }
+
+    plot->series_list_.push_back(std::move(time_series));
+  }
+}
+
+void EventLogAnalyzer::CreateAccumulatedPacketsGraph(
+    PacketDirection desired_direction,
+    Plot* plot) {
+  CreateAccumulatedPacketsTimeSeries(desired_direction, plot, rtp_packets_,
+                                     "RTP");
+  CreateAccumulatedPacketsTimeSeries(desired_direction, plot, rtcp_packets_,
+                                     "RTCP");
+
+  plot->SetXAxis(0, call_duration_s_, "Time (s)", kLeftMargin, kRightMargin);
+  plot->SetSuggestedYAxis(0, 1, "Received Packets", kBottomMargin, kTopMargin);
+  if (desired_direction == webrtc::PacketDirection::kIncomingPacket) {
+    plot->SetTitle("Accumulated Incoming RTP/RTCP packets");
+  } else if (desired_direction == webrtc::PacketDirection::kOutgoingPacket) {
+    plot->SetTitle("Accumulated Outgoing RTP/RTCP packets");
+  }
+}
+
 // For each SSRC, plot the time between the consecutive playouts.
 void EventLogAnalyzer::CreatePlayoutGraph(Plot* plot) {
   std::map<uint32_t, TimeSeries> time_series;
diff --git a/webrtc/tools/event_log_visualizer/analyzer.h b/webrtc/tools/event_log_visualizer/analyzer.h
index 6972b37..74c0ff0 100644
--- a/webrtc/tools/event_log_visualizer/analyzer.h
+++ b/webrtc/tools/event_log_visualizer/analyzer.h
@@ -11,11 +11,12 @@
 #ifndef WEBRTC_TOOLS_EVENT_LOG_VISUALIZER_ANALYZER_H_
 #define WEBRTC_TOOLS_EVENT_LOG_VISUALIZER_ANALYZER_H_
 
-#include <vector>
 #include <map>
 #include <memory>
 #include <set>
+#include <string>
 #include <utility>
+#include <vector>
 
 #include "webrtc/call/rtc_event_log_parser.h"
 #include "webrtc/modules/rtp_rtcp/include/rtp_rtcp_defines.h"
@@ -60,6 +61,9 @@
 
   void CreatePacketGraph(PacketDirection desired_direction, Plot* plot);
 
+  void CreateAccumulatedPacketsGraph(PacketDirection desired_direction,
+                                     Plot* plot);
+
   void CreatePlayoutGraph(Plot* plot);
 
   void CreateSequenceNumberGraph(Plot* plot);
@@ -99,6 +103,13 @@
     webrtc::PacketDirection direction_;
   };
 
+  template <typename T>
+  void CreateAccumulatedPacketsTimeSeries(
+      PacketDirection desired_direction,
+      Plot* plot,
+      const std::map<StreamId, std::vector<T>>& packets,
+      const std::string& label_prefix);
+
   bool IsRtxSsrc(StreamId stream_id);
 
   bool IsVideoSsrc(StreamId stream_id);
diff --git a/webrtc/tools/event_log_visualizer/main.cc b/webrtc/tools/event_log_visualizer/main.cc
index d8d9e25..a56947c 100644
--- a/webrtc/tools/event_log_visualizer/main.cc
+++ b/webrtc/tools/event_log_visualizer/main.cc
@@ -91,10 +91,16 @@
     if (FLAGS_incoming) {
       analyzer.CreatePacketGraph(webrtc::PacketDirection::kIncomingPacket,
                                  collection->AppendNewPlot());
+      analyzer.CreateAccumulatedPacketsGraph(
+          webrtc::PacketDirection::kIncomingPacket,
+          collection->AppendNewPlot());
     }
     if (FLAGS_outgoing) {
       analyzer.CreatePacketGraph(webrtc::PacketDirection::kOutgoingPacket,
                                  collection->AppendNewPlot());
+      analyzer.CreateAccumulatedPacketsGraph(
+          webrtc::PacketDirection::kOutgoingPacket,
+          collection->AppendNewPlot());
     }
   }