| 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
|
| new file mode 100644
|
| index 0000000000000000000000000000000000000000..5a7333a70893b3d3f6c0caaadfadc207fac1de0b
|
| --- /dev/null
|
| +++ b/media/cast/logging/encoding_event_subscriber.cc
|
| @@ -0,0 +1,140 @@
|
| +// Copyright 2014 The Chromium Authors. All rights reserved.
|
| +// Use of this source code is governed by a BSD-style license that can be
|
| +// found in the LICENSE file.
|
| +
|
| +#include "media/cast/logging/encoding_event_subscriber.h"
|
| +
|
| +#include <utility>
|
| +
|
| +#include "base/logging.h"
|
| +#include "media/cast/logging/proto/proto_utils.h"
|
| +
|
| +using google::protobuf::RepeatedPtrField;
|
| +using media::cast::proto::AggregatedFrameEvent;
|
| +using media::cast::proto::AggregatedGenericEvent;
|
| +using media::cast::proto::AggregatedPacketEvent;
|
| +using media::cast::proto::BasePacketEvent;
|
| +
|
| +namespace media {
|
| +namespace cast {
|
| +
|
| +EncodingEventSubscriber::EncodingEventSubscriber() {}
|
| +
|
| +EncodingEventSubscriber::~EncodingEventSubscriber() {
|
| + DCHECK(thread_checker_.CalledOnValidThread());
|
| +}
|
| +
|
| +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;
|
| + }
|
| +
|
| + 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());
|
| + }
|
| +}
|
| +
|
| +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) {
|
| + 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());
|
| +}
|
| +
|
| +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);
|
| +}
|
| +
|
| +void EncodingEventSubscriber::GetFrameEventsAndReset(
|
| + FrameEventMap* frame_event_map) {
|
| + DCHECK(thread_checker_.CalledOnValidThread());
|
| + frame_event_map->swap(frame_event_map_);
|
| + frame_event_map_.clear();
|
| +}
|
| +
|
| +void EncodingEventSubscriber::GetPacketEventsAndReset(
|
| + PacketEventMap* packet_event_map) {
|
| + DCHECK(thread_checker_.CalledOnValidThread());
|
| + packet_event_map->swap(packet_event_map_);
|
| + 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();
|
| +}
|
| +
|
| +} // namespace cast
|
| +} // namespace media
|
|
|