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()), 866e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) media_player_params.frame_url, 876e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) media_player_params.allow_credentials); 88f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) BrowserMediaPlayerManager* browser_media_player_manager = 89f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) static_cast<BrowserMediaPlayerManager*>(manager); 90f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) ContentViewCoreImpl* content_view_core_impl = 91f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) static_cast<ContentViewCoreImpl*>(ContentViewCore::FromWebContents( 92f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) browser_media_player_manager->web_contents_)); 93f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) if (!content_view_core_impl) { 94f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) // May reach here due to prerendering. Don't extract the metadata 95f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) // since it is expensive. 96f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) // TODO(qinmin): extract the metadata once the user decided to load 97f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) // the page. 98f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) browser_media_player_manager->OnMediaMetadataChanged( 99f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) media_player_params.player_id, base::TimeDelta(), 0, 0, false); 100f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) } else if (!content_view_core_impl->ShouldBlockMediaRequest( 101f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) media_player_params.url)) { 102f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) media_player_bridge->Initialize(); 103f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) } 10458537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) return media_player_bridge; 10558537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) } 10658537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) 10758537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) case MEDIA_PLAYER_TYPE_MEDIA_SOURCE: { 10868043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) return new MediaSourcePlayer( 109f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) media_player_params.player_id, 110a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) manager, 111a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) base::Bind(&BrowserMediaPlayerManager::OnMediaResourcesRequested, 112a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) weak_ptr_factory_.GetWeakPtr()), 113f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) demuxer->CreateDemuxer(media_player_params.demuxer_client_id), 114f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) media_player_params.frame_url); 11558537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) } 11658537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) } 11758537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) 11858537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) NOTREACHED(); 11958537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) return NULL; 12058537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)} 12158537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) 1227dbb3d5cf0c15f500944d211057644d6a2f37371Ben MurdochBrowserMediaPlayerManager::BrowserMediaPlayerManager( 123cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) RenderFrameHost* render_frame_host) 124cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) : render_frame_host_(render_frame_host), 1252a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) fullscreen_player_id_(-1), 126f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) fullscreen_player_is_released_(false), 127cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) web_contents_(WebContents::FromRenderFrameHost(render_frame_host)), 12868043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) weak_ptr_factory_(this) { 1295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 1305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 131f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)BrowserMediaPlayerManager::~BrowserMediaPlayerManager() { 132f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) // During the tear down process, OnDestroyPlayer() may or may not be called 133f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) // (e.g. the WebContents may be destroyed before the render process). So 134f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) // we cannot DCHECK(players_.empty()) here. Instead, all media players in 135f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) // |players_| will be destroyed here because |player_| is a ScopedVector. 136f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)} 1375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1387dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdochvoid BrowserMediaPlayerManager::FullscreenPlayerPlay() { 139b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles) MediaPlayerAndroid* player = GetFullscreenPlayer(); 1405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (player) { 141f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) if (fullscreen_player_is_released_) { 142f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) video_view_->OpenVideo(); 143f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) fullscreen_player_is_released_ = false; 144f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) } 1455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) player->Start(); 146cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) Send(new MediaPlayerMsg_DidMediaPlayerPlay(RoutingID(), 147cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) fullscreen_player_id_)); 1485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 1495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 1505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1517dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdochvoid BrowserMediaPlayerManager::FullscreenPlayerPause() { 152b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles) MediaPlayerAndroid* player = GetFullscreenPlayer(); 1535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (player) { 154d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) player->Pause(true); 155cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) Send(new MediaPlayerMsg_DidMediaPlayerPause(RoutingID(), 156cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) fullscreen_player_id_)); 1575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 1585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 1595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1607dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdochvoid BrowserMediaPlayerManager::FullscreenPlayerSeek(int msec) { 161b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles) MediaPlayerAndroid* player = GetFullscreenPlayer(); 16268043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) if (player) { 163f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) // TODO(kbalazs): if |fullscreen_player_is_released_| is true 164f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) // at this point, player->GetCurrentTime() will be wrong until 165f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) // FullscreenPlayerPlay (http://crbug.com/322798). 16668043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) OnSeekRequest(fullscreen_player_id_, 16768043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) base::TimeDelta::FromMilliseconds(msec)); 16868043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) } 1695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 1705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1717dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdochvoid BrowserMediaPlayerManager::ExitFullscreen(bool release_media_player) { 172116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch if (WebContentsDelegate* delegate = web_contents_->GetDelegate()) 173116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch delegate->ToggleFullscreenModeForTab(web_contents_, false); 1741320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci if (RenderWidgetHostViewAndroid* view_android = 1751320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci static_cast<RenderWidgetHostViewAndroid*>( 1761320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci web_contents_->GetRenderWidgetHostView())) { 1771320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci view_android->SetOverlayVideoMode(false); 1785d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) } 1795d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 180cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) Send( 181cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) new MediaPlayerMsg_DidExitFullscreen(RoutingID(), fullscreen_player_id_)); 182868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) video_view_.reset(); 183868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) MediaPlayerAndroid* player = GetFullscreenPlayer(); 184eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch fullscreen_player_id_ = -1; 1855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!player) 1865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return; 1875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (release_media_player) 1885d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) ReleaseFullscreenPlayer(player); 1895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) else 190868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) player->SetVideoSurface(gfx::ScopedJavaSurface()); 1915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 1925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1931320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tuccivoid BrowserMediaPlayerManager::OnTimeUpdate( 1941320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci int player_id, 1951320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci base::TimeDelta current_timestamp, 1961320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci base::TimeTicks current_time_ticks) { 1971320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci Send(new MediaPlayerMsg_MediaTimeUpdate( 1981320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci RoutingID(), player_id, current_timestamp, current_time_ticks)); 1997d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)} 2007d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) 2017dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdochvoid BrowserMediaPlayerManager::SetVideoSurface( 2027dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch gfx::ScopedJavaSurface surface) { 203b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles) MediaPlayerAndroid* player = GetFullscreenPlayer(); 204a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) if (!player) 205a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) return; 206effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch 207effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch bool empty_surface = surface.IsEmpty(); 208a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) player->SetVideoSurface(surface.Pass()); 209effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch if (empty_surface) 210effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch return; 2115d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 212cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) Send(new MediaPlayerMsg_DidEnterFullscreen(RoutingID(), player->player_id())); 2135d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) if (RenderWidgetHostViewAndroid* view_android = 2145d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) static_cast<RenderWidgetHostViewAndroid*>( 2155d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) web_contents_->GetRenderWidgetHostView())) { 2165d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) view_android->SetOverlayVideoMode(true); 2175d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) } 2185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 2195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2207dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdochvoid BrowserMediaPlayerManager::OnMediaMetadataChanged( 2217d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) int player_id, base::TimeDelta duration, int width, int height, 2227d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) bool success) { 2237d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) Send(new MediaPlayerMsg_MediaMetadataChanged( 224cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) RoutingID(), player_id, duration, width, height, success)); 225f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) if (fullscreen_player_id_ == player_id) 2267d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) video_view_->UpdateMediaMetadata(); 2277d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)} 2285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2297dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdochvoid BrowserMediaPlayerManager::OnPlaybackComplete(int player_id) { 230cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) Send(new MediaPlayerMsg_MediaPlaybackCompleted(RoutingID(), player_id)); 231f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) if (fullscreen_player_id_ == player_id) 2327d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) video_view_->OnPlaybackComplete(); 2337d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)} 2347d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) 2357dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdochvoid BrowserMediaPlayerManager::OnMediaInterrupted(int player_id) { 2367d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) // Tell WebKit that the audio should be paused, then release all resources 237cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) Send(new MediaPlayerMsg_MediaPlayerReleased(RoutingID(), player_id)); 2387d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) OnReleaseResources(player_id); 2397d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)} 2407d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) 2417dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdochvoid BrowserMediaPlayerManager::OnBufferingUpdate( 2427d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) int player_id, int percentage) { 2437d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) Send(new MediaPlayerMsg_MediaBufferingUpdate( 244cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) RoutingID(), player_id, percentage)); 245f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) if (fullscreen_player_id_ == player_id) 2467d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) video_view_->OnBufferingUpdate(percentage); 2477d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)} 2487d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) 24968043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)void BrowserMediaPlayerManager::OnSeekRequest( 25068043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) int player_id, 25168043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) const base::TimeDelta& time_to_seek) { 252cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) Send(new MediaPlayerMsg_SeekRequest(RoutingID(), player_id, time_to_seek)); 253cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)} 254cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) 2551320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tuccivoid BrowserMediaPlayerManager::ReleaseAllMediaPlayers() { 2561320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci for (ScopedVector<MediaPlayerAndroid>::iterator it = players_.begin(); 2571320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci it != players_.end(); ++it) { 2581320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci if ((*it)->player_id() == fullscreen_player_id_) 2591320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci fullscreen_player_is_released_ = true; 2601320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci (*it)->Release(); 2611320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci } 26268043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)} 26368043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) 26468043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)void BrowserMediaPlayerManager::OnSeekComplete( 26568043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) int player_id, 26668043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) const base::TimeDelta& current_time) { 267cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) Send(new MediaPlayerMsg_SeekCompleted(RoutingID(), player_id, current_time)); 2687d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)} 2697d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) 2707dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdochvoid BrowserMediaPlayerManager::OnError(int player_id, int error) { 271cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) Send(new MediaPlayerMsg_MediaError(RoutingID(), player_id, error)); 272f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) if (fullscreen_player_id_ == player_id) 2737d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) video_view_->OnMediaPlayerError(error); 2747d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)} 2757d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) 2767dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdochvoid BrowserMediaPlayerManager::OnVideoSizeChanged( 2777d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) int player_id, int width, int height) { 278cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) Send(new MediaPlayerMsg_MediaVideoSizeChanged(RoutingID(), player_id, 2797d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) width, height)); 280f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) if (fullscreen_player_id_ == player_id) 2817d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) video_view_->OnVideoSizeChanged(width, height); 2827d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)} 2837d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) 2847dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdochmedia::MediaResourceGetter* 2857dbb3d5cf0c15f500944d211057644d6a2f37371Ben MurdochBrowserMediaPlayerManager::GetMediaResourceGetter() { 286c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) if (!media_resource_getter_.get()) { 2871e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) RenderProcessHost* host = web_contents()->GetRenderProcessHost(); 288c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) BrowserContext* context = host->GetBrowserContext(); 289c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) StoragePartition* partition = host->GetStoragePartition(); 29003b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) storage::FileSystemContext* file_system_context = 291c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) partition ? partition->GetFileSystemContext() : NULL; 292010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) // Eventually this needs to be fixed to pass the correct frame rather 293010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) // than just using the main frame. 294c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) media_resource_getter_.reset(new MediaResourceGetterImpl( 295010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) context, 296010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) file_system_context, 297010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) host->GetID(), 298010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) web_contents()->GetMainFrame()->GetRoutingID())); 299c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) } 300c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) return media_resource_getter_.get(); 3015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 3025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3035f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)media::MediaUrlInterceptor* 3045f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)BrowserMediaPlayerManager::GetMediaUrlInterceptor() { 3055f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) return media_url_interceptor_; 3065f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)} 3075f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) 3087dbb3d5cf0c15f500944d211057644d6a2f37371Ben MurdochMediaPlayerAndroid* BrowserMediaPlayerManager::GetFullscreenPlayer() { 3097d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) return GetPlayer(fullscreen_player_id_); 3105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 3115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3127dbb3d5cf0c15f500944d211057644d6a2f37371Ben MurdochMediaPlayerAndroid* BrowserMediaPlayerManager::GetPlayer(int player_id) { 3137d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) for (ScopedVector<MediaPlayerAndroid>::iterator it = players_.begin(); 3147d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) it != players_.end(); ++it) { 3157d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) if ((*it)->player_id() == player_id) 3167d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) return *it; 3177d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) } 3187d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) return NULL; 3197d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)} 3207d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) 3210529e5d033099cbfc42635f6f6183833b09dff6eBen Murdochvoid BrowserMediaPlayerManager::RequestFullScreen(int player_id) { 3227dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch if (fullscreen_player_id_ == player_id) 3237dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch return; 3244e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) 3257dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch if (fullscreen_player_id_ != -1) { 3267dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch // TODO(qinmin): Determine the correct error code we should report to WMPA. 3277dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch OnError(player_id, MediaPlayerAndroid::MEDIA_ERROR_DECODE); 3287dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch return; 3297dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch } 330a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) 331f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) Send(new MediaPlayerMsg_RequestFullscreen(RoutingID(), player_id)); 3327d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)} 3337d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) 3345d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#if defined(VIDEO_HOLE) 335116680a4aac90f2aa7413d9095a592090648e557Ben Murdochbool 336116680a4aac90f2aa7413d9095a592090648e557Ben MurdochBrowserMediaPlayerManager::ShouldUseVideoOverlayForEmbeddedEncryptedVideo() { 337116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch RendererPreferences* prefs = web_contents_->GetMutableRendererPrefs(); 338116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch return prefs->use_video_overlay_for_embedded_encrypted_video; 339116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch} 340116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch 3417dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdochvoid BrowserMediaPlayerManager::AttachExternalVideoSurface(int player_id, 3427dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch jobject surface) { 343b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles) MediaPlayerAndroid* player = GetPlayer(player_id); 3447d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) if (player) { 3457d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) player->SetVideoSurface( 3467d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) gfx::ScopedJavaSurface::AcquireExternalSurface(surface)); 3477d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) } 3485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 3495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3507dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdochvoid BrowserMediaPlayerManager::DetachExternalVideoSurface(int player_id) { 351b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles) MediaPlayerAndroid* player = GetPlayer(player_id); 3525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (player) 3537d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) player->SetVideoSurface(gfx::ScopedJavaSurface()); 3547d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)} 3557d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) 356a02191e04bc25c4935f804f2c080ae28663d096dBen Murdochvoid BrowserMediaPlayerManager::OnFrameInfoUpdated() { 357a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch if (external_video_surface_container_) 358a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch external_video_surface_container_->OnFrameInfoUpdated(); 359a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch} 360a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch 3617dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdochvoid BrowserMediaPlayerManager::OnNotifyExternalSurface( 3627d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) int player_id, bool is_request, const gfx::RectF& rect) { 3637d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) if (!web_contents_) 3647d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) return; 3657d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) 366a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) if (is_request) { 367a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch OnRequestExternalSurface(player_id, rect); 368a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch } 369a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch if (external_video_surface_container_) { 370a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch external_video_surface_container_->OnExternalVideoSurfacePositionChanged( 371a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch player_id, rect); 372a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch } 373a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch} 374a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch 375a02191e04bc25c4935f804f2c080ae28663d096dBen Murdochvoid BrowserMediaPlayerManager::OnRequestExternalSurface( 376a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch int player_id, const gfx::RectF& rect) { 377a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch if (!external_video_surface_container_) { 378a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch ContentBrowserClient* client = GetContentClient()->browser(); 379a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch external_video_surface_container_.reset( 380a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch client->OverrideCreateExternalVideoSurfaceContainer(web_contents_)); 381a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch } 382a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch // It's safe to use base::Unretained(this), because the callbacks will not 383a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch // be called after running ReleaseExternalVideoSurface(). 384a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch if (external_video_surface_container_) { 385a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch external_video_surface_container_->RequestExternalVideoSurface( 386a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) player_id, 387a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) base::Bind(&BrowserMediaPlayerManager::AttachExternalVideoSurface, 388a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) base::Unretained(this)), 389a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) base::Bind(&BrowserMediaPlayerManager::DetachExternalVideoSurface, 390a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) base::Unretained(this))); 391a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) } 3925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 3935d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#endif // defined(VIDEO_HOLE) 3945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3957dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdochvoid BrowserMediaPlayerManager::OnEnterFullscreen(int player_id) { 3965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DCHECK_EQ(fullscreen_player_id_, -1); 397a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)#if defined(VIDEO_HOLE) 398a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch if (external_video_surface_container_) 399a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch external_video_surface_container_->ReleaseExternalVideoSurface(player_id); 400a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)#endif // defined(VIDEO_HOLE) 401868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) if (video_view_.get()) { 402868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) fullscreen_player_id_ = player_id; 403868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) video_view_->OpenVideo(); 4045c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu return; 4055d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) } else if (!ContentVideoView::GetInstance()) { 406868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) // In Android WebView, two ContentViewCores could both try to enter 407868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) // fullscreen video, we just ignore the second one. 4085d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) video_view_.reset(new ContentVideoView(this)); 4095c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu base::android::ScopedJavaLocalRef<jobject> j_content_video_view = 4105c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu video_view_->GetJavaObject(base::android::AttachCurrentThread()); 4115c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu if (!j_content_video_view.is_null()) { 4125c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu fullscreen_player_id_ = player_id; 4135c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu return; 4145c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu } 415868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) } 4165c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu 4175c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu // Force the second video to exit fullscreen. 4185c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu // TODO(qinmin): There is no need to send DidEnterFullscreen message. 4195c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu // However, if we don't send the message, page layers will not be 4205c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu // correctly restored. http:crbug.com/367346. 421cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) Send(new MediaPlayerMsg_DidEnterFullscreen(RoutingID(), player_id)); 422cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) Send(new MediaPlayerMsg_DidExitFullscreen(RoutingID(), player_id)); 4235c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu video_view_.reset(); 4245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 4255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4267dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdochvoid BrowserMediaPlayerManager::OnExitFullscreen(int player_id) { 4275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (fullscreen_player_id_ == player_id) { 428b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles) MediaPlayerAndroid* player = GetPlayer(player_id); 4295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (player) 430868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) player->SetVideoSurface(gfx::ScopedJavaSurface()); 431868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) video_view_->OnExitFullscreen(); 4325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 4335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 4345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4357dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdochvoid BrowserMediaPlayerManager::OnInitialize( 436f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) const MediaPlayerHostMsg_Initialize_Params& media_player_params) { 437f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) DCHECK(media_player_params.type != MEDIA_PLAYER_TYPE_MEDIA_SOURCE || 438f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) media_player_params.demuxer_client_id > 0) 43968043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) << "Media source players must have positive demuxer client IDs: " 440f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) << media_player_params.demuxer_client_id; 44168043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) 442f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) RemovePlayer(media_player_params.player_id); 4437d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) 4441e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) RenderProcessHostImpl* host = static_cast<RenderProcessHostImpl*>( 4451e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) web_contents()->GetRenderProcessHost()); 446e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch MediaPlayerAndroid* player = CreateMediaPlayer( 447f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) media_player_params, 448f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) 44968043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) host->GetBrowserContext()->IsOffTheRecord(), this, 450e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch host->browser_demuxer_android()); 451f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) 452e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch if (!player) 453e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch return; 454e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch 455e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch AddPlayer(player); 4567d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)} 4577d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) 4587dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdochvoid BrowserMediaPlayerManager::OnStart(int player_id) { 4597d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) MediaPlayerAndroid* player = GetPlayer(player_id); 4600529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch if (!player) 4610529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch return; 4620529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch player->Start(); 4630529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch if (fullscreen_player_id_ == player_id && fullscreen_player_is_released_) { 4640529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch video_view_->OpenVideo(); 4650529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch fullscreen_player_is_released_ = false; 4660529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch } 4677d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)} 4687d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) 46968043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)void BrowserMediaPlayerManager::OnSeek( 47068043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) int player_id, 47168043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) const base::TimeDelta& time) { 4727d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) MediaPlayerAndroid* player = GetPlayer(player_id); 4737d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) if (player) 4747d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) player->SeekTo(time); 4757d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)} 4767d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) 477d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)void BrowserMediaPlayerManager::OnPause( 478d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) int player_id, 479d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) bool is_media_related_action) { 4807d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) MediaPlayerAndroid* player = GetPlayer(player_id); 4817d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) if (player) 482d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) player->Pause(is_media_related_action); 4837d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)} 4847d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) 485a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)void BrowserMediaPlayerManager::OnSetVolume(int player_id, double volume) { 486a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) MediaPlayerAndroid* player = GetPlayer(player_id); 487a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) if (player) 488a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) player->SetVolume(volume); 489a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)} 490a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) 4915d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)void BrowserMediaPlayerManager::OnSetPoster(int player_id, const GURL& url) { 4925d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) // To be overridden by subclasses. 4935d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)} 4945d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 4957dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdochvoid BrowserMediaPlayerManager::OnReleaseResources(int player_id) { 496b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles) MediaPlayerAndroid* player = GetPlayer(player_id); 497f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) if (player) 4981320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci ReleasePlayer(player); 499f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) if (player_id == fullscreen_player_id_) 500f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) fullscreen_player_is_released_ = true; 5015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 5025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 5037dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdochvoid BrowserMediaPlayerManager::OnDestroyPlayer(int player_id) { 504868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) RemovePlayer(player_id); 5055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (fullscreen_player_id_ == player_id) 5065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) fullscreen_player_id_ = -1; 5075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 5085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 5091320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tuccivoid BrowserMediaPlayerManager::OnRequestRemotePlayback(int /* player_id */) { 5101320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci // Does nothing if we don't have a remote player 5111320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci} 5121320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci 5131320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tuccivoid BrowserMediaPlayerManager::OnRequestRemotePlaybackControl( 5141320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci int /* player_id */) { 5151320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci // Does nothing if we don't have a remote player 5161320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci} 5171320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci 5187dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdochvoid BrowserMediaPlayerManager::AddPlayer(MediaPlayerAndroid* player) { 519868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) DCHECK(!GetPlayer(player->player_id())); 520868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) players_.push_back(player); 521868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)} 522868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) 5237dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdochvoid BrowserMediaPlayerManager::RemovePlayer(int player_id) { 524868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) for (ScopedVector<MediaPlayerAndroid>::iterator it = players_.begin(); 525868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) it != players_.end(); ++it) { 5261320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci if ((*it)->player_id() == player_id) { 5271320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci ReleaseMediaResources(player_id); 528868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) players_.erase(it); 529868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) break; 530868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) } 531868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) } 532868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)} 533868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) 534d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)scoped_ptr<media::MediaPlayerAndroid> BrowserMediaPlayerManager::SwapPlayer( 535d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) int player_id, media::MediaPlayerAndroid* player) { 536d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) media::MediaPlayerAndroid* previous_player = NULL; 537d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) for (ScopedVector<MediaPlayerAndroid>::iterator it = players_.begin(); 538d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) it != players_.end(); ++it) { 539d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) if ((*it)->player_id() == player_id) { 540d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) previous_player = *it; 5411320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci ReleaseMediaResources(player_id); 542d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) players_.weak_erase(it); 543d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) players_.push_back(player); 544d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) break; 545d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) } 546d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) } 547d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) return scoped_ptr<media::MediaPlayerAndroid>(previous_player); 548d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)} 549d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) 550cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)int BrowserMediaPlayerManager::RoutingID() { 551cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) return render_frame_host_->GetRoutingID(); 552cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)} 553cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) 554cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)bool BrowserMediaPlayerManager::Send(IPC::Message* msg) { 555cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) return render_frame_host_->Send(msg); 556eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch} 557eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch 5585d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)void BrowserMediaPlayerManager::ReleaseFullscreenPlayer( 5595d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) MediaPlayerAndroid* player) { 5601320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci ReleasePlayer(player); 5615d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)} 5625d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 563a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)void BrowserMediaPlayerManager::OnMediaResourcesRequested(int player_id) { 564a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) int num_active_player = 0; 565a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) ScopedVector<MediaPlayerAndroid>::iterator it; 566a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) for (it = players_.begin(); it != players_.end(); ++it) { 567a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) if (!(*it)->IsPlayerReady()) 568a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) continue; 569a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) 570a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) // The player is already active, ignore it. 571a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) if ((*it)->player_id() == player_id) 572a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) return; 573a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) else 574a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) num_active_player++; 575a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) } 576a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) 577a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) // Number of active players are less than the threshold, do nothing. 578a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) if (num_active_player < kMediaPlayerThreshold) 579a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) return; 580a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) 581a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) for (it = players_.begin(); it != players_.end(); ++it) { 582a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) if ((*it)->IsPlayerReady() && !(*it)->IsPlaying() && 583a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) fullscreen_player_id_ != (*it)->player_id()) { 5841320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci ReleasePlayer(*it); 585cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) Send(new MediaPlayerMsg_MediaPlayerReleased(RoutingID(), 586cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) (*it)->player_id())); 587a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) } 588a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) } 589a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)} 590a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) 5911320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tuccivoid BrowserMediaPlayerManager::ReleaseMediaResources(int player_id) { 592a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)#if defined(VIDEO_HOLE) 593a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch if (external_video_surface_container_) 594a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch external_video_surface_container_->ReleaseExternalVideoSurface(player_id); 595a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)#endif // defined(VIDEO_HOLE) 596a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)} 597a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) 5981320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tuccivoid BrowserMediaPlayerManager::ReleasePlayer(MediaPlayerAndroid* player) { 5991320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci player->Release(); 6001320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci ReleaseMediaResources(player->player_id()); 6011320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci} 6021320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci 6035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} // namespace content 604