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