Chromium Code Reviews| 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 303 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 314 const NotificationSource& source, | 314 const NotificationSource& source, |
| 315 const NotificationDetails& details) { | 315 const NotificationDetails& details) { |
| 316 DCHECK_CURRENTLY_ON(BrowserThread::UI); | 316 DCHECK_CURRENTLY_ON(BrowserThread::UI); |
| 317 DCHECK_EQ(type, NOTIFICATION_RENDERER_PROCESS_TERMINATED); | 317 DCHECK_EQ(type, NOTIFICATION_RENDERER_PROCESS_TERMINATED); |
| 318 RenderProcessHost* process = Source<RenderProcessHost>(source).ptr(); | 318 RenderProcessHost* process = Source<RenderProcessHost>(source).ptr(); |
| 319 | 319 |
| 320 // Post the task to the IO thread to avoid race in updating renderer_info_ map | 320 // Post the task to the IO thread to avoid race in updating renderer_info_ map |
| 321 // by both SavePlayerState & LogAndClearPlayersInRenderer from different | 321 // by both SavePlayerState & LogAndClearPlayersInRenderer from different |
| 322 // threads. | 322 // threads. |
| 323 // Using base::Unretained() on MediaInternalsUMAHandler is safe since | 323 // Using base::Unretained() on MediaInternalsUMAHandler is safe since |
| 324 // it is owned by MediaInternals and share the same lifetime | 324 // it is owned by MediaInternals and shares the same lifetime. |
| 325 BrowserThread::PostTask( | 325 BrowserThread::PostTask( |
| 326 BrowserThread::IO, FROM_HERE, | 326 BrowserThread::IO, FROM_HERE, |
| 327 base::Bind(&MediaInternalsUMAHandler::LogAndClearPlayersInRenderer, | 327 base::Bind(&MediaInternalsUMAHandler::LogAndClearPlayersInRenderer, |
| 328 base::Unretained(this), process->GetID())); | 328 base::Unretained(this), process->GetID())); |
| 329 } | 329 } |
| 330 | 330 |
| 331 void MediaInternals::MediaInternalsUMAHandler::SavePlayerState( | 331 void MediaInternals::MediaInternalsUMAHandler::SavePlayerState( |
| 332 const media::MediaLogEvent& event, | 332 const media::MediaLogEvent& event, |
| 333 int render_process_id) { | 333 int render_process_id) { |
| 334 DCHECK_CURRENTLY_ON(BrowserThread::IO); | 334 DCHECK_CURRENTLY_ON(BrowserThread::IO); |
| (...skipping 108 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 443 int render_process_id) { | 443 int render_process_id) { |
| 444 DCHECK_CURRENTLY_ON(BrowserThread::IO); | 444 DCHECK_CURRENTLY_ON(BrowserThread::IO); |
| 445 auto players_it = renderer_info_.find(render_process_id); | 445 auto players_it = renderer_info_.find(render_process_id); |
| 446 if (players_it == renderer_info_.end()) | 446 if (players_it == renderer_info_.end()) |
| 447 return; | 447 return; |
| 448 auto it = players_it->second.begin(); | 448 auto it = players_it->second.begin(); |
| 449 while (it != players_it->second.end()) { | 449 while (it != players_it->second.end()) { |
| 450 ReportUMAForPipelineStatus(it->second); | 450 ReportUMAForPipelineStatus(it->second); |
| 451 players_it->second.erase(it++); | 451 players_it->second.erase(it++); |
| 452 } | 452 } |
| 453 renderer_info_.erase(players_it); | |
| 453 } | 454 } |
| 454 | 455 |
| 455 MediaInternals* MediaInternals::GetInstance() { | 456 MediaInternals* MediaInternals::GetInstance() { |
| 456 return g_media_internals.Pointer(); | 457 return g_media_internals.Pointer(); |
| 457 } | 458 } |
| 458 | 459 |
| 459 MediaInternals::MediaInternals() | 460 MediaInternals::MediaInternals() |
| 460 : can_update_(false), | 461 : can_update_(false), |
| 461 owner_ids_(), | 462 owner_ids_(), |
| 462 uma_handler_(new MediaInternalsUMAHandler()) { | 463 uma_handler_(new MediaInternalsUMAHandler()) { |
| (...skipping 27 matching lines...) Expand all Loading... | |
| 490 } | 491 } |
| 491 media::PipelineStatus error = static_cast<media::PipelineStatus>(status); | 492 media::PipelineStatus error = static_cast<media::PipelineStatus>(status); |
| 492 dict.SetString("params.pipeline_error", | 493 dict.SetString("params.pipeline_error", |
| 493 media::MediaLog::PipelineStatusToString(error)); | 494 media::MediaLog::PipelineStatusToString(error)); |
| 494 } else { | 495 } else { |
| 495 dict.Set("params", event->params.DeepCopy()); | 496 dict.Set("params", event->params.DeepCopy()); |
| 496 } | 497 } |
| 497 | 498 |
| 498 if (CanUpdate()) | 499 if (CanUpdate()) |
| 499 SendUpdate(SerializeUpdate("media.onMediaEvent", &dict)); | 500 SendUpdate(SerializeUpdate("media.onMediaEvent", &dict)); |
| 501 else | |
| 502 SaveUpdate(SerializeUpdate("media.onMediaEvent", &dict)); | |
| 503 | |
| 500 uma_handler_->SavePlayerState(*event, render_process_id); | 504 uma_handler_->SavePlayerState(*event, render_process_id); |
| 501 } | 505 } |
| 502 } | 506 } |
| 503 | 507 |
| 504 void MediaInternals::AddUpdateCallback(const UpdateCallback& callback) { | 508 void MediaInternals::AddUpdateCallback(const UpdateCallback& callback) { |
| 505 DCHECK_CURRENTLY_ON(BrowserThread::UI); | 509 DCHECK_CURRENTLY_ON(BrowserThread::UI); |
| 506 update_callbacks_.push_back(callback); | 510 update_callbacks_.push_back(callback); |
| 507 | 511 |
| 508 base::AutoLock auto_lock(lock_); | 512 base::AutoLock auto_lock(lock_); |
| 509 can_update_ = true; | 513 can_update_ = true; |
| (...skipping 10 matching lines...) Expand all Loading... | |
| 520 | 524 |
| 521 base::AutoLock auto_lock(lock_); | 525 base::AutoLock auto_lock(lock_); |
| 522 can_update_ = !update_callbacks_.empty(); | 526 can_update_ = !update_callbacks_.empty(); |
| 523 } | 527 } |
| 524 | 528 |
| 525 bool MediaInternals::CanUpdate() { | 529 bool MediaInternals::CanUpdate() { |
| 526 base::AutoLock auto_lock(lock_); | 530 base::AutoLock auto_lock(lock_); |
| 527 return can_update_; | 531 return can_update_; |
| 528 } | 532 } |
| 529 | 533 |
| 534 void MediaInternals::SendHistoricalMediaEvents() { | |
| 535 DCHECK_CURRENTLY_ON(BrowserThread::UI); | |
| 536 base::AutoLock auto_lock(lock_); | |
| 537 for (const auto& update : pending_updates_) | |
| 538 SendUpdate(update); | |
| 539 pending_updates_.clear(); | |
| 540 } | |
| 541 | |
| 530 void MediaInternals::SendAudioStreamData() { | 542 void MediaInternals::SendAudioStreamData() { |
| 531 base::string16 audio_stream_update; | 543 base::string16 audio_stream_update; |
| 532 { | 544 { |
| 533 base::AutoLock auto_lock(lock_); | 545 base::AutoLock auto_lock(lock_); |
| 534 audio_stream_update = SerializeUpdate( | 546 audio_stream_update = SerializeUpdate( |
| 535 "media.onReceiveAudioStreamData", &audio_streams_cached_data_); | 547 "media.onReceiveAudioStreamData", &audio_streams_cached_data_); |
| 536 } | 548 } |
| 537 SendUpdate(audio_stream_update); | 549 SendUpdate(audio_stream_update); |
| 538 } | 550 } |
| 539 | 551 |
| (...skipping 54 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 594 if (!BrowserThread::CurrentlyOn(BrowserThread::UI)) { | 606 if (!BrowserThread::CurrentlyOn(BrowserThread::UI)) { |
| 595 BrowserThread::PostTask(BrowserThread::UI, FROM_HERE, base::Bind( | 607 BrowserThread::PostTask(BrowserThread::UI, FROM_HERE, base::Bind( |
| 596 &MediaInternals::SendUpdate, base::Unretained(this), update)); | 608 &MediaInternals::SendUpdate, base::Unretained(this), update)); |
| 597 return; | 609 return; |
| 598 } | 610 } |
| 599 | 611 |
| 600 for (size_t i = 0; i < update_callbacks_.size(); i++) | 612 for (size_t i = 0; i < update_callbacks_.size(); i++) |
| 601 update_callbacks_[i].Run(update); | 613 update_callbacks_[i].Run(update); |
| 602 } | 614 } |
| 603 | 615 |
| 616 void MediaInternals::SaveUpdate(const base::string16& update) { | |
| 617 DCHECK_CURRENTLY_ON(BrowserThread::IO); | |
| 618 | |
| 619 static const size_t kMaxNumUpdates = 2048; | |
|
DaleCurtis
2015/06/09 16:41:32
Usually just const at function scope.
xhwang
2015/06/09 20:37:57
Done.
| |
| 620 | |
| 621 base::AutoLock auto_lock(lock_); | |
| 622 if (pending_updates_.size() >= kMaxNumUpdates) | |
| 623 pending_updates_.pop_front(); | |
| 624 pending_updates_.push_back(update); | |
| 625 } | |
| 626 | |
| 604 void MediaInternals::SendAudioLogUpdate(AudioLogUpdateType type, | 627 void MediaInternals::SendAudioLogUpdate(AudioLogUpdateType type, |
| 605 const std::string& cache_key, | 628 const std::string& cache_key, |
| 606 const std::string& function, | 629 const std::string& function, |
| 607 const base::DictionaryValue* value) { | 630 const base::DictionaryValue* value) { |
| 608 if (!CanUpdate()) | 631 if (!CanUpdate()) |
| 609 return; | 632 return; |
| 610 | 633 |
| 611 { | 634 { |
| 612 base::AutoLock auto_lock(lock_); | 635 base::AutoLock auto_lock(lock_); |
| 613 const bool has_entry = audio_streams_cached_data_.HasKey(cache_key); | 636 const bool has_entry = audio_streams_cached_data_.HasKey(cache_key); |
| (...skipping 10 matching lines...) Expand all Loading... | |
| 624 CHECK( | 647 CHECK( |
| 625 audio_streams_cached_data_.GetDictionary(cache_key, &existing_dict)); | 648 audio_streams_cached_data_.GetDictionary(cache_key, &existing_dict)); |
| 626 existing_dict->MergeDictionary(value); | 649 existing_dict->MergeDictionary(value); |
| 627 } | 650 } |
| 628 } | 651 } |
| 629 | 652 |
| 630 SendUpdate(SerializeUpdate(function, value)); | 653 SendUpdate(SerializeUpdate(function, value)); |
| 631 } | 654 } |
| 632 | 655 |
| 633 } // namespace content | 656 } // namespace content |
| OLD | NEW |