OLD | NEW |
1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. | 1 // Copyright (c) 2012 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 "content/browser/media/media_internals.h" | 5 #include "content/browser/media/media_internals.h" |
6 | 6 |
7 #include "base/metrics/histogram.h" | 7 #include "base/metrics/histogram.h" |
8 #include "base/strings/string16.h" | 8 #include "base/strings/string16.h" |
9 #include "base/strings/string_number_conversions.h" | 9 #include "base/strings/string_number_conversions.h" |
10 #include "base/strings/stringprintf.h" | 10 #include "base/strings/stringprintf.h" |
(...skipping 182 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
193 // Helper function to save the event payload to RendererPlayerMap. | 193 // Helper function to save the event payload to RendererPlayerMap. |
194 void SavePlayerState(const media::MediaLogEvent& event, | 194 void SavePlayerState(const media::MediaLogEvent& event, |
195 int render_process_id); | 195 int render_process_id); |
196 | 196 |
197 private: | 197 private: |
198 struct PipelineInfo { | 198 struct PipelineInfo { |
199 media::PipelineStatus last_pipeline_status; | 199 media::PipelineStatus last_pipeline_status; |
200 bool has_audio; | 200 bool has_audio; |
201 bool has_video; | 201 bool has_video; |
202 bool video_dds; | 202 bool video_dds; |
| 203 bool video_decoder_changed; |
203 std::string audio_codec_name; | 204 std::string audio_codec_name; |
204 std::string video_codec_name; | 205 std::string video_codec_name; |
205 std::string video_decoder; | 206 std::string video_decoder; |
206 PipelineInfo() | 207 PipelineInfo() |
207 : last_pipeline_status(media::PIPELINE_OK), | 208 : last_pipeline_status(media::PIPELINE_OK), |
208 has_audio(false), | 209 has_audio(false), |
209 has_video(false), | 210 has_video(false), |
210 video_dds(false) {} | 211 video_dds(false), |
| 212 video_decoder_changed(false) {} |
211 }; | 213 }; |
212 | 214 |
213 // Helper function to report PipelineStatus associated with a player to UMA. | 215 // Helper function to report PipelineStatus associated with a player to UMA. |
214 void ReportUMAForPipelineStatus(const PipelineInfo& player_info); | 216 void ReportUMAForPipelineStatus(const PipelineInfo& player_info); |
215 | 217 |
216 // Helper to generate PipelineStatus UMA name for AudioVideo streams. | 218 // Helper to generate PipelineStatus UMA name for AudioVideo streams. |
217 std::string GetUMANameForAVStream(const PipelineInfo& player_info); | 219 std::string GetUMANameForAVStream(const PipelineInfo& player_info); |
218 | 220 |
219 // Key is playerid | 221 // Key is playerid |
220 typedef std::map<int, PipelineInfo> PlayerInfoMap; | 222 typedef std::map<int, PipelineInfo> PlayerInfoMap; |
(...skipping 32 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
253 base::Bind(&MediaInternalsUMAHandler::LogAndClearPlayersInRenderer, | 255 base::Bind(&MediaInternalsUMAHandler::LogAndClearPlayersInRenderer, |
254 base::Unretained(this), process->GetID())); | 256 base::Unretained(this), process->GetID())); |
255 } | 257 } |
256 | 258 |
257 void MediaInternals::MediaInternalsUMAHandler::SavePlayerState( | 259 void MediaInternals::MediaInternalsUMAHandler::SavePlayerState( |
258 const media::MediaLogEvent& event, | 260 const media::MediaLogEvent& event, |
259 int render_process_id) { | 261 int render_process_id) { |
260 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::IO)); | 262 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::IO)); |
261 PlayerInfoMap& player_info = renderer_info_[render_process_id]; | 263 PlayerInfoMap& player_info = renderer_info_[render_process_id]; |
262 switch (event.type) { | 264 switch (event.type) { |
263 case media::MediaLogEvent::WEBMEDIAPLAYER_CREATED: { | |
264 // Nothing to do here | |
265 break; | |
266 } | |
267 case media::MediaLogEvent::PIPELINE_ERROR: { | 265 case media::MediaLogEvent::PIPELINE_ERROR: { |
268 int status; | 266 int status; |
269 event.params.GetInteger("pipeline_error", &status); | 267 event.params.GetInteger("pipeline_error", &status); |
270 player_info[event.id].last_pipeline_status = | 268 player_info[event.id].last_pipeline_status = |
271 static_cast<media::PipelineStatus>(status); | 269 static_cast<media::PipelineStatus>(status); |
272 break; | 270 break; |
273 } | 271 } |
274 case media::MediaLogEvent::PROPERTY_CHANGE: | 272 case media::MediaLogEvent::PROPERTY_CHANGE: |
275 if (event.params.HasKey("found_audio_stream")) { | 273 if (event.params.HasKey("found_audio_stream")) { |
276 event.params.GetBoolean("found_audio_stream", | 274 event.params.GetBoolean("found_audio_stream", |
277 &player_info[event.id].has_audio); | 275 &player_info[event.id].has_audio); |
278 } | 276 } |
279 if (event.params.HasKey("found_video_stream")) { | 277 if (event.params.HasKey("found_video_stream")) { |
280 event.params.GetBoolean("found_video_stream", | 278 event.params.GetBoolean("found_video_stream", |
281 &player_info[event.id].has_video); | 279 &player_info[event.id].has_video); |
282 } | 280 } |
283 if (event.params.HasKey("audio_codec_name")) { | 281 if (event.params.HasKey("audio_codec_name")) { |
284 event.params.GetString("audio_codec_name", | 282 event.params.GetString("audio_codec_name", |
285 &player_info[event.id].audio_codec_name); | 283 &player_info[event.id].audio_codec_name); |
286 } | 284 } |
287 if (event.params.HasKey("video_codec_name")) { | 285 if (event.params.HasKey("video_codec_name")) { |
288 event.params.GetString("video_codec_name", | 286 event.params.GetString("video_codec_name", |
289 &player_info[event.id].video_codec_name); | 287 &player_info[event.id].video_codec_name); |
290 } | 288 } |
291 if (event.params.HasKey("video_decoder")) { | 289 if (event.params.HasKey("video_decoder")) { |
| 290 std::string previous_video_decoder(player_info[event.id].video_decoder); |
292 event.params.GetString("video_decoder", | 291 event.params.GetString("video_decoder", |
293 &player_info[event.id].video_decoder); | 292 &player_info[event.id].video_decoder); |
| 293 if (!previous_video_decoder.empty() && |
| 294 previous_video_decoder != player_info[event.id].video_decoder) { |
| 295 player_info[event.id].video_decoder_changed = true; |
| 296 } |
294 } | 297 } |
295 if (event.params.HasKey("video_dds")) { | 298 if (event.params.HasKey("video_dds")) { |
296 event.params.GetBoolean("video_dds", &player_info[event.id].video_dds); | 299 event.params.GetBoolean("video_dds", &player_info[event.id].video_dds); |
297 } | 300 } |
298 break; | 301 break; |
299 default: | 302 default: |
300 break; | 303 break; |
301 } | 304 } |
302 return; | 305 return; |
303 } | 306 } |
(...skipping 45 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
349 media::PIPELINE_STATUS_MAX + 1); | 352 media::PIPELINE_STATUS_MAX + 1); |
350 } else if (player_info.has_video) { | 353 } else if (player_info.has_video) { |
351 UMA_HISTOGRAM_ENUMERATION("Media.PipelineStatus.VideoOnly", | 354 UMA_HISTOGRAM_ENUMERATION("Media.PipelineStatus.VideoOnly", |
352 player_info.last_pipeline_status, | 355 player_info.last_pipeline_status, |
353 media::PIPELINE_STATUS_MAX + 1); | 356 media::PIPELINE_STATUS_MAX + 1); |
354 } else { | 357 } else { |
355 UMA_HISTOGRAM_ENUMERATION("Media.PipelineStatus.Unsupported", | 358 UMA_HISTOGRAM_ENUMERATION("Media.PipelineStatus.Unsupported", |
356 player_info.last_pipeline_status, | 359 player_info.last_pipeline_status, |
357 media::PIPELINE_STATUS_MAX + 1); | 360 media::PIPELINE_STATUS_MAX + 1); |
358 } | 361 } |
| 362 // Report whether video decoder fallback happened, but only if a video decoder |
| 363 // was reported. |
| 364 if (!player_info.video_decoder.empty()) { |
| 365 UMA_HISTOGRAM_BOOLEAN("Media.VideoDecoderFallback", |
| 366 player_info.video_decoder_changed); |
| 367 } |
359 } | 368 } |
360 | 369 |
361 void MediaInternals::MediaInternalsUMAHandler::LogAndClearPlayersInRenderer( | 370 void MediaInternals::MediaInternalsUMAHandler::LogAndClearPlayersInRenderer( |
362 int render_process_id) { | 371 int render_process_id) { |
363 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::IO)); | 372 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::IO)); |
364 auto players_it = renderer_info_.find(render_process_id); | 373 auto players_it = renderer_info_.find(render_process_id); |
365 if (players_it == renderer_info_.end()) | 374 if (players_it == renderer_info_.end()) |
366 return; | 375 return; |
367 auto it = players_it->second.begin(); | 376 auto it = players_it->second.begin(); |
368 while (it != players_it->second.end()) { | 377 while (it != players_it->second.end()) { |
(...skipping 146 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
515 const std::string& function, | 524 const std::string& function, |
516 const base::DictionaryValue* value) { | 525 const base::DictionaryValue* value) { |
517 SendUpdate(SerializeUpdate(function, value)); | 526 SendUpdate(SerializeUpdate(function, value)); |
518 | 527 |
519 base::AutoLock auto_lock(lock_); | 528 base::AutoLock auto_lock(lock_); |
520 scoped_ptr<base::Value> out_value; | 529 scoped_ptr<base::Value> out_value; |
521 CHECK(audio_streams_cached_data_.Remove(cache_key, &out_value)); | 530 CHECK(audio_streams_cached_data_.Remove(cache_key, &out_value)); |
522 } | 531 } |
523 | 532 |
524 } // namespace content | 533 } // namespace content |
OLD | NEW |