browser_media_player_manager.cc revision 03b57e008b61dfcb1fbad3aea950ae0e001748b0
17dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch// Copyright 2013 The Chromium Authors. All rights reserved.
25821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Use of this source code is governed by a BSD-style license that can be
35821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// found in the LICENSE file.
45821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)#include "content/browser/media/android/browser_media_player_manager.h"
65821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
75c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu#include "base/android/scoped_java_ref.h"
858537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)#include "base/command_line.h"
9868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)#include "content/browser/android/content_view_core_impl.h"
10d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)#include "content/browser/media/android/browser_demuxer_android.h"
11d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)#include "content/browser/media/android/media_resource_getter_impl.h"
1268043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)#include "content/browser/renderer_host/render_view_host_impl.h"
132a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "content/browser/web_contents/web_contents_view_android.h"
1490dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)#include "content/common/media/media_player_messages_android.h"
15f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)#include "content/public/browser/android/content_view_core.h"
16a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)#include "content/public/browser/android/external_video_surface_container.h"
175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "content/public/browser/browser_context.h"
18a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch#include "content/public/browser/content_browser_client.h"
19cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)#include "content/public/browser/render_frame_host.h"
205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "content/public/browser/render_process_host.h"
215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "content/public/browser/render_view_host.h"
222a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "content/public/browser/storage_partition.h"
23868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)#include "content/public/browser/web_contents.h"
2468043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)#include "content/public/browser/web_contents_delegate.h"
255d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#include "content/public/common/content_client.h"
26f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)#include "content/public/common/content_switches.h"
2758537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)#include "media/base/android/media_player_bridge.h"
2858537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)#include "media/base/android/media_source_player.h"
295f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)#include "media/base/android/media_url_interceptor.h"
3058537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)#include "media/base/media_switches.h"
315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
32b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)using media::MediaPlayerAndroid;
3358537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)using media::MediaPlayerBridge;
3458537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)using media::MediaPlayerManager;
3558537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)using media::MediaSourcePlayer;
365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
37a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)namespace content {
38a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)
395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Threshold on the number of media players per renderer before we start
405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// attempting to release inactive media players.
41a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)const int kMediaPlayerThreshold = 1;
42a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)
43424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)static BrowserMediaPlayerManager::Factory g_factory = NULL;
445f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)static media::MediaUrlInterceptor* media_url_interceptor_ = NULL;
4590dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)
4690dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)// static
47424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)void BrowserMediaPlayerManager::RegisterFactory(Factory factory) {
48424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)  g_factory = factory;
4990dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)}
5090dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)
5190dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)// static
525f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)void BrowserMediaPlayerManager::RegisterMediaUrlInterceptor(
535f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    media::MediaUrlInterceptor* media_url_interceptor) {
545f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  media_url_interceptor_ = media_url_interceptor;
555f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)}
565f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)
575f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)// static
58424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)BrowserMediaPlayerManager* BrowserMediaPlayerManager::Create(
59cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)    RenderFrameHost* rfh) {
60424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)  if (g_factory)
61cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)    return g_factory(rfh);
62cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  return new BrowserMediaPlayerManager(rfh);
6390dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)}
6490dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)
655d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)ContentViewCoreImpl* BrowserMediaPlayerManager::GetContentViewCore() const {
665d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  return ContentViewCoreImpl::FromWebContents(web_contents());
675d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)}
685d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
6958537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)MediaPlayerAndroid* BrowserMediaPlayerManager::CreateMediaPlayer(
70f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)    const MediaPlayerHostMsg_Initialize_Params& media_player_params,
7158537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)    bool hide_url_log,
7258537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)    MediaPlayerManager* manager,
734e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)    BrowserDemuxerAndroid* demuxer) {
74f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  switch (media_player_params.type) {
7558537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)    case MEDIA_PLAYER_TYPE_URL: {
76a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)      const std::string user_agent = GetContentClient()->GetUserAgent();
7758537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)      MediaPlayerBridge* media_player_bridge = new MediaPlayerBridge(
78f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)          media_player_params.player_id,
79f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)          media_player_params.url,
80f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)          media_player_params.first_party_for_cookies,
815d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)          user_agent,
825d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)          hide_url_log,
83a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)          manager,
84a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)          base::Bind(&BrowserMediaPlayerManager::OnMediaResourcesRequested,
85a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)                     weak_ptr_factory_.GetWeakPtr()),
86a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)          base::Bind(&BrowserMediaPlayerManager::OnMediaResourcesReleased,
87f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)                     weak_ptr_factory_.GetWeakPtr()),
886e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)          media_player_params.frame_url,
896e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)          media_player_params.allow_credentials);
90f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)      BrowserMediaPlayerManager* browser_media_player_manager =
91f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)          static_cast<BrowserMediaPlayerManager*>(manager);
92f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)      ContentViewCoreImpl* content_view_core_impl =
93f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)          static_cast<ContentViewCoreImpl*>(ContentViewCore::FromWebContents(
94f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)              browser_media_player_manager->web_contents_));
95f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)      if (!content_view_core_impl) {
96f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)        // May reach here due to prerendering. Don't extract the metadata
97f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)        // since it is expensive.
98f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)        // TODO(qinmin): extract the metadata once the user decided to load
99f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)        // the page.
100f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)        browser_media_player_manager->OnMediaMetadataChanged(
101f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)            media_player_params.player_id, base::TimeDelta(), 0, 0, false);
102f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)      } else if (!content_view_core_impl->ShouldBlockMediaRequest(
103f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)            media_player_params.url)) {
104f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)        media_player_bridge->Initialize();
105f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)      }
10658537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)      return media_player_bridge;
10758537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)    }
10858537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)
10958537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)    case MEDIA_PLAYER_TYPE_MEDIA_SOURCE: {
11068043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)      return new MediaSourcePlayer(
111f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)          media_player_params.player_id,
112a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)          manager,
113a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)          base::Bind(&BrowserMediaPlayerManager::OnMediaResourcesRequested,
114a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)                     weak_ptr_factory_.GetWeakPtr()),
115a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)          base::Bind(&BrowserMediaPlayerManager::OnMediaResourcesReleased,
116a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)                     weak_ptr_factory_.GetWeakPtr()),
117f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)          demuxer->CreateDemuxer(media_player_params.demuxer_client_id),
118f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)          media_player_params.frame_url);
11958537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)    }
12058537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  }
12158537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)
12258537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  NOTREACHED();
12358537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  return NULL;
12458537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)}
12558537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)
1267dbb3d5cf0c15f500944d211057644d6a2f37371Ben MurdochBrowserMediaPlayerManager::BrowserMediaPlayerManager(
127cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)    RenderFrameHost* render_frame_host)
128cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)    : render_frame_host_(render_frame_host),
1292a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      fullscreen_player_id_(-1),
130f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)      fullscreen_player_is_released_(false),
131cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)      web_contents_(WebContents::FromRenderFrameHost(render_frame_host)),
13268043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)      weak_ptr_factory_(this) {
1335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
1345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
135f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)BrowserMediaPlayerManager::~BrowserMediaPlayerManager() {
136f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  // During the tear down process, OnDestroyPlayer() may or may not be called
137f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  // (e.g. the WebContents may be destroyed before the render process). So
138f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  // we cannot DCHECK(players_.empty()) here. Instead, all media players in
139f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  // |players_| will be destroyed here because |player_| is a ScopedVector.
140f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)}
1415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1427dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdochvoid BrowserMediaPlayerManager::FullscreenPlayerPlay() {
143b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)  MediaPlayerAndroid* player = GetFullscreenPlayer();
1445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (player) {
145f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)    if (fullscreen_player_is_released_) {
146f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)      video_view_->OpenVideo();
147f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)      fullscreen_player_is_released_ = false;
148f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)    }
1495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    player->Start();
150cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)    Send(new MediaPlayerMsg_DidMediaPlayerPlay(RoutingID(),
151cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)                                               fullscreen_player_id_));
1525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
1535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
1545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1557dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdochvoid BrowserMediaPlayerManager::FullscreenPlayerPause() {
156b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)  MediaPlayerAndroid* player = GetFullscreenPlayer();
1575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (player) {
158d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)    player->Pause(true);
159cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)    Send(new MediaPlayerMsg_DidMediaPlayerPause(RoutingID(),
160cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)                                                fullscreen_player_id_));
1615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
1625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
1635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1647dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdochvoid BrowserMediaPlayerManager::FullscreenPlayerSeek(int msec) {
165b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)  MediaPlayerAndroid* player = GetFullscreenPlayer();
16668043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)  if (player) {
167f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)    // TODO(kbalazs): if |fullscreen_player_is_released_| is true
168f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)    // at this point, player->GetCurrentTime() will be wrong until
169f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)    // FullscreenPlayerPlay (http://crbug.com/322798).
17068043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)    OnSeekRequest(fullscreen_player_id_,
17168043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)                  base::TimeDelta::FromMilliseconds(msec));
17268043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)  }
1735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
1745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1757dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdochvoid BrowserMediaPlayerManager::ExitFullscreen(bool release_media_player) {
176116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  if (WebContentsDelegate* delegate = web_contents_->GetDelegate())
177116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch    delegate->ToggleFullscreenModeForTab(web_contents_, false);
178a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  if (!CommandLine::ForCurrentProcess()->HasSwitch(
179a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)      switches::kDisableOverlayFullscreenVideoSubtitle)) {
1805d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    if (RenderWidgetHostViewAndroid* view_android =
1815d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)        static_cast<RenderWidgetHostViewAndroid*>(
1825d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)            web_contents_->GetRenderWidgetHostView())) {
1835d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      view_android->SetOverlayVideoMode(false);
1845d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    }
1855d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  }
1865d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
187cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  Send(
188cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)      new MediaPlayerMsg_DidExitFullscreen(RoutingID(), fullscreen_player_id_));
189868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  video_view_.reset();
190868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  MediaPlayerAndroid* player = GetFullscreenPlayer();
191eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  fullscreen_player_id_ = -1;
1925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (!player)
1935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return;
1945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (release_media_player)
1955d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    ReleaseFullscreenPlayer(player);
1965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  else
197868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)    player->SetVideoSurface(gfx::ScopedJavaSurface());
1985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
1995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2007dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdochvoid BrowserMediaPlayerManager::OnTimeUpdate(int player_id,
2017dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch                                             base::TimeDelta current_time) {
202cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  Send(
203cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)      new MediaPlayerMsg_MediaTimeUpdate(RoutingID(), player_id, current_time));
2047d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)}
2057d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)
2067dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdochvoid BrowserMediaPlayerManager::SetVideoSurface(
2077dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch    gfx::ScopedJavaSurface surface) {
208b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)  MediaPlayerAndroid* player = GetFullscreenPlayer();
209a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)  if (!player)
210a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)    return;
211effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch
212effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch  bool empty_surface = surface.IsEmpty();
213a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)  player->SetVideoSurface(surface.Pass());
214effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch  if (empty_surface)
215effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch    return;
2165d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
217cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  Send(new MediaPlayerMsg_DidEnterFullscreen(RoutingID(), player->player_id()));
218a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  if (CommandLine::ForCurrentProcess()->HasSwitch(
219a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)      switches::kDisableOverlayFullscreenVideoSubtitle)) {
2205d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    return;
2215d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  }
2225d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  if (RenderWidgetHostViewAndroid* view_android =
2235d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      static_cast<RenderWidgetHostViewAndroid*>(
2245d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)          web_contents_->GetRenderWidgetHostView())) {
2255d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    view_android->SetOverlayVideoMode(true);
2265d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  }
2275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
2285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2297dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdochvoid BrowserMediaPlayerManager::OnMediaMetadataChanged(
2307d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)    int player_id, base::TimeDelta duration, int width, int height,
2317d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)    bool success) {
2327d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  Send(new MediaPlayerMsg_MediaMetadataChanged(
233cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)      RoutingID(), player_id, duration, width, height, success));
234f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  if (fullscreen_player_id_ == player_id)
2357d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)    video_view_->UpdateMediaMetadata();
2367d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)}
2375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2387dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdochvoid BrowserMediaPlayerManager::OnPlaybackComplete(int player_id) {
239cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  Send(new MediaPlayerMsg_MediaPlaybackCompleted(RoutingID(), player_id));
240f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  if (fullscreen_player_id_ == player_id)
2417d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)    video_view_->OnPlaybackComplete();
2427d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)}
2437d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)
2447dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdochvoid BrowserMediaPlayerManager::OnMediaInterrupted(int player_id) {
2457d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  // Tell WebKit that the audio should be paused, then release all resources
246cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  Send(new MediaPlayerMsg_MediaPlayerReleased(RoutingID(), player_id));
2477d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  OnReleaseResources(player_id);
2487d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)}
2497d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)
2507dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdochvoid BrowserMediaPlayerManager::OnBufferingUpdate(
2517d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)    int player_id, int percentage) {
2527d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  Send(new MediaPlayerMsg_MediaBufferingUpdate(
253cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)      RoutingID(), player_id, percentage));
254f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  if (fullscreen_player_id_ == player_id)
2557d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)    video_view_->OnBufferingUpdate(percentage);
2567d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)}
2577d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)
25868043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)void BrowserMediaPlayerManager::OnSeekRequest(
25968043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)    int player_id,
26068043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)    const base::TimeDelta& time_to_seek) {
261cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  Send(new MediaPlayerMsg_SeekRequest(RoutingID(), player_id, time_to_seek));
262cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)}
263cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)
264cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)void BrowserMediaPlayerManager::PauseVideo() {
265cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  Send(new MediaPlayerMsg_PauseVideo(RoutingID()));
26668043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)}
26768043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)
26868043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)void BrowserMediaPlayerManager::OnSeekComplete(
26968043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)    int player_id,
27068043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)    const base::TimeDelta& current_time) {
271cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  Send(new MediaPlayerMsg_SeekCompleted(RoutingID(), player_id, current_time));
2727d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)}
2737d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)
2747dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdochvoid BrowserMediaPlayerManager::OnError(int player_id, int error) {
275cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  Send(new MediaPlayerMsg_MediaError(RoutingID(), player_id, error));
276f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  if (fullscreen_player_id_ == player_id)
2777d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)    video_view_->OnMediaPlayerError(error);
2787d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)}
2797d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)
2807dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdochvoid BrowserMediaPlayerManager::OnVideoSizeChanged(
2817d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)    int player_id, int width, int height) {
282cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  Send(new MediaPlayerMsg_MediaVideoSizeChanged(RoutingID(), player_id,
2837d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)      width, height));
284f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  if (fullscreen_player_id_ == player_id)
2857d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)    video_view_->OnVideoSizeChanged(width, height);
2867d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)}
2877d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)
2887dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdochmedia::MediaResourceGetter*
2897dbb3d5cf0c15f500944d211057644d6a2f37371Ben MurdochBrowserMediaPlayerManager::GetMediaResourceGetter() {
290c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  if (!media_resource_getter_.get()) {
2911e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)    RenderProcessHost* host = web_contents()->GetRenderProcessHost();
292c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    BrowserContext* context = host->GetBrowserContext();
293c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    StoragePartition* partition = host->GetStoragePartition();
29403b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)    storage::FileSystemContext* file_system_context =
295c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)        partition ? partition->GetFileSystemContext() : NULL;
296010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)    // Eventually this needs to be fixed to pass the correct frame rather
297010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)    // than just using the main frame.
298c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    media_resource_getter_.reset(new MediaResourceGetterImpl(
299010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)        context,
300010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)        file_system_context,
301010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)        host->GetID(),
302010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)        web_contents()->GetMainFrame()->GetRoutingID()));
303c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  }
304c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  return media_resource_getter_.get();
3055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
3065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3075f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)media::MediaUrlInterceptor*
3085f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)BrowserMediaPlayerManager::GetMediaUrlInterceptor() {
3095f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  return media_url_interceptor_;
3105f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)}
3115f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)
3127dbb3d5cf0c15f500944d211057644d6a2f37371Ben MurdochMediaPlayerAndroid* BrowserMediaPlayerManager::GetFullscreenPlayer() {
3137d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  return GetPlayer(fullscreen_player_id_);
3145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
3155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3167dbb3d5cf0c15f500944d211057644d6a2f37371Ben MurdochMediaPlayerAndroid* BrowserMediaPlayerManager::GetPlayer(int player_id) {
3177d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  for (ScopedVector<MediaPlayerAndroid>::iterator it = players_.begin();
3187d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)      it != players_.end(); ++it) {
3197d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)    if ((*it)->player_id() == player_id)
3207d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)      return *it;
3217d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  }
3227d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  return NULL;
3237d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)}
3247d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)
3250529e5d033099cbfc42635f6f6183833b09dff6eBen Murdochvoid BrowserMediaPlayerManager::RequestFullScreen(int player_id) {
3267dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  if (fullscreen_player_id_ == player_id)
3277dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch    return;
3284e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)
3297dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  if (fullscreen_player_id_ != -1) {
3307dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch    // TODO(qinmin): Determine the correct error code we should report to WMPA.
3317dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch    OnError(player_id, MediaPlayerAndroid::MEDIA_ERROR_DECODE);
3327dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch    return;
3337dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  }
334a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)
335f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  Send(new MediaPlayerMsg_RequestFullscreen(RoutingID(), player_id));
3367d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)}
3377d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)
3385d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#if defined(VIDEO_HOLE)
339116680a4aac90f2aa7413d9095a592090648e557Ben Murdochbool
340116680a4aac90f2aa7413d9095a592090648e557Ben MurdochBrowserMediaPlayerManager::ShouldUseVideoOverlayForEmbeddedEncryptedVideo() {
341116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  RendererPreferences* prefs = web_contents_->GetMutableRendererPrefs();
342116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  return prefs->use_video_overlay_for_embedded_encrypted_video;
343116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch}
344116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch
3457dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdochvoid BrowserMediaPlayerManager::AttachExternalVideoSurface(int player_id,
3467dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch                                                           jobject surface) {
347b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)  MediaPlayerAndroid* player = GetPlayer(player_id);
3487d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  if (player) {
3497d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)    player->SetVideoSurface(
3507d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)        gfx::ScopedJavaSurface::AcquireExternalSurface(surface));
3517d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  }
3525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
3535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3547dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdochvoid BrowserMediaPlayerManager::DetachExternalVideoSurface(int player_id) {
355b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)  MediaPlayerAndroid* player = GetPlayer(player_id);
3565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (player)
3577d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)    player->SetVideoSurface(gfx::ScopedJavaSurface());
3587d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)}
3597d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)
360a02191e04bc25c4935f804f2c080ae28663d096dBen Murdochvoid BrowserMediaPlayerManager::OnFrameInfoUpdated() {
361a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch  if (external_video_surface_container_)
362a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch    external_video_surface_container_->OnFrameInfoUpdated();
363a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch}
364a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch
3657dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdochvoid BrowserMediaPlayerManager::OnNotifyExternalSurface(
3667d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)    int player_id, bool is_request, const gfx::RectF& rect) {
3677d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  if (!web_contents_)
3687d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)    return;
3697d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)
370a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  if (is_request) {
371a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch    OnRequestExternalSurface(player_id, rect);
372a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch  }
373a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch  if (external_video_surface_container_) {
374a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch    external_video_surface_container_->OnExternalVideoSurfacePositionChanged(
375a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch        player_id, rect);
376a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch  }
377a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch}
378a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch
379a02191e04bc25c4935f804f2c080ae28663d096dBen Murdochvoid BrowserMediaPlayerManager::OnRequestExternalSurface(
380a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch    int player_id, const gfx::RectF& rect) {
381a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch  if (!external_video_surface_container_) {
382a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch    ContentBrowserClient* client = GetContentClient()->browser();
383a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch    external_video_surface_container_.reset(
384a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch        client->OverrideCreateExternalVideoSurfaceContainer(web_contents_));
385a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch  }
386a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch  // It's safe to use base::Unretained(this), because the callbacks will not
387a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch  // be called after running ReleaseExternalVideoSurface().
388a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch  if (external_video_surface_container_) {
389a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch    external_video_surface_container_->RequestExternalVideoSurface(
390a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)        player_id,
391a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)        base::Bind(&BrowserMediaPlayerManager::AttachExternalVideoSurface,
392a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)                   base::Unretained(this)),
393a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)        base::Bind(&BrowserMediaPlayerManager::DetachExternalVideoSurface,
394a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)                   base::Unretained(this)));
395a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  }
3965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
3975d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#endif  // defined(VIDEO_HOLE)
3985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3997dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdochvoid BrowserMediaPlayerManager::OnEnterFullscreen(int player_id) {
4005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  DCHECK_EQ(fullscreen_player_id_, -1);
401a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)#if defined(VIDEO_HOLE)
402a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch  if (external_video_surface_container_)
403a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch    external_video_surface_container_->ReleaseExternalVideoSurface(player_id);
404a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)#endif  // defined(VIDEO_HOLE)
405868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  if (video_view_.get()) {
406868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)    fullscreen_player_id_ = player_id;
407868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)    video_view_->OpenVideo();
4085c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu    return;
4095d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  } else if (!ContentVideoView::GetInstance()) {
410868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)    // In Android WebView, two ContentViewCores could both try to enter
411868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)    // fullscreen video, we just ignore the second one.
4125d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    video_view_.reset(new ContentVideoView(this));
4135c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu    base::android::ScopedJavaLocalRef<jobject> j_content_video_view =
4145c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu        video_view_->GetJavaObject(base::android::AttachCurrentThread());
4155c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu    if (!j_content_video_view.is_null()) {
4165c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu      fullscreen_player_id_ = player_id;
4175c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu      return;
4185c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu    }
419868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  }
4205c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu
4215c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu  // Force the second video to exit fullscreen.
4225c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu  // TODO(qinmin): There is no need to send DidEnterFullscreen message.
4235c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu  // However, if we don't send the message, page layers will not be
4245c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu  // correctly restored. http:crbug.com/367346.
425cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  Send(new MediaPlayerMsg_DidEnterFullscreen(RoutingID(), player_id));
426cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  Send(new MediaPlayerMsg_DidExitFullscreen(RoutingID(), player_id));
4275c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu  video_view_.reset();
4285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
4295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4307dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdochvoid BrowserMediaPlayerManager::OnExitFullscreen(int player_id) {
4315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (fullscreen_player_id_ == player_id) {
432b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)    MediaPlayerAndroid* player = GetPlayer(player_id);
4335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (player)
434868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)      player->SetVideoSurface(gfx::ScopedJavaSurface());
435868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)    video_view_->OnExitFullscreen();
4365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
4375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
4385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4397dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdochvoid BrowserMediaPlayerManager::OnInitialize(
440f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)    const MediaPlayerHostMsg_Initialize_Params& media_player_params) {
441f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  DCHECK(media_player_params.type != MEDIA_PLAYER_TYPE_MEDIA_SOURCE ||
442f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)      media_player_params.demuxer_client_id > 0)
44368043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)      << "Media source players must have positive demuxer client IDs: "
444f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)      << media_player_params.demuxer_client_id;
44568043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)
446f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  RemovePlayer(media_player_params.player_id);
4477d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)
4481e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  RenderProcessHostImpl* host = static_cast<RenderProcessHostImpl*>(
4491e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)      web_contents()->GetRenderProcessHost());
450e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch  MediaPlayerAndroid* player = CreateMediaPlayer(
451f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)      media_player_params,
452f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)
45368043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)      host->GetBrowserContext()->IsOffTheRecord(), this,
454e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch      host->browser_demuxer_android());
455f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)
456e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch  if (!player)
457e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch    return;
458e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch
459e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch  AddPlayer(player);
4607d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)}
4617d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)
4627dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdochvoid BrowserMediaPlayerManager::OnStart(int player_id) {
4637d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  MediaPlayerAndroid* player = GetPlayer(player_id);
4640529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch  if (!player)
4650529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch    return;
4660529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch  player->Start();
4670529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch  if (fullscreen_player_id_ == player_id && fullscreen_player_is_released_) {
4680529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch    video_view_->OpenVideo();
4690529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch    fullscreen_player_is_released_ = false;
4700529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch  }
4717d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)}
4727d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)
47368043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)void BrowserMediaPlayerManager::OnSeek(
47468043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)    int player_id,
47568043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)    const base::TimeDelta& time) {
4767d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  MediaPlayerAndroid* player = GetPlayer(player_id);
4777d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  if (player)
4787d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)    player->SeekTo(time);
4797d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)}
4807d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)
481d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)void BrowserMediaPlayerManager::OnPause(
482d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)    int player_id,
483d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)    bool is_media_related_action) {
4847d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  MediaPlayerAndroid* player = GetPlayer(player_id);
4857d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  if (player)
486d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)    player->Pause(is_media_related_action);
4877d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)}
4887d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)
489a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)void BrowserMediaPlayerManager::OnSetVolume(int player_id, double volume) {
490a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)  MediaPlayerAndroid* player = GetPlayer(player_id);
491a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)  if (player)
492a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)    player->SetVolume(volume);
493a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)}
494a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)
4955d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)void BrowserMediaPlayerManager::OnSetPoster(int player_id, const GURL& url) {
4965d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  // To be overridden by subclasses.
4975d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)}
4985d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
4997dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdochvoid BrowserMediaPlayerManager::OnReleaseResources(int player_id) {
500b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)  MediaPlayerAndroid* player = GetPlayer(player_id);
501f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  if (player)
5025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    player->Release();
503f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  if (player_id == fullscreen_player_id_)
504f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)    fullscreen_player_is_released_ = true;
5055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
5065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5077dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdochvoid BrowserMediaPlayerManager::OnDestroyPlayer(int player_id) {
508868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  RemovePlayer(player_id);
5095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (fullscreen_player_id_ == player_id)
5105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    fullscreen_player_id_ = -1;
5115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
5125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5137dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdochvoid BrowserMediaPlayerManager::AddPlayer(MediaPlayerAndroid* player) {
514868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  DCHECK(!GetPlayer(player->player_id()));
515868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  players_.push_back(player);
516868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)}
517868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)
5187dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdochvoid BrowserMediaPlayerManager::RemovePlayer(int player_id) {
519868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  for (ScopedVector<MediaPlayerAndroid>::iterator it = players_.begin();
520868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)      it != players_.end(); ++it) {
5218bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)    MediaPlayerAndroid* player = *it;
5228bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)    if (player->player_id() == player_id) {
523868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)      players_.erase(it);
524868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)      break;
525868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)    }
526868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  }
527868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)}
528868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)
529d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)scoped_ptr<media::MediaPlayerAndroid> BrowserMediaPlayerManager::SwapPlayer(
530d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)      int player_id, media::MediaPlayerAndroid* player) {
531d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)  media::MediaPlayerAndroid* previous_player = NULL;
532d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)  for (ScopedVector<MediaPlayerAndroid>::iterator it = players_.begin();
533d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)      it != players_.end(); ++it) {
534d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)    if ((*it)->player_id() == player_id) {
535d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)      previous_player = *it;
536d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)      players_.weak_erase(it);
537d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)      players_.push_back(player);
538d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)      break;
539d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)    }
540d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)  }
541d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)  return scoped_ptr<media::MediaPlayerAndroid>(previous_player);
542d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)}
543d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)
544cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)int BrowserMediaPlayerManager::RoutingID() {
545cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  return render_frame_host_->GetRoutingID();
546cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)}
547cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)
548cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)bool BrowserMediaPlayerManager::Send(IPC::Message* msg) {
549cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  return render_frame_host_->Send(msg);
550eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch}
551eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch
5525d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)void BrowserMediaPlayerManager::ReleaseFullscreenPlayer(
5535d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    MediaPlayerAndroid* player) {
5545d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    player->Release();
5555d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)}
5565d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
557a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)void BrowserMediaPlayerManager::OnMediaResourcesRequested(int player_id) {
558a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  int num_active_player = 0;
559a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  ScopedVector<MediaPlayerAndroid>::iterator it;
560a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  for (it = players_.begin(); it != players_.end(); ++it) {
561a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)    if (!(*it)->IsPlayerReady())
562a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)      continue;
563a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)
564a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)    // The player is already active, ignore it.
565a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)    if ((*it)->player_id() == player_id)
566a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)      return;
567a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)    else
568a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)      num_active_player++;
569a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  }
570a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)
571a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  // Number of active players are less than the threshold, do nothing.
572a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  if (num_active_player < kMediaPlayerThreshold)
573a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)    return;
574a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)
575a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  for (it = players_.begin(); it != players_.end(); ++it) {
576a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)    if ((*it)->IsPlayerReady() && !(*it)->IsPlaying() &&
577a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)        fullscreen_player_id_ != (*it)->player_id()) {
578a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)      (*it)->Release();
579cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)      Send(new MediaPlayerMsg_MediaPlayerReleased(RoutingID(),
580cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)                                                  (*it)->player_id()));
581a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)    }
582a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  }
583a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)}
584a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)
585a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)void BrowserMediaPlayerManager::OnMediaResourcesReleased(int player_id) {
586a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)#if defined(VIDEO_HOLE)
587a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  MediaPlayerAndroid* player = GetPlayer(player_id);
588a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  if (player && player->IsSurfaceInUse())
589a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)    return;
590a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch  if (external_video_surface_container_)
591a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch    external_video_surface_container_->ReleaseExternalVideoSurface(player_id);
592a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)#endif  // defined(VIDEO_HOLE)
593a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)}
594a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)
5955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}  // namespace content
596