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/debug/trace_event.h" | 5 #include "base/debug/trace_event.h" |
6 #include "base/metrics/histogram.h" | 6 #include "base/metrics/histogram.h" |
7 #include "media/cast/logging/logging_impl.h" | 7 #include "media/cast/logging/logging_impl.h" |
8 #include "net/base/big_endian.h" | 8 #include "net/base/big_endian.h" |
9 | 9 |
10 namespace media { | 10 namespace media { |
(...skipping 36 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
47 if (config_.enable_raw_data_collection) { | 47 if (config_.enable_raw_data_collection) { |
48 raw_.InsertFrameEventWithSize(time_of_event, event, rtp_timestamp, frame_id, | 48 raw_.InsertFrameEventWithSize(time_of_event, event, rtp_timestamp, frame_id, |
49 frame_size); | 49 frame_size); |
50 } | 50 } |
51 if (config_.enable_stats_data_collection) { | 51 if (config_.enable_stats_data_collection) { |
52 stats_.InsertFrameEventWithSize(time_of_event, event, rtp_timestamp, | 52 stats_.InsertFrameEventWithSize(time_of_event, event, rtp_timestamp, |
53 frame_id, frame_size); | 53 frame_id, frame_size); |
54 } | 54 } |
55 if (config_.enable_uma_stats) { | 55 if (config_.enable_uma_stats) { |
56 if (event == kAudioFrameEncoded) | 56 if (event == kAudioFrameEncoded) |
57 UMA_HISTOGRAM_COUNTS("Cast.AudioFrameEncoded", frame_size); | 57 UMA_HISTOGRAM_COUNTS("Cast.AudioFrameEncoded", frame_size); |
hguihot1
2014/01/22 21:41:13
AudioFrameEncodedSize?
mikhal1
2014/01/23 19:53:11
Done.
| |
58 else if (event == kVideoFrameEncoded) { | 58 else if (event == kVideoFrameEncoded) { |
59 UMA_HISTOGRAM_COUNTS("Cast.VideoFrameEncoded", frame_size); | 59 UMA_HISTOGRAM_COUNTS("Cast.VideoFrameEncoded", frame_size); |
hguihot1
2014/01/22 21:41:13
VideoFrameEncodedSize?
mikhal1
2014/01/23 19:53:11
Done.
| |
60 } | 60 } |
61 } | 61 } |
62 | 62 |
63 if (config_.enable_tracing) { | 63 if (config_.enable_tracing) { |
64 std::string event_string = CastLoggingToString(event); | 64 std::string event_string = CastLoggingToString(event); |
65 TRACE_EVENT_INSTANT2(event_string.c_str(), "FES", | 65 TRACE_EVENT_INSTANT2(event_string.c_str(), "FES", |
66 TRACE_EVENT_SCOPE_THREAD, "rtp_timestamp", rtp_timestamp, "frame_size", | 66 TRACE_EVENT_SCOPE_THREAD, "rtp_timestamp", rtp_timestamp, "frame_size", |
67 frame_size); | 67 frame_size); |
68 } | 68 } |
69 } | 69 } |
(...skipping 91 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
161 TRACE_EVENT_SCOPE_THREAD, "value", value); | 161 TRACE_EVENT_SCOPE_THREAD, "value", value); |
162 } | 162 } |
163 } | 163 } |
164 | 164 |
165 void LoggingImpl::InsertGenericUmaEvent(CastLoggingEvent event, int value) { | 165 void LoggingImpl::InsertGenericUmaEvent(CastLoggingEvent event, int value) { |
166 switch(event) { | 166 switch(event) { |
167 case kRttMs: | 167 case kRttMs: |
168 UMA_HISTOGRAM_COUNTS("Cast.RttMs", value); | 168 UMA_HISTOGRAM_COUNTS("Cast.RttMs", value); |
169 break; | 169 break; |
170 case kPacketLoss: | 170 case kPacketLoss: |
171 UMA_HISTOGRAM_COUNTS("Cast.PacketLoss", value); | 171 UMA_HISTOGRAM_COUNTS("Cast.PacketLoss", value); |
hguihot1
2014/01/22 21:41:13
Maybe a better name than PacketLoss? It does not s
mikhal1
2014/01/23 19:53:11
Done.
| |
172 break; | 172 break; |
173 case kJitterMs: | 173 case kJitterMs: |
174 UMA_HISTOGRAM_COUNTS("Cast.JitterMs", value); | 174 UMA_HISTOGRAM_COUNTS("Cast.JitterMs", value); |
175 break; | 175 break; |
176 case kRembBitrate: | 176 case kRembBitrate: |
177 UMA_HISTOGRAM_COUNTS("Cast.RembBitrate", value); | 177 UMA_HISTOGRAM_COUNTS("Cast.RembBitrate", value); |
178 break; | 178 break; |
179 default: | 179 default: |
180 // No-op | 180 // No-op |
181 break; | 181 break; |
182 } | 182 } |
183 } | 183 } |
184 | 184 |
185 // should just get the entire class, would be much easier. | 185 // should just get the entire class, would be much easier. |
186 FrameRawMap LoggingImpl::GetFrameRawData() { | 186 FrameRawMap LoggingImpl::GetFrameRawData() const { |
187 DCHECK(main_thread_proxy_->RunsTasksOnCurrentThread()); | 187 DCHECK(main_thread_proxy_->RunsTasksOnCurrentThread()); |
188 return raw_.GetFrameData(); | 188 return raw_.GetFrameData(); |
189 } | 189 } |
190 | 190 |
191 PacketRawMap LoggingImpl::GetPacketRawData() { | 191 PacketRawMap LoggingImpl::GetPacketRawData() const { |
192 DCHECK(main_thread_proxy_->RunsTasksOnCurrentThread()); | 192 DCHECK(main_thread_proxy_->RunsTasksOnCurrentThread()); |
193 return raw_.GetPacketData(); | 193 return raw_.GetPacketData(); |
194 } | 194 } |
195 | 195 |
196 GenericRawMap LoggingImpl::GetGenericRawData() { | 196 GenericRawMap LoggingImpl::GetGenericRawData() const { |
197 DCHECK(main_thread_proxy_->RunsTasksOnCurrentThread()); | 197 DCHECK(main_thread_proxy_->RunsTasksOnCurrentThread()); |
198 return raw_.GetGenericData(); | 198 return raw_.GetGenericData(); |
199 } | 199 } |
200 | 200 |
201 AudioRtcpRawMap LoggingImpl::GetAudioRtcpRawData() { | 201 AudioRtcpRawMap LoggingImpl::GetAudioRtcpRawData() { |
202 DCHECK(main_thread_proxy_->RunsTasksOnCurrentThread()); | 202 DCHECK(main_thread_proxy_->RunsTasksOnCurrentThread()); |
203 return raw_.GetAndResetAudioRtcpData(); | 203 return raw_.GetAndResetAudioRtcpData(); |
204 } | 204 } |
205 | 205 |
206 VideoRtcpRawMap LoggingImpl::GetVideoRtcpRawData() { | 206 VideoRtcpRawMap LoggingImpl::GetVideoRtcpRawData() { |
207 DCHECK(main_thread_proxy_->RunsTasksOnCurrentThread()); | 207 DCHECK(main_thread_proxy_->RunsTasksOnCurrentThread()); |
208 return raw_.GetAndResetVideoRtcpData(); | 208 return raw_.GetAndResetVideoRtcpData(); |
209 } | 209 } |
210 | 210 |
211 const FrameStatsMap* LoggingImpl::GetFrameStatsData( | 211 const FrameStatsMap* LoggingImpl::GetFrameStatsData() const { |
212 const base::TimeTicks& now) { | |
213 DCHECK(main_thread_proxy_->RunsTasksOnCurrentThread()); | 212 DCHECK(main_thread_proxy_->RunsTasksOnCurrentThread()); |
214 // Get stats data. | 213 return stats_.GetFrameStatsData(); |
215 const FrameStatsMap* stats = stats_.GetFrameStatsData(now); | |
216 if (config_.enable_uma_stats) { | |
217 FrameStatsMap::const_iterator it; | |
218 for (it = stats->begin(); it != stats->end(); ++it) { | |
219 // Check for an active event. | |
220 // The default frame event implies frame rate. | |
221 if (it->second->framerate_fps > 0) { | |
222 switch (it->first) { | |
223 case kAudioFrameReceived: | |
224 UMA_HISTOGRAM_COUNTS("Cast.Stats.AudioFrameReceived", | |
225 it->second->framerate_fps); | |
226 break; | |
227 case kAudioFrameCaptured: | |
228 UMA_HISTOGRAM_COUNTS("Cast.Stats.AudioFrameCaptured", | |
229 it->second->framerate_fps); | |
230 break; | |
231 case kAudioFrameEncoded: | |
232 UMA_HISTOGRAM_COUNTS("Cast.Stats.AudioFrameEncoded", | |
233 it->second->framerate_fps); | |
234 break; | |
235 case kVideoFrameCaptured: | |
236 UMA_HISTOGRAM_COUNTS("Cast.Stats.VideoFrameCaptured", | |
237 it->second->framerate_fps); | |
238 break; | |
239 case kVideoFrameReceived: | |
240 UMA_HISTOGRAM_COUNTS("Cast.Stats.VideoFrameReceived", | |
241 it->second->framerate_fps); | |
242 break; | |
243 case kVideoFrameSentToEncoder: | |
244 UMA_HISTOGRAM_COUNTS("Cast.Stats.VideoFrameSentToEncoder", | |
245 it->second->framerate_fps); | |
246 break; | |
247 case kVideoFrameEncoded: | |
248 UMA_HISTOGRAM_COUNTS("Cast.Stats.VideoFrameEncoded", | |
249 it->second->framerate_fps); | |
250 break; | |
251 case kVideoFrameDecoded: | |
252 UMA_HISTOGRAM_COUNTS("Cast.Stats.VideoFrameDecoded", | |
253 it->second->framerate_fps); | |
254 break; | |
255 default: | |
256 // No-op | |
257 break; | |
258 } | |
259 } else { | |
260 // All active frame events trigger frame rate computation. | |
261 continue; | |
262 } | |
263 // Bit rate should only be provided following encoding for either audio | |
264 // or video. | |
265 if (it->first == kVideoFrameEncoded) { | |
266 UMA_HISTOGRAM_COUNTS("Cast.Stats.VideoBitrateKbps", | |
267 it->second->framerate_fps); | |
268 } else if (it->first == kAudioFrameEncoded) { | |
269 UMA_HISTOGRAM_COUNTS("Cast.Stats.AudioBitrateKbps", | |
270 it->second->framerate_fps); | |
271 } | |
272 // Delay events. | |
273 if (it->first == kAudioPlayoutDelay) { | |
274 UMA_HISTOGRAM_COUNTS("Cast.Stats.AudioPlayoutDelayAvg", | |
275 it->second->avg_delay_ms); | |
276 UMA_HISTOGRAM_COUNTS("Cast.Stats.AudioPlayoutDelayMin", | |
277 it->second->min_delay_ms); | |
278 UMA_HISTOGRAM_COUNTS("Cast.Stats.AudioPlayoutDelayMax", | |
279 it->second->max_delay_ms); | |
280 } else if (it->first == kVideoRenderDelay) { | |
281 UMA_HISTOGRAM_COUNTS("Cast.Stats.VideoPlayoutDelayAvg", | |
282 it->second->avg_delay_ms); | |
283 UMA_HISTOGRAM_COUNTS("Cast.Stats.VideoPlayoutDelayMin", | |
284 it->second->min_delay_ms); | |
285 UMA_HISTOGRAM_COUNTS("Cast.Stats.VideoPlayoutDelayMax", | |
286 it->second->max_delay_ms); | |
287 } | |
288 } | |
289 } | |
290 return stats; | |
291 } | 214 } |
292 | 215 |
293 const PacketStatsMap* LoggingImpl::GetPacketStatsData( | 216 const PacketStatsMap* LoggingImpl::GetPacketStatsData() const { |
294 const base::TimeTicks& now) { | |
295 DCHECK(main_thread_proxy_->RunsTasksOnCurrentThread()); | 217 DCHECK(main_thread_proxy_->RunsTasksOnCurrentThread()); |
296 // Get stats data. | 218 return stats_.GetPacketStatsData(); |
297 const PacketStatsMap* stats = stats_.GetPacketStatsData(now); | |
298 if (config_.enable_uma_stats) { | |
299 PacketStatsMap::const_iterator it; | |
300 for (it = stats->begin(); it != stats->end(); ++it) { | |
301 switch (it->first) { | |
302 case kPacketSentToPacer: | |
303 UMA_HISTOGRAM_COUNTS("Cast.Stats.PacketSentToPacer", it->second); | |
304 break; | |
305 case kPacketSentToNetwork: | |
306 UMA_HISTOGRAM_COUNTS("Cast.Stats.PacketSentToNetwork", it->second); | |
307 break; | |
308 case kPacketRetransmitted: | |
309 UMA_HISTOGRAM_COUNTS("Cast.Stats.PacketRetransmited", it->second); | |
310 break; | |
311 case kDuplicatePacketReceived: | |
312 UMA_HISTOGRAM_COUNTS("Cast.Stats.DuplicatePacketReceived", | |
313 it->second); | |
314 break; | |
315 default: | |
316 // No-op. | |
317 break; | |
318 } | |
319 } | |
320 } | |
321 return stats; | |
322 } | 219 } |
323 | 220 |
324 const GenericStatsMap* LoggingImpl::GetGenericStatsData() { | 221 const GenericStatsMap* LoggingImpl::GetGenericStatsData() const { |
325 DCHECK(main_thread_proxy_->RunsTasksOnCurrentThread()); | 222 DCHECK(main_thread_proxy_->RunsTasksOnCurrentThread()); |
326 // Get stats data. | 223 return stats_.GetGenericStatsData(); |
327 const GenericStatsMap* stats = stats_.GetGenericStatsData(); | |
328 return stats; | |
329 } | 224 } |
330 | 225 |
331 void LoggingImpl::ResetRaw() { | 226 void LoggingImpl::ResetRaw() { |
332 DCHECK(main_thread_proxy_->RunsTasksOnCurrentThread()); | 227 DCHECK(main_thread_proxy_->RunsTasksOnCurrentThread()); |
333 raw_.Reset(); | 228 raw_.Reset(); |
334 } | 229 } |
335 | 230 |
336 void LoggingImpl::ResetStats() { | 231 void LoggingImpl::ResetStats() { |
337 DCHECK(main_thread_proxy_->RunsTasksOnCurrentThread()); | 232 DCHECK(main_thread_proxy_->RunsTasksOnCurrentThread()); |
338 stats_.Reset(); | 233 stats_.Reset(); |
339 } | 234 } |
340 | 235 |
341 } // namespace cast | 236 } // namespace cast |
342 } // namespace media | 237 } // namespace media |
OLD | NEW |