Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(857)

Side by Side Diff: media/cast/logging/log_deserializer.cc

Issue 189583004: Cast: Implement log compression and (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: Created 6 years, 9 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
« no previous file with comments | « media/cast/logging/log_deserializer.h ('k') | media/cast/logging/log_serializer.h » ('j') | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
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
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
OLDNEW
« no previous file with comments | « media/cast/logging/log_deserializer.h ('k') | media/cast/logging/log_serializer.h » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698