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