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 "content/browser/media/android/browser_media_player_manager.h" | 5 #include "content/browser/media/android/browser_media_player_manager.h" |
6 | 6 |
7 #include "base/android/scoped_java_ref.h" | 7 #include "base/android/scoped_java_ref.h" |
8 #include "base/command_line.h" | 8 #include "base/command_line.h" |
9 #include "content/browser/android/content_view_core_impl.h" | 9 #include "content/browser/android/content_view_core_impl.h" |
10 #include "content/browser/media/android/browser_demuxer_android.h" | 10 #include "content/browser/media/android/browser_demuxer_android.h" |
(...skipping 65 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
76 const std::string user_agent = GetContentClient()->GetUserAgent(); | 76 const std::string user_agent = GetContentClient()->GetUserAgent(); |
77 MediaPlayerBridge* media_player_bridge = new MediaPlayerBridge( | 77 MediaPlayerBridge* media_player_bridge = new MediaPlayerBridge( |
78 media_player_params.player_id, | 78 media_player_params.player_id, |
79 media_player_params.url, | 79 media_player_params.url, |
80 media_player_params.first_party_for_cookies, | 80 media_player_params.first_party_for_cookies, |
81 user_agent, | 81 user_agent, |
82 hide_url_log, | 82 hide_url_log, |
83 manager, | 83 manager, |
84 base::Bind(&BrowserMediaPlayerManager::OnMediaResourcesRequested, | 84 base::Bind(&BrowserMediaPlayerManager::OnMediaResourcesRequested, |
85 weak_ptr_factory_.GetWeakPtr()), | 85 weak_ptr_factory_.GetWeakPtr()), |
86 base::Bind(&BrowserMediaPlayerManager::OnMediaResourcesReleased, | |
87 weak_ptr_factory_.GetWeakPtr()), | |
88 media_player_params.frame_url, | 86 media_player_params.frame_url, |
89 media_player_params.allow_credentials); | 87 media_player_params.allow_credentials); |
90 BrowserMediaPlayerManager* browser_media_player_manager = | 88 BrowserMediaPlayerManager* browser_media_player_manager = |
91 static_cast<BrowserMediaPlayerManager*>(manager); | 89 static_cast<BrowserMediaPlayerManager*>(manager); |
92 ContentViewCoreImpl* content_view_core_impl = | 90 ContentViewCoreImpl* content_view_core_impl = |
93 static_cast<ContentViewCoreImpl*>(ContentViewCore::FromWebContents( | 91 static_cast<ContentViewCoreImpl*>(ContentViewCore::FromWebContents( |
94 browser_media_player_manager->web_contents_)); | 92 browser_media_player_manager->web_contents_)); |
95 if (!content_view_core_impl) { | 93 if (!content_view_core_impl) { |
96 // May reach here due to prerendering. Don't extract the metadata | 94 // May reach here due to prerendering. Don't extract the metadata |
97 // since it is expensive. | 95 // since it is expensive. |
98 // TODO(qinmin): extract the metadata once the user decided to load | 96 // TODO(qinmin): extract the metadata once the user decided to load |
99 // the page. | 97 // the page. |
100 browser_media_player_manager->OnMediaMetadataChanged( | 98 browser_media_player_manager->OnMediaMetadataChanged( |
101 media_player_params.player_id, base::TimeDelta(), 0, 0, false); | 99 media_player_params.player_id, base::TimeDelta(), 0, 0, false); |
102 } else if (!content_view_core_impl->ShouldBlockMediaRequest( | 100 } else if (!content_view_core_impl->ShouldBlockMediaRequest( |
103 media_player_params.url)) { | 101 media_player_params.url)) { |
104 media_player_bridge->Initialize(); | 102 media_player_bridge->Initialize(); |
105 } | 103 } |
106 return media_player_bridge; | 104 return media_player_bridge; |
107 } | 105 } |
108 | 106 |
109 case MEDIA_PLAYER_TYPE_MEDIA_SOURCE: { | 107 case MEDIA_PLAYER_TYPE_MEDIA_SOURCE: { |
110 return new MediaSourcePlayer( | 108 return new MediaSourcePlayer( |
111 media_player_params.player_id, | 109 media_player_params.player_id, |
112 manager, | 110 manager, |
113 base::Bind(&BrowserMediaPlayerManager::OnMediaResourcesRequested, | 111 base::Bind(&BrowserMediaPlayerManager::OnMediaResourcesRequested, |
114 weak_ptr_factory_.GetWeakPtr()), | 112 weak_ptr_factory_.GetWeakPtr()), |
115 base::Bind(&BrowserMediaPlayerManager::OnMediaResourcesReleased, | |
116 weak_ptr_factory_.GetWeakPtr()), | |
117 demuxer->CreateDemuxer(media_player_params.demuxer_client_id), | 113 demuxer->CreateDemuxer(media_player_params.demuxer_client_id), |
118 media_player_params.frame_url); | 114 media_player_params.frame_url); |
119 } | 115 } |
120 } | 116 } |
121 | 117 |
122 NOTREACHED(); | 118 NOTREACHED(); |
123 return NULL; | 119 return NULL; |
124 } | 120 } |
125 | 121 |
126 BrowserMediaPlayerManager::BrowserMediaPlayerManager( | 122 BrowserMediaPlayerManager::BrowserMediaPlayerManager( |
(...skipping 365 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
492 player->SetVolume(volume); | 488 player->SetVolume(volume); |
493 } | 489 } |
494 | 490 |
495 void BrowserMediaPlayerManager::OnSetPoster(int player_id, const GURL& url) { | 491 void BrowserMediaPlayerManager::OnSetPoster(int player_id, const GURL& url) { |
496 // To be overridden by subclasses. | 492 // To be overridden by subclasses. |
497 } | 493 } |
498 | 494 |
499 void BrowserMediaPlayerManager::OnReleaseResources(int player_id) { | 495 void BrowserMediaPlayerManager::OnReleaseResources(int player_id) { |
500 MediaPlayerAndroid* player = GetPlayer(player_id); | 496 MediaPlayerAndroid* player = GetPlayer(player_id); |
501 if (player) | 497 if (player) |
502 player->Release(); | 498 ReleasePlayer(player); |
503 if (player_id == fullscreen_player_id_) | 499 if (player_id == fullscreen_player_id_) |
504 fullscreen_player_is_released_ = true; | 500 fullscreen_player_is_released_ = true; |
505 } | 501 } |
506 | 502 |
507 void BrowserMediaPlayerManager::OnDestroyPlayer(int player_id) { | 503 void BrowserMediaPlayerManager::OnDestroyPlayer(int player_id) { |
508 RemovePlayer(player_id); | 504 RemovePlayer(player_id); |
509 if (fullscreen_player_id_ == player_id) | 505 if (fullscreen_player_id_ == player_id) |
510 fullscreen_player_id_ = -1; | 506 fullscreen_player_id_ = -1; |
511 } | 507 } |
512 | 508 |
513 void BrowserMediaPlayerManager::AddPlayer(MediaPlayerAndroid* player) { | 509 void BrowserMediaPlayerManager::AddPlayer(MediaPlayerAndroid* player) { |
514 DCHECK(!GetPlayer(player->player_id())); | 510 DCHECK(!GetPlayer(player->player_id())); |
515 players_.push_back(player); | 511 players_.push_back(player); |
516 } | 512 } |
517 | 513 |
518 void BrowserMediaPlayerManager::RemovePlayer(int player_id) { | 514 void BrowserMediaPlayerManager::RemovePlayer(int player_id) { |
519 for (ScopedVector<MediaPlayerAndroid>::iterator it = players_.begin(); | 515 for (ScopedVector<MediaPlayerAndroid>::iterator it = players_.begin(); |
520 it != players_.end(); ++it) { | 516 it != players_.end(); ++it) { |
521 MediaPlayerAndroid* player = *it; | 517 if ((*it)->player_id() == player_id) { |
522 if (player->player_id() == player_id) { | 518 ReleaseMediaResources(player_id); |
523 players_.erase(it); | 519 players_.erase(it); |
524 break; | 520 break; |
525 } | 521 } |
526 } | 522 } |
527 } | 523 } |
528 | 524 |
529 scoped_ptr<media::MediaPlayerAndroid> BrowserMediaPlayerManager::SwapPlayer( | 525 scoped_ptr<media::MediaPlayerAndroid> BrowserMediaPlayerManager::SwapPlayer( |
530 int player_id, media::MediaPlayerAndroid* player) { | 526 int player_id, media::MediaPlayerAndroid* player) { |
531 media::MediaPlayerAndroid* previous_player = NULL; | 527 media::MediaPlayerAndroid* previous_player = NULL; |
532 for (ScopedVector<MediaPlayerAndroid>::iterator it = players_.begin(); | 528 for (ScopedVector<MediaPlayerAndroid>::iterator it = players_.begin(); |
533 it != players_.end(); ++it) { | 529 it != players_.end(); ++it) { |
534 if ((*it)->player_id() == player_id) { | 530 if ((*it)->player_id() == player_id) { |
535 previous_player = *it; | 531 previous_player = *it; |
| 532 ReleaseMediaResources(player_id); |
536 players_.weak_erase(it); | 533 players_.weak_erase(it); |
537 players_.push_back(player); | 534 players_.push_back(player); |
538 break; | 535 break; |
539 } | 536 } |
540 } | 537 } |
541 return scoped_ptr<media::MediaPlayerAndroid>(previous_player); | 538 return scoped_ptr<media::MediaPlayerAndroid>(previous_player); |
542 } | 539 } |
543 | 540 |
544 int BrowserMediaPlayerManager::RoutingID() { | 541 int BrowserMediaPlayerManager::RoutingID() { |
545 return render_frame_host_->GetRoutingID(); | 542 return render_frame_host_->GetRoutingID(); |
546 } | 543 } |
547 | 544 |
548 bool BrowserMediaPlayerManager::Send(IPC::Message* msg) { | 545 bool BrowserMediaPlayerManager::Send(IPC::Message* msg) { |
549 return render_frame_host_->Send(msg); | 546 return render_frame_host_->Send(msg); |
550 } | 547 } |
551 | 548 |
552 void BrowserMediaPlayerManager::ReleaseFullscreenPlayer( | 549 void BrowserMediaPlayerManager::ReleaseFullscreenPlayer( |
553 MediaPlayerAndroid* player) { | 550 MediaPlayerAndroid* player) { |
554 player->Release(); | 551 ReleasePlayer(player); |
555 } | 552 } |
556 | 553 |
557 void BrowserMediaPlayerManager::OnMediaResourcesRequested(int player_id) { | 554 void BrowserMediaPlayerManager::OnMediaResourcesRequested(int player_id) { |
558 int num_active_player = 0; | 555 int num_active_player = 0; |
559 ScopedVector<MediaPlayerAndroid>::iterator it; | 556 ScopedVector<MediaPlayerAndroid>::iterator it; |
560 for (it = players_.begin(); it != players_.end(); ++it) { | 557 for (it = players_.begin(); it != players_.end(); ++it) { |
561 if (!(*it)->IsPlayerReady()) | 558 if (!(*it)->IsPlayerReady()) |
562 continue; | 559 continue; |
563 | 560 |
564 // The player is already active, ignore it. | 561 // The player is already active, ignore it. |
565 if ((*it)->player_id() == player_id) | 562 if ((*it)->player_id() == player_id) |
566 return; | 563 return; |
567 else | 564 else |
568 num_active_player++; | 565 num_active_player++; |
569 } | 566 } |
570 | 567 |
571 // Number of active players are less than the threshold, do nothing. | 568 // Number of active players are less than the threshold, do nothing. |
572 if (num_active_player < kMediaPlayerThreshold) | 569 if (num_active_player < kMediaPlayerThreshold) |
573 return; | 570 return; |
574 | 571 |
575 for (it = players_.begin(); it != players_.end(); ++it) { | 572 for (it = players_.begin(); it != players_.end(); ++it) { |
576 if ((*it)->IsPlayerReady() && !(*it)->IsPlaying() && | 573 if ((*it)->IsPlayerReady() && !(*it)->IsPlaying() && |
577 fullscreen_player_id_ != (*it)->player_id()) { | 574 fullscreen_player_id_ != (*it)->player_id()) { |
578 (*it)->Release(); | 575 ReleasePlayer(*it); |
579 Send(new MediaPlayerMsg_MediaPlayerReleased(RoutingID(), | 576 Send(new MediaPlayerMsg_MediaPlayerReleased(RoutingID(), |
580 (*it)->player_id())); | 577 (*it)->player_id())); |
581 } | 578 } |
582 } | 579 } |
583 } | 580 } |
584 | 581 |
585 void BrowserMediaPlayerManager::OnMediaResourcesReleased(int player_id) { | 582 void BrowserMediaPlayerManager::ReleaseMediaResources(int player_id) { |
586 #if defined(VIDEO_HOLE) | 583 #if defined(VIDEO_HOLE) |
587 MediaPlayerAndroid* player = GetPlayer(player_id); | 584 MediaPlayerAndroid* player = GetPlayer(player_id); |
588 if (player && player->IsSurfaceInUse()) | 585 if (player && player->IsSurfaceInUse()) |
589 return; | 586 return; |
590 if (external_video_surface_container_) | 587 if (external_video_surface_container_) |
591 external_video_surface_container_->ReleaseExternalVideoSurface(player_id); | 588 external_video_surface_container_->ReleaseExternalVideoSurface(player_id); |
592 #endif // defined(VIDEO_HOLE) | 589 #endif // defined(VIDEO_HOLE) |
593 } | 590 } |
594 | 591 |
| 592 void BrowserMediaPlayerManager::ReleasePlayer(MediaPlayerAndroid* player) { |
| 593 player->Release(); |
| 594 ReleaseMediaResources(player->player_id()); |
| 595 } |
| 596 |
595 } // namespace content | 597 } // namespace content |
OLD | NEW |