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