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 <utility> | 7 #include <utility> |
8 | 8 |
9 #include "base/android/scoped_java_ref.h" | 9 #include "base/android/scoped_java_ref.h" |
10 #include "content/browser/frame_host/render_frame_host_impl.h" | 10 #include "content/browser/frame_host/render_frame_host_impl.h" |
(...skipping 34 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
45 using media::MediaPlayerManager; | 45 using media::MediaPlayerManager; |
46 using media::MediaSourcePlayer; | 46 using media::MediaSourcePlayer; |
47 | 47 |
48 namespace content { | 48 namespace content { |
49 | 49 |
50 // Threshold on the number of media players per renderer before we start | 50 // Threshold on the number of media players per renderer before we start |
51 // attempting to release inactive media players. | 51 // attempting to release inactive media players. |
52 const int kMediaPlayerThreshold = 1; | 52 const int kMediaPlayerThreshold = 1; |
53 const int kInvalidMediaPlayerId = -1; | 53 const int kInvalidMediaPlayerId = -1; |
54 | 54 |
55 // Minimal duration of a media player in order to be considered as Content type. | |
56 const int kMinimumDurationForContentInSeconds = 5; | |
57 | |
58 static BrowserMediaPlayerManager::Factory g_factory = NULL; | 55 static BrowserMediaPlayerManager::Factory g_factory = NULL; |
59 static media::MediaUrlInterceptor* media_url_interceptor_ = NULL; | 56 static media::MediaUrlInterceptor* media_url_interceptor_ = NULL; |
60 | 57 |
61 // static | 58 // static |
62 void BrowserMediaPlayerManager::RegisterFactory(Factory factory) { | 59 void BrowserMediaPlayerManager::RegisterFactory(Factory factory) { |
63 // TODO(aberent) nullptr test is a temporary fix to simplify upstreaming Cast. | 60 // TODO(aberent) nullptr test is a temporary fix to simplify upstreaming Cast. |
64 // Until Cast is fully upstreamed we want the downstream factory to take | 61 // Until Cast is fully upstreamed we want the downstream factory to take |
65 // priority over the upstream factory. The downstream call happens first, | 62 // priority over the upstream factory. The downstream call happens first, |
66 // so this will ensure that it does. | 63 // so this will ensure that it does. |
67 if (g_factory == nullptr) | 64 if (g_factory == nullptr) |
(...skipping 158 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
226 | 223 |
227 BrowserMediaPlayerManager::~BrowserMediaPlayerManager() { | 224 BrowserMediaPlayerManager::~BrowserMediaPlayerManager() { |
228 // During the tear down process, OnDestroyPlayer() may or may not be called | 225 // During the tear down process, OnDestroyPlayer() may or may not be called |
229 // (e.g. the WebContents may be destroyed before the render process). So | 226 // (e.g. the WebContents may be destroyed before the render process). So |
230 // we cannot DCHECK(players_.empty()) here. Instead, all media players in | 227 // we cannot DCHECK(players_.empty()) here. Instead, all media players in |
231 // |players_| will be destroyed here because |player_| is a ScopedVector. | 228 // |players_| will be destroyed here because |player_| is a ScopedVector. |
232 | 229 |
233 for (MediaPlayerAndroid* player : players_) | 230 for (MediaPlayerAndroid* player : players_) |
234 player->DeleteOnCorrectThread(); | 231 player->DeleteOnCorrectThread(); |
235 | 232 |
236 MediaSession::Get(web_contents())->RemovePlayers(this); | |
237 players_.weak_clear(); | 233 players_.weak_clear(); |
238 } | 234 } |
239 | 235 |
240 void BrowserMediaPlayerManager::DidExitFullscreen(bool release_media_player) { | 236 void BrowserMediaPlayerManager::DidExitFullscreen(bool release_media_player) { |
241 #if defined(USE_AURA) | 237 #if defined(USE_AURA) |
242 // TODO(crbug.com/548024) | 238 // TODO(crbug.com/548024) |
243 NOTIMPLEMENTED(); | 239 NOTIMPLEMENTED(); |
244 #else | 240 #else |
245 if (WebContentsDelegate* delegate = web_contents_->GetDelegate()) | 241 if (WebContentsDelegate* delegate = web_contents_->GetDelegate()) |
246 delegate->ExitFullscreenModeForTab(web_contents_); | 242 delegate->ExitFullscreenModeForTab(web_contents_); |
(...skipping 55 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
302 int player_id, base::TimeDelta duration, int width, int height, | 298 int player_id, base::TimeDelta duration, int width, int height, |
303 bool success) { | 299 bool success) { |
304 Send(new MediaPlayerMsg_MediaMetadataChanged( | 300 Send(new MediaPlayerMsg_MediaMetadataChanged( |
305 RoutingID(), player_id, duration, width, height, success)); | 301 RoutingID(), player_id, duration, width, height, success)); |
306 if (fullscreen_player_id_ == player_id) | 302 if (fullscreen_player_id_ == player_id) |
307 video_view_->OnVideoSizeChanged(width, height); | 303 video_view_->OnVideoSizeChanged(width, height); |
308 } | 304 } |
309 | 305 |
310 void BrowserMediaPlayerManager::OnPlaybackComplete(int player_id) { | 306 void BrowserMediaPlayerManager::OnPlaybackComplete(int player_id) { |
311 Send(new MediaPlayerMsg_MediaPlaybackCompleted(RoutingID(), player_id)); | 307 Send(new MediaPlayerMsg_MediaPlaybackCompleted(RoutingID(), player_id)); |
312 MediaSession::Get(web_contents())->RemovePlayer(this, player_id); | |
313 } | 308 } |
314 | 309 |
315 void BrowserMediaPlayerManager::OnMediaInterrupted(int player_id) { | 310 void BrowserMediaPlayerManager::OnMediaInterrupted(int player_id) { |
316 // Tell WebKit that the audio should be paused, then release all resources | 311 // Tell WebKit that the audio should be paused, then release all resources |
317 Send(new MediaPlayerMsg_MediaPlayerReleased(RoutingID(), player_id)); | 312 Send(new MediaPlayerMsg_MediaPlayerReleased(RoutingID(), player_id)); |
318 MediaSession::Get(web_contents())->RemovePlayer(this, player_id); | |
319 ReleaseResources(player_id); | 313 ReleaseResources(player_id); |
320 } | 314 } |
321 | 315 |
322 void BrowserMediaPlayerManager::OnBufferingUpdate(int player_id, | 316 void BrowserMediaPlayerManager::OnBufferingUpdate(int player_id, |
323 int percentage) { | 317 int percentage) { |
324 Send(new MediaPlayerMsg_MediaBufferingUpdate(RoutingID(), player_id, | 318 Send(new MediaPlayerMsg_MediaBufferingUpdate(RoutingID(), player_id, |
325 percentage)); | 319 percentage)); |
326 } | 320 } |
327 | 321 |
328 void BrowserMediaPlayerManager::OnSeekRequest( | 322 void BrowserMediaPlayerManager::OnSeekRequest( |
(...skipping 70 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
399 it != players_.end(); ++it) { | 393 it != players_.end(); ++it) { |
400 if ((*it)->player_id() == player_id) | 394 if ((*it)->player_id() == player_id) |
401 return *it; | 395 return *it; |
402 } | 396 } |
403 return NULL; | 397 return NULL; |
404 } | 398 } |
405 | 399 |
406 bool BrowserMediaPlayerManager::RequestPlay(int player_id, | 400 bool BrowserMediaPlayerManager::RequestPlay(int player_id, |
407 base::TimeDelta duration, | 401 base::TimeDelta duration, |
408 bool has_audio) { | 402 bool has_audio) { |
409 if (!has_audio) | 403 DCHECK(player_id_to_delegate_id_map_.find(player_id) != |
410 return true; | 404 player_id_to_delegate_id_map_.end()); |
411 | 405 return MediaWebContentsObserverAndroid::FromWebContents(web_contents_) |
412 MediaSession::Type media_session_type = | 406 ->RequestPlay(render_frame_host_, |
413 duration == base::TimeDelta() || | 407 player_id_to_delegate_id_map_[player_id], has_audio, |
414 duration.InSeconds() > kMinimumDurationForContentInSeconds | 408 IsPlayingRemotely(player_id), duration); |
415 ? MediaSession::Type::Content | |
416 : MediaSession::Type::Transient; | |
417 | |
418 bool succeeded = MediaSession::Get(web_contents())->AddPlayer( | |
419 this, player_id, media_session_type); | |
420 if (!succeeded) | |
421 Send(new MediaPlayerMsg_DidMediaPlayerPause(RoutingID(), player_id)); | |
422 return succeeded; | |
423 } | |
424 | |
425 void BrowserMediaPlayerManager::OnSuspend(int player_id) { | |
426 MediaPlayerAndroid* player = GetPlayer(player_id); | |
427 DCHECK(player); | |
428 | |
429 player->Pause(true); | |
430 Send(new MediaPlayerMsg_DidMediaPlayerPause(RoutingID(), player_id)); | |
431 } | |
432 | |
433 void BrowserMediaPlayerManager::OnResume(int player_id) { | |
434 MediaPlayerAndroid* player = GetPlayer(player_id); | |
435 DCHECK(player); | |
436 | |
437 player->Start(); | |
438 Send(new MediaPlayerMsg_DidMediaPlayerPlay(RoutingID(), player_id)); | |
439 } | |
440 | |
441 void BrowserMediaPlayerManager::OnSetVolumeMultiplier( | |
442 int player_id, double volume_multiplier) { | |
443 MediaPlayerAndroid* player = GetPlayer(player_id); | |
444 if (!player) | |
445 return; | |
446 | |
447 player->SetVolumeMultiplier(volume_multiplier); | |
448 } | 409 } |
449 | 410 |
450 #if defined(VIDEO_HOLE) | 411 #if defined(VIDEO_HOLE) |
451 void BrowserMediaPlayerManager::AttachExternalVideoSurface(int player_id, | 412 void BrowserMediaPlayerManager::AttachExternalVideoSurface(int player_id, |
452 jobject surface) { | 413 jobject surface) { |
453 MediaPlayerAndroid* player = GetPlayer(player_id); | 414 MediaPlayerAndroid* player = GetPlayer(player_id); |
454 if (player) { | 415 if (player) { |
455 player->SetVideoSurface( | 416 player->SetVideoSurface( |
456 gfx::ScopedJavaSurface::AcquireExternalSurface(surface)); | 417 gfx::ScopedJavaSurface::AcquireExternalSurface(surface)); |
457 } | 418 } |
(...skipping 124 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
582 RenderProcessHostImpl* host = static_cast<RenderProcessHostImpl*>( | 543 RenderProcessHostImpl* host = static_cast<RenderProcessHostImpl*>( |
583 web_contents()->GetRenderProcessHost()); | 544 web_contents()->GetRenderProcessHost()); |
584 MediaPlayerAndroid* player = | 545 MediaPlayerAndroid* player = |
585 CreateMediaPlayer(media_player_params, | 546 CreateMediaPlayer(media_player_params, |
586 host->GetBrowserContext()->IsOffTheRecord(), | 547 host->GetBrowserContext()->IsOffTheRecord(), |
587 host->browser_demuxer_android().get()); | 548 host->browser_demuxer_android().get()); |
588 | 549 |
589 if (!player) | 550 if (!player) |
590 return; | 551 return; |
591 | 552 |
| 553 player_id_to_delegate_id_map_[media_player_params.player_id] = |
| 554 media_player_params.delegate_id; |
592 AddPlayer(player); | 555 AddPlayer(player); |
593 } | 556 } |
594 | 557 |
595 void BrowserMediaPlayerManager::OnStart(int player_id) { | 558 void BrowserMediaPlayerManager::OnStart(int player_id) { |
596 MediaPlayerAndroid* player = GetPlayer(player_id); | 559 MediaPlayerAndroid* player = GetPlayer(player_id); |
597 if (!player) | 560 if (!player) |
598 return; | 561 return; |
599 | 562 |
600 if (RequestDecoderResources(player_id, false)) { | 563 if (RequestDecoderResources(player_id, false)) { |
601 StartInternal(player_id); | 564 StartInternal(player_id); |
(...skipping 12 matching lines...) Expand all Loading... |
614 if (player) | 577 if (player) |
615 player->SeekTo(time); | 578 player->SeekTo(time); |
616 } | 579 } |
617 | 580 |
618 void BrowserMediaPlayerManager::OnPause( | 581 void BrowserMediaPlayerManager::OnPause( |
619 int player_id, | 582 int player_id, |
620 bool is_media_related_action) { | 583 bool is_media_related_action) { |
621 MediaPlayerAndroid* player = GetPlayer(player_id); | 584 MediaPlayerAndroid* player = GetPlayer(player_id); |
622 if (player) | 585 if (player) |
623 player->Pause(is_media_related_action); | 586 player->Pause(is_media_related_action); |
624 | |
625 if (is_media_related_action) | |
626 MediaSession::Get(web_contents())->OnPlayerPaused(this, player_id); | |
627 } | 587 } |
628 | 588 |
629 void BrowserMediaPlayerManager::OnSetVolume(int player_id, double volume) { | 589 void BrowserMediaPlayerManager::OnSetVolume(int player_id, double volume) { |
630 MediaPlayerAndroid* player = GetPlayer(player_id); | 590 MediaPlayerAndroid* player = GetPlayer(player_id); |
631 if (player) | 591 if (player) |
632 player->SetVolume(volume); | 592 player->SetVolume(volume); |
633 } | 593 } |
634 | 594 |
635 void BrowserMediaPlayerManager::OnSetPoster(int player_id, const GURL& url) { | 595 void BrowserMediaPlayerManager::OnSetPoster(int player_id, const GURL& url) { |
636 // To be overridden by subclasses. | 596 // To be overridden by subclasses. |
637 } | 597 } |
638 | 598 |
639 void BrowserMediaPlayerManager::OnSuspendAndReleaseResources(int player_id) { | 599 void BrowserMediaPlayerManager::OnSuspendAndReleaseResources(int player_id) { |
640 MediaSession::Get(web_contents())->RemovePlayer(this, player_id); | |
641 ReleaseResources(player_id); | 600 ReleaseResources(player_id); |
642 } | 601 } |
643 | 602 |
644 void BrowserMediaPlayerManager::OnDestroyPlayer(int player_id) { | 603 void BrowserMediaPlayerManager::OnDestroyPlayer(int player_id) { |
645 DestroyPlayer(player_id); | 604 DestroyPlayer(player_id); |
646 if (fullscreen_player_id_ == player_id) | 605 if (fullscreen_player_id_ == player_id) |
647 fullscreen_player_id_ = kInvalidMediaPlayerId; | 606 fullscreen_player_id_ = kInvalidMediaPlayerId; |
648 } | 607 } |
649 | 608 |
650 void BrowserMediaPlayerManager::OnRequestRemotePlayback(int /* player_id */) { | 609 void BrowserMediaPlayerManager::OnRequestRemotePlayback(int /* player_id */) { |
(...skipping 12 matching lines...) Expand all Loading... |
663 | 622 |
664 void BrowserMediaPlayerManager::DestroyPlayer(int player_id) { | 623 void BrowserMediaPlayerManager::DestroyPlayer(int player_id) { |
665 for (ScopedVector<MediaPlayerAndroid>::iterator it = players_.begin(); | 624 for (ScopedVector<MediaPlayerAndroid>::iterator it = players_.begin(); |
666 it != players_.end(); ++it) { | 625 it != players_.end(); ++it) { |
667 if ((*it)->player_id() == player_id) { | 626 if ((*it)->player_id() == player_id) { |
668 #if defined(VIDEO_HOLE) | 627 #if defined(VIDEO_HOLE) |
669 ReleaseExternalSurface(player_id); | 628 ReleaseExternalSurface(player_id); |
670 #endif | 629 #endif |
671 (*it)->DeleteOnCorrectThread(); | 630 (*it)->DeleteOnCorrectThread(); |
672 players_.weak_erase(it); | 631 players_.weak_erase(it); |
673 MediaSession::Get(web_contents())->RemovePlayer(this, player_id); | |
674 break; | 632 break; |
675 } | 633 } |
676 } | 634 } |
677 active_players_.erase(player_id); | 635 active_players_.erase(player_id); |
| 636 player_id_to_delegate_id_map_.erase(player_id); |
678 } | 637 } |
679 | 638 |
680 void BrowserMediaPlayerManager::ReleaseResources(int player_id) { | 639 void BrowserMediaPlayerManager::ReleaseResources(int player_id) { |
681 MediaPlayerAndroid* player = GetPlayer(player_id); | 640 MediaPlayerAndroid* player = GetPlayer(player_id); |
682 if (player) | 641 if (player) |
683 ReleasePlayer(player); | 642 ReleasePlayer(player); |
684 if (player_id == fullscreen_player_id_) | 643 if (player_id == fullscreen_player_id_) |
685 fullscreen_player_is_released_ = true; | 644 fullscreen_player_is_released_ = true; |
686 } | 645 } |
687 | 646 |
(...skipping 51 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
739 | 698 |
740 active_players_[player_id] = temporary; | 699 active_players_[player_id] = temporary; |
741 return true; | 700 return true; |
742 } | 701 } |
743 | 702 |
744 void BrowserMediaPlayerManager::OnDecoderResourcesReleased(int player_id) { | 703 void BrowserMediaPlayerManager::OnDecoderResourcesReleased(int player_id) { |
745 if (active_players_.find(player_id) == active_players_.end()) | 704 if (active_players_.find(player_id) == active_players_.end()) |
746 return; | 705 return; |
747 | 706 |
748 active_players_.erase(player_id); | 707 active_players_.erase(player_id); |
| 708 player_id_to_delegate_id_map_.erase(player_id); |
749 MediaThrottler::GetInstance()->OnDecodeRequestFinished(); | 709 MediaThrottler::GetInstance()->OnDecodeRequestFinished(); |
750 } | 710 } |
751 | 711 |
| 712 bool BrowserMediaPlayerManager::IsPlayingRemotely(int player_id) { |
| 713 return false; |
| 714 } |
| 715 |
752 int BrowserMediaPlayerManager::RoutingID() { | 716 int BrowserMediaPlayerManager::RoutingID() { |
753 return render_frame_host_->GetRoutingID(); | 717 return render_frame_host_->GetRoutingID(); |
754 } | 718 } |
755 | 719 |
756 bool BrowserMediaPlayerManager::Send(IPC::Message* msg) { | 720 bool BrowserMediaPlayerManager::Send(IPC::Message* msg) { |
757 return render_frame_host_->Send(msg); | 721 return render_frame_host_->Send(msg); |
758 } | 722 } |
759 | 723 |
760 void BrowserMediaPlayerManager::ReleaseFullscreenPlayer( | 724 void BrowserMediaPlayerManager::ReleaseFullscreenPlayer( |
761 MediaPlayerAndroid* player) { | 725 MediaPlayerAndroid* player) { |
(...skipping 21 matching lines...) Expand all Loading... |
783 if (!player) | 747 if (!player) |
784 return; | 748 return; |
785 player->Start(); | 749 player->Start(); |
786 if (fullscreen_player_id_ == player_id && fullscreen_player_is_released_) { | 750 if (fullscreen_player_id_ == player_id && fullscreen_player_is_released_) { |
787 video_view_->OpenVideo(); | 751 video_view_->OpenVideo(); |
788 fullscreen_player_is_released_ = false; | 752 fullscreen_player_is_released_ = false; |
789 } | 753 } |
790 } | 754 } |
791 | 755 |
792 } // namespace content | 756 } // namespace content |
OLD | NEW |