| OLD | NEW |
| 1 // Copyright 2014 The Chromium Authors. All rights reserved. | 1 // Copyright 2014 The Chromium Authors. All rights reserved. |
| 2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
| 3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
| 4 | 4 |
| 5 #include "media/cast/logging/log_deserializer.h" | 5 #include "media/cast/logging/log_deserializer.h" |
| 6 | 6 |
| 7 #include <utility> | 7 #include <utility> |
| 8 | 8 |
| 9 #include "base/big_endian.h" | 9 #include "base/big_endian.h" |
| 10 #include "base/memory/scoped_ptr.h" | 10 #include "base/memory/scoped_ptr.h" |
| 11 #include "third_party/zlib/zlib.h" | 11 #include "third_party/zlib/zlib.h" |
| 12 | 12 |
| 13 using media::cast::FrameEventMap; | 13 using media::cast::FrameEventMap; |
| 14 using media::cast::PacketEventMap; | 14 using media::cast::PacketEventMap; |
| 15 using media::cast::RtpTimestamp; | 15 using media::cast::RtpTimeDelta; |
| 16 using media::cast::RtpTimeTicks; |
| 16 using media::cast::proto::AggregatedFrameEvent; | 17 using media::cast::proto::AggregatedFrameEvent; |
| 17 using media::cast::proto::AggregatedPacketEvent; | 18 using media::cast::proto::AggregatedPacketEvent; |
| 18 using media::cast::proto::BasePacketEvent; | 19 using media::cast::proto::BasePacketEvent; |
| 19 using media::cast::proto::LogMetadata; | 20 using media::cast::proto::LogMetadata; |
| 20 | 21 |
| 21 namespace { | 22 namespace { |
| 22 | 23 |
| 23 // Use 60MB of temp buffer to hold uncompressed data if |compress| is true. | 24 // Use 60MB of temp buffer to hold uncompressed data if |compress| is true. |
| 24 // This is double the size of temp buffer used during compression (30MB) | 25 // This is double the size of temp buffer used during compression (30MB) |
| 25 // since the there are two streams in the blob. | 26 // since the there are two streams in the blob. |
| (...skipping 38 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 64 if (!to->has_target_bitrate() && from.has_target_bitrate()) | 65 if (!to->has_target_bitrate() && from.has_target_bitrate()) |
| 65 to->set_target_bitrate(from.target_bitrate()); | 66 to->set_target_bitrate(from.target_bitrate()); |
| 66 } | 67 } |
| 67 | 68 |
| 68 bool PopulateDeserializedLog(base::BigEndianReader* reader, | 69 bool PopulateDeserializedLog(base::BigEndianReader* reader, |
| 69 media::cast::DeserializedLog* log) { | 70 media::cast::DeserializedLog* log) { |
| 70 FrameEventMap frame_event_map; | 71 FrameEventMap frame_event_map; |
| 71 PacketEventMap packet_event_map; | 72 PacketEventMap packet_event_map; |
| 72 | 73 |
| 73 int num_frame_events = log->metadata.num_frame_events(); | 74 int num_frame_events = log->metadata.num_frame_events(); |
| 74 RtpTimestamp relative_rtp_timestamp = 0; | 75 RtpTimeTicks relative_rtp_timestamp; |
| 75 uint16 proto_size = 0; | 76 uint16 proto_size = 0; |
| 76 for (int i = 0; i < num_frame_events; i++) { | 77 for (int i = 0; i < num_frame_events; i++) { |
| 77 if (!reader->ReadU16(&proto_size)) | 78 if (!reader->ReadU16(&proto_size)) |
| 78 return false; | 79 return false; |
| 79 | 80 |
| 80 linked_ptr<AggregatedFrameEvent> frame_event(new AggregatedFrameEvent); | 81 linked_ptr<AggregatedFrameEvent> frame_event(new AggregatedFrameEvent); |
| 81 if (!frame_event->ParseFromArray(reader->ptr(), proto_size)) | 82 if (!frame_event->ParseFromArray(reader->ptr(), proto_size)) |
| 82 return false; | 83 return false; |
| 83 if (!reader->Skip(proto_size)) | 84 if (!reader->Skip(proto_size)) |
| 84 return false; | 85 return false; |
| 85 | 86 |
| 86 // During serialization the RTP timestamp in proto is relative to previous | 87 // During serialization the RTP timestamp in proto is relative to previous |
| 87 // frame. | 88 // frame. |
| 88 // Adjust RTP timestamp back to value relative to first RTP timestamp. | 89 // Adjust RTP timestamp back to value relative to first RTP timestamp. |
| 90 relative_rtp_timestamp += |
| 91 RtpTimeDelta::FromTicks(frame_event->relative_rtp_timestamp()); |
| 89 frame_event->set_relative_rtp_timestamp( | 92 frame_event->set_relative_rtp_timestamp( |
| 90 frame_event->relative_rtp_timestamp() + relative_rtp_timestamp); | 93 relative_rtp_timestamp.lower_32_bits()); |
| 91 relative_rtp_timestamp = frame_event->relative_rtp_timestamp(); | |
| 92 | 94 |
| 93 FrameEventMap::iterator it = frame_event_map.find( | 95 FrameEventMap::iterator it = frame_event_map.find(relative_rtp_timestamp); |
| 94 frame_event->relative_rtp_timestamp()); | |
| 95 if (it == frame_event_map.end()) { | 96 if (it == frame_event_map.end()) { |
| 96 frame_event_map.insert( | 97 frame_event_map.insert( |
| 97 std::make_pair(frame_event->relative_rtp_timestamp(), frame_event)); | 98 std::make_pair(relative_rtp_timestamp, frame_event)); |
| 98 } else { | 99 } else { |
| 99 // Events for the same frame might have been split into more than one | 100 // Events for the same frame might have been split into more than one |
| 100 // proto. Merge them. | 101 // proto. Merge them. |
| 101 MergeFrameEvent(*frame_event, it->second); | 102 MergeFrameEvent(*frame_event, it->second); |
| 102 } | 103 } |
| 103 } | 104 } |
| 104 | 105 |
| 105 log->frame_events.swap(frame_event_map); | 106 log->frame_events.swap(frame_event_map); |
| 106 | 107 |
| 107 int num_packet_events = log->metadata.num_packet_events(); | 108 int num_packet_events = log->metadata.num_packet_events(); |
| 108 relative_rtp_timestamp = 0; | 109 relative_rtp_timestamp = RtpTimeTicks(); |
| 109 for (int i = 0; i < num_packet_events; i++) { | 110 for (int i = 0; i < num_packet_events; i++) { |
| 110 if (!reader->ReadU16(&proto_size)) | 111 if (!reader->ReadU16(&proto_size)) |
| 111 return false; | 112 return false; |
| 112 | 113 |
| 113 linked_ptr<AggregatedPacketEvent> packet_event(new AggregatedPacketEvent); | 114 linked_ptr<AggregatedPacketEvent> packet_event(new AggregatedPacketEvent); |
| 114 if (!packet_event->ParseFromArray(reader->ptr(), proto_size)) | 115 if (!packet_event->ParseFromArray(reader->ptr(), proto_size)) |
| 115 return false; | 116 return false; |
| 116 if (!reader->Skip(proto_size)) | 117 if (!reader->Skip(proto_size)) |
| 117 return false; | 118 return false; |
| 118 | 119 |
| 120 relative_rtp_timestamp += |
| 121 RtpTimeDelta::FromTicks(packet_event->relative_rtp_timestamp()); |
| 119 packet_event->set_relative_rtp_timestamp( | 122 packet_event->set_relative_rtp_timestamp( |
| 120 packet_event->relative_rtp_timestamp() + relative_rtp_timestamp); | 123 relative_rtp_timestamp.lower_32_bits()); |
| 121 relative_rtp_timestamp = packet_event->relative_rtp_timestamp(); | |
| 122 | 124 |
| 123 PacketEventMap::iterator it = packet_event_map.find( | 125 PacketEventMap::iterator it = packet_event_map.find(relative_rtp_timestamp); |
| 124 packet_event->relative_rtp_timestamp()); | |
| 125 if (it == packet_event_map.end()) { | 126 if (it == packet_event_map.end()) { |
| 126 packet_event_map.insert( | 127 packet_event_map.insert( |
| 127 std::make_pair(packet_event->relative_rtp_timestamp(), packet_event)); | 128 std::make_pair(relative_rtp_timestamp, packet_event)); |
| 128 } else { | 129 } else { |
| 129 // Events for the same frame might have been split into more than one | 130 // Events for the same frame might have been split into more than one |
| 130 // proto. Merge them. | 131 // proto. Merge them. |
| 131 MergePacketEvent(*packet_event, it->second); | 132 MergePacketEvent(*packet_event, it->second); |
| 132 } | 133 } |
| 133 } | 134 } |
| 134 | 135 |
| 135 log->packet_events.swap(packet_event_map); | 136 log->packet_events.swap(packet_event_map); |
| 136 | 137 |
| 137 return true; | 138 return true; |
| (...skipping 104 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 242 } else { | 243 } else { |
| 243 return DoDeserializeEvents(data, data_bytes, audio_log, video_log); | 244 return DoDeserializeEvents(data, data_bytes, audio_log, video_log); |
| 244 } | 245 } |
| 245 } | 246 } |
| 246 | 247 |
| 247 DeserializedLog::DeserializedLog() {} | 248 DeserializedLog::DeserializedLog() {} |
| 248 DeserializedLog::~DeserializedLog() {} | 249 DeserializedLog::~DeserializedLog() {} |
| 249 | 250 |
| 250 } // namespace cast | 251 } // namespace cast |
| 251 } // namespace media | 252 } // namespace media |
| OLD | NEW |