Add pcap support to bwe tools. Allow filtering on SSRCs.

Also switches the command line interface to gflags.

Review URL: https://codereview.webrtc.org/1235433005

Cr-Commit-Position: refs/heads/master@{#9599}
diff --git a/webrtc/test/rtp_file_reader.cc b/webrtc/test/rtp_file_reader.cc
index 26151bb..c1a0bc8 100644
--- a/webrtc/test/rtp_file_reader.cc
+++ b/webrtc/test/rtp_file_reader.cc
@@ -69,7 +69,8 @@
 
 class RtpFileReaderImpl : public RtpFileReader {
  public:
-  virtual bool Init(const std::string& filename) = 0;
+  virtual bool Init(const std::string& filename,
+                    const std::set<uint32_t>& ssrc_filter) = 0;
 };
 
 class InterleavedRtpFileReader : public RtpFileReaderImpl {
@@ -81,7 +82,8 @@
     }
   }
 
-  virtual bool Init(const std::string& filename) {
+  virtual bool Init(const std::string& filename,
+                    const std::set<uint32_t>& ssrc_filter) {
     file_ = fopen(filename.c_str(), "rb");
     if (file_ == NULL) {
       printf("ERROR: Can't open file: %s\n", filename.c_str());
@@ -127,7 +129,8 @@
     }
   }
 
-  bool Init(const std::string& filename) {
+  bool Init(const std::string& filename,
+            const std::set<uint32_t>& ssrc_filter) {
     file_ = fopen(filename.c_str(), "rb");
     if (file_ == NULL) {
       printf("ERROR: Can't open file: %s\n", filename.c_str());
@@ -265,11 +268,13 @@
     }
   }
 
-  bool Init(const std::string& filename) override {
-    return Initialize(filename) == kResultSuccess;
+  bool Init(const std::string& filename,
+            const std::set<uint32_t>& ssrc_filter) override {
+    return Initialize(filename, ssrc_filter) == kResultSuccess;
   }
 
-  int Initialize(const std::string& filename) {
+  int Initialize(const std::string& filename,
+                 const std::set<uint32_t>& ssrc_filter) {
     file_ = fopen(filename.c_str(), "rb");
     if (file_ == NULL) {
       printf("ERROR: Can't open file: %s\n", filename.c_str());
@@ -286,7 +291,7 @@
     for (;;) {
       TRY_PCAP(fseek(file_, next_packet_pos, SEEK_SET));
       int result = ReadPacket(&next_packet_pos, stream_start_ms,
-                              ++total_packet_count);
+                              ++total_packet_count, ssrc_filter);
       if (result == kResultFail) {
         break;
       } else if (result == kResultSuccess && packets_.size() == 1) {
@@ -308,10 +313,10 @@
     for (SsrcMapIterator mit = packets_by_ssrc_.begin();
         mit != packets_by_ssrc_.end(); ++mit) {
       uint32_t ssrc = mit->first;
-      const std::vector<uint32_t>& packet_numbers = mit->second;
-      uint8_t pt = packets_[packet_numbers[0]].rtp_header.payloadType;
+      const std::vector<uint32_t>& packet_indices = mit->second;
+      uint8_t pt = packets_[packet_indices[0]].rtp_header.payloadType;
       printf("SSRC: %08x, %" PRIuS " packets, pt=%d\n", ssrc,
-             packet_numbers.size(), pt);
+             packet_indices.size(), pt);
     }
 
     // TODO(solenberg): Better validation of identified SSRC streams.
@@ -419,8 +424,10 @@
     return kResultSuccess;
   }
 
-  int ReadPacket(int32_t* next_packet_pos, uint32_t stream_start_ms,
-                 uint32_t number) {
+  int ReadPacket(int32_t* next_packet_pos,
+                 uint32_t stream_start_ms,
+                 uint32_t number,
+                 const std::set<uint32_t>& ssrc_filter) {
     assert(next_packet_pos);
 
     uint32_t ts_sec;    // Timestamp seconds.
@@ -457,8 +464,13 @@
       }
 
       uint32_t ssrc = marker.rtp_header.ssrc;
-      packets_by_ssrc_[ssrc].push_back(marker.packet_number);
-      packets_.push_back(marker);
+      if (ssrc_filter.empty() || ssrc_filter.find(ssrc) != ssrc_filter.end()) {
+        packets_by_ssrc_[ssrc].push_back(
+            static_cast<uint32_t>(packets_.size()));
+        packets_.push_back(marker);
+      } else {
+        return kResultSkip;
+      }
     }
 
     return kResultSuccess;
@@ -632,7 +644,8 @@
 };
 
 RtpFileReader* RtpFileReader::Create(FileFormat format,
-                                     const std::string& filename) {
+                                     const std::string& filename,
+                                     const std::set<uint32_t>& ssrc_filter) {
   RtpFileReaderImpl* reader = NULL;
   switch (format) {
     case kPcap:
@@ -645,12 +658,17 @@
       reader = new InterleavedRtpFileReader();
       break;
   }
-  if (!reader->Init(filename)) {
+  if (!reader->Init(filename, ssrc_filter)) {
     delete reader;
     return NULL;
   }
   return reader;
 }
 
+RtpFileReader* RtpFileReader::Create(FileFormat format,
+                                     const std::string& filename) {
+  return RtpFileReader::Create(format, filename, std::set<uint32_t>());
+}
+
 }  // namespace test
 }  // namespace webrtc