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 <map> | 7 #include <map> |
8 #include <utility> | 8 #include <utility> |
9 | 9 |
10 #include "base/big_endian.h" | 10 #include "base/big_endian.h" |
| 11 #include "third_party/zlib/zlib.h" |
11 | 12 |
| 13 using media::cast::FrameEventMap; |
| 14 using media::cast::PacketEventMap; |
| 15 using media::cast::RtpTimestamp; |
12 using media::cast::proto::AggregatedFrameEvent; | 16 using media::cast::proto::AggregatedFrameEvent; |
13 using media::cast::proto::AggregatedPacketEvent; | 17 using media::cast::proto::AggregatedPacketEvent; |
| 18 using media::cast::proto::LogMetadata; |
14 | 19 |
15 namespace media { | 20 namespace { |
16 namespace cast { | |
17 | 21 |
18 bool DeserializeEvents(const std::string& data, | 22 // Use 30MB of temp buffer to hold uncompressed data if |compress| is true. |
19 media::cast::proto::LogMetadata* metadata, | 23 const int kMaxUncompressedBytes = 30 * 1000 * 1000; |
20 FrameEventMap* frame_events, | |
21 PacketEventMap* packet_events) { | |
22 DCHECK(metadata); | |
23 DCHECK(frame_events); | |
24 DCHECK(packet_events); | |
25 | 24 |
26 base::BigEndianReader reader(&data[0], data.size()); | 25 bool DoDeserializeEvents(char* data, |
| 26 int data_bytes, |
| 27 LogMetadata* metadata, |
| 28 FrameEventMap* frame_events, |
| 29 PacketEventMap* packet_events) { |
| 30 base::BigEndianReader reader(data, data_bytes); |
27 | 31 |
28 uint16 proto_size; | 32 uint16 proto_size; |
29 if (!reader.ReadU16(&proto_size)) | 33 if (!reader.ReadU16(&proto_size)) |
30 return false; | 34 return false; |
31 if (!metadata->ParseFromArray(reader.ptr(), proto_size)) | 35 if (!metadata->ParseFromArray(reader.ptr(), proto_size)) |
32 return false; | 36 return false; |
33 if (!reader.Skip(proto_size)) | 37 if (!reader.Skip(proto_size)) |
34 return false; | 38 return false; |
35 | |
36 FrameEventMap frame_event_map; | 39 FrameEventMap frame_event_map; |
37 PacketEventMap packet_event_map; | 40 PacketEventMap packet_event_map; |
38 | 41 |
39 int num_frame_events = metadata->num_frame_events(); | 42 int num_frame_events = metadata->num_frame_events(); |
40 | 43 |
41 for (int i = 0; i < num_frame_events; i++) { | 44 for (int i = 0; i < num_frame_events; i++) { |
42 if (!reader.ReadU16(&proto_size)) | 45 if (!reader.ReadU16(&proto_size)) |
43 return false; | 46 return false; |
44 | 47 |
45 linked_ptr<AggregatedFrameEvent> frame_event(new AggregatedFrameEvent); | 48 linked_ptr<AggregatedFrameEvent> frame_event(new AggregatedFrameEvent); |
(...skipping 31 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
77 << packet_event->relative_rtp_timestamp(); | 80 << packet_event->relative_rtp_timestamp(); |
78 return false; | 81 return false; |
79 } | 82 } |
80 } | 83 } |
81 | 84 |
82 packet_events->swap(packet_event_map); | 85 packet_events->swap(packet_event_map); |
83 | 86 |
84 return true; | 87 return true; |
85 } | 88 } |
86 | 89 |
| 90 bool Uncompress(char* data, |
| 91 int data_bytes, |
| 92 int max_uncompressed_bytes, |
| 93 char* uncompressed, |
| 94 int* uncompressed_bytes) { |
| 95 z_stream stream = {0}; |
| 96 // 16 is added to read in gzip format. |
| 97 int result = inflateInit2(&stream, MAX_WBITS + 16); |
| 98 DCHECK_EQ(Z_OK, result); |
| 99 |
| 100 stream.next_in = reinterpret_cast<uint8*>(data); |
| 101 stream.avail_in = data_bytes; |
| 102 stream.next_out = reinterpret_cast<uint8*>(uncompressed); |
| 103 stream.avail_out = max_uncompressed_bytes; |
| 104 |
| 105 result = inflate(&stream, Z_FINISH); |
| 106 bool success = (result == Z_STREAM_END); |
| 107 if (!success) |
| 108 DVLOG(2) << "inflate() failed. Result: " << result; |
| 109 |
| 110 result = inflateEnd(&stream); |
| 111 DCHECK(result == Z_OK); |
| 112 |
| 113 if (success) |
| 114 *uncompressed_bytes = max_uncompressed_bytes - stream.avail_out; |
| 115 |
| 116 return success; |
| 117 } |
| 118 } // namespace |
| 119 |
| 120 namespace media { |
| 121 namespace cast { |
| 122 |
| 123 bool DeserializeEvents(char* data, |
| 124 int data_bytes, |
| 125 bool compressed, |
| 126 LogMetadata* log_metadata, |
| 127 FrameEventMap* frame_events, |
| 128 PacketEventMap* packet_events) { |
| 129 DCHECK(data); |
| 130 DCHECK_GT(data_bytes, 0); |
| 131 DCHECK(log_metadata); |
| 132 DCHECK(frame_events); |
| 133 DCHECK(packet_events); |
| 134 |
| 135 if (compressed) { |
| 136 scoped_ptr<char[]> uncompressed(new char[kMaxUncompressedBytes]); |
| 137 int uncompressed_bytes; |
| 138 if (!Uncompress(data, |
| 139 data_bytes, |
| 140 kMaxUncompressedBytes, |
| 141 uncompressed.get(), |
| 142 &uncompressed_bytes)) |
| 143 return false; |
| 144 |
| 145 return DoDeserializeEvents(uncompressed.get(), |
| 146 uncompressed_bytes, |
| 147 log_metadata, |
| 148 frame_events, |
| 149 packet_events); |
| 150 } else { |
| 151 return DoDeserializeEvents( |
| 152 data, data_bytes, log_metadata, frame_events, packet_events); |
| 153 } |
| 154 } |
| 155 |
87 } // namespace cast | 156 } // namespace cast |
88 } // namespace media | 157 } // namespace media |
OLD | NEW |