browser_media_player_manager.cc revision f2477e01787aa58f445919b809d89e252beef54f
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) 758537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)#include "base/command_line.h" 8868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)#include "content/browser/android/content_view_core_impl.h" 9d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)#include "content/browser/media/android/browser_demuxer_android.h" 10d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)#include "content/browser/media/android/media_resource_getter_impl.h" 1168043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)#include "content/browser/renderer_host/render_view_host_impl.h" 122a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "content/browser/web_contents/web_contents_view_android.h" 1390dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)#include "content/common/media/media_player_messages_android.h" 14f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)#include "content/public/browser/android/content_view_core.h" 155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "content/public/browser/browser_context.h" 165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "content/public/browser/render_process_host.h" 175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "content/public/browser/render_view_host.h" 182a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "content/public/browser/storage_partition.h" 19868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)#include "content/public/browser/web_contents.h" 2068043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)#include "content/public/browser/web_contents_delegate.h" 21f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)#include "content/public/common/content_switches.h" 227d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)#include "media/base/android/media_drm_bridge.h" 2358537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)#include "media/base/android/media_player_bridge.h" 2458537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)#include "media/base/android/media_source_player.h" 2558537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)#include "media/base/media_switches.h" 265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 277d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)using media::MediaDrmBridge; 28b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)using media::MediaPlayerAndroid; 2958537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)using media::MediaPlayerBridge; 3058537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)using media::MediaPlayerManager; 3158537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)using media::MediaSourcePlayer; 325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Threshold on the number of media players per renderer before we start 345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// attempting to release inactive media players. 355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)static const int kMediaPlayerThreshold = 1; 365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 37424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)namespace content { 3890dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) 39424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)static BrowserMediaPlayerManager::Factory g_factory = NULL; 4090dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) 4190dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)// static 42424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)void BrowserMediaPlayerManager::RegisterFactory(Factory factory) { 43424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles) g_factory = factory; 4490dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)} 4590dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) 4690dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)// static 47424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)BrowserMediaPlayerManager* BrowserMediaPlayerManager::Create( 48424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles) RenderViewHost* rvh) { 49424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles) if (g_factory) 50424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles) return g_factory(rvh); 51424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles) return new BrowserMediaPlayerManager(rvh); 5290dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)} 5390dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) 5458537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)#if !defined(GOOGLE_TV) 5558537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)// static 5658537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)MediaPlayerAndroid* BrowserMediaPlayerManager::CreateMediaPlayer( 5768043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) MediaPlayerHostMsg_Initialize_Type type, 5858537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) int player_id, 5958537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) const GURL& url, 6058537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) const GURL& first_party_for_cookies, 6168043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) int demuxer_client_id, 6258537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) bool hide_url_log, 6358537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) MediaPlayerManager* manager, 644e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) BrowserDemuxerAndroid* demuxer) { 6558537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) switch (type) { 6658537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) case MEDIA_PLAYER_TYPE_URL: { 6758537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) MediaPlayerBridge* media_player_bridge = new MediaPlayerBridge( 6858537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) player_id, url, first_party_for_cookies, hide_url_log, manager); 69f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) BrowserMediaPlayerManager* browser_media_player_manager = 70f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) static_cast<BrowserMediaPlayerManager*>(manager); 71f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) ContentViewCoreImpl* content_view_core_impl = 72f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) static_cast<ContentViewCoreImpl*>(ContentViewCore::FromWebContents( 73f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) browser_media_player_manager->web_contents_)); 74f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) if (!content_view_core_impl) { 75f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) // May reach here due to prerendering. Don't extract the metadata 76f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) // since it is expensive. 77f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) // TODO(qinmin): extract the metadata once the user decided to load 78f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) // the page. 79f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) browser_media_player_manager->OnMediaMetadataChanged( 80f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) player_id, base::TimeDelta(), 0, 0, false); 81f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) } else if (!content_view_core_impl->ShouldBlockMediaRequest(url)) { 82f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) media_player_bridge->Initialize(); 83f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) } 8458537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) return media_player_bridge; 8558537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) } 8658537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) 8758537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) case MEDIA_PLAYER_TYPE_MEDIA_SOURCE: { 8868043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) return new MediaSourcePlayer( 894e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) player_id, manager, demuxer->CreateDemuxer(demuxer_client_id)); 9058537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) } 9158537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) } 9258537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) 9358537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) NOTREACHED(); 9458537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) return NULL; 9558537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)} 9658537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)#endif 9758537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) 987dbb3d5cf0c15f500944d211057644d6a2f37371Ben MurdochBrowserMediaPlayerManager::BrowserMediaPlayerManager( 995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) RenderViewHost* render_view_host) 1001e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) : WebContentsObserver(WebContents::FromRenderViewHost(render_view_host)), 1012a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) fullscreen_player_id_(-1), 1024e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) pending_fullscreen_player_id_(-1), 103f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) fullscreen_player_is_released_(false), 10468043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) web_contents_(WebContents::FromRenderViewHost(render_view_host)), 10568043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) weak_ptr_factory_(this) { 1065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 1075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1087dbb3d5cf0c15f500944d211057644d6a2f37371Ben MurdochBrowserMediaPlayerManager::~BrowserMediaPlayerManager() {} 1095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1107dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdochbool BrowserMediaPlayerManager::OnMessageReceived(const IPC::Message& msg) { 1115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) bool handled = true; 1127dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch IPC_BEGIN_MESSAGE_MAP(BrowserMediaPlayerManager, msg) 1135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) IPC_MESSAGE_HANDLER(MediaPlayerHostMsg_EnterFullscreen, OnEnterFullscreen) 1145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) IPC_MESSAGE_HANDLER(MediaPlayerHostMsg_ExitFullscreen, OnExitFullscreen) 115a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) IPC_MESSAGE_HANDLER(MediaPlayerHostMsg_Initialize, OnInitialize) 116a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) IPC_MESSAGE_HANDLER(MediaPlayerHostMsg_Start, OnStart) 117a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) IPC_MESSAGE_HANDLER(MediaPlayerHostMsg_Seek, OnSeek) 118a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) IPC_MESSAGE_HANDLER(MediaPlayerHostMsg_Pause, OnPause) 119a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) IPC_MESSAGE_HANDLER(MediaPlayerHostMsg_SetVolume, OnSetVolume) 120a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) IPC_MESSAGE_HANDLER(MediaPlayerHostMsg_Release, OnReleaseResources) 1215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) IPC_MESSAGE_HANDLER(MediaPlayerHostMsg_DestroyMediaPlayer, OnDestroyPlayer) 1225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) IPC_MESSAGE_HANDLER(MediaPlayerHostMsg_DestroyAllMediaPlayers, 1235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DestroyAllMediaPlayers) 124eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch IPC_MESSAGE_HANDLER(MediaKeysHostMsg_InitializeCDM, 125eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch OnInitializeCDM) 126eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch IPC_MESSAGE_HANDLER(MediaKeysHostMsg_GenerateKeyRequest, 127868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) OnGenerateKeyRequest) 128eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch IPC_MESSAGE_HANDLER(MediaKeysHostMsg_AddKey, OnAddKey) 129eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch IPC_MESSAGE_HANDLER(MediaKeysHostMsg_CancelKeyRequest, 130868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) OnCancelKeyRequest) 13190dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)#if defined(GOOGLE_TV) 13290dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) IPC_MESSAGE_HANDLER(MediaPlayerHostMsg_NotifyExternalSurface, 133868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) OnNotifyExternalSurface) 134c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#endif 1355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) IPC_MESSAGE_UNHANDLED(handled = false) 1365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) IPC_END_MESSAGE_MAP() 1375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return handled; 1385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 1395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1407dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdochvoid BrowserMediaPlayerManager::FullscreenPlayerPlay() { 141b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles) MediaPlayerAndroid* player = GetFullscreenPlayer(); 1425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (player) { 143f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) if (fullscreen_player_is_released_) { 144f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) video_view_->OpenVideo(); 145f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) fullscreen_player_is_released_ = false; 146f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) } 1475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) player->Start(); 1485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Send(new MediaPlayerMsg_DidMediaPlayerPlay( 1495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) routing_id(), fullscreen_player_id_)); 1505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 1515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 1525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1537dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdochvoid BrowserMediaPlayerManager::FullscreenPlayerPause() { 154b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles) MediaPlayerAndroid* player = GetFullscreenPlayer(); 1555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (player) { 156d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) player->Pause(true); 1575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Send(new MediaPlayerMsg_DidMediaPlayerPause( 1585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) routing_id(), fullscreen_player_id_)); 1595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 1605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 1615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1627dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdochvoid BrowserMediaPlayerManager::FullscreenPlayerSeek(int msec) { 163b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles) MediaPlayerAndroid* player = GetFullscreenPlayer(); 16468043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) if (player) { 165f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) // TODO(kbalazs): if |fullscreen_player_is_released_| is true 166f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) // at this point, player->GetCurrentTime() will be wrong until 167f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) // FullscreenPlayerPlay (http://crbug.com/322798). 16868043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) OnSeekRequest(fullscreen_player_id_, 16968043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) base::TimeDelta::FromMilliseconds(msec)); 17068043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) } 1715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 1725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1737dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdochvoid BrowserMediaPlayerManager::ExitFullscreen(bool release_media_player) { 1745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Send(new MediaPlayerMsg_DidExitFullscreen( 1755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) routing_id(), fullscreen_player_id_)); 176868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) video_view_.reset(); 177868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) MediaPlayerAndroid* player = GetFullscreenPlayer(); 178eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch fullscreen_player_id_ = -1; 1795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!player) 1805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return; 1815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (release_media_player) 1825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) player->Release(); 1835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) else 184868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) player->SetVideoSurface(gfx::ScopedJavaSurface()); 1855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 1865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1877dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdochvoid BrowserMediaPlayerManager::OnTimeUpdate(int player_id, 1887dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch base::TimeDelta current_time) { 1897d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) Send(new MediaPlayerMsg_MediaTimeUpdate( 1907d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) routing_id(), player_id, current_time)); 1917d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)} 1927d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) 1937dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdochvoid BrowserMediaPlayerManager::SetVideoSurface( 1947dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch gfx::ScopedJavaSurface surface) { 195b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles) MediaPlayerAndroid* player = GetFullscreenPlayer(); 1965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (player) { 197868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) player->SetVideoSurface(surface.Pass()); 1985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Send(new MediaPlayerMsg_DidEnterFullscreen( 1995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) routing_id(), player->player_id())); 2005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 2015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 2025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2037dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdochvoid BrowserMediaPlayerManager::OnMediaMetadataChanged( 2047d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) int player_id, base::TimeDelta duration, int width, int height, 2057d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) bool success) { 2067d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) Send(new MediaPlayerMsg_MediaMetadataChanged( 2077d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) routing_id(), player_id, duration, width, height, success)); 208f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) if (fullscreen_player_id_ == player_id) 2097d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) video_view_->UpdateMediaMetadata(); 2107d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)} 2115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2127dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdochvoid BrowserMediaPlayerManager::OnPlaybackComplete(int player_id) { 2137d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) Send(new MediaPlayerMsg_MediaPlaybackCompleted(routing_id(), player_id)); 214f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) if (fullscreen_player_id_ == player_id) 2157d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) video_view_->OnPlaybackComplete(); 2167d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)} 2177d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) 2187dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdochvoid BrowserMediaPlayerManager::OnMediaInterrupted(int player_id) { 2197d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) // Tell WebKit that the audio should be paused, then release all resources 2207d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) Send(new MediaPlayerMsg_DidMediaPlayerPause(routing_id(), player_id)); 2217d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) OnReleaseResources(player_id); 2227d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)} 2237d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) 2247dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdochvoid BrowserMediaPlayerManager::OnBufferingUpdate( 2257d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) int player_id, int percentage) { 2267d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) Send(new MediaPlayerMsg_MediaBufferingUpdate( 2277d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) routing_id(), player_id, percentage)); 228f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) if (fullscreen_player_id_ == player_id) 2297d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) video_view_->OnBufferingUpdate(percentage); 2307d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)} 2317d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) 23268043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)void BrowserMediaPlayerManager::OnSeekRequest( 23368043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) int player_id, 23468043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) const base::TimeDelta& time_to_seek) { 23568043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) Send(new MediaPlayerMsg_SeekRequest(routing_id(), player_id, time_to_seek)); 23668043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)} 23768043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) 23868043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)void BrowserMediaPlayerManager::OnSeekComplete( 23968043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) int player_id, 24068043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) const base::TimeDelta& current_time) { 24168043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) Send(new MediaPlayerMsg_SeekCompleted(routing_id(), player_id, current_time)); 2427d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)} 2437d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) 2447dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdochvoid BrowserMediaPlayerManager::OnError(int player_id, int error) { 2457d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) Send(new MediaPlayerMsg_MediaError(routing_id(), player_id, error)); 246f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) if (fullscreen_player_id_ == player_id) 2477d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) video_view_->OnMediaPlayerError(error); 2487d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)} 2497d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) 2507dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdochvoid BrowserMediaPlayerManager::OnVideoSizeChanged( 2517d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) int player_id, int width, int height) { 2527d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) Send(new MediaPlayerMsg_MediaVideoSizeChanged(routing_id(), player_id, 2537d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) width, height)); 254f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) if (fullscreen_player_id_ == player_id) 2557d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) video_view_->OnVideoSizeChanged(width, height); 2567d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)} 2577d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) 2587dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdochvoid BrowserMediaPlayerManager::RequestMediaResources(int player_id) { 2597d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) int num_active_player = 0; 2607d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) ScopedVector<MediaPlayerAndroid>::iterator it; 2617d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) for (it = players_.begin(); it != players_.end(); ++it) { 2627d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) if (!(*it)->IsPlayerReady()) 2637d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) continue; 2647d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) 2657d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) // The player is already active, ignore it. 2667d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) if ((*it)->player_id() == player_id) 2677d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) return; 2687d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) else 2697d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) num_active_player++; 2707d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) } 2717d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) 2727d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) // Number of active players are less than the threshold, do nothing. 2737d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) if (num_active_player < kMediaPlayerThreshold) 2747d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) return; 2757d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) 2767d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) for (it = players_.begin(); it != players_.end(); ++it) { 2777d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) if ((*it)->IsPlayerReady() && !(*it)->IsPlaying() && 2787d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) fullscreen_player_id_ != (*it)->player_id()) { 2797d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) (*it)->Release(); 2807d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) Send(new MediaPlayerMsg_MediaPlayerReleased( 2817d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) routing_id(), (*it)->player_id())); 2827d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) } 2837d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) } 2847d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)} 2857d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) 2867dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdochvoid BrowserMediaPlayerManager::ReleaseMediaResources(int player_id) { 2877d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) // Nothing needs to be done. 288c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)} 2895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2907dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdochmedia::MediaResourceGetter* 2917dbb3d5cf0c15f500944d211057644d6a2f37371Ben MurdochBrowserMediaPlayerManager::GetMediaResourceGetter() { 292c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) if (!media_resource_getter_.get()) { 2931e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) RenderProcessHost* host = web_contents()->GetRenderProcessHost(); 294c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) BrowserContext* context = host->GetBrowserContext(); 295c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) StoragePartition* partition = host->GetStoragePartition(); 296c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) fileapi::FileSystemContext* file_system_context = 297c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) partition ? partition->GetFileSystemContext() : NULL; 298c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) media_resource_getter_.reset(new MediaResourceGetterImpl( 299c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) context, file_system_context, host->GetID(), routing_id())); 300c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) } 301c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) return media_resource_getter_.get(); 3025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 3035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3047dbb3d5cf0c15f500944d211057644d6a2f37371Ben MurdochMediaPlayerAndroid* BrowserMediaPlayerManager::GetFullscreenPlayer() { 3057d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) return GetPlayer(fullscreen_player_id_); 3065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 3075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3087dbb3d5cf0c15f500944d211057644d6a2f37371Ben MurdochMediaPlayerAndroid* BrowserMediaPlayerManager::GetPlayer(int player_id) { 3097d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) for (ScopedVector<MediaPlayerAndroid>::iterator it = players_.begin(); 3107d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) it != players_.end(); ++it) { 3117d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) if ((*it)->player_id() == player_id) 3127d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) return *it; 3137d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) } 3147d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) return NULL; 3157d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)} 3167d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) 3177dbb3d5cf0c15f500944d211057644d6a2f37371Ben MurdochMediaDrmBridge* BrowserMediaPlayerManager::GetDrmBridge(int media_keys_id) { 3187d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) for (ScopedVector<MediaDrmBridge>::iterator it = drm_bridges_.begin(); 3197d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) it != drm_bridges_.end(); ++it) { 3207d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) if ((*it)->media_keys_id() == media_keys_id) 3217d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) return *it; 3227d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) } 3237d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) return NULL; 3247d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)} 3257d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) 3267dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdochvoid BrowserMediaPlayerManager::DestroyAllMediaPlayers() { 3277d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) players_.clear(); 3284e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) drm_bridges_.clear(); 3297d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) if (fullscreen_player_id_ != -1) { 3307d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) video_view_.reset(); 3317d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) fullscreen_player_id_ = -1; 3327d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) } 3337d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)} 3347d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) 3357dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdochvoid BrowserMediaPlayerManager::OnProtectedSurfaceRequested(int player_id) { 3367dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch if (fullscreen_player_id_ == player_id) 3377dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch return; 3384e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) 3397dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch if (fullscreen_player_id_ != -1) { 3407dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch // TODO(qinmin): Determine the correct error code we should report to WMPA. 3417dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch OnError(player_id, MediaPlayerAndroid::MEDIA_ERROR_DECODE); 3427dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch return; 3437dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch } 3444e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) 3454e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) // If the player is pending approval, wait for the approval to happen. 3464e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) if (media_keys_ids_pending_approval_.end() != 3474e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) media_keys_ids_pending_approval_.find(player_id)) { 3484e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) pending_fullscreen_player_id_ = player_id; 3494e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) return; 3504e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) } 3514e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) 352f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) // Send an IPC to the render process to request the video element to enter 353f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) // fullscreen. OnEnterFullscreen() will be called later on success. 354f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) // This guarantees the fullscreen video will be rendered correctly. 355f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) // During the process, DisableFullscreenEncryptedMediaPlayback() may get 356f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) // called before or after OnEnterFullscreen(). If it is called before 357f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) // OnEnterFullscreen(), the player will not enter fullscreen. And it will 358f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) // retry the process once the GenerateKeyRequest is allowed to proceed 359f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) // TODO(qinmin): make this flag default on android. 360f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) if (CommandLine::ForCurrentProcess()->HasSwitch( 361f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) switches::kDisableGestureRequirementForMediaFullscreen)) { 362f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) Send(new MediaPlayerMsg_RequestFullscreen(routing_id(), player_id)); 363f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) } 3647dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch} 3657dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch 3667dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdochvoid BrowserMediaPlayerManager::OnKeyAdded(int media_keys_id, 367f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) uint32 reference_id) { 368f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) Send(new MediaKeysMsg_KeyAdded(routing_id(), media_keys_id, reference_id)); 3697d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)} 3707d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) 3717dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdochvoid BrowserMediaPlayerManager::OnKeyError( 3727dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch int media_keys_id, 373f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) uint32 reference_id, 3747dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch media::MediaKeys::KeyError error_code, 3757dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch int system_code) { 376eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch Send(new MediaKeysMsg_KeyError(routing_id(), media_keys_id, 377f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) reference_id, error_code, system_code)); 3787d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)} 3797d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) 3807dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdochvoid BrowserMediaPlayerManager::OnKeyMessage( 3817dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch int media_keys_id, 382f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) uint32 reference_id, 3837dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch const std::vector<uint8>& message, 3847dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch const std::string& destination_url) { 385eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch Send(new MediaKeysMsg_KeyMessage(routing_id(), media_keys_id, 386f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) reference_id, message, destination_url)); 387f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)} 388f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) 389f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)void BrowserMediaPlayerManager::OnSetSessionId(int media_keys_id, 390f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) uint32 reference_id, 391f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) const std::string& session_id) { 392f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) Send(new MediaKeysMsg_SetSessionId( 393f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) routing_id(), media_keys_id, reference_id, session_id)); 3947d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)} 3957d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) 3967d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)#if defined(GOOGLE_TV) 3977dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdochvoid BrowserMediaPlayerManager::AttachExternalVideoSurface(int player_id, 3987dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch jobject surface) { 399b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles) MediaPlayerAndroid* player = GetPlayer(player_id); 4007d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) if (player) { 4017d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) player->SetVideoSurface( 4027d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) gfx::ScopedJavaSurface::AcquireExternalSurface(surface)); 4037d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) } 4045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 4055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4067dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdochvoid BrowserMediaPlayerManager::DetachExternalVideoSurface(int player_id) { 407b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles) MediaPlayerAndroid* player = GetPlayer(player_id); 4085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (player) 4097d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) player->SetVideoSurface(gfx::ScopedJavaSurface()); 4107d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)} 4117d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) 4127dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdochvoid BrowserMediaPlayerManager::OnNotifyExternalSurface( 4137d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) int player_id, bool is_request, const gfx::RectF& rect) { 4147d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) if (!web_contents_) 4157d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) return; 4167d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) 4177d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) WebContentsViewAndroid* view = 4187d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) static_cast<WebContentsViewAndroid*>(web_contents_->GetView()); 4197d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) if (view) 4207d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) view->NotifyExternalSurface(player_id, is_request, rect); 4215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 4227d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)#endif 4235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4244e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)void BrowserMediaPlayerManager::DisableFullscreenEncryptedMediaPlayback() { 4254e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) if (fullscreen_player_id_ == -1) 4264e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) return; 4274e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) 4284e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) // If the fullscreen player is not playing back encrypted video, do nothing. 4294e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) MediaDrmBridge* drm_bridge = GetDrmBridge(fullscreen_player_id_); 4304e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) if (!drm_bridge) 4314e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) return; 4324e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) 4334e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) // Exit fullscreen. 4344e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) pending_fullscreen_player_id_ = fullscreen_player_id_; 4354e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) OnExitFullscreen(fullscreen_player_id_); 4364e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)} 4374e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) 4387dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdochvoid BrowserMediaPlayerManager::OnEnterFullscreen(int player_id) { 4395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DCHECK_EQ(fullscreen_player_id_, -1); 440f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) if (media_keys_ids_pending_approval_.find(player_id) != 441f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) media_keys_ids_pending_approval_.end()) { 442f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) return; 443f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) } 4445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 445868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) if (video_view_.get()) { 446868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) fullscreen_player_id_ = player_id; 447868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) video_view_->OpenVideo(); 448868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) } else if (!ContentVideoView::HasContentVideoView()) { 449868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) // In Android WebView, two ContentViewCores could both try to enter 450868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) // fullscreen video, we just ignore the second one. 451868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) fullscreen_player_id_ = player_id; 452868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) ContentViewCoreImpl* content_view_core_impl = 4531e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) ContentViewCoreImpl::FromWebContents(web_contents()); 454868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) video_view_.reset(new ContentVideoView(content_view_core_impl->GetContext(), 455868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) content_view_core_impl->GetContentVideoViewClient(), this)); 456868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) } 4575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 4585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4597dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdochvoid BrowserMediaPlayerManager::OnExitFullscreen(int player_id) { 4605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (fullscreen_player_id_ == player_id) { 461b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles) MediaPlayerAndroid* player = GetPlayer(player_id); 4625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (player) 463868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) player->SetVideoSurface(gfx::ScopedJavaSurface()); 464868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) video_view_->OnExitFullscreen(); 4655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 4665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 4675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4687dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdochvoid BrowserMediaPlayerManager::OnInitialize( 46968043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) MediaPlayerHostMsg_Initialize_Type type, 4707d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) int player_id, 4717d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) const GURL& url, 47268043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) const GURL& first_party_for_cookies, 47368043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) int demuxer_client_id) { 47468043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) DCHECK(type != MEDIA_PLAYER_TYPE_MEDIA_SOURCE || demuxer_client_id > 0) 47568043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) << "Media source players must have positive demuxer client IDs: " 47668043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) << demuxer_client_id; 47768043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) 4787d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) RemovePlayer(player_id); 4797d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) 4801e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) RenderProcessHostImpl* host = static_cast<RenderProcessHostImpl*>( 4811e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) web_contents()->GetRenderProcessHost()); 48258537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) AddPlayer(CreateMediaPlayer( 48368043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) type, player_id, url, first_party_for_cookies, demuxer_client_id, 48468043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) host->GetBrowserContext()->IsOffTheRecord(), this, 48568043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) host->browser_demuxer_android())); 4867d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)} 4877d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) 4887dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdochvoid BrowserMediaPlayerManager::OnStart(int player_id) { 4897d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) MediaPlayerAndroid* player = GetPlayer(player_id); 4907d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) if (player) 4917d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) player->Start(); 4927d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)} 4937d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) 49468043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)void BrowserMediaPlayerManager::OnSeek( 49568043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) int player_id, 49668043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) const base::TimeDelta& time) { 4977d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) MediaPlayerAndroid* player = GetPlayer(player_id); 4987d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) if (player) 4997d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) player->SeekTo(time); 5007d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)} 5017d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) 502d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)void BrowserMediaPlayerManager::OnPause( 503d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) int player_id, 504d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) bool is_media_related_action) { 5057d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) MediaPlayerAndroid* player = GetPlayer(player_id); 5067d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) if (player) 507d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) player->Pause(is_media_related_action); 5087d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)} 5097d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) 510a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)void BrowserMediaPlayerManager::OnSetVolume(int player_id, double volume) { 511a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) MediaPlayerAndroid* player = GetPlayer(player_id); 512a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) if (player) 513a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) player->SetVolume(volume); 514a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)} 515a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) 5167dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdochvoid BrowserMediaPlayerManager::OnReleaseResources(int player_id) { 517b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles) MediaPlayerAndroid* player = GetPlayer(player_id); 518f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) if (player) 5195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) player->Release(); 520f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) if (player_id == fullscreen_player_id_) 521f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) fullscreen_player_is_released_ = true; 522868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) 523868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)#if defined(GOOGLE_TV) 524868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) WebContentsViewAndroid* view = 525868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) static_cast<WebContentsViewAndroid*>(web_contents_->GetView()); 526868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) if (view) 527868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) view->NotifyExternalSurface(player_id, false, gfx::RectF()); 528868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)#endif 5295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 5305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 5317dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdochvoid BrowserMediaPlayerManager::OnDestroyPlayer(int player_id) { 532868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) RemovePlayer(player_id); 5335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (fullscreen_player_id_ == player_id) 5345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) fullscreen_player_id_ = -1; 5355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 5365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 5377dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdochvoid BrowserMediaPlayerManager::OnInitializeCDM( 5387dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch int media_keys_id, 53968043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) const std::vector<uint8>& uuid, 54068043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) const GURL& frame_url) { 54168043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) AddDrmBridge(media_keys_id, uuid, frame_url); 542eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch // In EME v0.1b MediaKeys lives in the media element. So the |media_keys_id| 543eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch // is the same as the |player_id|. 544eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch OnSetMediaKeys(media_keys_id, media_keys_id); 545eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch} 546eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch 5477dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdochvoid BrowserMediaPlayerManager::OnGenerateKeyRequest( 5487d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) int media_keys_id, 549f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) uint32 reference_id, 550868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) const std::string& type, 551868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) const std::vector<uint8>& init_data) { 55268043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) if (CommandLine::ForCurrentProcess() 55368043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) ->HasSwitch(switches::kDisableInfobarForProtectedMediaIdentifier)) { 554f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) GenerateKeyIfAllowed(media_keys_id, reference_id, type, init_data, true); 55568043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) return; 55668043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) } 55768043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) 5587d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) MediaDrmBridge* drm_bridge = GetDrmBridge(media_keys_id); 55968043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) if (!drm_bridge) { 56068043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) DLOG(WARNING) << "No MediaDrmBridge for ID: " << media_keys_id << " found"; 561f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) OnKeyError(media_keys_id, reference_id, media::MediaKeys::kUnknownError, 0); 56268043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) return; 56368043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) } 56468043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) 5654e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) if (media_keys_ids_approved_.find(media_keys_id) == 5664e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) media_keys_ids_approved_.end()) { 5674e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) media_keys_ids_pending_approval_.insert(media_keys_id); 5684e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) } 5691e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) web_contents()->GetDelegate()->RequestProtectedMediaIdentifierPermission( 5701e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) web_contents(), 57168043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) drm_bridge->frame_url(), 57268043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) base::Bind(&BrowserMediaPlayerManager::GenerateKeyIfAllowed, 57368043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) weak_ptr_factory_.GetWeakPtr(), 57468043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) media_keys_id, 575f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) reference_id, 57668043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) type, 57768043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) init_data)); 578868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)} 579868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) 5807dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdochvoid BrowserMediaPlayerManager::OnAddKey(int media_keys_id, 581f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) uint32 reference_id, 5827dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch const std::vector<uint8>& key, 583f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) const std::vector<uint8>& init_data) { 5847d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) MediaDrmBridge* drm_bridge = GetDrmBridge(media_keys_id); 58568043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) if (!drm_bridge) { 58668043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) DLOG(WARNING) << "No MediaDrmBridge for ID: " << media_keys_id << " found"; 587f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) OnKeyError(media_keys_id, reference_id, media::MediaKeys::kUnknownError, 0); 58858537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) return; 58968043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) } 59058537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) 591f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) drm_bridge->AddKey(reference_id, 592f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) &key[0], key.size(), 593f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) &init_data[0], init_data.size()); 59458537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) // In EME v0.1b MediaKeys lives in the media element. So the |media_keys_id| 59558537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) // is the same as the |player_id|. 59658537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) // TODO(xhwang): Separate |media_keys_id| and |player_id|. 59758537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) MediaPlayerAndroid* player = GetPlayer(media_keys_id); 59858537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) if (player) 59958537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) player->OnKeyAdded(); 600868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)} 601868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) 6027dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdochvoid BrowserMediaPlayerManager::OnCancelKeyRequest( 6037dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch int media_keys_id, 604f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) uint32 reference_id) { 6057d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) MediaDrmBridge* drm_bridge = GetDrmBridge(media_keys_id); 60668043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) if (!drm_bridge) { 60768043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) DLOG(WARNING) << "No MediaDrmBridge for ID: " << media_keys_id << " found"; 608f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) OnKeyError(media_keys_id, reference_id, media::MediaKeys::kUnknownError, 0); 60968043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) return; 61068043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) } 61168043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) 612f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) drm_bridge->CancelKeyRequest(reference_id); 6137d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)} 6147d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) 6157dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdochvoid BrowserMediaPlayerManager::AddPlayer(MediaPlayerAndroid* player) { 616868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) DCHECK(!GetPlayer(player->player_id())); 617868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) players_.push_back(player); 6188bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) if (player->IsRemote()) { 6198bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) Send(new MediaPlayerMsg_ConnectedToRemoteDevice(routing_id(), 6208bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) player->player_id())); 6218bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) } 622868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)} 623868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) 6247dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdochvoid BrowserMediaPlayerManager::RemovePlayer(int player_id) { 625868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) for (ScopedVector<MediaPlayerAndroid>::iterator it = players_.begin(); 626868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) it != players_.end(); ++it) { 6278bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) MediaPlayerAndroid* player = *it; 6288bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) if (player->player_id() == player_id) { 6298bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) if (player->IsRemote()) { 6308bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) Send(new MediaPlayerMsg_DisconnectedFromRemoteDevice( 6318bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) routing_id(), player->player_id())); 6328bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) } 633868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) players_.erase(it); 634868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) break; 635868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) } 636868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) } 637868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)} 638868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) 639d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)scoped_ptr<media::MediaPlayerAndroid> BrowserMediaPlayerManager::SwapPlayer( 640d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) int player_id, media::MediaPlayerAndroid* player) { 641d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) media::MediaPlayerAndroid* previous_player = NULL; 642d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) for (ScopedVector<MediaPlayerAndroid>::iterator it = players_.begin(); 643d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) it != players_.end(); ++it) { 644d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) if ((*it)->player_id() == player_id) { 645d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) previous_player = *it; 646d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) players_.weak_erase(it); 647d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) players_.push_back(player); 6488bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) if (!previous_player->IsRemote() && player->IsRemote()) { 6498bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) Send(new MediaPlayerMsg_ConnectedToRemoteDevice( 6508bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) routing_id(), player->player_id())); 6518bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) } else if (previous_player->IsRemote() && !player->IsRemote()) { 6528bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) Send(new MediaPlayerMsg_DisconnectedFromRemoteDevice( 6538bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) routing_id(), player->player_id())); 6548bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) } 655d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) break; 656d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) } 657d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) } 658d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) return scoped_ptr<media::MediaPlayerAndroid>(previous_player); 659d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)} 660d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) 6617dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdochvoid BrowserMediaPlayerManager::AddDrmBridge(int media_keys_id, 66268043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) const std::vector<uint8>& uuid, 66368043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) const GURL& frame_url) { 664eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch DCHECK(!GetDrmBridge(media_keys_id)); 66558537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) // TODO(xhwang/ddorwin): Pass the security level from key system. 66658537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) std::string security_level = "L3"; 66758537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) if (CommandLine::ForCurrentProcess() 66858537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) ->HasSwitch(switches::kMediaDrmEnableNonCompositing)) { 66958537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) security_level = "L1"; 67058537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) } 67158537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) 67268043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) scoped_ptr<MediaDrmBridge> drm_bridge(MediaDrmBridge::Create( 67368043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) media_keys_id, uuid, frame_url, security_level, this)); 67458537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) if (!drm_bridge) { 675f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) // This failure will be discovered and reported by OnGenerateKeyRequest() 676f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) // as GetDrmBridge() will return null. 67758537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) DVLOG(1) << "failed to create drm bridge."; 67858537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) return; 67958537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) } 68058537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) 6817dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch drm_bridges_.push_back(drm_bridge.release()); 682eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch} 683eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch 6847dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdochvoid BrowserMediaPlayerManager::RemoveDrmBridge(int media_keys_id) { 6857d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) for (ScopedVector<MediaDrmBridge>::iterator it = drm_bridges_.begin(); 6867d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) it != drm_bridges_.end(); ++it) { 6877d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) if ((*it)->media_keys_id() == media_keys_id) { 6887d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) drm_bridges_.erase(it); 6897d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) break; 6907d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) } 6917d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) } 6927d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)} 6937d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) 6947dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdochvoid BrowserMediaPlayerManager::OnSetMediaKeys(int player_id, 6957dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch int media_keys_id) { 696eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch MediaPlayerAndroid* player = GetPlayer(player_id); 697eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch MediaDrmBridge* drm_bridge = GetDrmBridge(media_keys_id); 698eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch if (!player || !drm_bridge) { 69958537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) DVLOG(1) << "OnSetMediaKeys(): Player and MediaKeys must be present."; 700eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch return; 701eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch } 702eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch // TODO(qinmin): add the logic to decide whether we should create the 703eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch // fullscreen surface for EME lv1. 704eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch player->SetDrmBridge(drm_bridge); 705eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch} 706eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch 70768043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)void BrowserMediaPlayerManager::GenerateKeyIfAllowed( 70868043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) int media_keys_id, 709f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) uint32 reference_id, 71068043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) const std::string& type, 71168043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) const std::vector<uint8>& init_data, 71268043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) bool allowed) { 71368043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) if (!allowed) 71468043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) return; 71568043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) 71668043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) MediaDrmBridge* drm_bridge = GetDrmBridge(media_keys_id); 71768043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) if (!drm_bridge) { 71868043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) DLOG(WARNING) << "No MediaDrmBridge for ID: " << media_keys_id << " found"; 719f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) OnKeyError(media_keys_id, reference_id, media::MediaKeys::kUnknownError, 0); 72068043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) return; 72168043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) } 7224e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) media_keys_ids_pending_approval_.erase(media_keys_id); 7234e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) media_keys_ids_approved_.insert(media_keys_id); 724f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) drm_bridge->GenerateKeyRequest( 725f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) reference_id, type, &init_data[0], init_data.size()); 7264e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) 7274e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) // TODO(qinmin): currently |media_keys_id| and player ID are identical. 7284e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) // This might not be true in the future. 7294e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) if (pending_fullscreen_player_id_ != media_keys_id) 7304e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) return; 7314e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) 7324e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) pending_fullscreen_player_id_ = -1; 7334e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) MediaPlayerAndroid* player = GetPlayer(media_keys_id); 7344e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) if (player->IsPlaying()) 7354e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) OnProtectedSurfaceRequested(media_keys_id); 73668043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)} 73768043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) 7385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} // namespace content 739