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" 29929504d64b38e05de7355e162311d6791ad6f54dBo Liu#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; 44929504d64b38e05de7355e162311d6791ad6f54dBo Liustatic 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 52929504d64b38e05de7355e162311d6791ad6f54dBo Liuvoid BrowserMediaPlayerManager::RegisterMediaUrlInterceptor( 53929504d64b38e05de7355e162311d6791ad6f54dBo Liu media::MediaUrlInterceptor* media_url_interceptor) { 54929504d64b38e05de7355e162311d6791ad6f54dBo Liu media_url_interceptor_ = media_url_interceptor; 55929504d64b38e05de7355e162311d6791ad6f54dBo Liu} 56929504d64b38e05de7355e162311d6791ad6f54dBo Liu 57929504d64b38e05de7355e162311d6791ad6f54dBo Liu// 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()), 88929504d64b38e05de7355e162311d6791ad6f54dBo Liu media_player_params.frame_url, 89929504d64b38e05de7355e162311d6791ad6f54dBo Liu 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) { 1767396bf7ba15cf923c112ff260fa26b47ed469c88qinmin@chromium.org if (WebContentsDelegate* delegate = web_contents_->GetDelegate()) 1777396bf7ba15cf923c112ff260fa26b47ed469c88qinmin@chromium.org 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(); 294c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) fileapi::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) 307929504d64b38e05de7355e162311d6791ad6f54dBo Liumedia::MediaUrlInterceptor* 308929504d64b38e05de7355e162311d6791ad6f54dBo LiuBrowserMediaPlayerManager::GetMediaUrlInterceptor() { 309929504d64b38e05de7355e162311d6791ad6f54dBo Liu return media_url_interceptor_; 310929504d64b38e05de7355e162311d6791ad6f54dBo Liu} 311929504d64b38e05de7355e162311d6791ad6f54dBo Liu 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) 339bee9932bab44713b74b422b4b759b49f5a222977Bo Liubool 340bee9932bab44713b74b422b4b759b49f5a222977Bo LiuBrowserMediaPlayerManager::ShouldUseVideoOverlayForEmbeddedEncryptedVideo() { 341bee9932bab44713b74b422b4b759b49f5a222977Bo Liu RendererPreferences* prefs = web_contents_->GetMutableRendererPrefs(); 342bee9932bab44713b74b422b4b759b49f5a222977Bo Liu return prefs->use_video_overlay_for_embedded_encrypted_video; 343bee9932bab44713b74b422b4b759b49f5a222977Bo Liu} 344bee9932bab44713b74b422b4b759b49f5a222977Bo Liu 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()) { 410929504d64b38e05de7355e162311d6791ad6f54dBo Liu if (!GetPlayer(player_id)) { 411929504d64b38e05de7355e162311d6791ad6f54dBo Liu // If a player doesn't exist, it must be waiting for CORS check. 412929504d64b38e05de7355e162311d6791ad6f54dBo Liu // As a result, just request the tab to enter fullscreen mode without 413929504d64b38e05de7355e162311d6791ad6f54dBo Liu // creating the surface view. This is only needed for M37. 414929504d64b38e05de7355e162311d6791ad6f54dBo Liu Send(new MediaPlayerMsg_DidEnterFullscreen(RoutingID(), player_id)); 415929504d64b38e05de7355e162311d6791ad6f54dBo Liu if (CommandLine::ForCurrentProcess()->HasSwitch( 416929504d64b38e05de7355e162311d6791ad6f54dBo Liu switches::kDisableOverlayFullscreenVideoSubtitle)) { 417929504d64b38e05de7355e162311d6791ad6f54dBo Liu return; 418929504d64b38e05de7355e162311d6791ad6f54dBo Liu } 419929504d64b38e05de7355e162311d6791ad6f54dBo Liu if (RenderWidgetHostViewAndroid* view_android = 420929504d64b38e05de7355e162311d6791ad6f54dBo Liu static_cast<RenderWidgetHostViewAndroid*>( 421929504d64b38e05de7355e162311d6791ad6f54dBo Liu web_contents_->GetRenderWidgetHostView())) { 422929504d64b38e05de7355e162311d6791ad6f54dBo Liu view_android->SetOverlayVideoMode(true); 423929504d64b38e05de7355e162311d6791ad6f54dBo Liu } 424929504d64b38e05de7355e162311d6791ad6f54dBo Liu if (WebContentsDelegate* delegate = web_contents_->GetDelegate()) 425929504d64b38e05de7355e162311d6791ad6f54dBo Liu delegate->ToggleFullscreenModeForTab(web_contents_, true); 426929504d64b38e05de7355e162311d6791ad6f54dBo Liu } 427929504d64b38e05de7355e162311d6791ad6f54dBo Liu 428868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) // In Android WebView, two ContentViewCores could both try to enter 429868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) // fullscreen video, we just ignore the second one. 4305d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) video_view_.reset(new ContentVideoView(this)); 4315c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu base::android::ScopedJavaLocalRef<jobject> j_content_video_view = 4325c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu video_view_->GetJavaObject(base::android::AttachCurrentThread()); 4335c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu if (!j_content_video_view.is_null()) { 4345c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu fullscreen_player_id_ = player_id; 4355c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu return; 4365c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu } 437868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) } 4385c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu 4395c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu // Force the second video to exit fullscreen. 4405c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu // TODO(qinmin): There is no need to send DidEnterFullscreen message. 4415c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu // However, if we don't send the message, page layers will not be 4425c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu // correctly restored. http:crbug.com/367346. 443cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) Send(new MediaPlayerMsg_DidEnterFullscreen(RoutingID(), player_id)); 444cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) Send(new MediaPlayerMsg_DidExitFullscreen(RoutingID(), player_id)); 4455c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu video_view_.reset(); 4465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 4475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4487dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdochvoid BrowserMediaPlayerManager::OnExitFullscreen(int player_id) { 4495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (fullscreen_player_id_ == player_id) { 450b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles) MediaPlayerAndroid* player = GetPlayer(player_id); 4515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (player) 452868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) player->SetVideoSurface(gfx::ScopedJavaSurface()); 453868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) video_view_->OnExitFullscreen(); 4545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 4555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 4565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4577dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdochvoid BrowserMediaPlayerManager::OnInitialize( 458f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) const MediaPlayerHostMsg_Initialize_Params& media_player_params) { 459f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) DCHECK(media_player_params.type != MEDIA_PLAYER_TYPE_MEDIA_SOURCE || 460f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) media_player_params.demuxer_client_id > 0) 46168043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) << "Media source players must have positive demuxer client IDs: " 462f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) << media_player_params.demuxer_client_id; 46368043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) 464f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) RemovePlayer(media_player_params.player_id); 4657d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) 4661e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) RenderProcessHostImpl* host = static_cast<RenderProcessHostImpl*>( 4671e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) web_contents()->GetRenderProcessHost()); 468e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch MediaPlayerAndroid* player = CreateMediaPlayer( 469f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) media_player_params, 470f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) 47168043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) host->GetBrowserContext()->IsOffTheRecord(), this, 472e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch host->browser_demuxer_android()); 473f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) 474e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch if (!player) 475e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch return; 476e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch 477e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch AddPlayer(player); 4787d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)} 4797d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) 4807dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdochvoid BrowserMediaPlayerManager::OnStart(int player_id) { 4817d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) MediaPlayerAndroid* player = GetPlayer(player_id); 4820529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch if (!player) 4830529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch return; 4840529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch player->Start(); 4850529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch if (fullscreen_player_id_ == player_id && fullscreen_player_is_released_) { 4860529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch video_view_->OpenVideo(); 4870529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch fullscreen_player_is_released_ = false; 4880529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch } 4897d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)} 4907d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) 49168043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)void BrowserMediaPlayerManager::OnSeek( 49268043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) int player_id, 49368043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) const base::TimeDelta& time) { 4947d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) MediaPlayerAndroid* player = GetPlayer(player_id); 4957d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) if (player) 4967d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) player->SeekTo(time); 4977d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)} 4987d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) 499d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)void BrowserMediaPlayerManager::OnPause( 500d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) int player_id, 501d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) bool is_media_related_action) { 5027d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) MediaPlayerAndroid* player = GetPlayer(player_id); 5037d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) if (player) 504d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) player->Pause(is_media_related_action); 5057d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)} 5067d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) 507a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)void BrowserMediaPlayerManager::OnSetVolume(int player_id, double volume) { 508a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) MediaPlayerAndroid* player = GetPlayer(player_id); 509a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) if (player) 510a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) player->SetVolume(volume); 511a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)} 512a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) 5135d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)void BrowserMediaPlayerManager::OnSetPoster(int player_id, const GURL& url) { 5145d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) // To be overridden by subclasses. 5155d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)} 5165d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 5177dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdochvoid BrowserMediaPlayerManager::OnReleaseResources(int player_id) { 518b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles) MediaPlayerAndroid* player = GetPlayer(player_id); 519f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) if (player) 5205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) player->Release(); 521f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) if (player_id == fullscreen_player_id_) 522f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) fullscreen_player_is_released_ = true; 5235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 5245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 5257dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdochvoid BrowserMediaPlayerManager::OnDestroyPlayer(int player_id) { 526868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) RemovePlayer(player_id); 5275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (fullscreen_player_id_ == player_id) 5285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) fullscreen_player_id_ = -1; 5295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 5305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 5317dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdochvoid BrowserMediaPlayerManager::AddPlayer(MediaPlayerAndroid* player) { 532868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) DCHECK(!GetPlayer(player->player_id())); 533868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) players_.push_back(player); 534868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)} 535868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) 5367dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdochvoid BrowserMediaPlayerManager::RemovePlayer(int player_id) { 537868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) for (ScopedVector<MediaPlayerAndroid>::iterator it = players_.begin(); 538868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) it != players_.end(); ++it) { 5398bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) MediaPlayerAndroid* player = *it; 5408bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) if (player->player_id() == player_id) { 541868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) players_.erase(it); 542868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) break; 543868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) } 544868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) } 545868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)} 546868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) 547d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)scoped_ptr<media::MediaPlayerAndroid> BrowserMediaPlayerManager::SwapPlayer( 548d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) int player_id, media::MediaPlayerAndroid* player) { 549d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) media::MediaPlayerAndroid* previous_player = NULL; 550d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) for (ScopedVector<MediaPlayerAndroid>::iterator it = players_.begin(); 551d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) it != players_.end(); ++it) { 552d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) if ((*it)->player_id() == player_id) { 553d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) previous_player = *it; 554d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) players_.weak_erase(it); 555d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) players_.push_back(player); 556d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) break; 557d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) } 558d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) } 559d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) return scoped_ptr<media::MediaPlayerAndroid>(previous_player); 560d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)} 561d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) 562cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)int BrowserMediaPlayerManager::RoutingID() { 563cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) return render_frame_host_->GetRoutingID(); 564cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)} 565cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) 566cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)bool BrowserMediaPlayerManager::Send(IPC::Message* msg) { 567cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) return render_frame_host_->Send(msg); 568eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch} 569eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch 5705d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)void BrowserMediaPlayerManager::ReleaseFullscreenPlayer( 5715d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) MediaPlayerAndroid* player) { 5725d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) player->Release(); 5735d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)} 5745d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 575a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)void BrowserMediaPlayerManager::OnMediaResourcesRequested(int player_id) { 576a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) int num_active_player = 0; 577a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) ScopedVector<MediaPlayerAndroid>::iterator it; 578a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) for (it = players_.begin(); it != players_.end(); ++it) { 579a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) if (!(*it)->IsPlayerReady()) 580a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) continue; 581a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) 582a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) // The player is already active, ignore it. 583a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) if ((*it)->player_id() == player_id) 584a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) return; 585a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) else 586a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) num_active_player++; 587a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) } 588a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) 589a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) // Number of active players are less than the threshold, do nothing. 590a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) if (num_active_player < kMediaPlayerThreshold) 591a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) return; 592a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) 593a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) for (it = players_.begin(); it != players_.end(); ++it) { 594a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) if ((*it)->IsPlayerReady() && !(*it)->IsPlaying() && 595a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) fullscreen_player_id_ != (*it)->player_id()) { 596a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) (*it)->Release(); 597cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) Send(new MediaPlayerMsg_MediaPlayerReleased(RoutingID(), 598cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) (*it)->player_id())); 599a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) } 600a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) } 601a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)} 602a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) 603a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)void BrowserMediaPlayerManager::OnMediaResourcesReleased(int player_id) { 604a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)#if defined(VIDEO_HOLE) 605a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) MediaPlayerAndroid* player = GetPlayer(player_id); 606a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) if (player && player->IsSurfaceInUse()) 607a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) return; 608a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch if (external_video_surface_container_) 609a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch external_video_surface_container_->ReleaseExternalVideoSurface(player_id); 610a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)#endif // defined(VIDEO_HOLE) 611a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)} 612a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) 6135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} // namespace content 614