| 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.AudioFrameEncodedSize", frame_size); |
| 58 else if (event == kVideoFrameEncoded) { | 58 else if (event == kVideoFrameEncoded) { |
| 59 UMA_HISTOGRAM_COUNTS("Cast.VideoFrameEncoded", frame_size); | 59 UMA_HISTOGRAM_COUNTS("Cast.VideoFrameEncodedSize", frame_size); |
| 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.PacketLossFraction", value); |
| 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::GetAndResetAudioRtcpRawData() { |
| 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::GetAndResetVideoRtcpRawData() { |
| 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 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 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 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 |