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"
29929504d64b38e05de7355e162311d6791ad6f54dBo Liu#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;
44929504d64b38e05de7355e162311d6791ad6f54dBo Liustatic 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
52929504d64b38e05de7355e162311d6791ad6f54dBo Liuvoid BrowserMediaPlayerManager::RegisterMediaUrlInterceptor(
53929504d64b38e05de7355e162311d6791ad6f54dBo Liu    media::MediaUrlInterceptor* media_url_interceptor) {
54929504d64b38e05de7355e162311d6791ad6f54dBo Liu  media_url_interceptor_ = media_url_interceptor;
55929504d64b38e05de7355e162311d6791ad6f54dBo Liu}
56929504d64b38e05de7355e162311d6791ad6f54dBo Liu
57929504d64b38e05de7355e162311d6791ad6f54dBo Liu// 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()),
88929504d64b38e05de7355e162311d6791ad6f54dBo Liu          media_player_params.frame_url,
89929504d64b38e05de7355e162311d6791ad6f54dBo Liu          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) {
1767396bf7ba15cf923c112ff260fa26b47ed469c88qinmin@chromium.org  if (WebContentsDelegate* delegate = web_contents_->GetDelegate())
1777396bf7ba15cf923c112ff260fa26b47ed469c88qinmin@chromium.org    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();
294c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    fileapi::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)
307929504d64b38e05de7355e162311d6791ad6f54dBo Liumedia::MediaUrlInterceptor*
308929504d64b38e05de7355e162311d6791ad6f54dBo LiuBrowserMediaPlayerManager::GetMediaUrlInterceptor() {
309929504d64b38e05de7355e162311d6791ad6f54dBo Liu  return media_url_interceptor_;
310929504d64b38e05de7355e162311d6791ad6f54dBo Liu}
311929504d64b38e05de7355e162311d6791ad6f54dBo Liu
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)
339bee9932bab44713b74b422b4b759b49f5a222977Bo Liubool
340bee9932bab44713b74b422b4b759b49f5a222977Bo LiuBrowserMediaPlayerManager::ShouldUseVideoOverlayForEmbeddedEncryptedVideo() {
341bee9932bab44713b74b422b4b759b49f5a222977Bo Liu  RendererPreferences* prefs = web_contents_->GetMutableRendererPrefs();
342bee9932bab44713b74b422b4b759b49f5a222977Bo Liu  return prefs->use_video_overlay_for_embedded_encrypted_video;
343bee9932bab44713b74b422b4b759b49f5a222977Bo Liu}
344bee9932bab44713b74b422b4b759b49f5a222977Bo Liu
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()) {
410929504d64b38e05de7355e162311d6791ad6f54dBo Liu    if (!GetPlayer(player_id)) {
411929504d64b38e05de7355e162311d6791ad6f54dBo Liu      // If a player doesn't exist, it must be waiting for CORS check.
412929504d64b38e05de7355e162311d6791ad6f54dBo Liu      // As a result, just request the tab to enter fullscreen mode without
413929504d64b38e05de7355e162311d6791ad6f54dBo Liu      // creating the surface view. This is only needed for M37.
414929504d64b38e05de7355e162311d6791ad6f54dBo Liu      Send(new MediaPlayerMsg_DidEnterFullscreen(RoutingID(), player_id));
415929504d64b38e05de7355e162311d6791ad6f54dBo Liu      if (CommandLine::ForCurrentProcess()->HasSwitch(
416929504d64b38e05de7355e162311d6791ad6f54dBo Liu          switches::kDisableOverlayFullscreenVideoSubtitle)) {
417929504d64b38e05de7355e162311d6791ad6f54dBo Liu        return;
418929504d64b38e05de7355e162311d6791ad6f54dBo Liu      }
419929504d64b38e05de7355e162311d6791ad6f54dBo Liu      if (RenderWidgetHostViewAndroid* view_android =
420929504d64b38e05de7355e162311d6791ad6f54dBo Liu          static_cast<RenderWidgetHostViewAndroid*>(
421929504d64b38e05de7355e162311d6791ad6f54dBo Liu              web_contents_->GetRenderWidgetHostView())) {
422929504d64b38e05de7355e162311d6791ad6f54dBo Liu        view_android->SetOverlayVideoMode(true);
423929504d64b38e05de7355e162311d6791ad6f54dBo Liu      }
424929504d64b38e05de7355e162311d6791ad6f54dBo Liu      if (WebContentsDelegate* delegate = web_contents_->GetDelegate())
425929504d64b38e05de7355e162311d6791ad6f54dBo Liu          delegate->ToggleFullscreenModeForTab(web_contents_, true);
426929504d64b38e05de7355e162311d6791ad6f54dBo Liu    }
427929504d64b38e05de7355e162311d6791ad6f54dBo Liu
428868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)    // In Android WebView, two ContentViewCores could both try to enter
429868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)    // fullscreen video, we just ignore the second one.
4305d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    video_view_.reset(new ContentVideoView(this));
4315c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu    base::android::ScopedJavaLocalRef<jobject> j_content_video_view =
4325c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu        video_view_->GetJavaObject(base::android::AttachCurrentThread());
4335c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu    if (!j_content_video_view.is_null()) {
4345c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu      fullscreen_player_id_ = player_id;
4355c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu      return;
4365c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu    }
437868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  }
4385c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu
4395c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu  // Force the second video to exit fullscreen.
4405c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu  // TODO(qinmin): There is no need to send DidEnterFullscreen message.
4415c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu  // However, if we don't send the message, page layers will not be
4425c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu  // correctly restored. http:crbug.com/367346.
443cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  Send(new MediaPlayerMsg_DidEnterFullscreen(RoutingID(), player_id));
444cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  Send(new MediaPlayerMsg_DidExitFullscreen(RoutingID(), player_id));
4455c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu  video_view_.reset();
4465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
4475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4487dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdochvoid BrowserMediaPlayerManager::OnExitFullscreen(int player_id) {
4495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (fullscreen_player_id_ == player_id) {
450b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)    MediaPlayerAndroid* player = GetPlayer(player_id);
4515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (player)
452868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)      player->SetVideoSurface(gfx::ScopedJavaSurface());
453868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)    video_view_->OnExitFullscreen();
4545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
4555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
4565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4577dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdochvoid BrowserMediaPlayerManager::OnInitialize(
458f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)    const MediaPlayerHostMsg_Initialize_Params& media_player_params) {
459f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  DCHECK(media_player_params.type != MEDIA_PLAYER_TYPE_MEDIA_SOURCE ||
460f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)      media_player_params.demuxer_client_id > 0)
46168043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)      << "Media source players must have positive demuxer client IDs: "
462f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)      << media_player_params.demuxer_client_id;
46368043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)
464f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  RemovePlayer(media_player_params.player_id);
4657d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)
4661e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  RenderProcessHostImpl* host = static_cast<RenderProcessHostImpl*>(
4671e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)      web_contents()->GetRenderProcessHost());
468e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch  MediaPlayerAndroid* player = CreateMediaPlayer(
469f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)      media_player_params,
470f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)
47168043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)      host->GetBrowserContext()->IsOffTheRecord(), this,
472e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch      host->browser_demuxer_android());
473f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)
474e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch  if (!player)
475e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch    return;
476e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch
477e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch  AddPlayer(player);
4787d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)}
4797d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)
4807dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdochvoid BrowserMediaPlayerManager::OnStart(int player_id) {
4817d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  MediaPlayerAndroid* player = GetPlayer(player_id);
4820529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch  if (!player)
4830529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch    return;
4840529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch  player->Start();
4850529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch  if (fullscreen_player_id_ == player_id && fullscreen_player_is_released_) {
4860529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch    video_view_->OpenVideo();
4870529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch    fullscreen_player_is_released_ = false;
4880529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch  }
4897d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)}
4907d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)
49168043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)void BrowserMediaPlayerManager::OnSeek(
49268043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)    int player_id,
49368043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)    const base::TimeDelta& time) {
4947d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  MediaPlayerAndroid* player = GetPlayer(player_id);
4957d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  if (player)
4967d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)    player->SeekTo(time);
4977d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)}
4987d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)
499d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)void BrowserMediaPlayerManager::OnPause(
500d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)    int player_id,
501d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)    bool is_media_related_action) {
5027d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  MediaPlayerAndroid* player = GetPlayer(player_id);
5037d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  if (player)
504d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)    player->Pause(is_media_related_action);
5057d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)}
5067d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)
507a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)void BrowserMediaPlayerManager::OnSetVolume(int player_id, double volume) {
508a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)  MediaPlayerAndroid* player = GetPlayer(player_id);
509a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)  if (player)
510a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)    player->SetVolume(volume);
511a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)}
512a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)
5135d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)void BrowserMediaPlayerManager::OnSetPoster(int player_id, const GURL& url) {
5145d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  // To be overridden by subclasses.
5155d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)}
5165d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
5177dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdochvoid BrowserMediaPlayerManager::OnReleaseResources(int player_id) {
518b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)  MediaPlayerAndroid* player = GetPlayer(player_id);
519f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  if (player)
5205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    player->Release();
521f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  if (player_id == fullscreen_player_id_)
522f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)    fullscreen_player_is_released_ = true;
5235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
5245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5257dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdochvoid BrowserMediaPlayerManager::OnDestroyPlayer(int player_id) {
526868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  RemovePlayer(player_id);
5275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (fullscreen_player_id_ == player_id)
5285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    fullscreen_player_id_ = -1;
5295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
5305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5317dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdochvoid BrowserMediaPlayerManager::AddPlayer(MediaPlayerAndroid* player) {
532868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  DCHECK(!GetPlayer(player->player_id()));
533868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  players_.push_back(player);
534868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)}
535868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)
5367dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdochvoid BrowserMediaPlayerManager::RemovePlayer(int player_id) {
537868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  for (ScopedVector<MediaPlayerAndroid>::iterator it = players_.begin();
538868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)      it != players_.end(); ++it) {
5398bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)    MediaPlayerAndroid* player = *it;
5408bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)    if (player->player_id() == player_id) {
541868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)      players_.erase(it);
542868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)      break;
543868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)    }
544868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  }
545868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)}
546868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)
547d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)scoped_ptr<media::MediaPlayerAndroid> BrowserMediaPlayerManager::SwapPlayer(
548d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)      int player_id, media::MediaPlayerAndroid* player) {
549d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)  media::MediaPlayerAndroid* previous_player = NULL;
550d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)  for (ScopedVector<MediaPlayerAndroid>::iterator it = players_.begin();
551d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)      it != players_.end(); ++it) {
552d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)    if ((*it)->player_id() == player_id) {
553d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)      previous_player = *it;
554d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)      players_.weak_erase(it);
555d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)      players_.push_back(player);
556d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)      break;
557d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)    }
558d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)  }
559d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)  return scoped_ptr<media::MediaPlayerAndroid>(previous_player);
560d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)}
561d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)
562cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)int BrowserMediaPlayerManager::RoutingID() {
563cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  return render_frame_host_->GetRoutingID();
564cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)}
565cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)
566cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)bool BrowserMediaPlayerManager::Send(IPC::Message* msg) {
567cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  return render_frame_host_->Send(msg);
568eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch}
569eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch
5705d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)void BrowserMediaPlayerManager::ReleaseFullscreenPlayer(
5715d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    MediaPlayerAndroid* player) {
5725d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    player->Release();
5735d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)}
5745d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
575a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)void BrowserMediaPlayerManager::OnMediaResourcesRequested(int player_id) {
576a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  int num_active_player = 0;
577a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  ScopedVector<MediaPlayerAndroid>::iterator it;
578a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  for (it = players_.begin(); it != players_.end(); ++it) {
579a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)    if (!(*it)->IsPlayerReady())
580a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)      continue;
581a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)
582a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)    // The player is already active, ignore it.
583a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)    if ((*it)->player_id() == player_id)
584a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)      return;
585a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)    else
586a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)      num_active_player++;
587a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  }
588a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)
589a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  // Number of active players are less than the threshold, do nothing.
590a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  if (num_active_player < kMediaPlayerThreshold)
591a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)    return;
592a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)
593a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  for (it = players_.begin(); it != players_.end(); ++it) {
594a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)    if ((*it)->IsPlayerReady() && !(*it)->IsPlaying() &&
595a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)        fullscreen_player_id_ != (*it)->player_id()) {
596a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)      (*it)->Release();
597cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)      Send(new MediaPlayerMsg_MediaPlayerReleased(RoutingID(),
598cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)                                                  (*it)->player_id()));
599a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)    }
600a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  }
601a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)}
602a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)
603a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)void BrowserMediaPlayerManager::OnMediaResourcesReleased(int player_id) {
604a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)#if defined(VIDEO_HOLE)
605a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  MediaPlayerAndroid* player = GetPlayer(player_id);
606a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  if (player && player->IsSurfaceInUse())
607a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)    return;
608a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch  if (external_video_surface_container_)
609a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch    external_video_surface_container_->ReleaseExternalVideoSurface(player_id);
610a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)#endif  // defined(VIDEO_HOLE)
611a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)}
612a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)
6135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}  // namespace content
614