| 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,
|
|
|