browser_media_player_manager.cc revision 4e180b6a0b4720a9b8e9e959a882386f690f08ff
10dc4eea64f56cc93e5359372b08b99a2d600273cBrian// Copyright 2013 The Chromium Authors. All rights reserved. 20dc4eea64f56cc93e5359372b08b99a2d600273cBrian// Use of this source code is governed by a BSD-style license that can be 30dc4eea64f56cc93e5359372b08b99a2d600273cBrian// found in the LICENSE file. 40dc4eea64f56cc93e5359372b08b99a2d600273cBrian 54bfe1c955fe679547c8a03119d1681e33593c768Michal Krol#include "content/browser/media/android/browser_media_player_manager.h" 60dc4eea64f56cc93e5359372b08b99a2d600273cBrian 70dc4eea64f56cc93e5359372b08b99a2d600273cBrian#include "base/command_line.h" 80dc4eea64f56cc93e5359372b08b99a2d600273cBrian#include "content/browser/android/content_view_core_impl.h" 90dc4eea64f56cc93e5359372b08b99a2d600273cBrian#include "content/browser/media/android/browser_demuxer_android.h" 100dc4eea64f56cc93e5359372b08b99a2d600273cBrian#include "content/browser/media/android/media_resource_getter_impl.h" 110dc4eea64f56cc93e5359372b08b99a2d600273cBrian#include "content/browser/renderer_host/render_view_host_impl.h" 120dc4eea64f56cc93e5359372b08b99a2d600273cBrian#include "content/browser/web_contents/web_contents_view_android.h" 130dc4eea64f56cc93e5359372b08b99a2d600273cBrian#include "content/common/media/media_player_messages_android.h" 140dc4eea64f56cc93e5359372b08b99a2d600273cBrian#include "content/public/browser/browser_context.h" 150dc4eea64f56cc93e5359372b08b99a2d600273cBrian#include "content/public/browser/render_process_host.h" 160dc4eea64f56cc93e5359372b08b99a2d600273cBrian#include "content/public/browser/render_view_host.h" 170dc4eea64f56cc93e5359372b08b99a2d600273cBrian#include "content/public/browser/storage_partition.h" 180dc4eea64f56cc93e5359372b08b99a2d600273cBrian#include "content/public/browser/web_contents.h" 190dc4eea64f56cc93e5359372b08b99a2d600273cBrian#include "content/public/browser/web_contents_delegate.h" 200dc4eea64f56cc93e5359372b08b99a2d600273cBrian#include "media/base/android/media_drm_bridge.h" 210dc4eea64f56cc93e5359372b08b99a2d600273cBrian#include "media/base/android/media_player_bridge.h" 220dc4eea64f56cc93e5359372b08b99a2d600273cBrian#include "media/base/android/media_source_player.h" 230dc4eea64f56cc93e5359372b08b99a2d600273cBrian#include "media/base/media_switches.h" 240dc4eea64f56cc93e5359372b08b99a2d600273cBrian 250dc4eea64f56cc93e5359372b08b99a2d600273cBrianusing media::MediaDrmBridge; 260dc4eea64f56cc93e5359372b08b99a2d600273cBrianusing media::MediaPlayerAndroid; 270dc4eea64f56cc93e5359372b08b99a2d600273cBrianusing media::MediaPlayerBridge; 280dc4eea64f56cc93e5359372b08b99a2d600273cBrianusing media::MediaPlayerManager; 290dc4eea64f56cc93e5359372b08b99a2d600273cBrianusing media::MediaSourcePlayer; 300dc4eea64f56cc93e5359372b08b99a2d600273cBrian 310dc4eea64f56cc93e5359372b08b99a2d600273cBrian// Threshold on the number of media players per renderer before we start 320dc4eea64f56cc93e5359372b08b99a2d600273cBrian// attempting to release inactive media players. 330dc4eea64f56cc93e5359372b08b99a2d600273cBrianstatic const int kMediaPlayerThreshold = 1; 344fc7d0345a18042a79686940fb7cc4e698cc9192Keith Whitwell 350dc4eea64f56cc93e5359372b08b99a2d600273cBriannamespace content { 360dc4eea64f56cc93e5359372b08b99a2d600273cBrian 370dc4eea64f56cc93e5359372b08b99a2d600273cBrianstatic BrowserMediaPlayerManager::Factory g_factory = NULL; 380dc4eea64f56cc93e5359372b08b99a2d600273cBrian 3900c835918259f8d41c3f74eca679a972713b11b2Keith Whitwell// static 401a46dcc8a927dfb38ca1381e7b3dafb789f8257cBrian Paulvoid BrowserMediaPlayerManager::RegisterFactory(Factory factory) { 414f25420bdd834e81a3e22733304efc5261c2998aBrian Paul g_factory = factory; 42d204659c8c725c02212ad4a49275c7447f2d02a6Brian Paul} 43d204659c8c725c02212ad4a49275c7447f2d02a6Brian Paul 447670102468a55de50cf0cfa0b938d36aaf212f1fKeith Whitwell// static 450dc4eea64f56cc93e5359372b08b99a2d600273cBrianBrowserMediaPlayerManager* BrowserMediaPlayerManager::Create( 460dc4eea64f56cc93e5359372b08b99a2d600273cBrian RenderViewHost* rvh) { 474250882ccf8326ba9074c671110370534489caa6Brian Paul if (g_factory) 484250882ccf8326ba9074c671110370534489caa6Brian Paul return g_factory(rvh); 494250882ccf8326ba9074c671110370534489caa6Brian Paul return new BrowserMediaPlayerManager(rvh); 503ffd529ff19bf8dd7b022a267bf2afe44c7f0f65Brian Paul} 5108f33a025100dea2d951e6d628891fe294b18082Brian 52b4a40d10524a4be6a59805589ee4209ebdb1de4fBrian Paul#if !defined(GOOGLE_TV) 53b4a40d10524a4be6a59805589ee4209ebdb1de4fBrian Paul// static 54b4a40d10524a4be6a59805589ee4209ebdb1de4fBrian PaulMediaPlayerAndroid* BrowserMediaPlayerManager::CreateMediaPlayer( 55b4a40d10524a4be6a59805589ee4209ebdb1de4fBrian Paul MediaPlayerHostMsg_Initialize_Type type, 5608f33a025100dea2d951e6d628891fe294b18082Brian int player_id, 5708f33a025100dea2d951e6d628891fe294b18082Brian const GURL& url, 58b4a40d10524a4be6a59805589ee4209ebdb1de4fBrian Paul const GURL& first_party_for_cookies, 59b4a40d10524a4be6a59805589ee4209ebdb1de4fBrian Paul int demuxer_client_id, 60b4a40d10524a4be6a59805589ee4209ebdb1de4fBrian Paul bool hide_url_log, 61b37c54150058c07ab2d3db2d7e5891a457b51e76Brian Paul MediaPlayerManager* manager, 62b4a40d10524a4be6a59805589ee4209ebdb1de4fBrian Paul BrowserDemuxerAndroid* demuxer) { 63b4a40d10524a4be6a59805589ee4209ebdb1de4fBrian Paul switch (type) { 6408f33a025100dea2d951e6d628891fe294b18082Brian case MEDIA_PLAYER_TYPE_URL: { 6508f33a025100dea2d951e6d628891fe294b18082Brian MediaPlayerBridge* media_player_bridge = new MediaPlayerBridge( 6608f33a025100dea2d951e6d628891fe294b18082Brian player_id, url, first_party_for_cookies, hide_url_log, manager); 6708f33a025100dea2d951e6d628891fe294b18082Brian media_player_bridge->Initialize(); 6808f33a025100dea2d951e6d628891fe294b18082Brian return media_player_bridge; 6938bee46e83b18ff4ad42d340b507b1a15b4326c7Brian } 7038bee46e83b18ff4ad42d340b507b1a15b4326c7Brian 7138bee46e83b18ff4ad42d340b507b1a15b4326c7Brian case MEDIA_PLAYER_TYPE_MEDIA_SOURCE: { 7238bee46e83b18ff4ad42d340b507b1a15b4326c7Brian return new MediaSourcePlayer( 7338bee46e83b18ff4ad42d340b507b1a15b4326c7Brian player_id, manager, demuxer->CreateDemuxer(demuxer_client_id)); 740dc4eea64f56cc93e5359372b08b99a2d600273cBrian } 750dc4eea64f56cc93e5359372b08b99a2d600273cBrian } 760dc4eea64f56cc93e5359372b08b99a2d600273cBrian 77fd60bf8e33bbcba7b7749ae5a4285bad60769b9bBrian Paul NOTREACHED(); 780dc4eea64f56cc93e5359372b08b99a2d600273cBrian return NULL; 790dc4eea64f56cc93e5359372b08b99a2d600273cBrian} 800dc4eea64f56cc93e5359372b08b99a2d600273cBrian#endif 810dc4eea64f56cc93e5359372b08b99a2d600273cBrian 820dc4eea64f56cc93e5359372b08b99a2d600273cBrianBrowserMediaPlayerManager::BrowserMediaPlayerManager( 830dc4eea64f56cc93e5359372b08b99a2d600273cBrian RenderViewHost* render_view_host) 84b4480285ed5098f1c862690ee105dd46f5e6cd1eBrian : RenderViewHostObserver(render_view_host), 85b4480285ed5098f1c862690ee105dd46f5e6cd1eBrian fullscreen_player_id_(-1), 86b4480285ed5098f1c862690ee105dd46f5e6cd1eBrian pending_fullscreen_player_id_(-1), 870dc4eea64f56cc93e5359372b08b99a2d600273cBrian web_contents_(WebContents::FromRenderViewHost(render_view_host)), 8838bee46e83b18ff4ad42d340b507b1a15b4326c7Brian weak_ptr_factory_(this) { 8938bee46e83b18ff4ad42d340b507b1a15b4326c7Brian} 9038bee46e83b18ff4ad42d340b507b1a15b4326c7Brian 9138bee46e83b18ff4ad42d340b507b1a15b4326c7BrianBrowserMediaPlayerManager::~BrowserMediaPlayerManager() {} 9238bee46e83b18ff4ad42d340b507b1a15b4326c7Brian 9338bee46e83b18ff4ad42d340b507b1a15b4326c7Brianbool BrowserMediaPlayerManager::OnMessageReceived(const IPC::Message& msg) { 9438bee46e83b18ff4ad42d340b507b1a15b4326c7Brian bool handled = true; 9538bee46e83b18ff4ad42d340b507b1a15b4326c7Brian IPC_BEGIN_MESSAGE_MAP(BrowserMediaPlayerManager, msg) 9638bee46e83b18ff4ad42d340b507b1a15b4326c7Brian IPC_MESSAGE_HANDLER(MediaPlayerHostMsg_EnterFullscreen, OnEnterFullscreen) 9738bee46e83b18ff4ad42d340b507b1a15b4326c7Brian IPC_MESSAGE_HANDLER(MediaPlayerHostMsg_ExitFullscreen, OnExitFullscreen) 9838bee46e83b18ff4ad42d340b507b1a15b4326c7Brian IPC_MESSAGE_HANDLER(MediaPlayerHostMsg_Initialize, OnInitialize) 9938bee46e83b18ff4ad42d340b507b1a15b4326c7Brian IPC_MESSAGE_HANDLER(MediaPlayerHostMsg_Start, OnStart) 10038bee46e83b18ff4ad42d340b507b1a15b4326c7Brian IPC_MESSAGE_HANDLER(MediaPlayerHostMsg_Seek, OnSeek) 10138bee46e83b18ff4ad42d340b507b1a15b4326c7Brian IPC_MESSAGE_HANDLER(MediaPlayerHostMsg_Pause, OnPause) 10238bee46e83b18ff4ad42d340b507b1a15b4326c7Brian IPC_MESSAGE_HANDLER(MediaPlayerHostMsg_SetVolume, OnSetVolume) 10338bee46e83b18ff4ad42d340b507b1a15b4326c7Brian IPC_MESSAGE_HANDLER(MediaPlayerHostMsg_Release, OnReleaseResources) 10438bee46e83b18ff4ad42d340b507b1a15b4326c7Brian IPC_MESSAGE_HANDLER(MediaPlayerHostMsg_DestroyMediaPlayer, OnDestroyPlayer) 1050dc4eea64f56cc93e5359372b08b99a2d600273cBrian IPC_MESSAGE_HANDLER(MediaPlayerHostMsg_DestroyAllMediaPlayers, 1060dc4eea64f56cc93e5359372b08b99a2d600273cBrian DestroyAllMediaPlayers) 1070dc4eea64f56cc93e5359372b08b99a2d600273cBrian IPC_MESSAGE_HANDLER(MediaKeysHostMsg_InitializeCDM, 10838bee46e83b18ff4ad42d340b507b1a15b4326c7Brian OnInitializeCDM) 1090dc4eea64f56cc93e5359372b08b99a2d600273cBrian IPC_MESSAGE_HANDLER(MediaKeysHostMsg_GenerateKeyRequest, 110b4a40d10524a4be6a59805589ee4209ebdb1de4fBrian Paul OnGenerateKeyRequest) 111e31f0f996537046228602a251706613ca4163209Brian Paul IPC_MESSAGE_HANDLER(MediaKeysHostMsg_AddKey, OnAddKey) 112e31f0f996537046228602a251706613ca4163209Brian Paul IPC_MESSAGE_HANDLER(MediaKeysHostMsg_CancelKeyRequest, 113e31f0f996537046228602a251706613ca4163209Brian Paul OnCancelKeyRequest) 1140dc4eea64f56cc93e5359372b08b99a2d600273cBrian#if defined(GOOGLE_TV) 115b4a40d10524a4be6a59805589ee4209ebdb1de4fBrian Paul IPC_MESSAGE_HANDLER(MediaPlayerHostMsg_NotifyExternalSurface, 116b4a40d10524a4be6a59805589ee4209ebdb1de4fBrian Paul OnNotifyExternalSurface) 117b4a40d10524a4be6a59805589ee4209ebdb1de4fBrian Paul#endif 118e31f0f996537046228602a251706613ca4163209Brian Paul IPC_MESSAGE_UNHANDLED(handled = false) 119b4a40d10524a4be6a59805589ee4209ebdb1de4fBrian Paul IPC_END_MESSAGE_MAP() 12008f33a025100dea2d951e6d628891fe294b18082Brian return handled; 12108f33a025100dea2d951e6d628891fe294b18082Brian} 12208f33a025100dea2d951e6d628891fe294b18082Brian 12338bee46e83b18ff4ad42d340b507b1a15b4326c7Brianvoid BrowserMediaPlayerManager::FullscreenPlayerPlay() { 12438bee46e83b18ff4ad42d340b507b1a15b4326c7Brian MediaPlayerAndroid* player = GetFullscreenPlayer(); 12508f33a025100dea2d951e6d628891fe294b18082Brian if (player) { 12638bee46e83b18ff4ad42d340b507b1a15b4326c7Brian player->Start(); 12708f33a025100dea2d951e6d628891fe294b18082Brian Send(new MediaPlayerMsg_DidMediaPlayerPlay( 12838bee46e83b18ff4ad42d340b507b1a15b4326c7Brian routing_id(), fullscreen_player_id_)); 12908f33a025100dea2d951e6d628891fe294b18082Brian } 13008f33a025100dea2d951e6d628891fe294b18082Brian} 1314fc7d0345a18042a79686940fb7cc4e698cc9192Keith Whitwell 132229a1a7e4da1a9c60b35b79f2a63e0bab451a76eOlivier Galibertvoid BrowserMediaPlayerManager::FullscreenPlayerPause() { 1334fc7d0345a18042a79686940fb7cc4e698cc9192Keith Whitwell MediaPlayerAndroid* player = GetFullscreenPlayer(); 1344fc7d0345a18042a79686940fb7cc4e698cc9192Keith Whitwell if (player) { 1354fc7d0345a18042a79686940fb7cc4e698cc9192Keith Whitwell player->Pause(true); 136229a1a7e4da1a9c60b35b79f2a63e0bab451a76eOlivier Galibert Send(new MediaPlayerMsg_DidMediaPlayerPause( 137229a1a7e4da1a9c60b35b79f2a63e0bab451a76eOlivier Galibert routing_id(), fullscreen_player_id_)); 1384fc7d0345a18042a79686940fb7cc4e698cc9192Keith Whitwell } 1394fc7d0345a18042a79686940fb7cc4e698cc9192Keith Whitwell} 1404fc7d0345a18042a79686940fb7cc4e698cc9192Keith Whitwell 1414fc7d0345a18042a79686940fb7cc4e698cc9192Keith Whitwellvoid BrowserMediaPlayerManager::FullscreenPlayerSeek(int msec) { 142229a1a7e4da1a9c60b35b79f2a63e0bab451a76eOlivier Galibert MediaPlayerAndroid* player = GetFullscreenPlayer(); 1430dc4eea64f56cc93e5359372b08b99a2d600273cBrian if (player) { 1444fc7d0345a18042a79686940fb7cc4e698cc9192Keith Whitwell OnSeekRequest(fullscreen_player_id_, 1454fc7d0345a18042a79686940fb7cc4e698cc9192Keith Whitwell base::TimeDelta::FromMilliseconds(msec)); 146229a1a7e4da1a9c60b35b79f2a63e0bab451a76eOlivier Galibert } 147229a1a7e4da1a9c60b35b79f2a63e0bab451a76eOlivier Galibert} 148229a1a7e4da1a9c60b35b79f2a63e0bab451a76eOlivier Galibert 149229a1a7e4da1a9c60b35b79f2a63e0bab451a76eOlivier Galibertvoid BrowserMediaPlayerManager::ExitFullscreen(bool release_media_player) { 150229a1a7e4da1a9c60b35b79f2a63e0bab451a76eOlivier Galibert Send(new MediaPlayerMsg_DidExitFullscreen( 151229a1a7e4da1a9c60b35b79f2a63e0bab451a76eOlivier Galibert routing_id(), fullscreen_player_id_)); 1524fc7d0345a18042a79686940fb7cc4e698cc9192Keith Whitwell video_view_.reset(); 1534fc7d0345a18042a79686940fb7cc4e698cc9192Keith Whitwell MediaPlayerAndroid* player = GetFullscreenPlayer(); 1544fc7d0345a18042a79686940fb7cc4e698cc9192Keith Whitwell fullscreen_player_id_ = -1; 1554fc7d0345a18042a79686940fb7cc4e698cc9192Keith Whitwell if (!player) 156229a1a7e4da1a9c60b35b79f2a63e0bab451a76eOlivier Galibert return; 1574fc7d0345a18042a79686940fb7cc4e698cc9192Keith Whitwell if (release_media_player) 1584fc7d0345a18042a79686940fb7cc4e698cc9192Keith Whitwell player->Release(); 1594fc7d0345a18042a79686940fb7cc4e698cc9192Keith Whitwell else 1604fc7d0345a18042a79686940fb7cc4e698cc9192Keith Whitwell player->SetVideoSurface(gfx::ScopedJavaSurface()); 1614fc7d0345a18042a79686940fb7cc4e698cc9192Keith Whitwell} 162229a1a7e4da1a9c60b35b79f2a63e0bab451a76eOlivier Galibert 163229a1a7e4da1a9c60b35b79f2a63e0bab451a76eOlivier Galibertvoid BrowserMediaPlayerManager::OnTimeUpdate(int player_id, 164229a1a7e4da1a9c60b35b79f2a63e0bab451a76eOlivier Galibert base::TimeDelta current_time) { 165229a1a7e4da1a9c60b35b79f2a63e0bab451a76eOlivier Galibert Send(new MediaPlayerMsg_MediaTimeUpdate( 166229a1a7e4da1a9c60b35b79f2a63e0bab451a76eOlivier Galibert routing_id(), player_id, current_time)); 167229a1a7e4da1a9c60b35b79f2a63e0bab451a76eOlivier Galibert} 1684fc7d0345a18042a79686940fb7cc4e698cc9192Keith Whitwell 1694fc7d0345a18042a79686940fb7cc4e698cc9192Keith Whitwellvoid BrowserMediaPlayerManager::SetVideoSurface( 1704fc7d0345a18042a79686940fb7cc4e698cc9192Keith Whitwell gfx::ScopedJavaSurface surface) { 1714fc7d0345a18042a79686940fb7cc4e698cc9192Keith Whitwell MediaPlayerAndroid* player = GetFullscreenPlayer(); 172229a1a7e4da1a9c60b35b79f2a63e0bab451a76eOlivier Galibert if (player) { 1734fc7d0345a18042a79686940fb7cc4e698cc9192Keith Whitwell player->SetVideoSurface(surface.Pass()); 1744fc7d0345a18042a79686940fb7cc4e698cc9192Keith Whitwell Send(new MediaPlayerMsg_DidEnterFullscreen( 1754fc7d0345a18042a79686940fb7cc4e698cc9192Keith Whitwell routing_id(), player->player_id())); 1764fc7d0345a18042a79686940fb7cc4e698cc9192Keith Whitwell } 1774fc7d0345a18042a79686940fb7cc4e698cc9192Keith Whitwell} 178229a1a7e4da1a9c60b35b79f2a63e0bab451a76eOlivier Galibert 179229a1a7e4da1a9c60b35b79f2a63e0bab451a76eOlivier Galibertvoid BrowserMediaPlayerManager::OnMediaMetadataChanged( 180229a1a7e4da1a9c60b35b79f2a63e0bab451a76eOlivier Galibert int player_id, base::TimeDelta duration, int width, int height, 181229a1a7e4da1a9c60b35b79f2a63e0bab451a76eOlivier Galibert bool success) { 182229a1a7e4da1a9c60b35b79f2a63e0bab451a76eOlivier Galibert Send(new MediaPlayerMsg_MediaMetadataChanged( 183229a1a7e4da1a9c60b35b79f2a63e0bab451a76eOlivier Galibert routing_id(), player_id, duration, width, height, success)); 1844fc7d0345a18042a79686940fb7cc4e698cc9192Keith Whitwell if (fullscreen_player_id_ != -1) 1854fc7d0345a18042a79686940fb7cc4e698cc9192Keith Whitwell video_view_->UpdateMediaMetadata(); 186e2329f2795d48d11131e9ac105e7aa3fd2c229c1Brian Paul} 1874fc7d0345a18042a79686940fb7cc4e698cc9192Keith Whitwell 188229a1a7e4da1a9c60b35b79f2a63e0bab451a76eOlivier Galibertvoid BrowserMediaPlayerManager::OnPlaybackComplete(int player_id) { 1894fc7d0345a18042a79686940fb7cc4e698cc9192Keith Whitwell Send(new MediaPlayerMsg_MediaPlaybackCompleted(routing_id(), player_id)); 1904fc7d0345a18042a79686940fb7cc4e698cc9192Keith Whitwell if (fullscreen_player_id_ != -1) 1914fc7d0345a18042a79686940fb7cc4e698cc9192Keith Whitwell video_view_->OnPlaybackComplete(); 192229a1a7e4da1a9c60b35b79f2a63e0bab451a76eOlivier Galibert} 193229a1a7e4da1a9c60b35b79f2a63e0bab451a76eOlivier Galibert 194229a1a7e4da1a9c60b35b79f2a63e0bab451a76eOlivier Galibertvoid BrowserMediaPlayerManager::OnMediaInterrupted(int player_id) { 195229a1a7e4da1a9c60b35b79f2a63e0bab451a76eOlivier Galibert // Tell WebKit that the audio should be paused, then release all resources 196229a1a7e4da1a9c60b35b79f2a63e0bab451a76eOlivier Galibert Send(new MediaPlayerMsg_DidMediaPlayerPause(routing_id(), player_id)); 197229a1a7e4da1a9c60b35b79f2a63e0bab451a76eOlivier Galibert OnReleaseResources(player_id); 198229a1a7e4da1a9c60b35b79f2a63e0bab451a76eOlivier Galibert} 199229a1a7e4da1a9c60b35b79f2a63e0bab451a76eOlivier Galibert 200229a1a7e4da1a9c60b35b79f2a63e0bab451a76eOlivier Galibertvoid BrowserMediaPlayerManager::OnBufferingUpdate( 201229a1a7e4da1a9c60b35b79f2a63e0bab451a76eOlivier Galibert int player_id, int percentage) { 2024fc7d0345a18042a79686940fb7cc4e698cc9192Keith Whitwell Send(new MediaPlayerMsg_MediaBufferingUpdate( 2034fc7d0345a18042a79686940fb7cc4e698cc9192Keith Whitwell routing_id(), player_id, percentage)); 204e2329f2795d48d11131e9ac105e7aa3fd2c229c1Brian Paul if (fullscreen_player_id_ != -1) 2054fc7d0345a18042a79686940fb7cc4e698cc9192Keith Whitwell video_view_->OnBufferingUpdate(percentage); 206229a1a7e4da1a9c60b35b79f2a63e0bab451a76eOlivier Galibert} 207229a1a7e4da1a9c60b35b79f2a63e0bab451a76eOlivier Galibert 208229a1a7e4da1a9c60b35b79f2a63e0bab451a76eOlivier Galibertvoid BrowserMediaPlayerManager::OnSeekRequest( 209229a1a7e4da1a9c60b35b79f2a63e0bab451a76eOlivier Galibert int player_id, 210229a1a7e4da1a9c60b35b79f2a63e0bab451a76eOlivier Galibert const base::TimeDelta& time_to_seek) { 211229a1a7e4da1a9c60b35b79f2a63e0bab451a76eOlivier Galibert Send(new MediaPlayerMsg_SeekRequest(routing_id(), player_id, time_to_seek)); 212229a1a7e4da1a9c60b35b79f2a63e0bab451a76eOlivier Galibert} 213229a1a7e4da1a9c60b35b79f2a63e0bab451a76eOlivier Galibert 214229a1a7e4da1a9c60b35b79f2a63e0bab451a76eOlivier Galibertvoid BrowserMediaPlayerManager::OnSeekComplete( 215229a1a7e4da1a9c60b35b79f2a63e0bab451a76eOlivier Galibert int player_id, 216229a1a7e4da1a9c60b35b79f2a63e0bab451a76eOlivier Galibert const base::TimeDelta& current_time) { 2174fc7d0345a18042a79686940fb7cc4e698cc9192Keith Whitwell Send(new MediaPlayerMsg_SeekCompleted(routing_id(), player_id, current_time)); 2184fc7d0345a18042a79686940fb7cc4e698cc9192Keith Whitwell} 219e2329f2795d48d11131e9ac105e7aa3fd2c229c1Brian Paul 2204fc7d0345a18042a79686940fb7cc4e698cc9192Keith Whitwellvoid BrowserMediaPlayerManager::OnError(int player_id, int error) { 221229a1a7e4da1a9c60b35b79f2a63e0bab451a76eOlivier Galibert Send(new MediaPlayerMsg_MediaError(routing_id(), player_id, error)); 2224fc7d0345a18042a79686940fb7cc4e698cc9192Keith Whitwell if (fullscreen_player_id_ != -1) 2234fc7d0345a18042a79686940fb7cc4e698cc9192Keith Whitwell video_view_->OnMediaPlayerError(error); 2244fc7d0345a18042a79686940fb7cc4e698cc9192Keith Whitwell} 2254fc7d0345a18042a79686940fb7cc4e698cc9192Keith Whitwell 2264fc7d0345a18042a79686940fb7cc4e698cc9192Keith Whitwellvoid BrowserMediaPlayerManager::OnVideoSizeChanged( 227229a1a7e4da1a9c60b35b79f2a63e0bab451a76eOlivier Galibert int player_id, int width, int height) { 228229a1a7e4da1a9c60b35b79f2a63e0bab451a76eOlivier Galibert Send(new MediaPlayerMsg_MediaVideoSizeChanged(routing_id(), player_id, 229229a1a7e4da1a9c60b35b79f2a63e0bab451a76eOlivier Galibert width, height)); 230229a1a7e4da1a9c60b35b79f2a63e0bab451a76eOlivier Galibert if (fullscreen_player_id_ != -1) 231229a1a7e4da1a9c60b35b79f2a63e0bab451a76eOlivier Galibert video_view_->OnVideoSizeChanged(width, height); 232229a1a7e4da1a9c60b35b79f2a63e0bab451a76eOlivier Galibert} 233229a1a7e4da1a9c60b35b79f2a63e0bab451a76eOlivier Galibert 2344fc7d0345a18042a79686940fb7cc4e698cc9192Keith Whitwellvoid BrowserMediaPlayerManager::RequestMediaResources(int player_id) { 2354fc7d0345a18042a79686940fb7cc4e698cc9192Keith Whitwell int num_active_player = 0; 2364fc7d0345a18042a79686940fb7cc4e698cc9192Keith Whitwell ScopedVector<MediaPlayerAndroid>::iterator it; 2374fc7d0345a18042a79686940fb7cc4e698cc9192Keith Whitwell for (it = players_.begin(); it != players_.end(); ++it) { 238229a1a7e4da1a9c60b35b79f2a63e0bab451a76eOlivier Galibert if (!(*it)->IsPlayerReady()) 2394fc7d0345a18042a79686940fb7cc4e698cc9192Keith Whitwell continue; 2404fc7d0345a18042a79686940fb7cc4e698cc9192Keith Whitwell 2414fc7d0345a18042a79686940fb7cc4e698cc9192Keith Whitwell // The player is already active, ignore it. 2424fc7d0345a18042a79686940fb7cc4e698cc9192Keith Whitwell if ((*it)->player_id() == player_id) 2434fc7d0345a18042a79686940fb7cc4e698cc9192Keith Whitwell return; 244229a1a7e4da1a9c60b35b79f2a63e0bab451a76eOlivier Galibert else 245229a1a7e4da1a9c60b35b79f2a63e0bab451a76eOlivier Galibert num_active_player++; 246229a1a7e4da1a9c60b35b79f2a63e0bab451a76eOlivier Galibert } 247229a1a7e4da1a9c60b35b79f2a63e0bab451a76eOlivier Galibert 248229a1a7e4da1a9c60b35b79f2a63e0bab451a76eOlivier Galibert // Number of active players are less than the threshold, do nothing. 249229a1a7e4da1a9c60b35b79f2a63e0bab451a76eOlivier Galibert if (num_active_player < kMediaPlayerThreshold) 250229a1a7e4da1a9c60b35b79f2a63e0bab451a76eOlivier Galibert return; 2510dc4eea64f56cc93e5359372b08b99a2d600273cBrian 2520dc4eea64f56cc93e5359372b08b99a2d600273cBrian for (it = players_.begin(); it != players_.end(); ++it) { 25308f33a025100dea2d951e6d628891fe294b18082Brian if ((*it)->IsPlayerReady() && !(*it)->IsPlaying() && 25408f33a025100dea2d951e6d628891fe294b18082Brian fullscreen_player_id_ != (*it)->player_id()) { 255229a1a7e4da1a9c60b35b79f2a63e0bab451a76eOlivier Galibert (*it)->Release(); 25608f33a025100dea2d951e6d628891fe294b18082Brian Send(new MediaPlayerMsg_MediaPlayerReleased( 257229a1a7e4da1a9c60b35b79f2a63e0bab451a76eOlivier Galibert routing_id(), (*it)->player_id())); 25808f33a025100dea2d951e6d628891fe294b18082Brian } 259229a1a7e4da1a9c60b35b79f2a63e0bab451a76eOlivier Galibert } 260229a1a7e4da1a9c60b35b79f2a63e0bab451a76eOlivier Galibert} 261229a1a7e4da1a9c60b35b79f2a63e0bab451a76eOlivier Galibert 262229a1a7e4da1a9c60b35b79f2a63e0bab451a76eOlivier Galibertvoid BrowserMediaPlayerManager::ReleaseMediaResources(int player_id) { 26308f33a025100dea2d951e6d628891fe294b18082Brian // Nothing needs to be done. 2644fc7d0345a18042a79686940fb7cc4e698cc9192Keith Whitwell} 265229a1a7e4da1a9c60b35b79f2a63e0bab451a76eOlivier Galibert 266229a1a7e4da1a9c60b35b79f2a63e0bab451a76eOlivier Galibertmedia::MediaResourceGetter* 267229a1a7e4da1a9c60b35b79f2a63e0bab451a76eOlivier GalibertBrowserMediaPlayerManager::GetMediaResourceGetter() { 268229a1a7e4da1a9c60b35b79f2a63e0bab451a76eOlivier Galibert if (!media_resource_getter_.get()) { 269229a1a7e4da1a9c60b35b79f2a63e0bab451a76eOlivier Galibert RenderProcessHost* host = render_view_host()->GetProcess(); 270229a1a7e4da1a9c60b35b79f2a63e0bab451a76eOlivier Galibert BrowserContext* context = host->GetBrowserContext(); 271229a1a7e4da1a9c60b35b79f2a63e0bab451a76eOlivier Galibert StoragePartition* partition = host->GetStoragePartition(); 2724fc7d0345a18042a79686940fb7cc4e698cc9192Keith Whitwell fileapi::FileSystemContext* file_system_context = 2734fc7d0345a18042a79686940fb7cc4e698cc9192Keith Whitwell partition ? partition->GetFileSystemContext() : NULL; 274e2329f2795d48d11131e9ac105e7aa3fd2c229c1Brian Paul media_resource_getter_.reset(new MediaResourceGetterImpl( 2754fc7d0345a18042a79686940fb7cc4e698cc9192Keith Whitwell context, file_system_context, host->GetID(), routing_id())); 276229a1a7e4da1a9c60b35b79f2a63e0bab451a76eOlivier Galibert } 277229a1a7e4da1a9c60b35b79f2a63e0bab451a76eOlivier Galibert return media_resource_getter_.get(); 278229a1a7e4da1a9c60b35b79f2a63e0bab451a76eOlivier Galibert} 279229a1a7e4da1a9c60b35b79f2a63e0bab451a76eOlivier Galibert 280229a1a7e4da1a9c60b35b79f2a63e0bab451a76eOlivier GalibertMediaPlayerAndroid* BrowserMediaPlayerManager::GetFullscreenPlayer() { 281229a1a7e4da1a9c60b35b79f2a63e0bab451a76eOlivier Galibert return GetPlayer(fullscreen_player_id_); 282229a1a7e4da1a9c60b35b79f2a63e0bab451a76eOlivier Galibert} 283229a1a7e4da1a9c60b35b79f2a63e0bab451a76eOlivier Galibert 2844fc7d0345a18042a79686940fb7cc4e698cc9192Keith WhitwellMediaPlayerAndroid* BrowserMediaPlayerManager::GetPlayer(int player_id) { 28538bee46e83b18ff4ad42d340b507b1a15b4326c7Brian for (ScopedVector<MediaPlayerAndroid>::iterator it = players_.begin(); 286e2329f2795d48d11131e9ac105e7aa3fd2c229c1Brian Paul it != players_.end(); ++it) { 2874fc7d0345a18042a79686940fb7cc4e698cc9192Keith Whitwell if ((*it)->player_id() == player_id) 288229a1a7e4da1a9c60b35b79f2a63e0bab451a76eOlivier Galibert return *it; 289229a1a7e4da1a9c60b35b79f2a63e0bab451a76eOlivier Galibert } 290229a1a7e4da1a9c60b35b79f2a63e0bab451a76eOlivier Galibert return NULL; 291229a1a7e4da1a9c60b35b79f2a63e0bab451a76eOlivier Galibert} 292229a1a7e4da1a9c60b35b79f2a63e0bab451a76eOlivier Galibert 293229a1a7e4da1a9c60b35b79f2a63e0bab451a76eOlivier GalibertMediaDrmBridge* BrowserMediaPlayerManager::GetDrmBridge(int media_keys_id) { 294229a1a7e4da1a9c60b35b79f2a63e0bab451a76eOlivier Galibert for (ScopedVector<MediaDrmBridge>::iterator it = drm_bridges_.begin(); 295229a1a7e4da1a9c60b35b79f2a63e0bab451a76eOlivier Galibert it != drm_bridges_.end(); ++it) { 296229a1a7e4da1a9c60b35b79f2a63e0bab451a76eOlivier Galibert if ((*it)->media_keys_id() == media_keys_id) 297229a1a7e4da1a9c60b35b79f2a63e0bab451a76eOlivier Galibert return *it; 298229a1a7e4da1a9c60b35b79f2a63e0bab451a76eOlivier Galibert } 299229a1a7e4da1a9c60b35b79f2a63e0bab451a76eOlivier Galibert return NULL; 3004fc7d0345a18042a79686940fb7cc4e698cc9192Keith Whitwell} 3014fc7d0345a18042a79686940fb7cc4e698cc9192Keith Whitwell 302e2329f2795d48d11131e9ac105e7aa3fd2c229c1Brian Paulvoid BrowserMediaPlayerManager::DestroyAllMediaPlayers() { 3034fc7d0345a18042a79686940fb7cc4e698cc9192Keith Whitwell players_.clear(); 304229a1a7e4da1a9c60b35b79f2a63e0bab451a76eOlivier Galibert drm_bridges_.clear(); 305229a1a7e4da1a9c60b35b79f2a63e0bab451a76eOlivier Galibert if (fullscreen_player_id_ != -1) { 3064fc7d0345a18042a79686940fb7cc4e698cc9192Keith Whitwell video_view_.reset(); 3074fc7d0345a18042a79686940fb7cc4e698cc9192Keith Whitwell fullscreen_player_id_ = -1; 3084fc7d0345a18042a79686940fb7cc4e698cc9192Keith Whitwell } 309229a1a7e4da1a9c60b35b79f2a63e0bab451a76eOlivier Galibert} 310229a1a7e4da1a9c60b35b79f2a63e0bab451a76eOlivier Galibert 311229a1a7e4da1a9c60b35b79f2a63e0bab451a76eOlivier Galibertvoid BrowserMediaPlayerManager::OnProtectedSurfaceRequested(int player_id) { 312229a1a7e4da1a9c60b35b79f2a63e0bab451a76eOlivier Galibert if (fullscreen_player_id_ == player_id) 313229a1a7e4da1a9c60b35b79f2a63e0bab451a76eOlivier Galibert return; 3144fc7d0345a18042a79686940fb7cc4e698cc9192Keith Whitwell 3154fc7d0345a18042a79686940fb7cc4e698cc9192Keith Whitwell if (fullscreen_player_id_ != -1) { 3164fc7d0345a18042a79686940fb7cc4e698cc9192Keith Whitwell // TODO(qinmin): Determine the correct error code we should report to WMPA. 3174fc7d0345a18042a79686940fb7cc4e698cc9192Keith Whitwell OnError(player_id, MediaPlayerAndroid::MEDIA_ERROR_DECODE); 318229a1a7e4da1a9c60b35b79f2a63e0bab451a76eOlivier Galibert return; 319229a1a7e4da1a9c60b35b79f2a63e0bab451a76eOlivier Galibert } 320229a1a7e4da1a9c60b35b79f2a63e0bab451a76eOlivier Galibert 321229a1a7e4da1a9c60b35b79f2a63e0bab451a76eOlivier Galibert // If the player is pending approval, wait for the approval to happen. 322229a1a7e4da1a9c60b35b79f2a63e0bab451a76eOlivier Galibert if (media_keys_ids_pending_approval_.end() != 323229a1a7e4da1a9c60b35b79f2a63e0bab451a76eOlivier Galibert media_keys_ids_pending_approval_.find(player_id)) { 324229a1a7e4da1a9c60b35b79f2a63e0bab451a76eOlivier Galibert pending_fullscreen_player_id_ = player_id; 325229a1a7e4da1a9c60b35b79f2a63e0bab451a76eOlivier Galibert return; 326229a1a7e4da1a9c60b35b79f2a63e0bab451a76eOlivier Galibert } 327229a1a7e4da1a9c60b35b79f2a63e0bab451a76eOlivier Galibert 328229a1a7e4da1a9c60b35b79f2a63e0bab451a76eOlivier Galibert OnEnterFullscreen(player_id); 329229a1a7e4da1a9c60b35b79f2a63e0bab451a76eOlivier Galibert} 330229a1a7e4da1a9c60b35b79f2a63e0bab451a76eOlivier Galibert 331229a1a7e4da1a9c60b35b79f2a63e0bab451a76eOlivier Galibertvoid BrowserMediaPlayerManager::OnKeyAdded(int media_keys_id, 332229a1a7e4da1a9c60b35b79f2a63e0bab451a76eOlivier Galibert const std::string& session_id) { 3334fc7d0345a18042a79686940fb7cc4e698cc9192Keith Whitwell Send(new MediaKeysMsg_KeyAdded(routing_id(), media_keys_id, session_id)); 3344fc7d0345a18042a79686940fb7cc4e698cc9192Keith Whitwell} 335e2329f2795d48d11131e9ac105e7aa3fd2c229c1Brian Paul 3364fc7d0345a18042a79686940fb7cc4e698cc9192Keith Whitwellvoid BrowserMediaPlayerManager::OnKeyError( 337229a1a7e4da1a9c60b35b79f2a63e0bab451a76eOlivier Galibert int media_keys_id, 338229a1a7e4da1a9c60b35b79f2a63e0bab451a76eOlivier Galibert const std::string& session_id, 339229a1a7e4da1a9c60b35b79f2a63e0bab451a76eOlivier Galibert media::MediaKeys::KeyError error_code, 340229a1a7e4da1a9c60b35b79f2a63e0bab451a76eOlivier Galibert int system_code) { 341229a1a7e4da1a9c60b35b79f2a63e0bab451a76eOlivier Galibert Send(new MediaKeysMsg_KeyError(routing_id(), media_keys_id, 342229a1a7e4da1a9c60b35b79f2a63e0bab451a76eOlivier Galibert session_id, error_code, system_code)); 343229a1a7e4da1a9c60b35b79f2a63e0bab451a76eOlivier Galibert} 344229a1a7e4da1a9c60b35b79f2a63e0bab451a76eOlivier Galibert 345229a1a7e4da1a9c60b35b79f2a63e0bab451a76eOlivier Galibertvoid BrowserMediaPlayerManager::OnKeyMessage( 346229a1a7e4da1a9c60b35b79f2a63e0bab451a76eOlivier Galibert int media_keys_id, 347229a1a7e4da1a9c60b35b79f2a63e0bab451a76eOlivier Galibert const std::string& session_id, 348229a1a7e4da1a9c60b35b79f2a63e0bab451a76eOlivier Galibert const std::vector<uint8>& message, 3494fc7d0345a18042a79686940fb7cc4e698cc9192Keith Whitwell const std::string& destination_url) { 3504fc7d0345a18042a79686940fb7cc4e698cc9192Keith Whitwell Send(new MediaKeysMsg_KeyMessage(routing_id(), media_keys_id, 351e2329f2795d48d11131e9ac105e7aa3fd2c229c1Brian Paul session_id, message, destination_url)); 3524fc7d0345a18042a79686940fb7cc4e698cc9192Keith Whitwell} 353229a1a7e4da1a9c60b35b79f2a63e0bab451a76eOlivier Galibert 354229a1a7e4da1a9c60b35b79f2a63e0bab451a76eOlivier Galibert#if defined(GOOGLE_TV) 355229a1a7e4da1a9c60b35b79f2a63e0bab451a76eOlivier Galibertvoid BrowserMediaPlayerManager::AttachExternalVideoSurface(int player_id, 356229a1a7e4da1a9c60b35b79f2a63e0bab451a76eOlivier Galibert jobject surface) { 357229a1a7e4da1a9c60b35b79f2a63e0bab451a76eOlivier Galibert MediaPlayerAndroid* player = GetPlayer(player_id); 358229a1a7e4da1a9c60b35b79f2a63e0bab451a76eOlivier Galibert if (player) { 359229a1a7e4da1a9c60b35b79f2a63e0bab451a76eOlivier Galibert player->SetVideoSurface( 360229a1a7e4da1a9c60b35b79f2a63e0bab451a76eOlivier Galibert gfx::ScopedJavaSurface::AcquireExternalSurface(surface)); 361229a1a7e4da1a9c60b35b79f2a63e0bab451a76eOlivier Galibert } 362229a1a7e4da1a9c60b35b79f2a63e0bab451a76eOlivier Galibert} 363229a1a7e4da1a9c60b35b79f2a63e0bab451a76eOlivier Galibert 364229a1a7e4da1a9c60b35b79f2a63e0bab451a76eOlivier Galibertvoid BrowserMediaPlayerManager::DetachExternalVideoSurface(int player_id) { 365229a1a7e4da1a9c60b35b79f2a63e0bab451a76eOlivier Galibert MediaPlayerAndroid* player = GetPlayer(player_id); 366229a1a7e4da1a9c60b35b79f2a63e0bab451a76eOlivier Galibert if (player) 367229a1a7e4da1a9c60b35b79f2a63e0bab451a76eOlivier Galibert player->SetVideoSurface(gfx::ScopedJavaSurface()); 368229a1a7e4da1a9c60b35b79f2a63e0bab451a76eOlivier Galibert} 3694fc7d0345a18042a79686940fb7cc4e698cc9192Keith Whitwell 3704fc7d0345a18042a79686940fb7cc4e698cc9192Keith Whitwellvoid BrowserMediaPlayerManager::OnNotifyExternalSurface( 371e2329f2795d48d11131e9ac105e7aa3fd2c229c1Brian Paul int player_id, bool is_request, const gfx::RectF& rect) { 3724fc7d0345a18042a79686940fb7cc4e698cc9192Keith Whitwell if (!web_contents_) 373229a1a7e4da1a9c60b35b79f2a63e0bab451a76eOlivier Galibert return; 374229a1a7e4da1a9c60b35b79f2a63e0bab451a76eOlivier Galibert 3754fc7d0345a18042a79686940fb7cc4e698cc9192Keith Whitwell WebContentsViewAndroid* view = 3764fc7d0345a18042a79686940fb7cc4e698cc9192Keith Whitwell static_cast<WebContentsViewAndroid*>(web_contents_->GetView()); 3774fc7d0345a18042a79686940fb7cc4e698cc9192Keith Whitwell if (view) 378229a1a7e4da1a9c60b35b79f2a63e0bab451a76eOlivier Galibert view->NotifyExternalSurface(player_id, is_request, rect); 379229a1a7e4da1a9c60b35b79f2a63e0bab451a76eOlivier Galibert} 380229a1a7e4da1a9c60b35b79f2a63e0bab451a76eOlivier Galibert#endif 381229a1a7e4da1a9c60b35b79f2a63e0bab451a76eOlivier Galibert 382229a1a7e4da1a9c60b35b79f2a63e0bab451a76eOlivier Galibertvoid BrowserMediaPlayerManager::DisableFullscreenEncryptedMediaPlayback() { 383229a1a7e4da1a9c60b35b79f2a63e0bab451a76eOlivier Galibert if (fullscreen_player_id_ == -1) 384229a1a7e4da1a9c60b35b79f2a63e0bab451a76eOlivier Galibert return; 385229a1a7e4da1a9c60b35b79f2a63e0bab451a76eOlivier Galibert 386229a1a7e4da1a9c60b35b79f2a63e0bab451a76eOlivier Galibert // If the fullscreen player is not playing back encrypted video, do nothing. 387229a1a7e4da1a9c60b35b79f2a63e0bab451a76eOlivier Galibert MediaDrmBridge* drm_bridge = GetDrmBridge(fullscreen_player_id_); 388229a1a7e4da1a9c60b35b79f2a63e0bab451a76eOlivier Galibert if (!drm_bridge) 3890dc4eea64f56cc93e5359372b08b99a2d600273cBrian return; 3900dc4eea64f56cc93e5359372b08b99a2d600273cBrian 3910dc4eea64f56cc93e5359372b08b99a2d600273cBrian // Exit fullscreen. 392b1c8fa5b6002296d9abe21c06d5cb81a3f70828aBrian pending_fullscreen_player_id_ = fullscreen_player_id_; 393b5b128b26841e7f947edd8f0cbcc91a530d6bb8fBrian Paul OnExitFullscreen(fullscreen_player_id_); 394b1c8fa5b6002296d9abe21c06d5cb81a3f70828aBrian} 3954fc7d0345a18042a79686940fb7cc4e698cc9192Keith Whitwell 396229a1a7e4da1a9c60b35b79f2a63e0bab451a76eOlivier Galibertvoid BrowserMediaPlayerManager::OnEnterFullscreen(int player_id) { 397b1c8fa5b6002296d9abe21c06d5cb81a3f70828aBrian DCHECK_EQ(fullscreen_player_id_, -1); 398229a1a7e4da1a9c60b35b79f2a63e0bab451a76eOlivier Galibert 399229a1a7e4da1a9c60b35b79f2a63e0bab451a76eOlivier Galibert if (video_view_.get()) { 4004fc7d0345a18042a79686940fb7cc4e698cc9192Keith Whitwell fullscreen_player_id_ = player_id; 4014fc7d0345a18042a79686940fb7cc4e698cc9192Keith Whitwell video_view_->OpenVideo(); 402e2329f2795d48d11131e9ac105e7aa3fd2c229c1Brian Paul } else if (!ContentVideoView::HasContentVideoView()) { 403e2329f2795d48d11131e9ac105e7aa3fd2c229c1Brian Paul // In Android WebView, two ContentViewCores could both try to enter 404b5b128b26841e7f947edd8f0cbcc91a530d6bb8fBrian Paul // fullscreen video, we just ignore the second one. 4054fc7d0345a18042a79686940fb7cc4e698cc9192Keith Whitwell fullscreen_player_id_ = player_id; 4064fc7d0345a18042a79686940fb7cc4e698cc9192Keith Whitwell WebContents* web_contents = 407229a1a7e4da1a9c60b35b79f2a63e0bab451a76eOlivier Galibert WebContents::FromRenderViewHost(render_view_host()); 4084fc7d0345a18042a79686940fb7cc4e698cc9192Keith Whitwell ContentViewCoreImpl* content_view_core_impl = 409229a1a7e4da1a9c60b35b79f2a63e0bab451a76eOlivier Galibert ContentViewCoreImpl::FromWebContents(web_contents); 410b5b128b26841e7f947edd8f0cbcc91a530d6bb8fBrian Paul video_view_.reset(new ContentVideoView(content_view_core_impl->GetContext(), 411b5b128b26841e7f947edd8f0cbcc91a530d6bb8fBrian Paul content_view_core_impl->GetContentVideoViewClient(), this)); 412b5b128b26841e7f947edd8f0cbcc91a530d6bb8fBrian Paul } 413b5b128b26841e7f947edd8f0cbcc91a530d6bb8fBrian Paul} 414b5b128b26841e7f947edd8f0cbcc91a530d6bb8fBrian Paul 415b5b128b26841e7f947edd8f0cbcc91a530d6bb8fBrian Paulvoid BrowserMediaPlayerManager::OnExitFullscreen(int player_id) { 416b5b128b26841e7f947edd8f0cbcc91a530d6bb8fBrian Paul if (fullscreen_player_id_ == player_id) { 417229a1a7e4da1a9c60b35b79f2a63e0bab451a76eOlivier Galibert MediaPlayerAndroid* player = GetPlayer(player_id); 418b5b128b26841e7f947edd8f0cbcc91a530d6bb8fBrian Paul if (player) 419229a1a7e4da1a9c60b35b79f2a63e0bab451a76eOlivier Galibert player->SetVideoSurface(gfx::ScopedJavaSurface()); 420b1c8fa5b6002296d9abe21c06d5cb81a3f70828aBrian video_view_->OnExitFullscreen(); 421b1c8fa5b6002296d9abe21c06d5cb81a3f70828aBrian } 422b1c8fa5b6002296d9abe21c06d5cb81a3f70828aBrian} 423b1c8fa5b6002296d9abe21c06d5cb81a3f70828aBrian 424b5b128b26841e7f947edd8f0cbcc91a530d6bb8fBrian Paulvoid BrowserMediaPlayerManager::OnInitialize( 425b1c8fa5b6002296d9abe21c06d5cb81a3f70828aBrian MediaPlayerHostMsg_Initialize_Type type, 4264fc7d0345a18042a79686940fb7cc4e698cc9192Keith Whitwell int player_id, 427229a1a7e4da1a9c60b35b79f2a63e0bab451a76eOlivier Galibert const GURL& url, 428229a1a7e4da1a9c60b35b79f2a63e0bab451a76eOlivier Galibert const GURL& first_party_for_cookies, 429229a1a7e4da1a9c60b35b79f2a63e0bab451a76eOlivier Galibert int demuxer_client_id) { 430229a1a7e4da1a9c60b35b79f2a63e0bab451a76eOlivier Galibert DCHECK(type != MEDIA_PLAYER_TYPE_MEDIA_SOURCE || demuxer_client_id > 0) 431229a1a7e4da1a9c60b35b79f2a63e0bab451a76eOlivier Galibert << "Media source players must have positive demuxer client IDs: " 432229a1a7e4da1a9c60b35b79f2a63e0bab451a76eOlivier Galibert << demuxer_client_id; 433229a1a7e4da1a9c60b35b79f2a63e0bab451a76eOlivier Galibert 434229a1a7e4da1a9c60b35b79f2a63e0bab451a76eOlivier Galibert RemovePlayer(player_id); 435b1c8fa5b6002296d9abe21c06d5cb81a3f70828aBrian 436b1c8fa5b6002296d9abe21c06d5cb81a3f70828aBrian RenderProcessHostImpl* host = 437e2329f2795d48d11131e9ac105e7aa3fd2c229c1Brian Paul static_cast<RenderProcessHostImpl*>(render_view_host()->GetProcess()); 438b5b128b26841e7f947edd8f0cbcc91a530d6bb8fBrian Paul AddPlayer(CreateMediaPlayer( 439b5b128b26841e7f947edd8f0cbcc91a530d6bb8fBrian Paul type, player_id, url, first_party_for_cookies, demuxer_client_id, 440b5b128b26841e7f947edd8f0cbcc91a530d6bb8fBrian Paul host->GetBrowserContext()->IsOffTheRecord(), this, 4414fc7d0345a18042a79686940fb7cc4e698cc9192Keith Whitwell host->browser_demuxer_android())); 442229a1a7e4da1a9c60b35b79f2a63e0bab451a76eOlivier Galibert} 443229a1a7e4da1a9c60b35b79f2a63e0bab451a76eOlivier Galibert 444229a1a7e4da1a9c60b35b79f2a63e0bab451a76eOlivier Galibertvoid BrowserMediaPlayerManager::OnStart(int player_id) { 445229a1a7e4da1a9c60b35b79f2a63e0bab451a76eOlivier Galibert MediaPlayerAndroid* player = GetPlayer(player_id); 446229a1a7e4da1a9c60b35b79f2a63e0bab451a76eOlivier Galibert if (player) 447229a1a7e4da1a9c60b35b79f2a63e0bab451a76eOlivier Galibert player->Start(); 448229a1a7e4da1a9c60b35b79f2a63e0bab451a76eOlivier Galibert} 449229a1a7e4da1a9c60b35b79f2a63e0bab451a76eOlivier Galibert 450229a1a7e4da1a9c60b35b79f2a63e0bab451a76eOlivier Galibertvoid BrowserMediaPlayerManager::OnSeek( 451229a1a7e4da1a9c60b35b79f2a63e0bab451a76eOlivier Galibert int player_id, 452b5b128b26841e7f947edd8f0cbcc91a530d6bb8fBrian Paul const base::TimeDelta& time) { 453b5b128b26841e7f947edd8f0cbcc91a530d6bb8fBrian Paul MediaPlayerAndroid* player = GetPlayer(player_id); 454b5b128b26841e7f947edd8f0cbcc91a530d6bb8fBrian Paul if (player) 455b5b128b26841e7f947edd8f0cbcc91a530d6bb8fBrian Paul player->SeekTo(time); 456b5b128b26841e7f947edd8f0cbcc91a530d6bb8fBrian Paul} 457b5b128b26841e7f947edd8f0cbcc91a530d6bb8fBrian Paul 458b5b128b26841e7f947edd8f0cbcc91a530d6bb8fBrian Paulvoid BrowserMediaPlayerManager::OnPause( 459229a1a7e4da1a9c60b35b79f2a63e0bab451a76eOlivier Galibert int player_id, 460229a1a7e4da1a9c60b35b79f2a63e0bab451a76eOlivier Galibert bool is_media_related_action) { 461229a1a7e4da1a9c60b35b79f2a63e0bab451a76eOlivier Galibert MediaPlayerAndroid* player = GetPlayer(player_id); 462229a1a7e4da1a9c60b35b79f2a63e0bab451a76eOlivier Galibert if (player) 463229a1a7e4da1a9c60b35b79f2a63e0bab451a76eOlivier Galibert player->Pause(is_media_related_action); 464229a1a7e4da1a9c60b35b79f2a63e0bab451a76eOlivier Galibert} 465229a1a7e4da1a9c60b35b79f2a63e0bab451a76eOlivier Galibert 466229a1a7e4da1a9c60b35b79f2a63e0bab451a76eOlivier Galibertvoid BrowserMediaPlayerManager::OnSetVolume(int player_id, double volume) { 467229a1a7e4da1a9c60b35b79f2a63e0bab451a76eOlivier Galibert MediaPlayerAndroid* player = GetPlayer(player_id); 468229a1a7e4da1a9c60b35b79f2a63e0bab451a76eOlivier Galibert if (player) 4694fc7d0345a18042a79686940fb7cc4e698cc9192Keith Whitwell player->SetVolume(volume); 4704fc7d0345a18042a79686940fb7cc4e698cc9192Keith Whitwell} 47134a48abd5ff82ce9748fc29191e35a0985d47c5fBrian 472779e9cb658dba4ef44fae7e8aa62409f7227f46cBrian Paulvoid BrowserMediaPlayerManager::OnReleaseResources(int player_id) { 473779e9cb658dba4ef44fae7e8aa62409f7227f46cBrian Paul MediaPlayerAndroid* player = GetPlayer(player_id); 474779e9cb658dba4ef44fae7e8aa62409f7227f46cBrian Paul // Don't release the fullscreen player when tab visibility changes, 475779e9cb658dba4ef44fae7e8aa62409f7227f46cBrian Paul // it will be released when user hit the back/home button or when 476229a1a7e4da1a9c60b35b79f2a63e0bab451a76eOlivier Galibert // OnDestroyPlayer is called. 477779e9cb658dba4ef44fae7e8aa62409f7227f46cBrian Paul if (player && player_id != fullscreen_player_id_) 478229a1a7e4da1a9c60b35b79f2a63e0bab451a76eOlivier Galibert player->Release(); 479229a1a7e4da1a9c60b35b79f2a63e0bab451a76eOlivier Galibert 480779e9cb658dba4ef44fae7e8aa62409f7227f46cBrian Paul#if defined(GOOGLE_TV) 481779e9cb658dba4ef44fae7e8aa62409f7227f46cBrian Paul WebContentsViewAndroid* view = 48234a48abd5ff82ce9748fc29191e35a0985d47c5fBrian static_cast<WebContentsViewAndroid*>(web_contents_->GetView()); 483b4480285ed5098f1c862690ee105dd46f5e6cd1eBrian if (view) 484b4480285ed5098f1c862690ee105dd46f5e6cd1eBrian view->NotifyExternalSurface(player_id, false, gfx::RectF()); 485b4480285ed5098f1c862690ee105dd46f5e6cd1eBrian#endif 486b4480285ed5098f1c862690ee105dd46f5e6cd1eBrian} 487b4480285ed5098f1c862690ee105dd46f5e6cd1eBrian 488f3955f6fcdd1a3106a6538642131ccea5ef1cef0Brian Paulvoid BrowserMediaPlayerManager::OnDestroyPlayer(int player_id) { 4896b63e25b3d7a6ac0bd738c139ead0c7e7ad84368Tom Stellard RemovePlayer(player_id); 4906b63e25b3d7a6ac0bd738c139ead0c7e7ad84368Tom Stellard if (fullscreen_player_id_ == player_id) 4916b63e25b3d7a6ac0bd738c139ead0c7e7ad84368Tom Stellard fullscreen_player_id_ = -1; 492b4480285ed5098f1c862690ee105dd46f5e6cd1eBrian} 49321148e6a8806736b4487da41b01e2d3c01cbc743Henri Verbeet 4944fc7d0345a18042a79686940fb7cc4e698cc9192Keith Whitwellvoid BrowserMediaPlayerManager::OnInitializeCDM( 4954fc7d0345a18042a79686940fb7cc4e698cc9192Keith Whitwell int media_keys_id, 4969acdd7739b729375444f8669fc2419d9eb57acc5Henri Verbeet const std::vector<uint8>& uuid, 497b4480285ed5098f1c862690ee105dd46f5e6cd1eBrian const GURL& frame_url) { 4984bfe1c955fe679547c8a03119d1681e33593c768Michal Krol AddDrmBridge(media_keys_id, uuid, frame_url); 499b4480285ed5098f1c862690ee105dd46f5e6cd1eBrian // In EME v0.1b MediaKeys lives in the media element. So the |media_keys_id| 500b4480285ed5098f1c862690ee105dd46f5e6cd1eBrian // is the same as the |player_id|. 501e2329f2795d48d11131e9ac105e7aa3fd2c229c1Brian Paul OnSetMediaKeys(media_keys_id, media_keys_id); 5024fc7d0345a18042a79686940fb7cc4e698cc9192Keith Whitwell} 503f3955f6fcdd1a3106a6538642131ccea5ef1cef0Brian Paul 5046b63e25b3d7a6ac0bd738c139ead0c7e7ad84368Tom Stellardvoid BrowserMediaPlayerManager::OnGenerateKeyRequest( 5056b63e25b3d7a6ac0bd738c139ead0c7e7ad84368Tom Stellard int media_keys_id, 5066b63e25b3d7a6ac0bd738c139ead0c7e7ad84368Tom Stellard const std::string& type, 50709a1b912605ff48c8782dcc5aae55ac77e27037bBrian const std::vector<uint8>& init_data) { 50821148e6a8806736b4487da41b01e2d3c01cbc743Henri Verbeet if (CommandLine::ForCurrentProcess() 5094fc7d0345a18042a79686940fb7cc4e698cc9192Keith Whitwell ->HasSwitch(switches::kDisableInfobarForProtectedMediaIdentifier)) { 5104fc7d0345a18042a79686940fb7cc4e698cc9192Keith Whitwell GenerateKeyIfAllowed(media_keys_id, type, init_data, true); 5114fc7d0345a18042a79686940fb7cc4e698cc9192Keith Whitwell return; 5124fc7d0345a18042a79686940fb7cc4e698cc9192Keith Whitwell } 5139acdd7739b729375444f8669fc2419d9eb57acc5Henri Verbeet 5149acdd7739b729375444f8669fc2419d9eb57acc5Henri Verbeet MediaDrmBridge* drm_bridge = GetDrmBridge(media_keys_id); 5154fc7d0345a18042a79686940fb7cc4e698cc9192Keith Whitwell if (!drm_bridge) { 516c7722edcfdf36e0d0bfdc51013ecb199fc7fa9f6Brian DLOG(WARNING) << "No MediaDrmBridge for ID: " << media_keys_id << " found"; 5174bfe1c955fe679547c8a03119d1681e33593c768Michal Krol OnKeyError(media_keys_id, "", media::MediaKeys::kUnknownError, 0); 51809a1b912605ff48c8782dcc5aae55ac77e27037bBrian return; 51909a1b912605ff48c8782dcc5aae55ac77e27037bBrian } 52008f33a025100dea2d951e6d628891fe294b18082Brian 5214fc7d0345a18042a79686940fb7cc4e698cc9192Keith Whitwell if (media_keys_ids_approved_.find(media_keys_id) == 522f3955f6fcdd1a3106a6538642131ccea5ef1cef0Brian Paul media_keys_ids_approved_.end()) { 5236b63e25b3d7a6ac0bd738c139ead0c7e7ad84368Tom Stellard media_keys_ids_pending_approval_.insert(media_keys_id); 5246b63e25b3d7a6ac0bd738c139ead0c7e7ad84368Tom Stellard } 5256b63e25b3d7a6ac0bd738c139ead0c7e7ad84368Tom Stellard WebContents* web_contents = 52609a1b912605ff48c8782dcc5aae55ac77e27037bBrian WebContents::FromRenderViewHost(render_view_host()); 52721148e6a8806736b4487da41b01e2d3c01cbc743Henri Verbeet web_contents->GetDelegate()->RequestProtectedMediaIdentifierPermission( 5284fc7d0345a18042a79686940fb7cc4e698cc9192Keith Whitwell web_contents, 5294fc7d0345a18042a79686940fb7cc4e698cc9192Keith Whitwell drm_bridge->frame_url(), 5304fc7d0345a18042a79686940fb7cc4e698cc9192Keith Whitwell base::Bind(&BrowserMediaPlayerManager::GenerateKeyIfAllowed, 5314fc7d0345a18042a79686940fb7cc4e698cc9192Keith Whitwell weak_ptr_factory_.GetWeakPtr(), 5324fc7d0345a18042a79686940fb7cc4e698cc9192Keith Whitwell media_keys_id, 5334fc7d0345a18042a79686940fb7cc4e698cc9192Keith Whitwell type, 5349acdd7739b729375444f8669fc2419d9eb57acc5Henri Verbeet init_data)); 5359acdd7739b729375444f8669fc2419d9eb57acc5Henri Verbeet} 5369acdd7739b729375444f8669fc2419d9eb57acc5Henri Verbeet 5374bfe1c955fe679547c8a03119d1681e33593c768Michal Krolvoid BrowserMediaPlayerManager::OnAddKey(int media_keys_id, 53800c835918259f8d41c3f74eca679a972713b11b2Keith Whitwell const std::vector<uint8>& key, 5394fc7d0345a18042a79686940fb7cc4e698cc9192Keith Whitwell const std::vector<uint8>& init_data, 5404fc7d0345a18042a79686940fb7cc4e698cc9192Keith Whitwell const std::string& session_id) { 541c7722edcfdf36e0d0bfdc51013ecb199fc7fa9f6Brian MediaDrmBridge* drm_bridge = GetDrmBridge(media_keys_id); 5424bfe1c955fe679547c8a03119d1681e33593c768Michal Krol if (!drm_bridge) { 54309a1b912605ff48c8782dcc5aae55ac77e27037bBrian DLOG(WARNING) << "No MediaDrmBridge for ID: " << media_keys_id << " found"; 54409a1b912605ff48c8782dcc5aae55ac77e27037bBrian OnKeyError(media_keys_id, session_id, media::MediaKeys::kUnknownError, 0); 54508f33a025100dea2d951e6d628891fe294b18082Brian return; 546e2329f2795d48d11131e9ac105e7aa3fd2c229c1Brian Paul } 547e2329f2795d48d11131e9ac105e7aa3fd2c229c1Brian Paul 5484bfe1c955fe679547c8a03119d1681e33593c768Michal Krol drm_bridge->AddKey(&key[0], key.size(), &init_data[0], init_data.size(), 549e2329f2795d48d11131e9ac105e7aa3fd2c229c1Brian Paul session_id); 5504fc7d0345a18042a79686940fb7cc4e698cc9192Keith Whitwell // In EME v0.1b MediaKeys lives in the media element. So the |media_keys_id| 551f3955f6fcdd1a3106a6538642131ccea5ef1cef0Brian Paul // is the same as the |player_id|. 5526b63e25b3d7a6ac0bd738c139ead0c7e7ad84368Tom Stellard // TODO(xhwang): Separate |media_keys_id| and |player_id|. 5536b63e25b3d7a6ac0bd738c139ead0c7e7ad84368Tom Stellard MediaPlayerAndroid* player = GetPlayer(media_keys_id); 5546b63e25b3d7a6ac0bd738c139ead0c7e7ad84368Tom Stellard if (player) 5554fc7d0345a18042a79686940fb7cc4e698cc9192Keith Whitwell player->OnKeyAdded(); 5564bfe1c955fe679547c8a03119d1681e33593c768Michal Krol} 5574fc7d0345a18042a79686940fb7cc4e698cc9192Keith Whitwell 5584fc7d0345a18042a79686940fb7cc4e698cc9192Keith Whitwellvoid BrowserMediaPlayerManager::OnCancelKeyRequest( 5594fc7d0345a18042a79686940fb7cc4e698cc9192Keith Whitwell int media_keys_id, 5604fc7d0345a18042a79686940fb7cc4e698cc9192Keith Whitwell const std::string& session_id) { 5614fc7d0345a18042a79686940fb7cc4e698cc9192Keith Whitwell MediaDrmBridge* drm_bridge = GetDrmBridge(media_keys_id); 5624fc7d0345a18042a79686940fb7cc4e698cc9192Keith Whitwell if (!drm_bridge) { 5634fc7d0345a18042a79686940fb7cc4e698cc9192Keith Whitwell DLOG(WARNING) << "No MediaDrmBridge for ID: " << media_keys_id << " found"; 56481601d85ef6b82297b046d5aab1b70e75168c2faKeith Whitwell OnKeyError(media_keys_id, session_id, media::MediaKeys::kUnknownError, 0); 5654fc7d0345a18042a79686940fb7cc4e698cc9192Keith Whitwell return; 566b4480285ed5098f1c862690ee105dd46f5e6cd1eBrian } 567b4480285ed5098f1c862690ee105dd46f5e6cd1eBrian 56870eb7996f265f3634dabda078f13d1be3533cc65Brian drm_bridge->CancelKeyRequest(session_id); 56980c78472ad43f4288c9ef5076074ba9d31a39885Keith Whitwell} 570229a1a7e4da1a9c60b35b79f2a63e0bab451a76eOlivier Galibert 571b4480285ed5098f1c862690ee105dd46f5e6cd1eBrianvoid BrowserMediaPlayerManager::AddPlayer(MediaPlayerAndroid* player) { 57281601d85ef6b82297b046d5aab1b70e75168c2faKeith Whitwell DCHECK(!GetPlayer(player->player_id())); 57381601d85ef6b82297b046d5aab1b70e75168c2faKeith Whitwell players_.push_back(player); 57481601d85ef6b82297b046d5aab1b70e75168c2faKeith Whitwell} 57581601d85ef6b82297b046d5aab1b70e75168c2faKeith Whitwell 57681601d85ef6b82297b046d5aab1b70e75168c2faKeith Whitwellvoid BrowserMediaPlayerManager::RemovePlayer(int player_id) { 577f3955f6fcdd1a3106a6538642131ccea5ef1cef0Brian Paul for (ScopedVector<MediaPlayerAndroid>::iterator it = players_.begin(); 57881601d85ef6b82297b046d5aab1b70e75168c2faKeith Whitwell it != players_.end(); ++it) { 579b4480285ed5098f1c862690ee105dd46f5e6cd1eBrian if ((*it)->player_id() == player_id) { 58081601d85ef6b82297b046d5aab1b70e75168c2faKeith Whitwell players_.erase(it); 58181601d85ef6b82297b046d5aab1b70e75168c2faKeith Whitwell break; 58281601d85ef6b82297b046d5aab1b70e75168c2faKeith Whitwell } 58381601d85ef6b82297b046d5aab1b70e75168c2faKeith Whitwell } 58481601d85ef6b82297b046d5aab1b70e75168c2faKeith Whitwell} 58581601d85ef6b82297b046d5aab1b70e75168c2faKeith Whitwell 58681601d85ef6b82297b046d5aab1b70e75168c2faKeith Whitwellscoped_ptr<media::MediaPlayerAndroid> BrowserMediaPlayerManager::SwapPlayer( 58781601d85ef6b82297b046d5aab1b70e75168c2faKeith Whitwell int player_id, media::MediaPlayerAndroid* player) { 58881601d85ef6b82297b046d5aab1b70e75168c2faKeith Whitwell media::MediaPlayerAndroid* previous_player = NULL; 58981601d85ef6b82297b046d5aab1b70e75168c2faKeith Whitwell for (ScopedVector<MediaPlayerAndroid>::iterator it = players_.begin(); 59081601d85ef6b82297b046d5aab1b70e75168c2faKeith Whitwell it != players_.end(); ++it) { 59181601d85ef6b82297b046d5aab1b70e75168c2faKeith Whitwell if ((*it)->player_id() == player_id) { 59281601d85ef6b82297b046d5aab1b70e75168c2faKeith Whitwell previous_player = *it; 59381601d85ef6b82297b046d5aab1b70e75168c2faKeith Whitwell players_.weak_erase(it); 594f3955f6fcdd1a3106a6538642131ccea5ef1cef0Brian Paul players_.push_back(player); 59581601d85ef6b82297b046d5aab1b70e75168c2faKeith Whitwell break; 59681601d85ef6b82297b046d5aab1b70e75168c2faKeith Whitwell } 59721148e6a8806736b4487da41b01e2d3c01cbc743Henri Verbeet } 59881601d85ef6b82297b046d5aab1b70e75168c2faKeith Whitwell return scoped_ptr<media::MediaPlayerAndroid>(previous_player); 59981601d85ef6b82297b046d5aab1b70e75168c2faKeith Whitwell} 600683e35f726a182ed9fc6b6d5cb07146eebe14deaKeith Whitwell 601683e35f726a182ed9fc6b6d5cb07146eebe14deaKeith Whitwellvoid BrowserMediaPlayerManager::AddDrmBridge(int media_keys_id, 6029f61e43b4903c6cf0ac03a479ec9ed7b15fd6ccfDave Airlie const std::vector<uint8>& uuid, 60381601d85ef6b82297b046d5aab1b70e75168c2faKeith Whitwell const GURL& frame_url) { 60481601d85ef6b82297b046d5aab1b70e75168c2faKeith Whitwell DCHECK(!GetDrmBridge(media_keys_id)); 60581601d85ef6b82297b046d5aab1b70e75168c2faKeith Whitwell // TODO(xhwang/ddorwin): Pass the security level from key system. 60681601d85ef6b82297b046d5aab1b70e75168c2faKeith Whitwell std::string security_level = "L3"; 60781601d85ef6b82297b046d5aab1b70e75168c2faKeith Whitwell if (CommandLine::ForCurrentProcess() 6086142de393fe34ff0866f8489f1292eb473276f11Keith Whitwell ->HasSwitch(switches::kMediaDrmEnableNonCompositing)) { 6096142de393fe34ff0866f8489f1292eb473276f11Keith Whitwell security_level = "L1"; 61081601d85ef6b82297b046d5aab1b70e75168c2faKeith Whitwell } 61181601d85ef6b82297b046d5aab1b70e75168c2faKeith Whitwell 61281601d85ef6b82297b046d5aab1b70e75168c2faKeith Whitwell scoped_ptr<MediaDrmBridge> drm_bridge(MediaDrmBridge::Create( 613f3955f6fcdd1a3106a6538642131ccea5ef1cef0Brian Paul media_keys_id, uuid, frame_url, security_level, this)); 61481601d85ef6b82297b046d5aab1b70e75168c2faKeith Whitwell if (!drm_bridge) { 61581601d85ef6b82297b046d5aab1b70e75168c2faKeith Whitwell DVLOG(1) << "failed to create drm bridge."; 61681601d85ef6b82297b046d5aab1b70e75168c2faKeith Whitwell OnKeyError(media_keys_id, "", media::MediaKeys::kUnknownError, 0); 61781601d85ef6b82297b046d5aab1b70e75168c2faKeith Whitwell return; 61881601d85ef6b82297b046d5aab1b70e75168c2faKeith Whitwell } 61981601d85ef6b82297b046d5aab1b70e75168c2faKeith Whitwell 62081601d85ef6b82297b046d5aab1b70e75168c2faKeith Whitwell drm_bridges_.push_back(drm_bridge.release()); 62181601d85ef6b82297b046d5aab1b70e75168c2faKeith Whitwell} 6226142de393fe34ff0866f8489f1292eb473276f11Keith Whitwell 6236142de393fe34ff0866f8489f1292eb473276f11Keith Whitwellvoid BrowserMediaPlayerManager::RemoveDrmBridge(int media_keys_id) { 62481601d85ef6b82297b046d5aab1b70e75168c2faKeith Whitwell for (ScopedVector<MediaDrmBridge>::iterator it = drm_bridges_.begin(); 62581601d85ef6b82297b046d5aab1b70e75168c2faKeith Whitwell it != drm_bridges_.end(); ++it) { 6266142de393fe34ff0866f8489f1292eb473276f11Keith Whitwell if ((*it)->media_keys_id() == media_keys_id) { 6276142de393fe34ff0866f8489f1292eb473276f11Keith Whitwell drm_bridges_.erase(it); 6286142de393fe34ff0866f8489f1292eb473276f11Keith Whitwell break; 6296142de393fe34ff0866f8489f1292eb473276f11Keith Whitwell } 6306142de393fe34ff0866f8489f1292eb473276f11Keith Whitwell } 6316142de393fe34ff0866f8489f1292eb473276f11Keith Whitwell} 6326142de393fe34ff0866f8489f1292eb473276f11Keith Whitwell 63381601d85ef6b82297b046d5aab1b70e75168c2faKeith Whitwellvoid BrowserMediaPlayerManager::OnSetMediaKeys(int player_id, 63481601d85ef6b82297b046d5aab1b70e75168c2faKeith Whitwell int media_keys_id) { 63581601d85ef6b82297b046d5aab1b70e75168c2faKeith Whitwell MediaPlayerAndroid* player = GetPlayer(player_id); 63681601d85ef6b82297b046d5aab1b70e75168c2faKeith Whitwell MediaDrmBridge* drm_bridge = GetDrmBridge(media_keys_id); 637f3955f6fcdd1a3106a6538642131ccea5ef1cef0Brian Paul if (!player || !drm_bridge) { 63881601d85ef6b82297b046d5aab1b70e75168c2faKeith Whitwell DVLOG(1) << "OnSetMediaKeys(): Player and MediaKeys must be present."; 63981601d85ef6b82297b046d5aab1b70e75168c2faKeith Whitwell return; 64081601d85ef6b82297b046d5aab1b70e75168c2faKeith Whitwell } 64181601d85ef6b82297b046d5aab1b70e75168c2faKeith Whitwell // TODO(qinmin): add the logic to decide whether we should create the 64281601d85ef6b82297b046d5aab1b70e75168c2faKeith Whitwell // fullscreen surface for EME lv1. 64381601d85ef6b82297b046d5aab1b70e75168c2faKeith Whitwell player->SetDrmBridge(drm_bridge); 64481601d85ef6b82297b046d5aab1b70e75168c2faKeith Whitwell} 64581601d85ef6b82297b046d5aab1b70e75168c2faKeith Whitwell 64681601d85ef6b82297b046d5aab1b70e75168c2faKeith Whitwellvoid BrowserMediaPlayerManager::GenerateKeyIfAllowed( 64781601d85ef6b82297b046d5aab1b70e75168c2faKeith Whitwell int media_keys_id, 64881601d85ef6b82297b046d5aab1b70e75168c2faKeith Whitwell const std::string& type, 64981601d85ef6b82297b046d5aab1b70e75168c2faKeith Whitwell const std::vector<uint8>& init_data, 65081601d85ef6b82297b046d5aab1b70e75168c2faKeith Whitwell bool allowed) { 65181601d85ef6b82297b046d5aab1b70e75168c2faKeith Whitwell if (!allowed) 652f3955f6fcdd1a3106a6538642131ccea5ef1cef0Brian Paul return; 65381601d85ef6b82297b046d5aab1b70e75168c2faKeith Whitwell 65481601d85ef6b82297b046d5aab1b70e75168c2faKeith Whitwell MediaDrmBridge* drm_bridge = GetDrmBridge(media_keys_id); 65581601d85ef6b82297b046d5aab1b70e75168c2faKeith Whitwell if (!drm_bridge) { 65681601d85ef6b82297b046d5aab1b70e75168c2faKeith Whitwell DLOG(WARNING) << "No MediaDrmBridge for ID: " << media_keys_id << " found"; 65781601d85ef6b82297b046d5aab1b70e75168c2faKeith Whitwell OnKeyError(media_keys_id, "", media::MediaKeys::kUnknownError, 0); 65881601d85ef6b82297b046d5aab1b70e75168c2faKeith Whitwell return; 65981601d85ef6b82297b046d5aab1b70e75168c2faKeith Whitwell } 66081601d85ef6b82297b046d5aab1b70e75168c2faKeith Whitwell media_keys_ids_pending_approval_.erase(media_keys_id); 66181601d85ef6b82297b046d5aab1b70e75168c2faKeith Whitwell media_keys_ids_approved_.insert(media_keys_id); 66281601d85ef6b82297b046d5aab1b70e75168c2faKeith Whitwell drm_bridge->GenerateKeyRequest(type, &init_data[0], init_data.size()); 66381601d85ef6b82297b046d5aab1b70e75168c2faKeith Whitwell 66481601d85ef6b82297b046d5aab1b70e75168c2faKeith Whitwell // TODO(qinmin): currently |media_keys_id| and player ID are identical. 66581601d85ef6b82297b046d5aab1b70e75168c2faKeith Whitwell // This might not be true in the future. 666f3955f6fcdd1a3106a6538642131ccea5ef1cef0Brian Paul if (pending_fullscreen_player_id_ != media_keys_id) 66781601d85ef6b82297b046d5aab1b70e75168c2faKeith Whitwell return; 6686142de393fe34ff0866f8489f1292eb473276f11Keith Whitwell 669f3955f6fcdd1a3106a6538642131ccea5ef1cef0Brian Paul pending_fullscreen_player_id_ = -1; 670e2329f2795d48d11131e9ac105e7aa3fd2c229c1Brian Paul MediaPlayerAndroid* player = GetPlayer(media_keys_id); 6716142de393fe34ff0866f8489f1292eb473276f11Keith Whitwell if (player->IsPlaying()) 672153e474d22d1b440bb6bd7b04dabf244d7455582Keith Whitwell OnProtectedSurfaceRequested(media_keys_id); 6736142de393fe34ff0866f8489f1292eb473276f11Keith Whitwell} 674153e474d22d1b440bb6bd7b04dabf244d7455582Keith Whitwell 675153e474d22d1b440bb6bd7b04dabf244d7455582Keith Whitwell} // namespace content 67681601d85ef6b82297b046d5aab1b70e75168c2faKeith Whitwell