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

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

Issue 241833002: Cast: Limit number of events/packets in EncodingEventSubscriber protos. (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: fix merge Created 6 years, 8 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_serializer.h ('k') | media/cast/logging/serialize_deserialize_test.cc » ('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 // The serialization format is as follows: 5 // The serialization format is as follows:
6 // 8-bit integer describing |is_audio|. 6 // 16-bit integer describing the following LogMetadata proto size in bytes.
7 // 32-bit integer describing |first_rtp_timestamp|. 7 // The LogMetadata proto.
8 // 32-bit integer describing number of frame events. 8 // 32-bit integer describing number of frame events.
9 // (The following repeated for number of frame events): 9 // (The following repeated for number of frame events):
10 // 16-bit integer describing the following AggregatedFrameEvent proto size 10 // 16-bit integer describing the following AggregatedFrameEvent proto size
11 // in bytes. 11 // in bytes.
12 // The AggregatedFrameEvent proto. 12 // The AggregatedFrameEvent proto.
13 // 32-bit integer describing number of packet events. 13 // 32-bit integer describing number of packet events.
14 // (The following repeated for number of packet events): 14 // (The following repeated for number of packet events):
15 // 16-bit integer describing the following AggregatedPacketEvent proto 15 // 16-bit integer describing the following AggregatedPacketEvent proto
16 // size in bytes. 16 // size in bytes.
17 // The AggregatedPacketEvent proto. 17 // The AggregatedPacketEvent proto.
18 18
19 #include "media/cast/logging/log_serializer.h" 19 #include "media/cast/logging/log_serializer.h"
20 20
21 #include "base/big_endian.h" 21 #include "base/big_endian.h"
22 #include "base/logging.h"
23 #include "base/memory/scoped_ptr.h"
22 #include "third_party/zlib/zlib.h" 24 #include "third_party/zlib/zlib.h"
23 25
24 namespace media { 26 namespace media {
25 namespace cast { 27 namespace cast {
26 28
27 namespace { 29 namespace {
28 30
29 using media::cast::proto::AggregatedFrameEvent; 31 using media::cast::proto::AggregatedFrameEvent;
30 using media::cast::proto::AggregatedPacketEvent; 32 using media::cast::proto::AggregatedPacketEvent;
31 using media::cast::proto::LogMetadata; 33 using media::cast::proto::LogMetadata;
32 34
33 // Use 30MB of temp buffer to hold uncompressed data if |compress| is true. 35 // Use 30MB of temp buffer to hold uncompressed data if |compress| is true.
34 const int kMaxUncompressedBytes = 30 * 1000 * 1000; 36 const int kMaxUncompressedBytes = 30 * 1000 * 1000;
35 37
38 // The maximum allowed size per serialized proto.
39 const int kMaxSerializedProtoBytes = (1 << 16) - 1;
36 bool DoSerializeEvents(const LogMetadata& metadata, 40 bool DoSerializeEvents(const LogMetadata& metadata,
37 const FrameEventMap& frame_events, 41 const FrameEventList& frame_events,
38 const PacketEventMap& packet_events, 42 const PacketEventList& packet_events,
39 const int max_output_bytes, 43 const int max_output_bytes,
40 char* output, 44 char* output,
41 int* output_bytes) { 45 int* output_bytes) {
42 base::BigEndianWriter writer(output, max_output_bytes); 46 base::BigEndianWriter writer(output, max_output_bytes);
43 47
44 int proto_size = metadata.ByteSize(); 48 int proto_size = metadata.ByteSize();
49 DCHECK(proto_size <= kMaxSerializedProtoBytes);
45 if (!writer.WriteU16(proto_size)) 50 if (!writer.WriteU16(proto_size))
46 return false; 51 return false;
47 if (!metadata.SerializeToArray(writer.ptr(), writer.remaining())) 52 if (!metadata.SerializeToArray(writer.ptr(), writer.remaining()))
48 return false; 53 return false;
49 if (!writer.Skip(proto_size)) 54 if (!writer.Skip(proto_size))
50 return false; 55 return false;
51 56
52 RtpTimestamp prev_rtp_timestamp = 0; 57 RtpTimestamp prev_rtp_timestamp = 0;
53 for (media::cast::FrameEventMap::const_iterator it = frame_events.begin(); 58 for (media::cast::FrameEventList::const_iterator it = frame_events.begin();
54 it != frame_events.end(); 59 it != frame_events.end();
55 ++it) { 60 ++it) {
56 media::cast::proto::AggregatedFrameEvent frame_event(*(it->second)); 61 media::cast::proto::AggregatedFrameEvent frame_event(**it);
57 62
58 // Adjust relative RTP timestamp so that it is relative to previous frame, 63 // Adjust relative RTP timestamp so that it is relative to previous frame,
59 // rather than relative to first RTP timestamp. 64 // rather than relative to first RTP timestamp.
60 // This is done to improve encoding size. 65 // This is done to improve encoding size.
66 RtpTimestamp old_relative_rtp_timestamp =
67 frame_event.relative_rtp_timestamp();
61 frame_event.set_relative_rtp_timestamp( 68 frame_event.set_relative_rtp_timestamp(
62 frame_event.relative_rtp_timestamp() - prev_rtp_timestamp); 69 old_relative_rtp_timestamp - prev_rtp_timestamp);
63 prev_rtp_timestamp = it->first; 70 prev_rtp_timestamp = old_relative_rtp_timestamp;
64 71
65 proto_size = frame_event.ByteSize(); 72 proto_size = frame_event.ByteSize();
73 DCHECK(proto_size <= kMaxSerializedProtoBytes);
66 74
67 // Write size of the proto, then write the proto. 75 // Write size of the proto, then write the proto.
68 if (!writer.WriteU16(proto_size)) 76 if (!writer.WriteU16(proto_size))
69 return false; 77 return false;
70 if (!frame_event.SerializeToArray(writer.ptr(), writer.remaining())) 78 if (!frame_event.SerializeToArray(writer.ptr(), writer.remaining()))
71 return false; 79 return false;
72 if (!writer.Skip(proto_size)) 80 if (!writer.Skip(proto_size))
73 return false; 81 return false;
74 } 82 }
75 83
76 // Write packet events. 84 // Write packet events.
77 prev_rtp_timestamp = 0; 85 prev_rtp_timestamp = 0;
78 for (media::cast::PacketEventMap::const_iterator it = packet_events.begin(); 86 for (media::cast::PacketEventList::const_iterator it = packet_events.begin();
79 it != packet_events.end(); 87 it != packet_events.end();
80 ++it) { 88 ++it) {
81 media::cast::proto::AggregatedPacketEvent packet_event(*(it->second)); 89 media::cast::proto::AggregatedPacketEvent packet_event(**it);
90 RtpTimestamp old_relative_rtp_timestamp =
91 packet_event.relative_rtp_timestamp();
82 packet_event.set_relative_rtp_timestamp( 92 packet_event.set_relative_rtp_timestamp(
83 packet_event.relative_rtp_timestamp() - prev_rtp_timestamp); 93 old_relative_rtp_timestamp - prev_rtp_timestamp);
84 prev_rtp_timestamp = it->first; 94 prev_rtp_timestamp = old_relative_rtp_timestamp;
85 95
86 proto_size = packet_event.ByteSize(); 96 proto_size = packet_event.ByteSize();
97 DCHECK(proto_size <= kMaxSerializedProtoBytes);
87 98
88 // Write size of the proto, then write the proto. 99 // Write size of the proto, then write the proto.
89 if (!writer.WriteU16(proto_size)) 100 if (!writer.WriteU16(proto_size))
90 return false; 101 return false;
91 if (!packet_event.SerializeToArray(writer.ptr(), writer.remaining())) 102 if (!packet_event.SerializeToArray(writer.ptr(), writer.remaining()))
92 return false; 103 return false;
93 if (!writer.Skip(proto_size)) 104 if (!writer.Skip(proto_size))
94 return false; 105 return false;
95 } 106 }
96 107
(...skipping 34 matching lines...) Expand 10 before | Expand all | Expand 10 after
131 142
132 if (success) 143 if (success)
133 *output_bytes = max_output_bytes - stream.avail_out; 144 *output_bytes = max_output_bytes - stream.avail_out;
134 145
135 return success; 146 return success;
136 } 147 }
137 148
138 } // namespace 149 } // namespace
139 150
140 bool SerializeEvents(const LogMetadata& log_metadata, 151 bool SerializeEvents(const LogMetadata& log_metadata,
141 const FrameEventMap& frame_events, 152 const FrameEventList& frame_events,
142 const PacketEventMap& packet_events, 153 const PacketEventList& packet_events,
143 bool compress, 154 bool compress,
144 int max_output_bytes, 155 int max_output_bytes,
145 char* output, 156 char* output,
146 int* output_bytes) { 157 int* output_bytes) {
147 DCHECK_GT(max_output_bytes, 0); 158 DCHECK_GT(max_output_bytes, 0);
148 DCHECK(output); 159 DCHECK(output);
149 DCHECK(output_bytes); 160 DCHECK(output_bytes);
150 161
151 if (compress) { 162 if (compress) {
152 // Allocate a reasonably large temp buffer to hold uncompressed data. 163 // Allocate a reasonably large temp buffer to hold uncompressed data.
(...skipping 17 matching lines...) Expand all
170 frame_events, 181 frame_events,
171 packet_events, 182 packet_events,
172 max_output_bytes, 183 max_output_bytes,
173 output, 184 output,
174 output_bytes); 185 output_bytes);
175 } 186 }
176 } 187 }
177 188
178 } // namespace cast 189 } // namespace cast
179 } // namespace media 190 } // namespace media
OLDNEW
« no previous file with comments | « media/cast/logging/log_serializer.h ('k') | media/cast/logging/serialize_deserialize_test.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698