OLD | NEW |
---|---|
1 // Copyright 2013 The Chromium Authors. All rights reserved. | 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 | 2 // Use of this source code is governed by a BSD-style license that can be |
3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
4 | 4 |
5 #include "base/memory/linked_ptr.h" | 5 #include "base/memory/linked_ptr.h" |
6 #include "base/memory/scoped_ptr.h" | 6 #include "base/memory/scoped_ptr.h" |
7 #include "media/cast/logging/logging_stats.h" | 7 #include "media/cast/logging/logging_stats.h" |
8 | 8 |
9 namespace media { | 9 namespace media { |
10 namespace cast { | 10 namespace cast { |
11 | 11 |
12 LoggingStats::LoggingStats() | 12 LoggingStats::LoggingStats() |
13 : frame_stats_(), | 13 : frame_stats_(), |
14 packet_stats_(), | 14 packet_stats_(), |
15 generic_stats_(), | 15 generic_stats_() { |
16 start_time_() { | |
17 memset(counts_, 0, sizeof(counts_)); | |
18 memset(start_time_, 0, sizeof(start_time_)); | |
19 } | 16 } |
20 | 17 |
21 LoggingStats::~LoggingStats() {} | 18 LoggingStats::~LoggingStats() {} |
22 | 19 |
23 void LoggingStats::Reset() { | 20 void LoggingStats::Reset() { |
24 frame_stats_.clear(); | 21 frame_stats_.clear(); |
25 packet_stats_.clear(); | 22 packet_stats_.clear(); |
26 generic_stats_.clear(); | 23 generic_stats_.clear(); |
27 memset(counts_, 0, sizeof(counts_)); | |
28 } | 24 } |
29 | 25 |
30 void LoggingStats::InsertFrameEvent(const base::TimeTicks& time_of_event, | 26 void LoggingStats::InsertFrameEvent(const base::TimeTicks& time_of_event, |
31 CastLoggingEvent event, | 27 CastLoggingEvent event, |
32 uint32 rtp_timestamp, | 28 uint32 rtp_timestamp, |
33 uint32 frame_id) { | 29 uint32 frame_id) { |
34 InsertBaseFrameEvent(time_of_event, event, frame_id, rtp_timestamp); | 30 InsertBaseFrameEvent(time_of_event, event, frame_id, rtp_timestamp); |
35 } | 31 } |
36 | 32 |
37 void LoggingStats::InsertFrameEventWithSize( | 33 void LoggingStats::InsertFrameEventWithSize( |
38 const base::TimeTicks& time_of_event, | 34 const base::TimeTicks& time_of_event, |
39 CastLoggingEvent event, | 35 CastLoggingEvent event, |
40 uint32 rtp_timestamp, | 36 uint32 rtp_timestamp, |
41 uint32 frame_id, | 37 uint32 frame_id, |
42 int frame_size) { | 38 int frame_size) { |
43 InsertBaseFrameEvent(time_of_event, event, frame_id, rtp_timestamp); | 39 InsertBaseFrameEvent(time_of_event, event, frame_id, rtp_timestamp); |
44 // Update size. | 40 // Update size. |
45 FrameStatsMap::iterator it = frame_stats_.find(event); | 41 FrameStatsMap::iterator it = frame_stats_.find(event); |
46 DCHECK(it != frame_stats_.end()); | 42 DCHECK(it != frame_stats_.end()); |
47 it->second->bitrate_kbps += frame_size; | 43 it->second->size_sum += frame_size; |
48 } | 44 } |
49 | 45 |
50 void LoggingStats::InsertFrameEventWithDelay( | 46 void LoggingStats::InsertFrameEventWithDelay( |
51 const base::TimeTicks& time_of_event, | 47 const base::TimeTicks& time_of_event, |
52 CastLoggingEvent event, | 48 CastLoggingEvent event, |
53 uint32 rtp_timestamp, | 49 uint32 rtp_timestamp, |
54 uint32 frame_id, | 50 uint32 frame_id, |
55 base::TimeDelta delay) { | 51 base::TimeDelta delay) { |
56 InsertBaseFrameEvent(time_of_event, event, frame_id, rtp_timestamp); | 52 InsertBaseFrameEvent(time_of_event, event, frame_id, rtp_timestamp); |
57 // Update size. | 53 // Update size. |
58 FrameStatsMap::iterator it = frame_stats_.find(event); | 54 FrameStatsMap::iterator it = frame_stats_.find(event); |
59 DCHECK(it != frame_stats_.end()); | 55 DCHECK(it != frame_stats_.end()); |
60 // Using the average delay as a counter, will divide by the counter when | 56 // Using the average delay as a counter, will divide by the counter when |
imcheng
2014/01/22 21:03:37
Remove comment
mikhal1
2014/01/23 19:53:11
Done.
| |
61 // triggered. | 57 // triggered. |
62 it->second->avg_delay_ms += delay.InMilliseconds(); | 58 it->second->sum_delay += delay; |
63 if (delay.InMilliseconds() > it->second->max_delay_ms) | 59 if (delay > it->second->max_delay || it->second->event_counter == 1) |
64 it->second->max_delay_ms = delay.InMilliseconds(); | 60 it->second->max_delay = delay; |
65 if ((delay.InMilliseconds() < it->second->min_delay_ms) || | 61 if (delay < it->second->min_delay || it->second->event_counter == 1) |
66 (counts_[event] == 1) ) | 62 it->second->min_delay = delay; |
67 it->second->min_delay_ms = delay.InMilliseconds(); | |
68 } | 63 } |
69 | 64 |
70 void LoggingStats::InsertBaseFrameEvent(const base::TimeTicks& time_of_event, | 65 void LoggingStats::InsertBaseFrameEvent(const base::TimeTicks& time_of_event, |
imcheng
2014/01/22 21:03:37
Maybe have this function return a pointer to the F
mikhal1
2014/01/23 19:53:11
Was deliberating about that one too. I will still
imcheng
2014/01/23 21:17:18
In the case of inserting, map::insert returns a pa
| |
71 CastLoggingEvent event, | 66 CastLoggingEvent event, |
72 uint32 frame_id, | 67 uint32 frame_id, |
73 uint32 rtp_timestamp) { | 68 uint32 rtp_timestamp) { |
74 // Does this belong to an existing event? | 69 // Does this belong to an existing event? |
75 FrameStatsMap::iterator it = frame_stats_.find(event); | 70 FrameStatsMap::iterator it = frame_stats_.find(event); |
76 if (it == frame_stats_.end()) { | 71 if (it == frame_stats_.end()) { |
77 // New event. | 72 // New event. |
78 start_time_[event] = time_of_event; | |
79 linked_ptr<FrameLogStats> stats(new FrameLogStats()); | 73 linked_ptr<FrameLogStats> stats(new FrameLogStats()); |
74 stats->first_event_time = time_of_event; | |
75 stats->last_event_time = time_of_event; | |
76 stats->event_counter = 1; | |
80 frame_stats_.insert(std::make_pair(event, stats)); | 77 frame_stats_.insert(std::make_pair(event, stats)); |
78 } else { | |
79 it->second->last_event_time = time_of_event; | |
80 ++it->second->event_counter; | |
imcheng
2014/01/22 21:03:37
nit: Does this work? I am paranoid about operator
mikhal1
2014/01/23 19:53:11
my tests implies this works, but I'm adding a pare
imcheng
2014/01/23 21:17:18
Thanks!
On 2014/01/23 19:53:11, mikhal1 wrote:
| |
81 } | 81 } |
82 | |
83 ++counts_[event]; | |
84 } | 82 } |
85 | 83 |
86 void LoggingStats::InsertPacketEvent(const base::TimeTicks& time_of_event, | 84 void LoggingStats::InsertPacketEvent(const base::TimeTicks& time_of_event, |
87 CastLoggingEvent event, | 85 CastLoggingEvent event, |
88 uint32 rtp_timestamp, | 86 uint32 rtp_timestamp, |
89 uint32 frame_id, | 87 uint32 frame_id, |
90 uint16 packet_id, | 88 uint16 packet_id, |
91 uint16 max_packet_id, | 89 uint16 max_packet_id, |
92 size_t size) { | 90 size_t size) { |
93 // Does this packet belong to an existing event? | 91 // Does this packet belong to an existing event? |
94 PacketStatsMap::iterator it = packet_stats_.find(event); | 92 PacketStatsMap::iterator it = packet_stats_.find(event); |
95 if (it == packet_stats_.end()) { | 93 if (it == packet_stats_.end()) { |
96 // New event. | 94 // New event. |
97 start_time_[event] = time_of_event; | 95 linked_ptr<PacketLogStats> stats(new PacketLogStats()); |
98 packet_stats_.insert(std::make_pair(event, size)); | 96 stats->first_event_time = time_of_event; |
97 stats->last_event_time = time_of_event; | |
98 stats->size_sum = size; | |
99 stats->event_counter = 1; | |
100 packet_stats_.insert(std::make_pair(event, stats)); | |
99 } else { | 101 } else { |
100 // Add to existing. | 102 // Add to an existing event. |
101 it->second += size; | 103 it->second->size_sum += size; |
104 ++it->second->event_counter; | |
imcheng
2014/01/22 21:03:37
Same as above regarding operator precedence.
mikhal1
2014/01/23 19:53:11
Done.
| |
102 } | 105 } |
103 ++counts_[event]; | |
104 } | 106 } |
105 | 107 |
106 void LoggingStats::InsertGenericEvent(const base::TimeTicks& time_of_event, | 108 void LoggingStats::InsertGenericEvent(const base::TimeTicks& time_of_event, |
107 CastLoggingEvent event, int value) { | 109 CastLoggingEvent event, int value) { |
108 // Does this event belong to an existing event? | 110 // Does this event belong to an existing event? |
109 GenericStatsMap::iterator it = generic_stats_.find(event); | 111 GenericStatsMap::iterator it = generic_stats_.find(event); |
110 if (it == generic_stats_.end()) { | 112 if (it == generic_stats_.end()) { |
111 // New event. | 113 // New event. |
112 start_time_[event] = time_of_event; | 114 linked_ptr<GenericLogStats> stats(new GenericLogStats()); |
113 generic_stats_.insert(std::make_pair(event, value)); | 115 stats->first_event_time = time_of_event; |
116 stats->last_event_time = time_of_event; | |
117 stats->sum = value; | |
118 stats->min = value; | |
119 stats->max = value; | |
120 stats->event_counter = 1; | |
121 generic_stats_.insert(std::make_pair(event, stats)); | |
114 } else { | 122 } else { |
115 // Add to existing (will be used to compute average). | 123 // Add to existing event. |
116 it->second += value; | 124 it->second->sum += value; |
125 ++it->second->event_counter; | |
imcheng
2014/01/22 21:03:37
Same as above regarding operator precedence.
mikhal1
2014/01/23 19:53:11
Done.
| |
126 it->second->last_event_time = time_of_event; | |
127 if (it->second->min > value) { | |
128 it->second->min = value; | |
129 } else if (it->second->max < value) { | |
130 it->second->max = value; | |
131 } | |
117 } | 132 } |
118 ++counts_[event]; | |
119 } | 133 } |
120 | 134 |
121 const FrameStatsMap* LoggingStats::GetFrameStatsData( | 135 const FrameStatsMap* LoggingStats::GetFrameStatsData() const { |
122 const base::TimeTicks& now) { | |
123 // Compute framerate and bitrate (when available). | |
124 FrameStatsMap::iterator it; | |
125 for (it = frame_stats_.begin(); it != frame_stats_.end(); ++it) { | |
126 base::TimeDelta time_diff = now - start_time_[it->first]; | |
127 it->second->framerate_fps = counts_[it->first] / time_diff.InSecondsF(); | |
128 if (it->second->bitrate_kbps > 0) { | |
129 it->second->bitrate_kbps = (8 / 1000) * it->second->bitrate_kbps / | |
130 time_diff.InSecondsF(); | |
131 } | |
132 if (it->second->avg_delay_ms > 0) | |
133 it->second->avg_delay_ms /= counts_[it->first]; | |
134 } | |
135 return &frame_stats_; | 136 return &frame_stats_; |
136 } | 137 } |
137 | 138 |
138 const PacketStatsMap* LoggingStats::GetPacketStatsData( | 139 const PacketStatsMap* LoggingStats::GetPacketStatsData() const { |
139 const base::TimeTicks& now) { | |
140 PacketStatsMap::iterator it; | |
141 for (it = packet_stats_.begin(); it != packet_stats_.end(); ++it) { | |
142 if (counts_[it->first] == 0) continue; | |
143 base::TimeDelta time_diff = now - start_time_[it->first]; | |
144 it->second = (8 / 1000) * it->second / time_diff.InSecondsF(); | |
145 } | |
146 return &packet_stats_; | 140 return &packet_stats_; |
147 } | 141 } |
148 | 142 |
149 const GenericStatsMap* LoggingStats::GetGenericStatsData() { | 143 const GenericStatsMap* LoggingStats::GetGenericStatsData() const { |
150 // Compute averages. | |
151 GenericStatsMap::iterator it; | |
152 for (it = generic_stats_.begin(); it != generic_stats_.end(); ++it) { | |
153 it->second /= counts_[ it->first]; | |
154 } | |
155 return &generic_stats_; | 144 return &generic_stats_; |
156 } | 145 } |
157 | 146 |
158 } // namespace cast | 147 } // namespace cast |
159 } // namespace media | 148 } // namespace media |
OLD | NEW |