Index: media/cast/logging/stats_event_subscriber.cc |
diff --git a/media/cast/logging/stats_event_subscriber.cc b/media/cast/logging/stats_event_subscriber.cc |
new file mode 100644 |
index 0000000000000000000000000000000000000000..9a2df9d9ef8bb5df17d8d19db9af4be05397dab3 |
--- /dev/null |
+++ b/media/cast/logging/stats_event_subscriber.cc |
@@ -0,0 +1,139 @@ |
+// 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/stats_event_subscriber.h" |
+ |
+#include "base/logging.h" |
+ |
+namespace media { |
+namespace cast { |
+ |
+StatsEventSubscriber::StatsEventSubscriber(EventMediaType event_media_type) |
+ : event_media_type_(event_media_type) {} |
+ |
+StatsEventSubscriber::~StatsEventSubscriber() { |
+ DCHECK(thread_checker_.CalledOnValidThread()); |
+} |
+ |
+void StatsEventSubscriber::OnReceiveFrameEvent(const FrameEvent& frame_event) { |
+ DCHECK(thread_checker_.CalledOnValidThread()); |
+ |
+ CastLoggingEvent type = frame_event.type; |
+ if (GetEventMediaType(type) != event_media_type_) |
+ return; |
+ |
+ FrameStatsMap::iterator it = frame_stats_.find(type); |
+ if (it == frame_stats_.end()) { |
+ FrameLogStats stats; |
+ stats.first_event_time = frame_event.timestamp; |
+ stats.last_event_time = frame_event.timestamp; |
+ stats.event_counter = 1; |
+ stats.sum_size = frame_event.size; |
+ stats.min_delay = frame_event.delay_delta; |
+ stats.max_delay = frame_event.delay_delta; |
+ stats.sum_delay = frame_event.delay_delta; |
+ frame_stats_.insert(std::make_pair(type, stats)); |
+ } else { |
+ ++(it->second.event_counter); |
+ it->second.last_event_time = frame_event.timestamp; |
+ it->second.sum_size += frame_event.size; |
+ it->second.sum_delay += frame_event.delay_delta; |
+ if (frame_event.delay_delta > it->second.max_delay) |
+ it->second.max_delay = frame_event.delay_delta; |
+ if (frame_event.delay_delta < it->second.min_delay) |
+ it->second.min_delay = frame_event.delay_delta; |
+ } |
+} |
+ |
+void StatsEventSubscriber::OnReceivePacketEvent( |
+ const PacketEvent& packet_event) { |
+ DCHECK(thread_checker_.CalledOnValidThread()); |
+ |
+ CastLoggingEvent type = packet_event.type; |
+ if (GetEventMediaType(type) != event_media_type_) |
+ return; |
+ |
+ PacketStatsMap::iterator it = packet_stats_.find(type); |
+ if (it == packet_stats_.end()) { |
+ PacketLogStats stats; |
+ stats.first_event_time = packet_event.timestamp; |
+ stats.last_event_time = packet_event.timestamp; |
+ stats.event_counter = 1; |
+ stats.sum_size = packet_event.size; |
+ packet_stats_.insert(std::make_pair(type, stats)); |
+ } else { |
+ it->second.last_event_time = packet_event.timestamp; |
+ ++(it->second.event_counter); |
+ it->second.sum_size += packet_event.size; |
+ } |
+} |
+ |
+void StatsEventSubscriber::OnReceiveGenericEvent( |
+ const GenericEvent& generic_event) { |
+ DCHECK(thread_checker_.CalledOnValidThread()); |
+ |
+ CastLoggingEvent type = generic_event.type; |
+ if (GetEventMediaType(type) != event_media_type_) |
+ return; |
+ |
+ GenericStatsMap::iterator it = generic_stats_.find(type); |
+ if (it == generic_stats_.end()) { |
+ GenericLogStats stats; |
+ stats.first_event_time = generic_event.timestamp; |
+ stats.last_event_time = generic_event.timestamp; |
+ stats.event_counter = 1; |
+ stats.sum = generic_event.value; |
+ stats.sum_squared = generic_event.value * generic_event.value; |
+ stats.min = generic_event.value; |
+ stats.max = generic_event.value; |
+ generic_stats_.insert(std::make_pair(type, stats)); |
+ } else { |
+ it->second.last_event_time = generic_event.timestamp; |
+ ++(it->second.event_counter); |
+ it->second.sum += generic_event.value; |
+ it->second.sum_squared += generic_event.value * generic_event.value; |
+ if (it->second.min > generic_event.value) { |
+ it->second.min = generic_event.value; |
+ } else if (it->second.max < generic_event.value) { |
+ it->second.max = generic_event.value; |
+ } |
+ } |
+} |
+ |
+void StatsEventSubscriber::GetFrameStats(FrameStatsMap* frame_stats_map) const { |
+ DCHECK(thread_checker_.CalledOnValidThread()); |
+ DCHECK(frame_stats_map); |
+ |
+ frame_stats_map->clear(); |
+ frame_stats_map->insert(frame_stats_.begin(), frame_stats_.end()); |
+} |
+ |
+void StatsEventSubscriber::GetPacketStats( |
+ PacketStatsMap* packet_stats_map) const { |
+ DCHECK(thread_checker_.CalledOnValidThread()); |
+ DCHECK(packet_stats_map); |
+ |
+ packet_stats_map->clear(); |
+ packet_stats_map->insert(packet_stats_.begin(), packet_stats_.end()); |
+} |
+ |
+void StatsEventSubscriber::GetGenericStats( |
+ GenericStatsMap* generic_stats_map) const { |
+ DCHECK(thread_checker_.CalledOnValidThread()); |
+ DCHECK(generic_stats_map); |
+ |
+ generic_stats_map->clear(); |
+ generic_stats_map->insert(generic_stats_.begin(), generic_stats_.end()); |
+} |
+ |
+void StatsEventSubscriber::Reset() { |
+ DCHECK(thread_checker_.CalledOnValidThread()); |
+ |
+ frame_stats_.clear(); |
+ packet_stats_.clear(); |
+ generic_stats_.clear(); |
+} |
+ |
+} // namespace cast |
+} // namespace media |