1 // Copyright 2013 The Chromium Authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file.
5 #include "base/memory/linked_ptr.h"
6 #include "base/memory/scoped_ptr.h"
7 #include "media/cast/logging/logging_stats.h"
12 LoggingStats::LoggingStats(base::TickClock* clock)
18 memset(counts_, 0, sizeof(counts_));
21 LoggingStats::~LoggingStats() {}
23 void LoggingStats::Reset() {
25 packet_stats_.clear();
26 generic_stats_.clear();
27 memset(counts_, 0, sizeof(counts_));
30 void LoggingStats::InsertFrameEvent(CastLoggingEvent event,
33 InsertBaseFrameEvent(event, frame_id, rtp_timestamp);
36 void LoggingStats::InsertFrameEventWithSize(CastLoggingEvent event,
40 InsertBaseFrameEvent(event, frame_id, rtp_timestamp);
42 FrameStatsMap::iterator it = frame_stats_.find(event);
43 DCHECK(it != frame_stats_.end());
44 it->second->bitrate_kbps += frame_size;
47 void LoggingStats::InsertFrameEventWithDelay(CastLoggingEvent event,
50 base::TimeDelta delay) {
51 InsertBaseFrameEvent(event, frame_id, rtp_timestamp);
53 FrameStatsMap::iterator it = frame_stats_.find(event);
54 DCHECK(it != frame_stats_.end());
55 // Using the average delay as a counter, will divide by the counter when
57 it->second->avg_delay_ms += delay.InMilliseconds();
58 if (delay.InMilliseconds() > it->second->max_delay_ms)
59 it->second->max_delay_ms = delay.InMilliseconds();
60 if ((delay.InMilliseconds() < it->second->min_delay_ms) ||
61 (counts_[event] == 1) )
62 it->second->min_delay_ms = delay.InMilliseconds();
65 void LoggingStats::InsertBaseFrameEvent(CastLoggingEvent event,
67 uint32 rtp_timestamp) {
68 // Does this belong to an existing event?
69 FrameStatsMap::iterator it = frame_stats_.find(event);
70 if (it == frame_stats_.end()) {
72 start_time_[event] = clock_->NowTicks();
73 linked_ptr<FrameLogStats> stats(new FrameLogStats());
74 frame_stats_.insert(std::make_pair(event, stats));
80 void LoggingStats::InsertPacketEvent(CastLoggingEvent event,
86 // Does this packet belong to an existing event?
87 PacketStatsMap::iterator it = packet_stats_.find(event);
88 if (it == packet_stats_.end()) {
90 start_time_[event] = clock_->NowTicks();
91 packet_stats_.insert(std::make_pair(event, size));
99 void LoggingStats::InsertGenericEvent(CastLoggingEvent event, int value) {
100 // Does this event belong to an existing event?
101 GenericStatsMap::iterator it = generic_stats_.find(event);
102 if (it == generic_stats_.end()) {
104 start_time_[event] = clock_->NowTicks();
105 generic_stats_.insert(std::make_pair(event, value));
107 // Add to existing (will be used to compute average).
113 const FrameStatsMap* LoggingStats::GetFrameStatsData() {
114 // Compute framerate and bitrate (when available).
115 FrameStatsMap::iterator it;
116 for (it = frame_stats_.begin(); it != frame_stats_.end(); ++it) {
117 base::TimeDelta time_diff = clock_->NowTicks() - start_time_[it->first];
118 it->second->framerate_fps = counts_[it->first] / time_diff.InSecondsF();
119 if (it->second->bitrate_kbps > 0) {
120 it->second->bitrate_kbps = (8 / 1000) *
121 it->second->bitrate_kbps / time_diff.InSecondsF();
123 if (it->second->avg_delay_ms > 0)
124 it->second->avg_delay_ms /= counts_[it->first];
126 return &frame_stats_;
129 const PacketStatsMap* LoggingStats::GetPacketStatsData() {
130 PacketStatsMap::iterator it;
131 for (it = packet_stats_.begin(); it != packet_stats_.end(); ++it) {
132 if (counts_[it->first] == 0) continue;
133 base::TimeDelta time_diff = clock_->NowTicks() - start_time_[it->first];
134 it->second = (8 / 1000) * it->second / time_diff.InSecondsF();
136 return &packet_stats_;
139 const GenericStatsMap* LoggingStats::GetGenericStatsData() {
141 GenericStatsMap::iterator it;
142 for (it = generic_stats_.begin(); it != generic_stats_.end(); ++it) {
143 it->second /= counts_[ it->first];
145 return &generic_stats_;