| Index: media/cast/logging/encoding_event_subscriber.cc
|
| diff --git a/media/cast/logging/encoding_event_subscriber.cc b/media/cast/logging/encoding_event_subscriber.cc
|
| index 5a7333a70893b3d3f6c0caaadfadc207fac1de0b..265e39d2be4c05d5a23540d586e33a247600feae 100644
|
| --- a/media/cast/logging/encoding_event_subscriber.cc
|
| +++ b/media/cast/logging/encoding_event_subscriber.cc
|
| @@ -4,6 +4,7 @@
|
|
|
| #include "media/cast/logging/encoding_event_subscriber.h"
|
|
|
| +#include <cstring>
|
| #include <utility>
|
|
|
| #include "base/logging.h"
|
| @@ -18,7 +19,9 @@ using media::cast::proto::BasePacketEvent;
|
| namespace media {
|
| namespace cast {
|
|
|
| -EncodingEventSubscriber::EncodingEventSubscriber() {}
|
| +EncodingEventSubscriber::EncodingEventSubscriber(
|
| + EventMediaType event_media_type, size_t max_frames)
|
| + : event_media_type_(event_media_type), max_frames_(max_frames) {}
|
|
|
| EncodingEventSubscriber::~EncodingEventSubscriber() {
|
| DCHECK(thread_checker_.CalledOnValidThread());
|
| @@ -28,91 +31,93 @@ void EncodingEventSubscriber::OnReceiveFrameEvent(
|
| const FrameEvent& frame_event) {
|
| DCHECK(thread_checker_.CalledOnValidThread());
|
|
|
| - FrameEventMap::iterator it = frame_event_map_.find(frame_event.rtp_timestamp);
|
| - linked_ptr<AggregatedFrameEvent> event_proto;
|
| -
|
| - // Look up existing entry. If not found, create a new entry and add to map.
|
| - if (it == frame_event_map_.end()) {
|
| - event_proto.reset(new AggregatedFrameEvent);
|
| - event_proto->set_rtp_timestamp(frame_event.rtp_timestamp);
|
| - frame_event_map_.insert(
|
| - std::make_pair(frame_event.rtp_timestamp, event_proto));
|
| - } else {
|
| - event_proto = it->second;
|
| - }
|
| + if (ShouldProcessEvent(frame_event.type)) {
|
| + FrameEventMap::iterator it =
|
| + frame_event_map_.find(frame_event.rtp_timestamp);
|
| + linked_ptr<AggregatedFrameEvent> event_proto;
|
| +
|
| + // Look up existing entry. If not found, create a new entry and add to map.
|
| + if (it == frame_event_map_.end()) {
|
| + event_proto.reset(new AggregatedFrameEvent);
|
| + event_proto->set_rtp_timestamp(frame_event.rtp_timestamp);
|
| + frame_event_map_.insert(
|
| + std::make_pair(frame_event.rtp_timestamp, event_proto));
|
| + } else {
|
| + event_proto = it->second;
|
| + }
|
|
|
| - event_proto->add_event_type(ToProtoEventType(frame_event.type));
|
| - event_proto->add_event_timestamp_micros(
|
| - frame_event.timestamp.ToInternalValue());
|
| + event_proto->add_event_type(ToProtoEventType(frame_event.type));
|
| + event_proto->add_event_timestamp_micros(
|
| + frame_event.timestamp.ToInternalValue());
|
|
|
| - if (frame_event.type == kAudioFrameEncoded ||
|
| - frame_event.type == kVideoFrameEncoded) {
|
| - event_proto->set_encoded_frame_size(frame_event.size);
|
| - } else if (frame_event.type == kAudioPlayoutDelay ||
|
| - frame_event.type == kVideoRenderDelay) {
|
| - event_proto->set_delay_millis(frame_event.delay_delta.InMilliseconds());
|
| + if (frame_event.type == kAudioFrameEncoded ||
|
| + frame_event.type == kVideoFrameEncoded) {
|
| + event_proto->set_encoded_frame_size(frame_event.size);
|
| + } else if (frame_event.type == kAudioPlayoutDelay ||
|
| + frame_event.type == kVideoRenderDelay) {
|
| + event_proto->set_delay_millis(frame_event.delay_delta.InMilliseconds());
|
| + }
|
| +
|
| + TruncateFrameEventMapIfNeeded();
|
| }
|
| +
|
| + DCHECK(frame_event_map_.size() <= max_frames_);
|
| }
|
|
|
| void EncodingEventSubscriber::OnReceivePacketEvent(
|
| const PacketEvent& packet_event) {
|
| DCHECK(thread_checker_.CalledOnValidThread());
|
|
|
| - PacketEventMap::iterator it =
|
| - packet_event_map_.find(packet_event.rtp_timestamp);
|
| - linked_ptr<AggregatedPacketEvent> event_proto;
|
| - BasePacketEvent* base_packet_event_proto = NULL;
|
| -
|
| - // Look up existing entry. If not found, create a new entry and add to map.
|
| - if (it == packet_event_map_.end()) {
|
| - event_proto.reset(new AggregatedPacketEvent);
|
| - event_proto->set_rtp_timestamp(packet_event.rtp_timestamp);
|
| - packet_event_map_.insert(
|
| - std::make_pair(packet_event.rtp_timestamp, event_proto));
|
| - base_packet_event_proto = event_proto->add_base_packet_event();
|
| - base_packet_event_proto->set_packet_id(packet_event.packet_id);
|
| - } else {
|
| - // Found existing entry, now look up existing BasePacketEvent using packet
|
| - // ID. If not found, create a new entry and add to proto.
|
| - event_proto = it->second;
|
| - RepeatedPtrField<BasePacketEvent>* field =
|
| - event_proto->mutable_base_packet_event();
|
| - for (RepeatedPtrField<BasePacketEvent>::pointer_iterator it =
|
| - field->pointer_begin();
|
| - it != field->pointer_end(); ++it) {
|
| - if ((*it)->packet_id() == packet_event.packet_id) {
|
| - base_packet_event_proto = *it;
|
| - break;
|
| - }
|
| - }
|
| - if (!base_packet_event_proto) {
|
| + if (ShouldProcessEvent(packet_event.type)) {
|
| + PacketEventMap::iterator it =
|
| + packet_event_map_.find(packet_event.rtp_timestamp);
|
| + linked_ptr<AggregatedPacketEvent> event_proto;
|
| + BasePacketEvent* base_packet_event_proto = NULL;
|
| +
|
| + // Look up existing entry. If not found, create a new entry and add to map.
|
| + if (it == packet_event_map_.end()) {
|
| + event_proto.reset(new AggregatedPacketEvent);
|
| + event_proto->set_rtp_timestamp(packet_event.rtp_timestamp);
|
| + packet_event_map_.insert(
|
| + std::make_pair(packet_event.rtp_timestamp, event_proto));
|
| base_packet_event_proto = event_proto->add_base_packet_event();
|
| base_packet_event_proto->set_packet_id(packet_event.packet_id);
|
| + } else {
|
| + // Found existing entry, now look up existing BasePacketEvent using packet
|
| + // ID. If not found, create a new entry and add to proto.
|
| + event_proto = it->second;
|
| + RepeatedPtrField<BasePacketEvent>* field =
|
| + event_proto->mutable_base_packet_event();
|
| + for (RepeatedPtrField<BasePacketEvent>::pointer_iterator it =
|
| + field->pointer_begin();
|
| + it != field->pointer_end();
|
| + ++it) {
|
| + if ((*it)->packet_id() == packet_event.packet_id) {
|
| + base_packet_event_proto = *it;
|
| + break;
|
| + }
|
| + }
|
| + if (!base_packet_event_proto) {
|
| + base_packet_event_proto = event_proto->add_base_packet_event();
|
| + base_packet_event_proto->set_packet_id(packet_event.packet_id);
|
| + }
|
| }
|
| +
|
| + base_packet_event_proto->add_event_type(
|
| + ToProtoEventType(packet_event.type));
|
| + base_packet_event_proto->add_event_timestamp_micros(
|
| + packet_event.timestamp.ToInternalValue());
|
| +
|
| + TruncatePacketEventMapIfNeeded();
|
| }
|
|
|
| - base_packet_event_proto->add_event_type(ToProtoEventType(packet_event.type));
|
| - base_packet_event_proto->add_event_timestamp_micros(
|
| - packet_event.timestamp.ToInternalValue());
|
| + DCHECK(packet_event_map_.size() <= max_frames_);
|
| }
|
|
|
| void EncodingEventSubscriber::OnReceiveGenericEvent(
|
| const GenericEvent& generic_event) {
|
| DCHECK(thread_checker_.CalledOnValidThread());
|
| -
|
| - GenericEventMap::iterator it = generic_event_map_.find(generic_event.type);
|
| - linked_ptr<AggregatedGenericEvent> event_proto;
|
| - if (it == generic_event_map_.end()) {
|
| - event_proto.reset(new AggregatedGenericEvent);
|
| - event_proto->set_event_type(ToProtoEventType(generic_event.type));
|
| - generic_event_map_.insert(std::make_pair(generic_event.type, event_proto));
|
| - } else {
|
| - event_proto = it->second;
|
| - }
|
| -
|
| - event_proto->add_event_timestamp_micros(
|
| - generic_event.timestamp.ToInternalValue());
|
| - event_proto->add_value(generic_event.value);
|
| + // Do nothing, there are no generic events we are interested in.
|
| }
|
|
|
| void EncodingEventSubscriber::GetFrameEventsAndReset(
|
| @@ -129,11 +134,23 @@ void EncodingEventSubscriber::GetPacketEventsAndReset(
|
| packet_event_map_.clear();
|
| }
|
|
|
| -void EncodingEventSubscriber::GetGenericEventsAndReset(
|
| - GenericEventMap* generic_event_map) {
|
| - DCHECK(thread_checker_.CalledOnValidThread());
|
| - generic_event_map->swap(generic_event_map_);
|
| - generic_event_map_.clear();
|
| +
|
| +bool EncodingEventSubscriber::ShouldProcessEvent(CastLoggingEvent event) {
|
| + return GetEventMediaType(event) == event_media_type_;
|
| +}
|
| +
|
| +void EncodingEventSubscriber::TruncateFrameEventMapIfNeeded() {
|
| + // This works because this is called everytime an event is inserted and
|
| + // we only insert events one at a time.
|
| + if (frame_event_map_.size() > max_frames_)
|
| + frame_event_map_.erase(frame_event_map_.begin());
|
| +}
|
| +
|
| +void EncodingEventSubscriber::TruncatePacketEventMapIfNeeded() {
|
| + // This works because this is called everytime an event is inserted and
|
| + // we only insert events one at a time.
|
| + if (packet_event_map_.size() > max_frames_)
|
| + packet_event_map_.erase(packet_event_map_.begin());
|
| }
|
|
|
| } // namespace cast
|
|
|