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()),
866e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)          media_player_params.frame_url,
876e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)          media_player_params.allow_credentials);
88f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)      BrowserMediaPlayerManager* browser_media_player_manager =
89f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)          static_cast<BrowserMediaPlayerManager*>(manager);
90f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)      ContentViewCoreImpl* content_view_core_impl =
91f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)          static_cast<ContentViewCoreImpl*>(ContentViewCore::FromWebContents(
92f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)              browser_media_player_manager->web_contents_));
93f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)      if (!content_view_core_impl) {
94f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)        // May reach here due to prerendering. Don't extract the metadata
95f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)        // since it is expensive.
96f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)        // TODO(qinmin): extract the metadata once the user decided to load
97f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)        // the page.
98f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)        browser_media_player_manager->OnMediaMetadataChanged(
99f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)            media_player_params.player_id, base::TimeDelta(), 0, 0, false);
100f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)      } else if (!content_view_core_impl->ShouldBlockMediaRequest(
101f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)            media_player_params.url)) {
102f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)        media_player_bridge->Initialize();
103f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)      }
10458537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)      return media_player_bridge;
10558537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)    }
10658537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)
10758537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)    case MEDIA_PLAYER_TYPE_MEDIA_SOURCE: {
10868043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)      return new MediaSourcePlayer(
109f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)          media_player_params.player_id,
110a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)          manager,
111a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)          base::Bind(&BrowserMediaPlayerManager::OnMediaResourcesRequested,
112a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)                     weak_ptr_factory_.GetWeakPtr()),
113f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)          demuxer->CreateDemuxer(media_player_params.demuxer_client_id),
114f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)          media_player_params.frame_url);
11558537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)    }
11658537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  }
11758537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)
11858537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  NOTREACHED();
11958537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  return NULL;
12058537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)}
12158537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)
1227dbb3d5cf0c15f500944d211057644d6a2f37371Ben MurdochBrowserMediaPlayerManager::BrowserMediaPlayerManager(
123cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)    RenderFrameHost* render_frame_host)
124cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)    : render_frame_host_(render_frame_host),
1252a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      fullscreen_player_id_(-1),
126f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)      fullscreen_player_is_released_(false),
127cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)      web_contents_(WebContents::FromRenderFrameHost(render_frame_host)),
12868043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)      weak_ptr_factory_(this) {
1295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
1305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
131f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)BrowserMediaPlayerManager::~BrowserMediaPlayerManager() {
132f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  // During the tear down process, OnDestroyPlayer() may or may not be called
133f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  // (e.g. the WebContents may be destroyed before the render process). So
134f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  // we cannot DCHECK(players_.empty()) here. Instead, all media players in
135f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  // |players_| will be destroyed here because |player_| is a ScopedVector.
136f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)}
1375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1387dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdochvoid BrowserMediaPlayerManager::FullscreenPlayerPlay() {
139b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)  MediaPlayerAndroid* player = GetFullscreenPlayer();
1405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (player) {
141f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)    if (fullscreen_player_is_released_) {
142f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)      video_view_->OpenVideo();
143f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)      fullscreen_player_is_released_ = false;
144f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)    }
1455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    player->Start();
146cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)    Send(new MediaPlayerMsg_DidMediaPlayerPlay(RoutingID(),
147cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)                                               fullscreen_player_id_));
1485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
1495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
1505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1517dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdochvoid BrowserMediaPlayerManager::FullscreenPlayerPause() {
152b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)  MediaPlayerAndroid* player = GetFullscreenPlayer();
1535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (player) {
154d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)    player->Pause(true);
155cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)    Send(new MediaPlayerMsg_DidMediaPlayerPause(RoutingID(),
156cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)                                                fullscreen_player_id_));
1575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
1585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
1595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1607dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdochvoid BrowserMediaPlayerManager::FullscreenPlayerSeek(int msec) {
161b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)  MediaPlayerAndroid* player = GetFullscreenPlayer();
16268043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)  if (player) {
163f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)    // TODO(kbalazs): if |fullscreen_player_is_released_| is true
164f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)    // at this point, player->GetCurrentTime() will be wrong until
165f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)    // FullscreenPlayerPlay (http://crbug.com/322798).
16668043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)    OnSeekRequest(fullscreen_player_id_,
16768043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)                  base::TimeDelta::FromMilliseconds(msec));
16868043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)  }
1695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
1705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1717dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdochvoid BrowserMediaPlayerManager::ExitFullscreen(bool release_media_player) {
172116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  if (WebContentsDelegate* delegate = web_contents_->GetDelegate())
173116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch    delegate->ToggleFullscreenModeForTab(web_contents_, false);
1741320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  if (RenderWidgetHostViewAndroid* view_android =
1751320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      static_cast<RenderWidgetHostViewAndroid*>(
1761320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci          web_contents_->GetRenderWidgetHostView())) {
1771320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    view_android->SetOverlayVideoMode(false);
1785d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  }
1795d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
180cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  Send(
181cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)      new MediaPlayerMsg_DidExitFullscreen(RoutingID(), fullscreen_player_id_));
182868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  video_view_.reset();
183868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  MediaPlayerAndroid* player = GetFullscreenPlayer();
184eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  fullscreen_player_id_ = -1;
1855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (!player)
1865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return;
1875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (release_media_player)
1885d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    ReleaseFullscreenPlayer(player);
1895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  else
190868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)    player->SetVideoSurface(gfx::ScopedJavaSurface());
1915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
1925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1931320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tuccivoid BrowserMediaPlayerManager::OnTimeUpdate(
1941320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    int player_id,
1951320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    base::TimeDelta current_timestamp,
1961320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    base::TimeTicks current_time_ticks) {
1971320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  Send(new MediaPlayerMsg_MediaTimeUpdate(
1981320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      RoutingID(), player_id, current_timestamp, current_time_ticks));
1997d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)}
2007d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)
2017dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdochvoid BrowserMediaPlayerManager::SetVideoSurface(
2027dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch    gfx::ScopedJavaSurface surface) {
203b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)  MediaPlayerAndroid* player = GetFullscreenPlayer();
204a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)  if (!player)
205a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)    return;
206effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch
207effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch  bool empty_surface = surface.IsEmpty();
208a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)  player->SetVideoSurface(surface.Pass());
209effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch  if (empty_surface)
210effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch    return;
2115d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
212cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  Send(new MediaPlayerMsg_DidEnterFullscreen(RoutingID(), player->player_id()));
2135d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  if (RenderWidgetHostViewAndroid* view_android =
2145d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      static_cast<RenderWidgetHostViewAndroid*>(
2155d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)          web_contents_->GetRenderWidgetHostView())) {
2165d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    view_android->SetOverlayVideoMode(true);
2175d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  }
2185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
2195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2207dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdochvoid BrowserMediaPlayerManager::OnMediaMetadataChanged(
2217d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)    int player_id, base::TimeDelta duration, int width, int height,
2227d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)    bool success) {
2237d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  Send(new MediaPlayerMsg_MediaMetadataChanged(
224cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)      RoutingID(), player_id, duration, width, height, success));
225f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  if (fullscreen_player_id_ == player_id)
2267d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)    video_view_->UpdateMediaMetadata();
2277d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)}
2285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2297dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdochvoid BrowserMediaPlayerManager::OnPlaybackComplete(int player_id) {
230cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  Send(new MediaPlayerMsg_MediaPlaybackCompleted(RoutingID(), player_id));
231f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  if (fullscreen_player_id_ == player_id)
2327d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)    video_view_->OnPlaybackComplete();
2337d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)}
2347d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)
2357dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdochvoid BrowserMediaPlayerManager::OnMediaInterrupted(int player_id) {
2367d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  // Tell WebKit that the audio should be paused, then release all resources
237cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  Send(new MediaPlayerMsg_MediaPlayerReleased(RoutingID(), player_id));
2387d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  OnReleaseResources(player_id);
2397d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)}
2407d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)
2417dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdochvoid BrowserMediaPlayerManager::OnBufferingUpdate(
2427d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)    int player_id, int percentage) {
2437d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  Send(new MediaPlayerMsg_MediaBufferingUpdate(
244cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)      RoutingID(), player_id, percentage));
245f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  if (fullscreen_player_id_ == player_id)
2467d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)    video_view_->OnBufferingUpdate(percentage);
2477d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)}
2487d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)
24968043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)void BrowserMediaPlayerManager::OnSeekRequest(
25068043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)    int player_id,
25168043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)    const base::TimeDelta& time_to_seek) {
252cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  Send(new MediaPlayerMsg_SeekRequest(RoutingID(), player_id, time_to_seek));
253cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)}
254cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)
2551320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tuccivoid BrowserMediaPlayerManager::ReleaseAllMediaPlayers() {
2561320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  for (ScopedVector<MediaPlayerAndroid>::iterator it = players_.begin();
2571320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      it != players_.end(); ++it) {
2581320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    if ((*it)->player_id() == fullscreen_player_id_)
2591320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      fullscreen_player_is_released_ = true;
2601320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    (*it)->Release();
2611320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  }
26268043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)}
26368043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)
26468043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)void BrowserMediaPlayerManager::OnSeekComplete(
26568043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)    int player_id,
26668043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)    const base::TimeDelta& current_time) {
267cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  Send(new MediaPlayerMsg_SeekCompleted(RoutingID(), player_id, current_time));
2687d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)}
2697d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)
2707dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdochvoid BrowserMediaPlayerManager::OnError(int player_id, int error) {
271cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  Send(new MediaPlayerMsg_MediaError(RoutingID(), player_id, error));
272f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  if (fullscreen_player_id_ == player_id)
2737d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)    video_view_->OnMediaPlayerError(error);
2747d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)}
2757d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)
2767dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdochvoid BrowserMediaPlayerManager::OnVideoSizeChanged(
2777d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)    int player_id, int width, int height) {
278cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  Send(new MediaPlayerMsg_MediaVideoSizeChanged(RoutingID(), player_id,
2797d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)      width, height));
280f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  if (fullscreen_player_id_ == player_id)
2817d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)    video_view_->OnVideoSizeChanged(width, height);
2827d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)}
2837d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)
2847dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdochmedia::MediaResourceGetter*
2857dbb3d5cf0c15f500944d211057644d6a2f37371Ben MurdochBrowserMediaPlayerManager::GetMediaResourceGetter() {
286c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  if (!media_resource_getter_.get()) {
2871e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)    RenderProcessHost* host = web_contents()->GetRenderProcessHost();
288c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    BrowserContext* context = host->GetBrowserContext();
289c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    StoragePartition* partition = host->GetStoragePartition();
29003b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)    storage::FileSystemContext* file_system_context =
291c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)        partition ? partition->GetFileSystemContext() : NULL;
292010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)    // Eventually this needs to be fixed to pass the correct frame rather
293010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)    // than just using the main frame.
294c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    media_resource_getter_.reset(new MediaResourceGetterImpl(
295010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)        context,
296010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)        file_system_context,
297010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)        host->GetID(),
298010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)        web_contents()->GetMainFrame()->GetRoutingID()));
299c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  }
300c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  return media_resource_getter_.get();
3015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
3025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3035f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)media::MediaUrlInterceptor*
3045f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)BrowserMediaPlayerManager::GetMediaUrlInterceptor() {
3055f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  return media_url_interceptor_;
3065f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)}
3075f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)
3087dbb3d5cf0c15f500944d211057644d6a2f37371Ben MurdochMediaPlayerAndroid* BrowserMediaPlayerManager::GetFullscreenPlayer() {
3097d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  return GetPlayer(fullscreen_player_id_);
3105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
3115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3127dbb3d5cf0c15f500944d211057644d6a2f37371Ben MurdochMediaPlayerAndroid* BrowserMediaPlayerManager::GetPlayer(int player_id) {
3137d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  for (ScopedVector<MediaPlayerAndroid>::iterator it = players_.begin();
3147d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)      it != players_.end(); ++it) {
3157d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)    if ((*it)->player_id() == player_id)
3167d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)      return *it;
3177d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  }
3187d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  return NULL;
3197d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)}
3207d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)
3210529e5d033099cbfc42635f6f6183833b09dff6eBen Murdochvoid BrowserMediaPlayerManager::RequestFullScreen(int player_id) {
3227dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  if (fullscreen_player_id_ == player_id)
3237dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch    return;
3244e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)
3257dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  if (fullscreen_player_id_ != -1) {
3267dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch    // TODO(qinmin): Determine the correct error code we should report to WMPA.
3277dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch    OnError(player_id, MediaPlayerAndroid::MEDIA_ERROR_DECODE);
3287dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch    return;
3297dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  }
330a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)
331f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  Send(new MediaPlayerMsg_RequestFullscreen(RoutingID(), player_id));
3327d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)}
3337d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)
3345d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#if defined(VIDEO_HOLE)
335116680a4aac90f2aa7413d9095a592090648e557Ben Murdochbool
336116680a4aac90f2aa7413d9095a592090648e557Ben MurdochBrowserMediaPlayerManager::ShouldUseVideoOverlayForEmbeddedEncryptedVideo() {
337116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  RendererPreferences* prefs = web_contents_->GetMutableRendererPrefs();
338116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  return prefs->use_video_overlay_for_embedded_encrypted_video;
339116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch}
340116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch
3417dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdochvoid BrowserMediaPlayerManager::AttachExternalVideoSurface(int player_id,
3427dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch                                                           jobject surface) {
343b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)  MediaPlayerAndroid* player = GetPlayer(player_id);
3447d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  if (player) {
3457d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)    player->SetVideoSurface(
3467d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)        gfx::ScopedJavaSurface::AcquireExternalSurface(surface));
3477d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  }
3485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
3495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3507dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdochvoid BrowserMediaPlayerManager::DetachExternalVideoSurface(int player_id) {
351b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)  MediaPlayerAndroid* player = GetPlayer(player_id);
3525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (player)
3537d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)    player->SetVideoSurface(gfx::ScopedJavaSurface());
3547d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)}
3557d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)
356a02191e04bc25c4935f804f2c080ae28663d096dBen Murdochvoid BrowserMediaPlayerManager::OnFrameInfoUpdated() {
357a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch  if (external_video_surface_container_)
358a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch    external_video_surface_container_->OnFrameInfoUpdated();
359a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch}
360a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch
3617dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdochvoid BrowserMediaPlayerManager::OnNotifyExternalSurface(
3627d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)    int player_id, bool is_request, const gfx::RectF& rect) {
3637d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  if (!web_contents_)
3647d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)    return;
3657d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)
366a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  if (is_request) {
367a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch    OnRequestExternalSurface(player_id, rect);
368a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch  }
369a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch  if (external_video_surface_container_) {
370a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch    external_video_surface_container_->OnExternalVideoSurfacePositionChanged(
371a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch        player_id, rect);
372a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch  }
373a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch}
374a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch
375a02191e04bc25c4935f804f2c080ae28663d096dBen Murdochvoid BrowserMediaPlayerManager::OnRequestExternalSurface(
376a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch    int player_id, const gfx::RectF& rect) {
377a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch  if (!external_video_surface_container_) {
378a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch    ContentBrowserClient* client = GetContentClient()->browser();
379a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch    external_video_surface_container_.reset(
380a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch        client->OverrideCreateExternalVideoSurfaceContainer(web_contents_));
381a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch  }
382a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch  // It's safe to use base::Unretained(this), because the callbacks will not
383a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch  // be called after running ReleaseExternalVideoSurface().
384a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch  if (external_video_surface_container_) {
385a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch    external_video_surface_container_->RequestExternalVideoSurface(
386a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)        player_id,
387a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)        base::Bind(&BrowserMediaPlayerManager::AttachExternalVideoSurface,
388a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)                   base::Unretained(this)),
389a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)        base::Bind(&BrowserMediaPlayerManager::DetachExternalVideoSurface,
390a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)                   base::Unretained(this)));
391a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  }
3925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
3935d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#endif  // defined(VIDEO_HOLE)
3945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3957dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdochvoid BrowserMediaPlayerManager::OnEnterFullscreen(int player_id) {
3965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  DCHECK_EQ(fullscreen_player_id_, -1);
397a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)#if defined(VIDEO_HOLE)
398a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch  if (external_video_surface_container_)
399a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch    external_video_surface_container_->ReleaseExternalVideoSurface(player_id);
400a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)#endif  // defined(VIDEO_HOLE)
401868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  if (video_view_.get()) {
402868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)    fullscreen_player_id_ = player_id;
403868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)    video_view_->OpenVideo();
4045c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu    return;
4055d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  } else if (!ContentVideoView::GetInstance()) {
406868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)    // In Android WebView, two ContentViewCores could both try to enter
407868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)    // fullscreen video, we just ignore the second one.
4085d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    video_view_.reset(new ContentVideoView(this));
4095c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu    base::android::ScopedJavaLocalRef<jobject> j_content_video_view =
4105c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu        video_view_->GetJavaObject(base::android::AttachCurrentThread());
4115c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu    if (!j_content_video_view.is_null()) {
4125c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu      fullscreen_player_id_ = player_id;
4135c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu      return;
4145c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu    }
415868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  }
4165c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu
4175c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu  // Force the second video to exit fullscreen.
4185c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu  // TODO(qinmin): There is no need to send DidEnterFullscreen message.
4195c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu  // However, if we don't send the message, page layers will not be
4205c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu  // correctly restored. http:crbug.com/367346.
421cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  Send(new MediaPlayerMsg_DidEnterFullscreen(RoutingID(), player_id));
422cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  Send(new MediaPlayerMsg_DidExitFullscreen(RoutingID(), player_id));
4235c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu  video_view_.reset();
4245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
4255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4267dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdochvoid BrowserMediaPlayerManager::OnExitFullscreen(int player_id) {
4275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (fullscreen_player_id_ == player_id) {
428b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)    MediaPlayerAndroid* player = GetPlayer(player_id);
4295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (player)
430868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)      player->SetVideoSurface(gfx::ScopedJavaSurface());
431868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)    video_view_->OnExitFullscreen();
4325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
4335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
4345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4357dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdochvoid BrowserMediaPlayerManager::OnInitialize(
436f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)    const MediaPlayerHostMsg_Initialize_Params& media_player_params) {
437f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  DCHECK(media_player_params.type != MEDIA_PLAYER_TYPE_MEDIA_SOURCE ||
438f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)      media_player_params.demuxer_client_id > 0)
43968043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)      << "Media source players must have positive demuxer client IDs: "
440f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)      << media_player_params.demuxer_client_id;
44168043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)
442f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  RemovePlayer(media_player_params.player_id);
4437d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)
4441e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  RenderProcessHostImpl* host = static_cast<RenderProcessHostImpl*>(
4451e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)      web_contents()->GetRenderProcessHost());
446e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch  MediaPlayerAndroid* player = CreateMediaPlayer(
447f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)      media_player_params,
448f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)
44968043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)      host->GetBrowserContext()->IsOffTheRecord(), this,
450e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch      host->browser_demuxer_android());
451f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)
452e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch  if (!player)
453e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch    return;
454e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch
455e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch  AddPlayer(player);
4567d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)}
4577d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)
4587dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdochvoid BrowserMediaPlayerManager::OnStart(int player_id) {
4597d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  MediaPlayerAndroid* player = GetPlayer(player_id);
4600529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch  if (!player)
4610529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch    return;
4620529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch  player->Start();
4630529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch  if (fullscreen_player_id_ == player_id && fullscreen_player_is_released_) {
4640529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch    video_view_->OpenVideo();
4650529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch    fullscreen_player_is_released_ = false;
4660529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch  }
4677d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)}
4687d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)
46968043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)void BrowserMediaPlayerManager::OnSeek(
47068043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)    int player_id,
47168043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)    const base::TimeDelta& time) {
4727d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  MediaPlayerAndroid* player = GetPlayer(player_id);
4737d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  if (player)
4747d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)    player->SeekTo(time);
4757d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)}
4767d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)
477d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)void BrowserMediaPlayerManager::OnPause(
478d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)    int player_id,
479d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)    bool is_media_related_action) {
4807d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  MediaPlayerAndroid* player = GetPlayer(player_id);
4817d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  if (player)
482d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)    player->Pause(is_media_related_action);
4837d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)}
4847d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)
485a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)void BrowserMediaPlayerManager::OnSetVolume(int player_id, double volume) {
486a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)  MediaPlayerAndroid* player = GetPlayer(player_id);
487a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)  if (player)
488a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)    player->SetVolume(volume);
489a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)}
490a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)
4915d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)void BrowserMediaPlayerManager::OnSetPoster(int player_id, const GURL& url) {
4925d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  // To be overridden by subclasses.
4935d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)}
4945d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
4957dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdochvoid BrowserMediaPlayerManager::OnReleaseResources(int player_id) {
496b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)  MediaPlayerAndroid* player = GetPlayer(player_id);
497f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  if (player)
4981320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    ReleasePlayer(player);
499f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  if (player_id == fullscreen_player_id_)
500f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)    fullscreen_player_is_released_ = true;
5015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
5025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5037dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdochvoid BrowserMediaPlayerManager::OnDestroyPlayer(int player_id) {
504868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  RemovePlayer(player_id);
5055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (fullscreen_player_id_ == player_id)
5065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    fullscreen_player_id_ = -1;
5075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
5085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5091320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tuccivoid BrowserMediaPlayerManager::OnRequestRemotePlayback(int /* player_id */) {
5101320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  // Does nothing if we don't have a remote player
5111320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci}
5121320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
5131320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tuccivoid BrowserMediaPlayerManager::OnRequestRemotePlaybackControl(
5141320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    int /* player_id */) {
5151320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  // Does nothing if we don't have a remote player
5161320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci}
5171320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
5187dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdochvoid BrowserMediaPlayerManager::AddPlayer(MediaPlayerAndroid* player) {
519868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  DCHECK(!GetPlayer(player->player_id()));
520868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  players_.push_back(player);
521868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)}
522868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)
5237dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdochvoid BrowserMediaPlayerManager::RemovePlayer(int player_id) {
524868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  for (ScopedVector<MediaPlayerAndroid>::iterator it = players_.begin();
525868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)      it != players_.end(); ++it) {
5261320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    if ((*it)->player_id() == player_id) {
5271320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      ReleaseMediaResources(player_id);
528868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)      players_.erase(it);
529868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)      break;
530868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)    }
531868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  }
532868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)}
533868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)
534d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)scoped_ptr<media::MediaPlayerAndroid> BrowserMediaPlayerManager::SwapPlayer(
535d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)      int player_id, media::MediaPlayerAndroid* player) {
536d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)  media::MediaPlayerAndroid* previous_player = NULL;
537d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)  for (ScopedVector<MediaPlayerAndroid>::iterator it = players_.begin();
538d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)      it != players_.end(); ++it) {
539d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)    if ((*it)->player_id() == player_id) {
540d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)      previous_player = *it;
5411320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      ReleaseMediaResources(player_id);
542d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)      players_.weak_erase(it);
543d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)      players_.push_back(player);
544d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)      break;
545d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)    }
546d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)  }
547d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)  return scoped_ptr<media::MediaPlayerAndroid>(previous_player);
548d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)}
549d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)
550cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)int BrowserMediaPlayerManager::RoutingID() {
551cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  return render_frame_host_->GetRoutingID();
552cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)}
553cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)
554cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)bool BrowserMediaPlayerManager::Send(IPC::Message* msg) {
555cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  return render_frame_host_->Send(msg);
556eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch}
557eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch
5585d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)void BrowserMediaPlayerManager::ReleaseFullscreenPlayer(
5595d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    MediaPlayerAndroid* player) {
5601320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  ReleasePlayer(player);
5615d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)}
5625d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
563a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)void BrowserMediaPlayerManager::OnMediaResourcesRequested(int player_id) {
564a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  int num_active_player = 0;
565a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  ScopedVector<MediaPlayerAndroid>::iterator it;
566a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  for (it = players_.begin(); it != players_.end(); ++it) {
567a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)    if (!(*it)->IsPlayerReady())
568a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)      continue;
569a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)
570a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)    // The player is already active, ignore it.
571a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)    if ((*it)->player_id() == player_id)
572a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)      return;
573a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)    else
574a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)      num_active_player++;
575a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  }
576a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)
577a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  // Number of active players are less than the threshold, do nothing.
578a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  if (num_active_player < kMediaPlayerThreshold)
579a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)    return;
580a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)
581a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  for (it = players_.begin(); it != players_.end(); ++it) {
582a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)    if ((*it)->IsPlayerReady() && !(*it)->IsPlaying() &&
583a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)        fullscreen_player_id_ != (*it)->player_id()) {
5841320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      ReleasePlayer(*it);
585cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)      Send(new MediaPlayerMsg_MediaPlayerReleased(RoutingID(),
586cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)                                                  (*it)->player_id()));
587a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)    }
588a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  }
589a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)}
590a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)
5911320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tuccivoid BrowserMediaPlayerManager::ReleaseMediaResources(int player_id) {
592a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)#if defined(VIDEO_HOLE)
593a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch  if (external_video_surface_container_)
594a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch    external_video_surface_container_->ReleaseExternalVideoSurface(player_id);
595a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)#endif  // defined(VIDEO_HOLE)
596a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)}
597a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)
5981320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tuccivoid BrowserMediaPlayerManager::ReleasePlayer(MediaPlayerAndroid* player) {
5991320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  player->Release();
6001320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  ReleaseMediaResources(player->player_id());
6011320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci}
6021320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
6035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}  // namespace content
604