From 5ceb0d949437768864223e7bdd57b0db71a00dfb Mon Sep 17 00:00:00 2001 From: Bjorn Terelius Date: Tue, 29 May 2018 11:14:33 +0200 Subject: [PATCH] Fix bug that skips postprocessing after parsing a broken event log. MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Bug: webrtc:9323 Change-Id: I7bdaf1b37ed172ec519da491369f63065adde413 Reviewed-on: https://webrtc-review.googlesource.com/79520 Reviewed-by: Sebastian Jansson Commit-Queue: Björn Terelius Cr-Commit-Position: refs/heads/master@{#23429} --- .../rtc_event_log/rtc_event_log_parser_new.cc | 69 +++++++++++-------- .../rtc_event_log/rtc_event_log_parser_new.h | 3 + 2 files changed, 42 insertions(+), 30 deletions(-) diff --git a/logging/rtc_event_log/rtc_event_log_parser_new.cc b/logging/rtc_event_log/rtc_event_log_parser_new.cc index bee0e0d2a2..810279e3a8 100644 --- a/logging/rtc_event_log/rtc_event_log_parser_new.cc +++ b/logging/rtc_event_log/rtc_event_log_parser_new.cc @@ -354,6 +354,45 @@ bool ParsedRtcEventLogNew::ParseString(const std::string& s) { bool ParsedRtcEventLogNew::ParseStream( std::istream& stream) { // no-presubmit-check TODO(webrtc:8982) Clear(); + bool success = ParseStreamInternal(stream); + + // ParseStreamInternal stores the RTP packets in a map indexed by SSRC. + // Since we dont need rapid lookup based on SSRC after parsing, we move the + // packets_streams from map to vector. + incoming_rtp_packets_by_ssrc_.reserve(incoming_rtp_packets_map_.size()); + for (const auto& kv : incoming_rtp_packets_map_) { + incoming_rtp_packets_by_ssrc_.emplace_back(LoggedRtpStreamIncoming()); + incoming_rtp_packets_by_ssrc_.back().ssrc = kv.first; + incoming_rtp_packets_by_ssrc_.back().incoming_packets = + std::move(kv.second); + } + incoming_rtp_packets_map_.clear(); + outgoing_rtp_packets_by_ssrc_.reserve(outgoing_rtp_packets_map_.size()); + for (const auto& kv : outgoing_rtp_packets_map_) { + outgoing_rtp_packets_by_ssrc_.emplace_back(LoggedRtpStreamOutgoing()); + outgoing_rtp_packets_by_ssrc_.back().ssrc = kv.first; + outgoing_rtp_packets_by_ssrc_.back().outgoing_packets = + std::move(kv.second); + } + outgoing_rtp_packets_map_.clear(); + + // Build PacketViews for easier iteration over RTP packets + for (const auto& stream : incoming_rtp_packets_by_ssrc_) { + incoming_rtp_packet_views_by_ssrc_.emplace_back( + LoggedRtpStreamView(stream.ssrc, stream.incoming_packets.data(), + stream.incoming_packets.size())); + } + for (const auto& stream : outgoing_rtp_packets_by_ssrc_) { + outgoing_rtp_packet_views_by_ssrc_.emplace_back( + LoggedRtpStreamView(stream.ssrc, stream.outgoing_packets.data(), + stream.outgoing_packets.size())); + } + + return success; +} + +bool ParsedRtcEventLogNew::ParseStreamInternal( + std::istream& stream) { // no-presubmit-check TODO(webrtc:8982) const size_t kMaxEventSize = (1u << 16) - 1; std::vector tmp_buffer(kMaxEventSize); uint64_t tag; @@ -410,38 +449,8 @@ bool ParsedRtcEventLogNew::ParseStream( } StoreParsedEvent(event); - events_.push_back(event); } - - // Move packets_streams from map to vector. - incoming_rtp_packets_by_ssrc_.reserve(incoming_rtp_packets_map_.size()); - for (const auto& kv : incoming_rtp_packets_map_) { - incoming_rtp_packets_by_ssrc_.emplace_back(LoggedRtpStreamIncoming()); - incoming_rtp_packets_by_ssrc_.back().ssrc = kv.first; - incoming_rtp_packets_by_ssrc_.back().incoming_packets = - std::move(kv.second); - } - outgoing_rtp_packets_by_ssrc_.reserve(outgoing_rtp_packets_map_.size()); - for (const auto& kv : outgoing_rtp_packets_map_) { - outgoing_rtp_packets_by_ssrc_.emplace_back(LoggedRtpStreamOutgoing()); - outgoing_rtp_packets_by_ssrc_.back().ssrc = kv.first; - outgoing_rtp_packets_by_ssrc_.back().outgoing_packets = - std::move(kv.second); - } - - // Build PacketViews for easier iteration over RTP packets - for (const auto& stream : incoming_rtp_packets_by_ssrc_) { - incoming_rtp_packet_views_by_ssrc_.emplace_back( - LoggedRtpStreamView(stream.ssrc, stream.incoming_packets.data(), - stream.incoming_packets.size())); - } - for (const auto& stream : outgoing_rtp_packets_by_ssrc_) { - outgoing_rtp_packet_views_by_ssrc_.emplace_back( - LoggedRtpStreamView(stream.ssrc, stream.outgoing_packets.data(), - stream.outgoing_packets.size())); - } - return true; } diff --git a/logging/rtc_event_log/rtc_event_log_parser_new.h b/logging/rtc_event_log/rtc_event_log_parser_new.h index 98d2a52085..c7cbc4b007 100644 --- a/logging/rtc_event_log/rtc_event_log_parser_new.h +++ b/logging/rtc_event_log/rtc_event_log_parser_new.h @@ -776,6 +776,9 @@ class ParsedRtcEventLogNew { int64_t last_timestamp() const { return last_timestamp_; } private: + bool ParseStreamInternal( + std::istream& stream); // no-presubmit-check TODO(webrtc:8982) + void StoreParsedEvent(const rtclog::Event& event); rtclog::StreamConfig GetVideoReceiveConfig(const rtclog::Event& event) const;