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 |