Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(76)

Side by Side Diff: content/browser/media/android/browser_media_player_manager.cc

Issue 1570043002: Implement MediaSession on top of the WebMediaPlayerDelegate. (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@media_session
Patch Set: Comments. Fix test? Created 4 years, 10 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
OLDNEW
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
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
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
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
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
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);
Tima Vaisburd 2016/01/26 07:10:14 Do we need consistency between |players_| and |pla
DaleCurtis 2016/01/26 16:17:58 Yes, that seems reasonable. I don't see anyone usi
Tima Vaisburd 2016/01/26 18:44:20 Neither do I.
DaleCurtis 2016/01/27 02:25:13 Done.
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);
602 } else if (WebContentsDelegate* delegate = web_contents_->GetDelegate()){ 565 } else if (WebContentsDelegate* delegate = web_contents_->GetDelegate()){
(...skipping 11 matching lines...) Expand all
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 && !IsPlayingRemotely(player_id))
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 16 matching lines...) Expand all
667 626
668 void BrowserMediaPlayerManager::DestroyPlayer(int player_id) { 627 void BrowserMediaPlayerManager::DestroyPlayer(int player_id) {
669 for (ScopedVector<MediaPlayerAndroid>::iterator it = players_.begin(); 628 for (ScopedVector<MediaPlayerAndroid>::iterator it = players_.begin();
670 it != players_.end(); ++it) { 629 it != players_.end(); ++it) {
671 if ((*it)->player_id() == player_id) { 630 if ((*it)->player_id() == player_id) {
672 #if defined(VIDEO_HOLE) 631 #if defined(VIDEO_HOLE)
673 ReleaseExternalSurface(player_id); 632 ReleaseExternalSurface(player_id);
674 #endif 633 #endif
675 (*it)->DeleteOnCorrectThread(); 634 (*it)->DeleteOnCorrectThread();
676 players_.weak_erase(it); 635 players_.weak_erase(it);
677 MediaSession::Get(web_contents())->RemovePlayer(this, player_id);
678 break; 636 break;
679 } 637 }
680 } 638 }
681 active_players_.erase(player_id); 639 active_players_.erase(player_id);
640 player_id_to_delegate_id_map_.erase(player_id);
682 } 641 }
683 642
684 void BrowserMediaPlayerManager::ReleaseResources(int player_id) { 643 void BrowserMediaPlayerManager::ReleaseResources(int player_id) {
685 MediaPlayerAndroid* player = GetPlayer(player_id); 644 MediaPlayerAndroid* player = GetPlayer(player_id);
686 if (player) 645 if (player)
687 ReleasePlayer(player); 646 ReleasePlayer(player);
688 if (player_id == fullscreen_player_id_) 647 if (player_id == fullscreen_player_id_)
689 fullscreen_player_is_released_ = true; 648 fullscreen_player_is_released_ = true;
690 } 649 }
691 650
(...skipping 95 matching lines...) Expand 10 before | Expand all | Expand 10 after
787 if (!player) 746 if (!player)
788 return; 747 return;
789 player->Start(); 748 player->Start();
790 if (fullscreen_player_id_ == player_id && fullscreen_player_is_released_) { 749 if (fullscreen_player_id_ == player_id && fullscreen_player_is_released_) {
791 video_view_->OpenVideo(); 750 video_view_->OpenVideo();
792 fullscreen_player_is_released_ = false; 751 fullscreen_player_is_released_ = false;
793 } 752 }
794 } 753 }
795 754
796 } // namespace content 755 } // namespace content
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698