Index: media/cast/logging/log_deserializer.cc |
diff --git a/media/cast/logging/log_deserializer.cc b/media/cast/logging/log_deserializer.cc |
index 997daa9081dbe6ff3c1d63d2455b0596b170a4e4..5621be032122d5145773260489417acc04f949e4 100644 |
--- a/media/cast/logging/log_deserializer.cc |
+++ b/media/cast/logging/log_deserializer.cc |
@@ -8,6 +8,7 @@ |
#include <utility> |
#include "base/big_endian.h" |
+#include "base/memory/scoped_ptr.h" |
#include "third_party/zlib/zlib.h" |
using media::cast::FrameEventMap; |
@@ -15,6 +16,7 @@ using media::cast::PacketEventMap; |
using media::cast::RtpTimestamp; |
using media::cast::proto::AggregatedFrameEvent; |
using media::cast::proto::AggregatedPacketEvent; |
+using media::cast::proto::BasePacketEvent; |
using media::cast::proto::LogMetadata; |
namespace { |
@@ -25,6 +27,38 @@ namespace { |
// Keep in sync with media/cast/logging/log_serializer.cc. |
const int kMaxUncompressedBytes = 60 * 1000 * 1000; |
+void MergePacketEvent(const AggregatedPacketEvent& from, |
+ linked_ptr<AggregatedPacketEvent> to) { |
+ for (int i = 0; i < from.base_packet_event_size(); i++) { |
+ const BasePacketEvent& from_base_event = from.base_packet_event(i); |
+ bool merged = false; |
+ for (int j = 0; j < to->base_packet_event_size(); j++) { |
+ BasePacketEvent* to_base_event = to->mutable_base_packet_event(i); |
+ if (from_base_event.packet_id() == to_base_event->packet_id()) { |
+ to_base_event->MergeFrom(from_base_event); |
+ merged = true; |
+ break; |
+ } |
+ } |
+ if (!merged) { |
+ BasePacketEvent* to_base_event = to->add_base_packet_event(); |
+ to_base_event->CopyFrom(from_base_event); |
+ } |
+ } |
+} |
+ |
+void MergeFrameEvent(const AggregatedFrameEvent& from, |
+ linked_ptr<AggregatedFrameEvent> to) { |
+ to->mutable_event_type()->MergeFrom(from.event_type()); |
+ to->mutable_event_timestamp_ms()->MergeFrom(from.event_timestamp_ms()); |
+ if (!to->has_encoded_frame_size()) |
+ to->set_encoded_frame_size(from.encoded_frame_size()); |
+ if (!to->has_delay_millis()) |
+ to->set_delay_millis(from.delay_millis()); |
+ if (!to->has_key_frame()) |
+ to->set_key_frame(from.key_frame()); |
+} |
+ |
bool PopulateDeserializedLog(base::BigEndianReader* reader, |
media::cast::DeserializedLog* log) { |
FrameEventMap frame_event_map; |
@@ -50,12 +84,15 @@ bool PopulateDeserializedLog(base::BigEndianReader* reader, |
frame_event->relative_rtp_timestamp() + relative_rtp_timestamp); |
relative_rtp_timestamp = frame_event->relative_rtp_timestamp(); |
- std::pair<FrameEventMap::iterator, bool> result = frame_event_map.insert( |
- std::make_pair(frame_event->relative_rtp_timestamp(), frame_event)); |
- if (!result.second) { |
- VLOG(1) << "Duplicate frame event entry detected: " |
- << frame_event->relative_rtp_timestamp(); |
- return false; |
+ FrameEventMap::iterator it = frame_event_map.find( |
+ frame_event->relative_rtp_timestamp()); |
+ if (it == frame_event_map.end()) { |
+ frame_event_map.insert( |
+ std::make_pair(frame_event->relative_rtp_timestamp(), frame_event)); |
+ } else { |
+ // Events for the same frame might have been split into more than one |
+ // proto. Merge them. |
+ MergeFrameEvent(*frame_event, it->second); |
} |
} |
@@ -77,12 +114,15 @@ bool PopulateDeserializedLog(base::BigEndianReader* reader, |
packet_event->relative_rtp_timestamp() + relative_rtp_timestamp); |
relative_rtp_timestamp = packet_event->relative_rtp_timestamp(); |
- std::pair<PacketEventMap::iterator, bool> result = packet_event_map.insert( |
- std::make_pair(packet_event->relative_rtp_timestamp(), packet_event)); |
- if (!result.second) { |
- VLOG(1) << "Duplicate packet event entry detected: " |
- << packet_event->relative_rtp_timestamp(); |
- return false; |
+ PacketEventMap::iterator it = packet_event_map.find( |
+ packet_event->relative_rtp_timestamp()); |
+ if (it == packet_event_map.end()) { |
+ packet_event_map.insert( |
+ std::make_pair(packet_event->relative_rtp_timestamp(), packet_event)); |
+ } else { |
+ // Events for the same frame might have been split into more than one |
+ // proto. Merge them. |
+ MergePacketEvent(*packet_event, it->second); |
} |
} |