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