Track SSRCs configured for each media type in event log visualization tool.

Review-Url: https://codereview.webrtc.org/2207453003
Cr-Commit-Position: refs/heads/master@{#13675}
diff --git a/webrtc/tools/event_log_visualizer/analyzer.cc b/webrtc/tools/event_log_visualizer/analyzer.cc
index cb8455c..1f7973e 100644
--- a/webrtc/tools/event_log_visualizer/analyzer.cc
+++ b/webrtc/tools/event_log_visualizer/analyzer.cc
@@ -100,23 +100,6 @@
 
 }  // namespace
 
-bool EventLogAnalyzer::StreamId::operator<(const StreamId& other) const {
-  if (ssrc_ < other.ssrc_) {
-    return true;
-  }
-  if (ssrc_ == other.ssrc_) {
-    if (direction_ < other.direction_) {
-      return true;
-    }
-  }
-  return false;
-}
-
-bool EventLogAnalyzer::StreamId::operator==(const StreamId& other) const {
-  return ssrc_ == other.ssrc_ && direction_ == other.direction_;
-}
-
-
 EventLogAnalyzer::EventLogAnalyzer(const ParsedRtcEventLog& log)
     : parsed_log_(log), window_duration_(250000), step_(10000) {
   uint64_t first_timestamp = std::numeric_limits<uint64_t>::max();
@@ -151,10 +134,13 @@
         StreamId stream(config.rtp.remote_ssrc, kIncomingPacket);
         RegisterHeaderExtensions(config.rtp.extensions,
                                  &extension_maps[stream]);
+        video_ssrcs_.insert(stream);
         for (auto kv : config.rtp.rtx) {
           StreamId rtx_stream(kv.second.ssrc, kIncomingPacket);
           RegisterHeaderExtensions(config.rtp.extensions,
                                    &extension_maps[rtx_stream]);
+          video_ssrcs_.insert(rtx_stream);
+          rtx_ssrcs_.insert(rtx_stream);
         }
         break;
       }
@@ -165,11 +151,14 @@
           StreamId stream(ssrc, kOutgoingPacket);
           RegisterHeaderExtensions(config.rtp.extensions,
                                    &extension_maps[stream]);
+          video_ssrcs_.insert(stream);
         }
         for (auto ssrc : config.rtp.rtx.ssrcs) {
-          StreamId stream(ssrc, kOutgoingPacket);
+          StreamId rtx_stream(ssrc, kOutgoingPacket);
           RegisterHeaderExtensions(config.rtp.extensions,
-                                   &extension_maps[stream]);
+                                   &extension_maps[rtx_stream]);
+          video_ssrcs_.insert(rtx_stream);
+          rtx_ssrcs_.insert(rtx_stream);
         }
         break;
       }
@@ -303,6 +292,18 @@
   bool bitrate_updated_;
 };
 
+bool EventLogAnalyzer::IsRtxSsrc(StreamId stream_id) {
+  return rtx_ssrcs_.count(stream_id) == 1;
+}
+
+bool EventLogAnalyzer::IsVideoSsrc(StreamId stream_id) {
+  return video_ssrcs_.count(stream_id) == 1;
+}
+
+bool EventLogAnalyzer::IsAudioSsrc(StreamId stream_id) {
+  return audio_ssrcs_.count(stream_id) == 1;
+}
+
 void EventLogAnalyzer::CreatePacketGraph(PacketDirection desired_direction,
                                          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 dc56c5f..ce2179f 100644
--- a/webrtc/tools/event_log_visualizer/analyzer.h
+++ b/webrtc/tools/event_log_visualizer/analyzer.h
@@ -14,6 +14,7 @@
 #include <vector>
 #include <map>
 #include <memory>
+#include <set>
 #include <utility>
 
 #include "webrtc/call/rtc_event_log_parser.h"
@@ -56,8 +57,14 @@
    public:
     StreamId(uint32_t ssrc, webrtc::PacketDirection direction)
         : ssrc_(ssrc), direction_(direction) {}
-    bool operator<(const StreamId& other) const;
-    bool operator==(const StreamId& other) const;
+    bool operator<(const StreamId& other) const {
+      return std::tie(ssrc_, direction_) <
+             std::tie(other.ssrc_, other.direction_);
+    }
+    bool operator==(const StreamId& other) const {
+      return std::tie(ssrc_, direction_) ==
+             std::tie(other.ssrc_, other.direction_);
+    }
     uint32_t GetSsrc() const { return ssrc_; }
     webrtc::PacketDirection GetDirection() const { return direction_; }
 
@@ -93,15 +100,30 @@
     int32_t expected_packets;
   };
 
+  bool IsRtxSsrc(StreamId stream_id);
+
+  bool IsVideoSsrc(StreamId stream_id);
+
+  bool IsAudioSsrc(StreamId stream_id);
+
   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_;
 
-  // Maps a stream identifier consisting of ssrc, direction and MediaType
-  // to the parsed RTP headers in that stream. Header extensions are parsed
-  // if the stream has been configured.
+  // Tracks what each stream is configured for. Note that a single SSRC can be
+  // in several sets. For example, the SSRC used for sending video over RTX
+  // will appear in both video_ssrcs_ and rtx_ssrcs_. In the unlikely case that
+  // an SSRC is reconfigured to a different media type mid-call, it will also
+  // appear in multiple sets.
+  std::set<StreamId> rtx_ssrcs_;
+  std::set<StreamId> video_ssrcs_;
+  std::set<StreamId> audio_ssrcs_;
+
+  // Maps a stream identifier consisting of ssrc and direction to the parsed
+  // RTP headers in that stream. Header extensions are parsed if the stream
+  // has been configured.
   std::map<StreamId, std::vector<LoggedRtpPacket>> rtp_packets_;
 
   std::map<StreamId, std::vector<LoggedRtcpPacket>> rtcp_packets_;