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

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: Created 4 years, 11 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"
11 #include "content/browser/media/android/browser_demuxer_android.h" 11 #include "content/browser/media/android/browser_demuxer_android.h"
12 #include "content/browser/media/android/media_resource_getter_impl.h" 12 #include "content/browser/media/android/media_resource_getter_impl.h"
13 #include "content/browser/media/android/media_session.h"
14 #include "content/browser/media/android/media_throttler.h" 13 #include "content/browser/media/android/media_throttler.h"
15 #include "content/browser/media/android/media_web_contents_observer_android.h" 14 #include "content/browser/media/android/media_web_contents_observer_android.h"
16 #include "content/browser/renderer_host/render_view_host_impl.h" 15 #include "content/browser/renderer_host/render_view_host_impl.h"
17 #include "content/browser/web_contents/web_contents_impl.h" 16 #include "content/browser/web_contents/web_contents_impl.h"
18 #include "content/common/media/media_player_messages_android.h" 17 #include "content/common/media/media_player_messages_android.h"
19 #include "content/public/browser/android/external_video_surface_container.h" 18 #include "content/public/browser/android/external_video_surface_container.h"
20 #include "content/public/browser/browser_context.h" 19 #include "content/public/browser/browser_context.h"
21 #include "content/public/browser/browser_thread.h" 20 #include "content/public/browser/browser_thread.h"
22 #include "content/public/browser/content_browser_client.h" 21 #include "content/public/browser/content_browser_client.h"
23 #include "content/public/browser/render_frame_host.h" 22 #include "content/public/browser/render_frame_host.h"
(...skipping 21 matching lines...) Expand all
45 using media::MediaPlayerManager; 44 using media::MediaPlayerManager;
46 using media::MediaSourcePlayer; 45 using media::MediaSourcePlayer;
47 46
48 namespace content { 47 namespace content {
49 48
50 // Threshold on the number of media players per renderer before we start 49 // Threshold on the number of media players per renderer before we start
51 // attempting to release inactive media players. 50 // attempting to release inactive media players.
52 const int kMediaPlayerThreshold = 1; 51 const int kMediaPlayerThreshold = 1;
53 const int kInvalidMediaPlayerId = -1; 52 const int kInvalidMediaPlayerId = -1;
54 53
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; 54 static BrowserMediaPlayerManager::Factory g_factory = NULL;
59 static media::MediaUrlInterceptor* media_url_interceptor_ = NULL; 55 static media::MediaUrlInterceptor* media_url_interceptor_ = NULL;
60 56
61 // static 57 // static
62 void BrowserMediaPlayerManager::RegisterFactory(Factory factory) { 58 void BrowserMediaPlayerManager::RegisterFactory(Factory factory) {
63 // TODO(aberent) nullptr test is a temporary fix to simplify upstreaming Cast. 59 // 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 60 // Until Cast is fully upstreamed we want the downstream factory to take
65 // priority over the upstream factory. The downstream call happens first, 61 // priority over the upstream factory. The downstream call happens first,
66 // so this will ensure that it does. 62 // so this will ensure that it does.
67 if (g_factory == nullptr) 63 if (g_factory == nullptr)
(...skipping 153 matching lines...) Expand 10 before | Expand all | Expand 10 after
221 217
222 BrowserMediaPlayerManager::~BrowserMediaPlayerManager() { 218 BrowserMediaPlayerManager::~BrowserMediaPlayerManager() {
223 // During the tear down process, OnDestroyPlayer() may or may not be called 219 // During the tear down process, OnDestroyPlayer() may or may not be called
224 // (e.g. the WebContents may be destroyed before the render process). So 220 // (e.g. the WebContents may be destroyed before the render process). So
225 // we cannot DCHECK(players_.empty()) here. Instead, all media players in 221 // we cannot DCHECK(players_.empty()) here. Instead, all media players in
226 // |players_| will be destroyed here because |player_| is a ScopedVector. 222 // |players_| will be destroyed here because |player_| is a ScopedVector.
227 223
228 for (MediaPlayerAndroid* player : players_) 224 for (MediaPlayerAndroid* player : players_)
229 player->DeleteOnCorrectThread(); 225 player->DeleteOnCorrectThread();
230 226
231 MediaSession::Get(web_contents())->RemovePlayers(this);
232 players_.weak_clear(); 227 players_.weak_clear();
233 } 228 }
234 229
235 void BrowserMediaPlayerManager::ExitFullscreen(bool release_media_player) { 230 void BrowserMediaPlayerManager::ExitFullscreen(bool release_media_player) {
236 #if defined(USE_AURA) 231 #if defined(USE_AURA)
237 // TODO(crbug.com/548024) 232 // TODO(crbug.com/548024)
238 NOTIMPLEMENTED(); 233 NOTIMPLEMENTED();
239 #else 234 #else
240 if (WebContentsDelegate* delegate = web_contents_->GetDelegate()) 235 if (WebContentsDelegate* delegate = web_contents_->GetDelegate())
241 delegate->ExitFullscreenModeForTab(web_contents_); 236 delegate->ExitFullscreenModeForTab(web_contents_);
(...skipping 55 matching lines...) Expand 10 before | Expand all | Expand 10 after
297 int player_id, base::TimeDelta duration, int width, int height, 292 int player_id, base::TimeDelta duration, int width, int height,
298 bool success) { 293 bool success) {
299 Send(new MediaPlayerMsg_MediaMetadataChanged( 294 Send(new MediaPlayerMsg_MediaMetadataChanged(
300 RoutingID(), player_id, duration, width, height, success)); 295 RoutingID(), player_id, duration, width, height, success));
301 if (fullscreen_player_id_ == player_id) 296 if (fullscreen_player_id_ == player_id)
302 video_view_->UpdateMediaMetadata(); 297 video_view_->UpdateMediaMetadata();
303 } 298 }
304 299
305 void BrowserMediaPlayerManager::OnPlaybackComplete(int player_id) { 300 void BrowserMediaPlayerManager::OnPlaybackComplete(int player_id) {
306 Send(new MediaPlayerMsg_MediaPlaybackCompleted(RoutingID(), player_id)); 301 Send(new MediaPlayerMsg_MediaPlaybackCompleted(RoutingID(), player_id));
307 MediaSession::Get(web_contents())->RemovePlayer(this, player_id);
308 302
309 if (fullscreen_player_id_ == player_id) 303 if (fullscreen_player_id_ == player_id)
310 video_view_->OnPlaybackComplete(); 304 video_view_->OnPlaybackComplete();
311 } 305 }
312 306
313 void BrowserMediaPlayerManager::OnMediaInterrupted(int player_id) { 307 void BrowserMediaPlayerManager::OnMediaInterrupted(int player_id) {
314 // Tell WebKit that the audio should be paused, then release all resources 308 // Tell WebKit that the audio should be paused, then release all resources
315 Send(new MediaPlayerMsg_MediaPlayerReleased(RoutingID(), player_id)); 309 Send(new MediaPlayerMsg_MediaPlayerReleased(RoutingID(), player_id));
316 OnReleaseResources(player_id); 310 OnReleaseResources(player_id);
317 } 311 }
(...skipping 77 matching lines...) Expand 10 before | Expand all | Expand 10 after
395 for (ScopedVector<MediaPlayerAndroid>::iterator it = players_.begin(); 389 for (ScopedVector<MediaPlayerAndroid>::iterator it = players_.begin();
396 it != players_.end(); ++it) { 390 it != players_.end(); ++it) {
397 if ((*it)->player_id() == player_id) 391 if ((*it)->player_id() == player_id)
398 return *it; 392 return *it;
399 } 393 }
400 return NULL; 394 return NULL;
401 } 395 }
402 396
403 bool BrowserMediaPlayerManager::RequestPlay(int player_id, 397 bool BrowserMediaPlayerManager::RequestPlay(int player_id,
404 base::TimeDelta duration) { 398 base::TimeDelta duration) {
405 MediaSession::Type media_session_type = 399 // TODO(dalecurtis, timav): Remove the concept of RequestPlay(), it's added
406 duration == base::TimeDelta() || 400 // latency for the vast majority of playbacks. Instead playback is paused
407 duration.InSeconds() > kMinimumDurationForContentInSeconds 401 // after startup by the MediaWebContentsObserverAndroid if permission is
408 ? MediaSession::Type::Content 402 // denied. http://crbug.com/XXXXXX
409 : MediaSession::Type::Transient; 403 return true;
410
411 bool succeeded = MediaSession::Get(web_contents())->AddPlayer(
412 this, player_id, media_session_type);
413 if (!succeeded)
414 Send(new MediaPlayerMsg_DidMediaPlayerPause(RoutingID(), player_id));
415 return succeeded;
416 }
417
418 void BrowserMediaPlayerManager::OnSuspend(int player_id) {
419 MediaPlayerAndroid* player = GetPlayer(player_id);
420 DCHECK(player);
421
422 player->Pause(true);
423 Send(new MediaPlayerMsg_DidMediaPlayerPause(RoutingID(), player_id));
424 }
425
426 void BrowserMediaPlayerManager::OnResume(int player_id) {
427 MediaPlayerAndroid* player = GetPlayer(player_id);
428 DCHECK(player);
429
430 player->Start();
431 Send(new MediaPlayerMsg_DidMediaPlayerPlay(RoutingID(), player_id));
432 } 404 }
433 405
434 #if defined(VIDEO_HOLE) 406 #if defined(VIDEO_HOLE)
435 void BrowserMediaPlayerManager::AttachExternalVideoSurface(int player_id, 407 void BrowserMediaPlayerManager::AttachExternalVideoSurface(int player_id,
436 jobject surface) { 408 jobject surface) {
437 MediaPlayerAndroid* player = GetPlayer(player_id); 409 MediaPlayerAndroid* player = GetPlayer(player_id);
438 if (player) { 410 if (player) {
439 player->SetVideoSurface( 411 player->SetVideoSurface(
440 gfx::ScopedJavaSurface::AcquireExternalSurface(surface)); 412 gfx::ScopedJavaSurface::AcquireExternalSurface(surface));
441 } 413 }
(...skipping 147 matching lines...) Expand 10 before | Expand all | Expand 10 after
589 if (player) 561 if (player)
590 player->SeekTo(time); 562 player->SeekTo(time);
591 } 563 }
592 564
593 void BrowserMediaPlayerManager::OnPause( 565 void BrowserMediaPlayerManager::OnPause(
594 int player_id, 566 int player_id,
595 bool is_media_related_action) { 567 bool is_media_related_action) {
596 MediaPlayerAndroid* player = GetPlayer(player_id); 568 MediaPlayerAndroid* player = GetPlayer(player_id);
597 if (player) 569 if (player)
598 player->Pause(is_media_related_action); 570 player->Pause(is_media_related_action);
599
600 if (is_media_related_action)
601 MediaSession::Get(web_contents())->OnPlayerPaused(this, player_id);
602 } 571 }
603 572
604 void BrowserMediaPlayerManager::OnSetVolume(int player_id, double volume) { 573 void BrowserMediaPlayerManager::OnSetVolume(int player_id, double volume) {
605 MediaPlayerAndroid* player = GetPlayer(player_id); 574 MediaPlayerAndroid* player = GetPlayer(player_id);
606 if (player) 575 if (player)
607 player->SetVolume(volume); 576 player->SetVolume(volume);
608 } 577 }
609 578
610 void BrowserMediaPlayerManager::OnSetPoster(int player_id, const GURL& url) { 579 void BrowserMediaPlayerManager::OnSetPoster(int player_id, const GURL& url) {
611 // To be overridden by subclasses. 580 // To be overridden by subclasses.
612 } 581 }
613 582
614 void BrowserMediaPlayerManager::OnReleaseResources(int player_id) { 583 void BrowserMediaPlayerManager::OnReleaseResources(int player_id) {
615 MediaPlayerAndroid* player = GetPlayer(player_id); 584 MediaPlayerAndroid* player = GetPlayer(player_id);
616 if (player) { 585 if (player)
617 // Videos can't play in the background, so are removed from the media
618 // session.
619 if (player->GetVideoWidth() > 0)
620 MediaSession::Get(web_contents())->RemovePlayer(this, player_id);
621
622 ReleasePlayer(player); 586 ReleasePlayer(player);
623 }
624 if (player_id == fullscreen_player_id_) 587 if (player_id == fullscreen_player_id_)
625 fullscreen_player_is_released_ = true; 588 fullscreen_player_is_released_ = true;
626 } 589 }
627 590
628 void BrowserMediaPlayerManager::OnDestroyPlayer(int player_id) { 591 void BrowserMediaPlayerManager::OnDestroyPlayer(int player_id) {
629 DestroyPlayer(player_id); 592 DestroyPlayer(player_id);
630 if (fullscreen_player_id_ == player_id) 593 if (fullscreen_player_id_ == player_id)
631 fullscreen_player_id_ = kInvalidMediaPlayerId; 594 fullscreen_player_id_ = kInvalidMediaPlayerId;
632 } 595 }
633 596
(...skipping 13 matching lines...) Expand all
647 610
648 void BrowserMediaPlayerManager::DestroyPlayer(int player_id) { 611 void BrowserMediaPlayerManager::DestroyPlayer(int player_id) {
649 for (ScopedVector<MediaPlayerAndroid>::iterator it = players_.begin(); 612 for (ScopedVector<MediaPlayerAndroid>::iterator it = players_.begin();
650 it != players_.end(); ++it) { 613 it != players_.end(); ++it) {
651 if ((*it)->player_id() == player_id) { 614 if ((*it)->player_id() == player_id) {
652 #if defined(VIDEO_HOLE) 615 #if defined(VIDEO_HOLE)
653 ReleaseExternalSurface(player_id); 616 ReleaseExternalSurface(player_id);
654 #endif 617 #endif
655 (*it)->DeleteOnCorrectThread(); 618 (*it)->DeleteOnCorrectThread();
656 players_.weak_erase(it); 619 players_.weak_erase(it);
657 MediaSession::Get(web_contents())->RemovePlayer(this, player_id);
658 break; 620 break;
659 } 621 }
660 } 622 }
661 active_players_.erase(player_id); 623 active_players_.erase(player_id);
662 } 624 }
663 625
664 scoped_ptr<media::MediaPlayerAndroid> BrowserMediaPlayerManager::SwapPlayer( 626 scoped_ptr<media::MediaPlayerAndroid> BrowserMediaPlayerManager::SwapPlayer(
665 int player_id, media::MediaPlayerAndroid* player) { 627 int player_id, media::MediaPlayerAndroid* player) {
666 media::MediaPlayerAndroid* previous_player = NULL; 628 media::MediaPlayerAndroid* previous_player = NULL;
667 for (ScopedVector<MediaPlayerAndroid>::iterator it = players_.begin(); 629 for (ScopedVector<MediaPlayerAndroid>::iterator it = players_.begin();
(...skipping 91 matching lines...) Expand 10 before | Expand all | Expand 10 after
759 if (!player) 721 if (!player)
760 return; 722 return;
761 player->Start(); 723 player->Start();
762 if (fullscreen_player_id_ == player_id && fullscreen_player_is_released_) { 724 if (fullscreen_player_id_ == player_id && fullscreen_player_is_released_) {
763 video_view_->OpenVideo(); 725 video_view_->OpenVideo();
764 fullscreen_player_is_released_ = false; 726 fullscreen_player_is_released_ = false;
765 } 727 }
766 } 728 }
767 729
768 } // namespace content 730 } // namespace content
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698