Chromium Code Reviews| 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..f4b4a828355936c3d205ac592f26c8f91bcc5890 |
| --- /dev/null |
| +++ b/media/cast/logging/encoding_event_subscriber.cc |
| @@ -0,0 +1,146 @@ |
| +// 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 <functional> |
| +#include <map> |
| + |
| +#include "base/logging.h" |
| +#include "base/memory/linked_ptr.h" |
| +#include "base/single_thread_task_runner.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( |
| + const scoped_refptr<base::SingleThreadTaskRunner>& main_thread_proxy) { |
| + DCHECK(main_thread_proxy->RunsTasksOnCurrentThread()); |
| +} |
| + |
| +EncodingEventSubscriber::~EncodingEventSubscriber() { |
| + thread_checker_.CalledOnValidThread(); |
|
Alpha Left Google
2014/02/11 22:49:13
DCHECK(thread_checker_.CalledOnValidThread()).
imcheng
2014/02/12 08:44:13
Oops, I just realized the DCHECK are missing from
|
| +} |
| + |
| +void EncodingEventSubscriber::OnReceiveFrameEvent( |
| + const FrameEvent& frame_event) { |
| + thread_checker_.CalledOnValidThread(); |
|
Alpha Left Google
2014/02/11 22:49:13
DCHECK(thread_checker_.CalledOnValidThread()).
imcheng
2014/02/12 08:44:13
Done.
|
| + |
| + 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) { |
| + thread_checker_.CalledOnValidThread(); |
|
Alpha Left Google
2014/02/11 22:49:13
DCHECK(thread_checker_.CalledOnValidThread()).
imcheng
2014/02/12 08:44:13
Done.
|
| + |
| + 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) { |
| + thread_checker_.CalledOnValidThread(); |
|
Alpha Left Google
2014/02/11 22:49:13
DCHECK(thread_checker_.CalledOnValidThread()).
imcheng
2014/02/12 08:44:13
Done.
|
| + |
| + 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) { |
| + thread_checker_.CalledOnValidThread(); |
|
Alpha Left Google
2014/02/11 22:49:13
DCHECK(thread_checker_.CalledOnValidThread()).
imcheng
2014/02/12 08:44:13
Done.
|
| + frame_event_map->swap(frame_event_map_); |
| + frame_event_map_.clear(); |
| +} |
| + |
| +void EncodingEventSubscriber::GetPacketEventsAndReset( |
| + PacketEventMap* packet_event_map) { |
| + thread_checker_.CalledOnValidThread(); |
|
Alpha Left Google
2014/02/11 22:49:13
DCHECK(thread_checker_.CalledOnValidThread()).
imcheng
2014/02/12 08:44:13
Done.
|
| + packet_event_map->swap(packet_event_map_); |
| + packet_event_map_.clear(); |
| +} |
| + |
| +void EncodingEventSubscriber::GetGenericEventsAndReset( |
| + GenericEventMap* generic_event_map) { |
| + thread_checker_.CalledOnValidThread(); |
|
Alpha Left Google
2014/02/11 22:49:13
DCHECK(thread_checker_.CalledOnValidThread()).
imcheng
2014/02/12 08:44:13
Done.
|
| + generic_event_map->swap(generic_event_map_); |
| + generic_event_map_.clear(); |
| +} |
| + |
| +} // namespace cast |
| +} // namespace media |