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

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: 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
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 // 8-bit integer describing |is_audio|.
7 // 32-bit integer describing |first_rtp_timestamp|. 7 // 32-bit integer describing |first_rtp_timestamp|.
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"
22 #include "third_party/zlib/zlib.h" 23 #include "third_party/zlib/zlib.h"
23 24
24 namespace media { 25 namespace media {
25 namespace cast { 26 namespace cast {
26 27
27 namespace { 28 namespace {
28 29
29 using media::cast::proto::AggregatedFrameEvent; 30 using media::cast::proto::AggregatedFrameEvent;
30 using media::cast::proto::AggregatedPacketEvent; 31 using media::cast::proto::AggregatedPacketEvent;
31 using media::cast::proto::LogMetadata; 32 using media::cast::proto::LogMetadata;
32 33
33 // Use 30MB of temp buffer to hold uncompressed data if |compress| is true. 34 // Use 30MB of temp buffer to hold uncompressed data if |compress| is true.
34 const int kMaxUncompressedBytes = 30 * 1000 * 1000; 35 const int kMaxUncompressedBytes = 30 * 1000 * 1000;
35 36
37 // The maximum allowed size per serialized proto.
38 const int kMaxSerializedProtoBytes = (1 << 16) - 1;
36 bool DoSerializeEvents(const LogMetadata& metadata, 39 bool DoSerializeEvents(const LogMetadata& metadata,
37 const FrameEventMap& frame_events, 40 const FrameEventMap& frame_events,
38 const PacketEventMap& packet_events, 41 const PacketEventMap& packet_events,
39 const int max_output_bytes, 42 const int max_output_bytes,
40 char* output, 43 char* output,
41 int* output_bytes) { 44 int* output_bytes) {
42 base::BigEndianWriter writer(output, max_output_bytes); 45 base::BigEndianWriter writer(output, max_output_bytes);
43 46
44 int proto_size = metadata.ByteSize(); 47 int proto_size = metadata.ByteSize();
48 DCHECK(proto_size <= kMaxSerializedProtoBytes);
45 if (!writer.WriteU16(proto_size)) 49 if (!writer.WriteU16(proto_size))
46 return false; 50 return false;
47 if (!metadata.SerializeToArray(writer.ptr(), writer.remaining())) 51 if (!metadata.SerializeToArray(writer.ptr(), writer.remaining()))
48 return false; 52 return false;
49 if (!writer.Skip(proto_size)) 53 if (!writer.Skip(proto_size))
50 return false; 54 return false;
51 55
52 RtpTimestamp prev_rtp_timestamp = 0; 56 RtpTimestamp prev_rtp_timestamp = 0;
53 for (media::cast::FrameEventMap::const_iterator it = frame_events.begin(); 57 for (media::cast::FrameEventMap::const_iterator it = frame_events.begin();
54 it != frame_events.end(); 58 it != frame_events.end();
55 ++it) { 59 ++it) {
56 media::cast::proto::AggregatedFrameEvent frame_event(*(it->second)); 60 media::cast::proto::AggregatedFrameEvent frame_event(*(it->second));
57 61
58 // Adjust relative RTP timestamp so that it is relative to previous frame, 62 // Adjust relative RTP timestamp so that it is relative to previous frame,
59 // rather than relative to first RTP timestamp. 63 // rather than relative to first RTP timestamp.
60 // This is done to improve encoding size. 64 // This is done to improve encoding size.
61 frame_event.set_relative_rtp_timestamp( 65 frame_event.set_relative_rtp_timestamp(
62 frame_event.relative_rtp_timestamp() - prev_rtp_timestamp); 66 frame_event.relative_rtp_timestamp() - prev_rtp_timestamp);
63 prev_rtp_timestamp = it->first; 67 prev_rtp_timestamp = it->first;
64 68
65 proto_size = frame_event.ByteSize(); 69 proto_size = frame_event.ByteSize();
70 DCHECK(proto_size <= kMaxSerializedProtoBytes);
66 71
67 // Write size of the proto, then write the proto. 72 // Write size of the proto, then write the proto.
68 if (!writer.WriteU16(proto_size)) 73 if (!writer.WriteU16(proto_size))
69 return false; 74 return false;
70 if (!frame_event.SerializeToArray(writer.ptr(), writer.remaining())) 75 if (!frame_event.SerializeToArray(writer.ptr(), writer.remaining()))
71 return false; 76 return false;
72 if (!writer.Skip(proto_size)) 77 if (!writer.Skip(proto_size))
73 return false; 78 return false;
74 } 79 }
75 80
76 // Write packet events. 81 // Write packet events.
77 prev_rtp_timestamp = 0; 82 prev_rtp_timestamp = 0;
78 for (media::cast::PacketEventMap::const_iterator it = packet_events.begin(); 83 for (media::cast::PacketEventMap::const_iterator it = packet_events.begin();
79 it != packet_events.end(); 84 it != packet_events.end();
80 ++it) { 85 ++it) {
81 media::cast::proto::AggregatedPacketEvent packet_event(*(it->second)); 86 media::cast::proto::AggregatedPacketEvent packet_event(*(it->second));
82 packet_event.set_relative_rtp_timestamp( 87 packet_event.set_relative_rtp_timestamp(
83 packet_event.relative_rtp_timestamp() - prev_rtp_timestamp); 88 packet_event.relative_rtp_timestamp() - prev_rtp_timestamp);
84 prev_rtp_timestamp = it->first; 89 prev_rtp_timestamp = it->first;
85 90
86 proto_size = packet_event.ByteSize(); 91 proto_size = packet_event.ByteSize();
92 DCHECK(proto_size <= kMaxSerializedProtoBytes);
87 93
88 // Write size of the proto, then write the proto. 94 // Write size of the proto, then write the proto.
89 if (!writer.WriteU16(proto_size)) 95 if (!writer.WriteU16(proto_size))
90 return false; 96 return false;
91 if (!packet_event.SerializeToArray(writer.ptr(), writer.remaining())) 97 if (!packet_event.SerializeToArray(writer.ptr(), writer.remaining()))
92 return false; 98 return false;
93 if (!writer.Skip(proto_size)) 99 if (!writer.Skip(proto_size))
94 return false; 100 return false;
95 } 101 }
96 102
(...skipping 73 matching lines...) Expand 10 before | Expand all | Expand 10 after
170 frame_events, 176 frame_events,
171 packet_events, 177 packet_events,
172 max_output_bytes, 178 max_output_bytes,
173 output, 179 output,
174 output_bytes); 180 output_bytes);
175 } 181 }
176 } 182 }
177 183
178 } // namespace cast 184 } // namespace cast
179 } // namespace media 185 } // namespace media
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698