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

Unified 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 side-by-side diff with in-line comments
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 »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
Index: media/cast/logging/log_serializer.cc
diff --git a/media/cast/logging/log_serializer.cc b/media/cast/logging/log_serializer.cc
index 3452c903bf94aadfd700f6447ddddd4733fedaa1..afcf77013f3e9fbdabf93fa69a2864e2b726aa79 100644
--- a/media/cast/logging/log_serializer.cc
+++ b/media/cast/logging/log_serializer.cc
@@ -3,8 +3,8 @@
// found in the LICENSE file.
//
// The serialization format is as follows:
-// 8-bit integer describing |is_audio|.
-// 32-bit integer describing |first_rtp_timestamp|.
+// 16-bit integer describing the following LogMetadata proto size in bytes.
+// The LogMetadata proto.
// 32-bit integer describing number of frame events.
// (The following repeated for number of frame events):
// 16-bit integer describing the following AggregatedFrameEvent proto size
@@ -19,6 +19,8 @@
#include "media/cast/logging/log_serializer.h"
#include "base/big_endian.h"
+#include "base/logging.h"
+#include "base/memory/scoped_ptr.h"
#include "third_party/zlib/zlib.h"
namespace media {
@@ -33,15 +35,18 @@ using media::cast::proto::LogMetadata;
// Use 30MB of temp buffer to hold uncompressed data if |compress| is true.
const int kMaxUncompressedBytes = 30 * 1000 * 1000;
+// The maximum allowed size per serialized proto.
+const int kMaxSerializedProtoBytes = (1 << 16) - 1;
bool DoSerializeEvents(const LogMetadata& metadata,
- const FrameEventMap& frame_events,
- const PacketEventMap& packet_events,
+ const FrameEventList& frame_events,
+ const PacketEventList& packet_events,
const int max_output_bytes,
char* output,
int* output_bytes) {
base::BigEndianWriter writer(output, max_output_bytes);
int proto_size = metadata.ByteSize();
+ DCHECK(proto_size <= kMaxSerializedProtoBytes);
if (!writer.WriteU16(proto_size))
return false;
if (!metadata.SerializeToArray(writer.ptr(), writer.remaining()))
@@ -50,19 +55,22 @@ bool DoSerializeEvents(const LogMetadata& metadata,
return false;
RtpTimestamp prev_rtp_timestamp = 0;
- for (media::cast::FrameEventMap::const_iterator it = frame_events.begin();
+ for (media::cast::FrameEventList::const_iterator it = frame_events.begin();
it != frame_events.end();
++it) {
- media::cast::proto::AggregatedFrameEvent frame_event(*(it->second));
+ media::cast::proto::AggregatedFrameEvent frame_event(**it);
// Adjust relative RTP timestamp so that it is relative to previous frame,
// rather than relative to first RTP timestamp.
// This is done to improve encoding size.
+ RtpTimestamp old_relative_rtp_timestamp =
+ frame_event.relative_rtp_timestamp();
frame_event.set_relative_rtp_timestamp(
- frame_event.relative_rtp_timestamp() - prev_rtp_timestamp);
- prev_rtp_timestamp = it->first;
+ old_relative_rtp_timestamp - prev_rtp_timestamp);
+ prev_rtp_timestamp = old_relative_rtp_timestamp;
proto_size = frame_event.ByteSize();
+ DCHECK(proto_size <= kMaxSerializedProtoBytes);
// Write size of the proto, then write the proto.
if (!writer.WriteU16(proto_size))
@@ -75,15 +83,18 @@ bool DoSerializeEvents(const LogMetadata& metadata,
// Write packet events.
prev_rtp_timestamp = 0;
- for (media::cast::PacketEventMap::const_iterator it = packet_events.begin();
+ for (media::cast::PacketEventList::const_iterator it = packet_events.begin();
it != packet_events.end();
++it) {
- media::cast::proto::AggregatedPacketEvent packet_event(*(it->second));
+ media::cast::proto::AggregatedPacketEvent packet_event(**it);
+ RtpTimestamp old_relative_rtp_timestamp =
+ packet_event.relative_rtp_timestamp();
packet_event.set_relative_rtp_timestamp(
- packet_event.relative_rtp_timestamp() - prev_rtp_timestamp);
- prev_rtp_timestamp = it->first;
+ old_relative_rtp_timestamp - prev_rtp_timestamp);
+ prev_rtp_timestamp = old_relative_rtp_timestamp;
proto_size = packet_event.ByteSize();
+ DCHECK(proto_size <= kMaxSerializedProtoBytes);
// Write size of the proto, then write the proto.
if (!writer.WriteU16(proto_size))
@@ -138,8 +149,8 @@ bool Compress(char* uncompressed_buffer,
} // namespace
bool SerializeEvents(const LogMetadata& log_metadata,
- const FrameEventMap& frame_events,
- const PacketEventMap& packet_events,
+ const FrameEventList& frame_events,
+ const PacketEventList& packet_events,
bool compress,
int max_output_bytes,
char* output,
« 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