browser_media_player_manager.cc revision 03b57e008b61dfcb1fbad3aea950ae0e001748b0
17dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch// Copyright 2013 The Chromium Authors. All rights reserved. 25821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Use of this source code is governed by a BSD-style license that can be 35821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// found in the LICENSE file. 45821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 5d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)#include "content/browser/media/android/browser_media_player_manager.h" 65821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 75c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu#include "base/android/scoped_java_ref.h" 858537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)#include "base/command_line.h" 9868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)#include "content/browser/android/content_view_core_impl.h" 10d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)#include "content/browser/media/android/browser_demuxer_android.h" 11d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)#include "content/browser/media/android/media_resource_getter_impl.h" 1268043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)#include "content/browser/renderer_host/render_view_host_impl.h" 132a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "content/browser/web_contents/web_contents_view_android.h" 1490dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)#include "content/common/media/media_player_messages_android.h" 15f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)#include "content/public/browser/android/content_view_core.h" 16a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)#include "content/public/browser/android/external_video_surface_container.h" 175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "content/public/browser/browser_context.h" 18a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch#include "content/public/browser/content_browser_client.h" 19cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)#include "content/public/browser/render_frame_host.h" 205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "content/public/browser/render_process_host.h" 215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "content/public/browser/render_view_host.h" 222a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "content/public/browser/storage_partition.h" 23868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)#include "content/public/browser/web_contents.h" 2468043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)#include "content/public/browser/web_contents_delegate.h" 255d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#include "content/public/common/content_client.h" 26f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)#include "content/public/common/content_switches.h" 2758537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)#include "media/base/android/media_player_bridge.h" 2858537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)#include "media/base/android/media_source_player.h" 295f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)#include "media/base/android/media_url_interceptor.h" 3058537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)#include "media/base/media_switches.h" 315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 32b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)using media::MediaPlayerAndroid; 3358537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)using media::MediaPlayerBridge; 3458537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)using media::MediaPlayerManager; 3558537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)using media::MediaSourcePlayer; 365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 37a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)namespace content { 38a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) 395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Threshold on the number of media players per renderer before we start 405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// attempting to release inactive media players. 41a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)const int kMediaPlayerThreshold = 1; 42a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) 43424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)static BrowserMediaPlayerManager::Factory g_factory = NULL; 445f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)static media::MediaUrlInterceptor* media_url_interceptor_ = NULL; 4590dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) 4690dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)// static 47424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)void BrowserMediaPlayerManager::RegisterFactory(Factory factory) { 48424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles) g_factory = factory; 4990dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)} 5090dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) 5190dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)// static 525f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)void BrowserMediaPlayerManager::RegisterMediaUrlInterceptor( 535f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) media::MediaUrlInterceptor* media_url_interceptor) { 545f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) media_url_interceptor_ = media_url_interceptor; 555f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)} 565f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) 575f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)// static 58424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)BrowserMediaPlayerManager* BrowserMediaPlayerManager::Create( 59cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) RenderFrameHost* rfh) { 60424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles) if (g_factory) 61cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) return g_factory(rfh); 62cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) return new BrowserMediaPlayerManager(rfh); 6390dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)} 6490dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) 655d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)ContentViewCoreImpl* BrowserMediaPlayerManager::GetContentViewCore() const { 665d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) return ContentViewCoreImpl::FromWebContents(web_contents()); 675d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)} 685d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 6958537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)MediaPlayerAndroid* BrowserMediaPlayerManager::CreateMediaPlayer( 70f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) const MediaPlayerHostMsg_Initialize_Params& media_player_params, 7158537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) bool hide_url_log, 7258537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) MediaPlayerManager* manager, 734e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) BrowserDemuxerAndroid* demuxer) { 74f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) switch (media_player_params.type) { 7558537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) case MEDIA_PLAYER_TYPE_URL: { 76a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) const std::string user_agent = GetContentClient()->GetUserAgent(); 7758537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) MediaPlayerBridge* media_player_bridge = new MediaPlayerBridge( 78f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) media_player_params.player_id, 79f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) media_player_params.url, 80f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) media_player_params.first_party_for_cookies, 815d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) user_agent, 825d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) hide_url_log, 83a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) manager, 84a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) base::Bind(&BrowserMediaPlayerManager::OnMediaResourcesRequested, 85a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) weak_ptr_factory_.GetWeakPtr()), 86a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) base::Bind(&BrowserMediaPlayerManager::OnMediaResourcesReleased, 87f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) weak_ptr_factory_.GetWeakPtr()), 886e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) media_player_params.frame_url, 896e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) media_player_params.allow_credentials); 90f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) BrowserMediaPlayerManager* browser_media_player_manager = 91f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) static_cast<BrowserMediaPlayerManager*>(manager); 92f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) ContentViewCoreImpl* content_view_core_impl = 93f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) static_cast<ContentViewCoreImpl*>(ContentViewCore::FromWebContents( 94f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) browser_media_player_manager->web_contents_)); 95f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) if (!content_view_core_impl) { 96f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) // May reach here due to prerendering. Don't extract the metadata 97f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) // since it is expensive. 98f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) // TODO(qinmin): extract the metadata once the user decided to load 99f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) // the page. 100f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) browser_media_player_manager->OnMediaMetadataChanged( 101f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) media_player_params.player_id, base::TimeDelta(), 0, 0, false); 102f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) } else if (!content_view_core_impl->ShouldBlockMediaRequest( 103f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) media_player_params.url)) { 104f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) media_player_bridge->Initialize(); 105f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) } 10658537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) return media_player_bridge; 10758537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) } 10858537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) 10958537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) case MEDIA_PLAYER_TYPE_MEDIA_SOURCE: { 11068043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) return new MediaSourcePlayer( 111f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) media_player_params.player_id, 112a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) manager, 113a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) base::Bind(&BrowserMediaPlayerManager::OnMediaResourcesRequested, 114a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) weak_ptr_factory_.GetWeakPtr()), 115a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) base::Bind(&BrowserMediaPlayerManager::OnMediaResourcesReleased, 116a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) weak_ptr_factory_.GetWeakPtr()), 117f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) demuxer->CreateDemuxer(media_player_params.demuxer_client_id), 118f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) media_player_params.frame_url); 11958537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) } 12058537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) } 12158537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) 12258537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) NOTREACHED(); 12358537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) return NULL; 12458537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)} 12558537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) 1267dbb3d5cf0c15f500944d211057644d6a2f37371Ben MurdochBrowserMediaPlayerManager::BrowserMediaPlayerManager( 127cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) RenderFrameHost* render_frame_host) 128cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) : render_frame_host_(render_frame_host), 1292a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) fullscreen_player_id_(-1), 130f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) fullscreen_player_is_released_(false), 131cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) web_contents_(WebContents::FromRenderFrameHost(render_frame_host)), 13268043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) weak_ptr_factory_(this) { 1335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 1345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 135f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)BrowserMediaPlayerManager::~BrowserMediaPlayerManager() { 136f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) // During the tear down process, OnDestroyPlayer() may or may not be called 137f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) // (e.g. the WebContents may be destroyed before the render process). So 138f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) // we cannot DCHECK(players_.empty()) here. Instead, all media players in 139f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) // |players_| will be destroyed here because |player_| is a ScopedVector. 140f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)} 1415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1427dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdochvoid BrowserMediaPlayerManager::FullscreenPlayerPlay() { 143b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles) MediaPlayerAndroid* player = GetFullscreenPlayer(); 1445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (player) { 145f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) if (fullscreen_player_is_released_) { 146f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) video_view_->OpenVideo(); 147f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) fullscreen_player_is_released_ = false; 148f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) } 1495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) player->Start(); 150cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) Send(new MediaPlayerMsg_DidMediaPlayerPlay(RoutingID(), 151cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) fullscreen_player_id_)); 1525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 1535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 1545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1557dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdochvoid BrowserMediaPlayerManager::FullscreenPlayerPause() { 156b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles) MediaPlayerAndroid* player = GetFullscreenPlayer(); 1575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (player) { 158d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) player->Pause(true); 159cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) Send(new MediaPlayerMsg_DidMediaPlayerPause(RoutingID(), 160cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) fullscreen_player_id_)); 1615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 1625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 1635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1647dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdochvoid BrowserMediaPlayerManager::FullscreenPlayerSeek(int msec) { 165b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles) MediaPlayerAndroid* player = GetFullscreenPlayer(); 16668043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) if (player) { 167f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) // TODO(kbalazs): if |fullscreen_player_is_released_| is true 168f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) // at this point, player->GetCurrentTime() will be wrong until 169f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) // FullscreenPlayerPlay (http://crbug.com/322798). 17068043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) OnSeekRequest(fullscreen_player_id_, 17168043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) base::TimeDelta::FromMilliseconds(msec)); 17268043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) } 1735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 1745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1757dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdochvoid BrowserMediaPlayerManager::ExitFullscreen(bool release_media_player) { 176116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch if (WebContentsDelegate* delegate = web_contents_->GetDelegate()) 177116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch delegate->ToggleFullscreenModeForTab(web_contents_, false); 178a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) if (!CommandLine::ForCurrentProcess()->HasSwitch( 179a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) switches::kDisableOverlayFullscreenVideoSubtitle)) { 1805d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) if (RenderWidgetHostViewAndroid* view_android = 1815d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) static_cast<RenderWidgetHostViewAndroid*>( 1825d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) web_contents_->GetRenderWidgetHostView())) { 1835d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) view_android->SetOverlayVideoMode(false); 1845d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) } 1855d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) } 1865d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 187cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) Send( 188cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) new MediaPlayerMsg_DidExitFullscreen(RoutingID(), fullscreen_player_id_)); 189868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) video_view_.reset(); 190868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) MediaPlayerAndroid* player = GetFullscreenPlayer(); 191eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch fullscreen_player_id_ = -1; 1925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!player) 1935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return; 1945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (release_media_player) 1955d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) ReleaseFullscreenPlayer(player); 1965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) else 197868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) player->SetVideoSurface(gfx::ScopedJavaSurface()); 1985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 1995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2007dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdochvoid BrowserMediaPlayerManager::OnTimeUpdate(int player_id, 2017dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch base::TimeDelta current_time) { 202cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) Send( 203cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) new MediaPlayerMsg_MediaTimeUpdate(RoutingID(), player_id, current_time)); 2047d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)} 2057d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) 2067dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdochvoid BrowserMediaPlayerManager::SetVideoSurface( 2077dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch gfx::ScopedJavaSurface surface) { 208b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles) MediaPlayerAndroid* player = GetFullscreenPlayer(); 209a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) if (!player) 210a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) return; 211effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch 212effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch bool empty_surface = surface.IsEmpty(); 213a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) player->SetVideoSurface(surface.Pass()); 214effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch if (empty_surface) 215effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch return; 2165d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 217cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) Send(new MediaPlayerMsg_DidEnterFullscreen(RoutingID(), player->player_id())); 218a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) if (CommandLine::ForCurrentProcess()->HasSwitch( 219a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) switches::kDisableOverlayFullscreenVideoSubtitle)) { 2205d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) return; 2215d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) } 2225d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) if (RenderWidgetHostViewAndroid* view_android = 2235d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) static_cast<RenderWidgetHostViewAndroid*>( 2245d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) web_contents_->GetRenderWidgetHostView())) { 2255d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) view_android->SetOverlayVideoMode(true); 2265d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) } 2275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 2285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2297dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdochvoid BrowserMediaPlayerManager::OnMediaMetadataChanged( 2307d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) int player_id, base::TimeDelta duration, int width, int height, 2317d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) bool success) { 2327d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) Send(new MediaPlayerMsg_MediaMetadataChanged( 233cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) RoutingID(), player_id, duration, width, height, success)); 234f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) if (fullscreen_player_id_ == player_id) 2357d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) video_view_->UpdateMediaMetadata(); 2367d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)} 2375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2387dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdochvoid BrowserMediaPlayerManager::OnPlaybackComplete(int player_id) { 239cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) Send(new MediaPlayerMsg_MediaPlaybackCompleted(RoutingID(), player_id)); 240f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) if (fullscreen_player_id_ == player_id) 2417d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) video_view_->OnPlaybackComplete(); 2427d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)} 2437d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) 2447dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdochvoid BrowserMediaPlayerManager::OnMediaInterrupted(int player_id) { 2457d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) // Tell WebKit that the audio should be paused, then release all resources 246cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) Send(new MediaPlayerMsg_MediaPlayerReleased(RoutingID(), player_id)); 2477d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) OnReleaseResources(player_id); 2487d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)} 2497d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) 2507dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdochvoid BrowserMediaPlayerManager::OnBufferingUpdate( 2517d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) int player_id, int percentage) { 2527d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) Send(new MediaPlayerMsg_MediaBufferingUpdate( 253cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) RoutingID(), player_id, percentage)); 254f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) if (fullscreen_player_id_ == player_id) 2557d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) video_view_->OnBufferingUpdate(percentage); 2567d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)} 2577d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) 25868043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)void BrowserMediaPlayerManager::OnSeekRequest( 25968043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) int player_id, 26068043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) const base::TimeDelta& time_to_seek) { 261cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) Send(new MediaPlayerMsg_SeekRequest(RoutingID(), player_id, time_to_seek)); 262cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)} 263cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) 264cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)void BrowserMediaPlayerManager::PauseVideo() { 265cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) Send(new MediaPlayerMsg_PauseVideo(RoutingID())); 26668043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)} 26768043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) 26868043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)void BrowserMediaPlayerManager::OnSeekComplete( 26968043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) int player_id, 27068043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) const base::TimeDelta& current_time) { 271cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) Send(new MediaPlayerMsg_SeekCompleted(RoutingID(), player_id, current_time)); 2727d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)} 2737d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) 2747dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdochvoid BrowserMediaPlayerManager::OnError(int player_id, int error) { 275cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) Send(new MediaPlayerMsg_MediaError(RoutingID(), player_id, error)); 276f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) if (fullscreen_player_id_ == player_id) 2777d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) video_view_->OnMediaPlayerError(error); 2787d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)} 2797d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) 2807dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdochvoid BrowserMediaPlayerManager::OnVideoSizeChanged( 2817d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) int player_id, int width, int height) { 282cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) Send(new MediaPlayerMsg_MediaVideoSizeChanged(RoutingID(), player_id, 2837d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) width, height)); 284f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) if (fullscreen_player_id_ == player_id) 2857d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) video_view_->OnVideoSizeChanged(width, height); 2867d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)} 2877d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) 2887dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdochmedia::MediaResourceGetter* 2897dbb3d5cf0c15f500944d211057644d6a2f37371Ben MurdochBrowserMediaPlayerManager::GetMediaResourceGetter() { 290c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) if (!media_resource_getter_.get()) { 2911e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) RenderProcessHost* host = web_contents()->GetRenderProcessHost(); 292c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) BrowserContext* context = host->GetBrowserContext(); 293c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) StoragePartition* partition = host->GetStoragePartition(); 29403b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) storage::FileSystemContext* file_system_context = 295c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) partition ? partition->GetFileSystemContext() : NULL; 296010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) // Eventually this needs to be fixed to pass the correct frame rather 297010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) // than just using the main frame. 298c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) media_resource_getter_.reset(new MediaResourceGetterImpl( 299010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) context, 300010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) file_system_context, 301010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) host->GetID(), 302010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) web_contents()->GetMainFrame()->GetRoutingID())); 303c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) } 304c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) return media_resource_getter_.get(); 3055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 3065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3075f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)media::MediaUrlInterceptor* 3085f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)BrowserMediaPlayerManager::GetMediaUrlInterceptor() { 3095f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) return media_url_interceptor_; 3105f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)} 3115f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) 3127dbb3d5cf0c15f500944d211057644d6a2f37371Ben MurdochMediaPlayerAndroid* BrowserMediaPlayerManager::GetFullscreenPlayer() { 3137d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) return GetPlayer(fullscreen_player_id_); 3145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 3155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3167dbb3d5cf0c15f500944d211057644d6a2f37371Ben MurdochMediaPlayerAndroid* BrowserMediaPlayerManager::GetPlayer(int player_id) { 3177d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) for (ScopedVector<MediaPlayerAndroid>::iterator it = players_.begin(); 3187d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) it != players_.end(); ++it) { 3197d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) if ((*it)->player_id() == player_id) 3207d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) return *it; 3217d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) } 3227d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) return NULL; 3237d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)} 3247d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) 3250529e5d033099cbfc42635f6f6183833b09dff6eBen Murdochvoid BrowserMediaPlayerManager::RequestFullScreen(int player_id) { 3267dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch if (fullscreen_player_id_ == player_id) 3277dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch return; 3284e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) 3297dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch if (fullscreen_player_id_ != -1) { 3307dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch // TODO(qinmin): Determine the correct error code we should report to WMPA. 3317dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch OnError(player_id, MediaPlayerAndroid::MEDIA_ERROR_DECODE); 3327dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch return; 3337dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch } 334a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) 335f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) Send(new MediaPlayerMsg_RequestFullscreen(RoutingID(), player_id)); 3367d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)} 3377d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) 3385d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#if defined(VIDEO_HOLE) 339116680a4aac90f2aa7413d9095a592090648e557Ben Murdochbool 340116680a4aac90f2aa7413d9095a592090648e557Ben MurdochBrowserMediaPlayerManager::ShouldUseVideoOverlayForEmbeddedEncryptedVideo() { 341116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch RendererPreferences* prefs = web_contents_->GetMutableRendererPrefs(); 342116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch return prefs->use_video_overlay_for_embedded_encrypted_video; 343116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch} 344116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch 3457dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdochvoid BrowserMediaPlayerManager::AttachExternalVideoSurface(int player_id, 3467dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch jobject surface) { 347b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles) MediaPlayerAndroid* player = GetPlayer(player_id); 3487d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) if (player) { 3497d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) player->SetVideoSurface( 3507d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) gfx::ScopedJavaSurface::AcquireExternalSurface(surface)); 3517d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) } 3525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 3535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3547dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdochvoid BrowserMediaPlayerManager::DetachExternalVideoSurface(int player_id) { 355b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles) MediaPlayerAndroid* player = GetPlayer(player_id); 3565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (player) 3577d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) player->SetVideoSurface(gfx::ScopedJavaSurface()); 3587d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)} 3597d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) 360a02191e04bc25c4935f804f2c080ae28663d096dBen Murdochvoid BrowserMediaPlayerManager::OnFrameInfoUpdated() { 361a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch if (external_video_surface_container_) 362a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch external_video_surface_container_->OnFrameInfoUpdated(); 363a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch} 364a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch 3657dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdochvoid BrowserMediaPlayerManager::OnNotifyExternalSurface( 3667d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) int player_id, bool is_request, const gfx::RectF& rect) { 3677d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) if (!web_contents_) 3687d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) return; 3697d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) 370a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) if (is_request) { 371a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch OnRequestExternalSurface(player_id, rect); 372a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch } 373a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch if (external_video_surface_container_) { 374a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch external_video_surface_container_->OnExternalVideoSurfacePositionChanged( 375a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch player_id, rect); 376a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch } 377a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch} 378a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch 379a02191e04bc25c4935f804f2c080ae28663d096dBen Murdochvoid BrowserMediaPlayerManager::OnRequestExternalSurface( 380a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch int player_id, const gfx::RectF& rect) { 381a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch if (!external_video_surface_container_) { 382a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch ContentBrowserClient* client = GetContentClient()->browser(); 383a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch external_video_surface_container_.reset( 384a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch client->OverrideCreateExternalVideoSurfaceContainer(web_contents_)); 385a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch } 386a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch // It's safe to use base::Unretained(this), because the callbacks will not 387a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch // be called after running ReleaseExternalVideoSurface(). 388a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch if (external_video_surface_container_) { 389a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch external_video_surface_container_->RequestExternalVideoSurface( 390a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) player_id, 391a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) base::Bind(&BrowserMediaPlayerManager::AttachExternalVideoSurface, 392a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) base::Unretained(this)), 393a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) base::Bind(&BrowserMediaPlayerManager::DetachExternalVideoSurface, 394a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) base::Unretained(this))); 395a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) } 3965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 3975d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#endif // defined(VIDEO_HOLE) 3985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3997dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdochvoid BrowserMediaPlayerManager::OnEnterFullscreen(int player_id) { 4005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DCHECK_EQ(fullscreen_player_id_, -1); 401a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)#if defined(VIDEO_HOLE) 402a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch if (external_video_surface_container_) 403a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch external_video_surface_container_->ReleaseExternalVideoSurface(player_id); 404a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)#endif // defined(VIDEO_HOLE) 405868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) if (video_view_.get()) { 406868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) fullscreen_player_id_ = player_id; 407868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) video_view_->OpenVideo(); 4085c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu return; 4095d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) } else if (!ContentVideoView::GetInstance()) { 410868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) // In Android WebView, two ContentViewCores could both try to enter 411868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) // fullscreen video, we just ignore the second one. 4125d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) video_view_.reset(new ContentVideoView(this)); 4135c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu base::android::ScopedJavaLocalRef<jobject> j_content_video_view = 4145c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu video_view_->GetJavaObject(base::android::AttachCurrentThread()); 4155c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu if (!j_content_video_view.is_null()) { 4165c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu fullscreen_player_id_ = player_id; 4175c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu return; 4185c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu } 419868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) } 4205c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu 4215c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu // Force the second video to exit fullscreen. 4225c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu // TODO(qinmin): There is no need to send DidEnterFullscreen message. 4235c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu // However, if we don't send the message, page layers will not be 4245c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu // correctly restored. http:crbug.com/367346. 425cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) Send(new MediaPlayerMsg_DidEnterFullscreen(RoutingID(), player_id)); 426cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) Send(new MediaPlayerMsg_DidExitFullscreen(RoutingID(), player_id)); 4275c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu video_view_.reset(); 4285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 4295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4307dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdochvoid BrowserMediaPlayerManager::OnExitFullscreen(int player_id) { 4315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (fullscreen_player_id_ == player_id) { 432b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles) MediaPlayerAndroid* player = GetPlayer(player_id); 4335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (player) 434868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) player->SetVideoSurface(gfx::ScopedJavaSurface()); 435868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) video_view_->OnExitFullscreen(); 4365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 4375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 4385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4397dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdochvoid BrowserMediaPlayerManager::OnInitialize( 440f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) const MediaPlayerHostMsg_Initialize_Params& media_player_params) { 441f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) DCHECK(media_player_params.type != MEDIA_PLAYER_TYPE_MEDIA_SOURCE || 442f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) media_player_params.demuxer_client_id > 0) 44368043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) << "Media source players must have positive demuxer client IDs: " 444f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) << media_player_params.demuxer_client_id; 44568043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) 446f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) RemovePlayer(media_player_params.player_id); 4477d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) 4481e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) RenderProcessHostImpl* host = static_cast<RenderProcessHostImpl*>( 4491e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) web_contents()->GetRenderProcessHost()); 450e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch MediaPlayerAndroid* player = CreateMediaPlayer( 451f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) media_player_params, 452f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) 45368043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) host->GetBrowserContext()->IsOffTheRecord(), this, 454e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch host->browser_demuxer_android()); 455f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) 456e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch if (!player) 457e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch return; 458e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch 459e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch AddPlayer(player); 4607d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)} 4617d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) 4627dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdochvoid BrowserMediaPlayerManager::OnStart(int player_id) { 4637d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) MediaPlayerAndroid* player = GetPlayer(player_id); 4640529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch if (!player) 4650529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch return; 4660529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch player->Start(); 4670529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch if (fullscreen_player_id_ == player_id && fullscreen_player_is_released_) { 4680529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch video_view_->OpenVideo(); 4690529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch fullscreen_player_is_released_ = false; 4700529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch } 4717d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)} 4727d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) 47368043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)void BrowserMediaPlayerManager::OnSeek( 47468043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) int player_id, 47568043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) const base::TimeDelta& time) { 4767d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) MediaPlayerAndroid* player = GetPlayer(player_id); 4777d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) if (player) 4787d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) player->SeekTo(time); 4797d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)} 4807d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) 481d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)void BrowserMediaPlayerManager::OnPause( 482d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) int player_id, 483d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) bool is_media_related_action) { 4847d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) MediaPlayerAndroid* player = GetPlayer(player_id); 4857d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) if (player) 486d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) player->Pause(is_media_related_action); 4877d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)} 4887d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) 489a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)void BrowserMediaPlayerManager::OnSetVolume(int player_id, double volume) { 490a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) MediaPlayerAndroid* player = GetPlayer(player_id); 491a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) if (player) 492a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) player->SetVolume(volume); 493a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)} 494a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) 4955d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)void BrowserMediaPlayerManager::OnSetPoster(int player_id, const GURL& url) { 4965d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) // To be overridden by subclasses. 4975d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)} 4985d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 4997dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdochvoid BrowserMediaPlayerManager::OnReleaseResources(int player_id) { 500b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles) MediaPlayerAndroid* player = GetPlayer(player_id); 501f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) if (player) 5025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) player->Release(); 503f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) if (player_id == fullscreen_player_id_) 504f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) fullscreen_player_is_released_ = true; 5055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 5065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 5077dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdochvoid BrowserMediaPlayerManager::OnDestroyPlayer(int player_id) { 508868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) RemovePlayer(player_id); 5095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (fullscreen_player_id_ == player_id) 5105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) fullscreen_player_id_ = -1; 5115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 5125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 5137dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdochvoid BrowserMediaPlayerManager::AddPlayer(MediaPlayerAndroid* player) { 514868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) DCHECK(!GetPlayer(player->player_id())); 515868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) players_.push_back(player); 516868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)} 517868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) 5187dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdochvoid BrowserMediaPlayerManager::RemovePlayer(int player_id) { 519868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) for (ScopedVector<MediaPlayerAndroid>::iterator it = players_.begin(); 520868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) it != players_.end(); ++it) { 5218bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) MediaPlayerAndroid* player = *it; 5228bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) if (player->player_id() == player_id) { 523868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) players_.erase(it); 524868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) break; 525868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) } 526868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) } 527868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)} 528868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) 529d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)scoped_ptr<media::MediaPlayerAndroid> BrowserMediaPlayerManager::SwapPlayer( 530d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) int player_id, media::MediaPlayerAndroid* player) { 531d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) media::MediaPlayerAndroid* previous_player = NULL; 532d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) for (ScopedVector<MediaPlayerAndroid>::iterator it = players_.begin(); 533d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) it != players_.end(); ++it) { 534d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) if ((*it)->player_id() == player_id) { 535d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) previous_player = *it; 536d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) players_.weak_erase(it); 537d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) players_.push_back(player); 538d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) break; 539d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) } 540d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) } 541d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) return scoped_ptr<media::MediaPlayerAndroid>(previous_player); 542d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)} 543d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) 544cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)int BrowserMediaPlayerManager::RoutingID() { 545cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) return render_frame_host_->GetRoutingID(); 546cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)} 547cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) 548cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)bool BrowserMediaPlayerManager::Send(IPC::Message* msg) { 549cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) return render_frame_host_->Send(msg); 550eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch} 551eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch 5525d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)void BrowserMediaPlayerManager::ReleaseFullscreenPlayer( 5535d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) MediaPlayerAndroid* player) { 5545d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) player->Release(); 5555d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)} 5565d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 557a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)void BrowserMediaPlayerManager::OnMediaResourcesRequested(int player_id) { 558a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) int num_active_player = 0; 559a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) ScopedVector<MediaPlayerAndroid>::iterator it; 560a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) for (it = players_.begin(); it != players_.end(); ++it) { 561a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) if (!(*it)->IsPlayerReady()) 562a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) continue; 563a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) 564a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) // The player is already active, ignore it. 565a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) if ((*it)->player_id() == player_id) 566a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) return; 567a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) else 568a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) num_active_player++; 569a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) } 570a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) 571a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) // Number of active players are less than the threshold, do nothing. 572a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) if (num_active_player < kMediaPlayerThreshold) 573a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) return; 574a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) 575a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) for (it = players_.begin(); it != players_.end(); ++it) { 576a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) if ((*it)->IsPlayerReady() && !(*it)->IsPlaying() && 577a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) fullscreen_player_id_ != (*it)->player_id()) { 578a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) (*it)->Release(); 579cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) Send(new MediaPlayerMsg_MediaPlayerReleased(RoutingID(), 580cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) (*it)->player_id())); 581a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) } 582a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) } 583a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)} 584a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) 585a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)void BrowserMediaPlayerManager::OnMediaResourcesReleased(int player_id) { 586a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)#if defined(VIDEO_HOLE) 587a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) MediaPlayerAndroid* player = GetPlayer(player_id); 588a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) if (player && player->IsSurfaceInUse()) 589a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) return; 590a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch if (external_video_surface_container_) 591a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch external_video_surface_container_->ReleaseExternalVideoSurface(player_id); 592a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)#endif // defined(VIDEO_HOLE) 593a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)} 594a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) 5955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} // namespace content 596