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 |