Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(32)

Side by Side Diff: content/browser/android/media_player_manager_android.cc

Issue 14314020: Rename MediaPlayerBridgeManager to MediaPlayerManager (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: Created 7 years, 7 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch | Annotate | Revision Log
OLDNEW
(Empty)
1 // Copyright (c) 2012 The Chromium Authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file.
4
5 #include "content/browser/android/media_player_manager_android.h"
6
7 #include "base/bind.h"
8 #include "content/browser/android/media_resource_getter_impl.h"
9 #include "content/browser/web_contents/web_contents_view_android.h"
10 #include "content/common/media/media_player_messages.h"
11 #include "content/public/browser/browser_context.h"
12 #include "content/public/browser/render_process_host.h"
13 #include "content/public/browser/render_view_host.h"
14 #include "content/public/browser/storage_partition.h"
15
16 using media::MediaPlayerBridge;
17
18 // Threshold on the number of media players per renderer before we start
19 // attempting to release inactive media players.
20 static const int kMediaPlayerThreshold = 1;
21
22 namespace content {
23
24 MediaPlayerManagerAndroid::MediaPlayerManagerAndroid(
25 RenderViewHost* render_view_host)
26 : RenderViewHostObserver(render_view_host),
27 ALLOW_THIS_IN_INITIALIZER_LIST(video_view_(this)),
28 fullscreen_player_id_(-1),
29 web_contents_(WebContents::FromRenderViewHost(render_view_host)) {
30 }
31
32 MediaPlayerManagerAndroid::~MediaPlayerManagerAndroid() {}
33
34 bool MediaPlayerManagerAndroid::OnMessageReceived(const IPC::Message& msg) {
35 bool handled = true;
36 IPC_BEGIN_MESSAGE_MAP(MediaPlayerManagerAndroid, msg)
37 IPC_MESSAGE_HANDLER(MediaPlayerHostMsg_EnterFullscreen, OnEnterFullscreen)
38 IPC_MESSAGE_HANDLER(MediaPlayerHostMsg_ExitFullscreen, OnExitFullscreen)
39 IPC_MESSAGE_HANDLER(MediaPlayerHostMsg_MediaPlayerInitialize, OnInitialize)
40 IPC_MESSAGE_HANDLER(MediaPlayerHostMsg_MediaPlayerStart, OnStart)
41 IPC_MESSAGE_HANDLER(MediaPlayerHostMsg_MediaPlayerSeek, OnSeek)
42 IPC_MESSAGE_HANDLER(MediaPlayerHostMsg_MediaPlayerPause, OnPause)
43 IPC_MESSAGE_HANDLER(MediaPlayerHostMsg_MediaPlayerRelease,
44 OnReleaseResources)
45 IPC_MESSAGE_HANDLER(MediaPlayerHostMsg_DestroyMediaPlayer, OnDestroyPlayer)
46 IPC_MESSAGE_HANDLER(MediaPlayerHostMsg_DestroyAllMediaPlayers,
47 DestroyAllMediaPlayers)
48 #if defined(GOOGLE_TV)
49 IPC_MESSAGE_HANDLER(MediaPlayerHostMsg_RequestExternalSurface,
50 OnRequestExternalSurface)
51 IPC_MESSAGE_HANDLER(MediaPlayerHostMsg_NotifyGeometryChange,
52 OnNotifyGeometryChange)
53 #endif
54 IPC_MESSAGE_UNHANDLED(handled = false)
55 IPC_END_MESSAGE_MAP()
56 return handled;
57 }
58
59 void MediaPlayerManagerAndroid::FullscreenPlayerPlay() {
60 MediaPlayerBridge* player = GetFullscreenPlayer();
61 if (player) {
62 player->Start();
63 Send(new MediaPlayerMsg_DidMediaPlayerPlay(
64 routing_id(), fullscreen_player_id_));
65 }
66 }
67
68 void MediaPlayerManagerAndroid::FullscreenPlayerPause() {
69 MediaPlayerBridge* player = GetFullscreenPlayer();
70 if (player) {
71 player->Pause();
72 Send(new MediaPlayerMsg_DidMediaPlayerPause(
73 routing_id(), fullscreen_player_id_));
74 }
75 }
76
77 void MediaPlayerManagerAndroid::FullscreenPlayerSeek(int msec) {
78 MediaPlayerBridge* player = GetFullscreenPlayer();
79 if (player)
80 player->SeekTo(base::TimeDelta::FromMilliseconds(msec));
81 }
82
83 void MediaPlayerManagerAndroid::ExitFullscreen(bool release_media_player) {
84 Send(new MediaPlayerMsg_DidExitFullscreen(
85 routing_id(), fullscreen_player_id_));
86 MediaPlayerBridge* player = GetFullscreenPlayer();
87 fullscreen_player_id_ = -1;
88 if (!player)
89 return;
90 if (release_media_player)
91 player->Release();
92 else
93 player->SetVideoSurface(NULL);
94 }
95
96 void MediaPlayerManagerAndroid::SetVideoSurface(jobject surface) {
97 MediaPlayerBridge* player = GetFullscreenPlayer();
98 if (player) {
99 player->SetVideoSurface(surface);
100 Send(new MediaPlayerMsg_DidEnterFullscreen(
101 routing_id(), player->player_id()));
102 }
103 }
104
105 void MediaPlayerManagerAndroid::OnInitialize(
106 int player_id, const GURL& url, const GURL& first_party_for_cookies) {
107 for (ScopedVector<MediaPlayerBridge>::iterator it = players_.begin();
108 it != players_.end(); ++it) {
109 if ((*it)->player_id() == player_id) {
110 players_.erase(it);
111 break;
112 }
113 }
114
115 RenderProcessHost* host = render_view_host()->GetProcess();
116 BrowserContext* context = host->GetBrowserContext();
117 StoragePartition* partition = host->GetStoragePartition();
118 fileapi::FileSystemContext* file_system_context =
119 partition ? partition->GetFileSystemContext() : NULL;
120 players_.push_back(new MediaPlayerBridge(
121 player_id, url, first_party_for_cookies,
122 new MediaResourceGetterImpl(context, file_system_context, host->GetID(),
123 routing_id()),
124 context->IsOffTheRecord(), this,
125 base::Bind(&MediaPlayerManagerAndroid::OnError, base::Unretained(this)),
126 base::Bind(&MediaPlayerManagerAndroid::OnVideoSizeChanged,
127 base::Unretained(this)),
128 base::Bind(&MediaPlayerManagerAndroid::OnBufferingUpdate,
129 base::Unretained(this)),
130 base::Bind(&MediaPlayerManagerAndroid::OnMediaMetadataChanged,
131 base::Unretained(this)),
132 base::Bind(&MediaPlayerManagerAndroid::OnPlaybackComplete,
133 base::Unretained(this)),
134 base::Bind(&MediaPlayerManagerAndroid::OnSeekComplete,
135 base::Unretained(this)),
136 base::Bind(&MediaPlayerManagerAndroid::OnTimeUpdate,
137 base::Unretained(this)),
138 base::Bind(&MediaPlayerManagerAndroid::OnMediaInterrupted,
139 base::Unretained(this))));
140 }
141
142 void MediaPlayerManagerAndroid::OnStart(int player_id) {
143 MediaPlayerBridge* player = GetPlayer(player_id);
144 if (player)
145 player->Start();
146 }
147
148 void MediaPlayerManagerAndroid::OnSeek(int player_id, base::TimeDelta time) {
149 MediaPlayerBridge* player = GetPlayer(player_id);
150 if (player)
151 player->SeekTo(time);
152 }
153
154 void MediaPlayerManagerAndroid::OnPause(int player_id) {
155 MediaPlayerBridge* player = GetPlayer(player_id);
156 if (player)
157 player->Pause();
158 }
159
160 void MediaPlayerManagerAndroid::OnEnterFullscreen(int player_id) {
161 DCHECK_EQ(fullscreen_player_id_, -1);
162
163 fullscreen_player_id_ = player_id;
164 video_view_.CreateContentVideoView();
165 }
166
167 void MediaPlayerManagerAndroid::OnExitFullscreen(int player_id) {
168 if (fullscreen_player_id_ == player_id) {
169 MediaPlayerBridge* player = GetPlayer(player_id);
170 if (player)
171 player->SetVideoSurface(NULL);
172 video_view_.DestroyContentVideoView();
173 fullscreen_player_id_ = -1;
174 }
175 }
176
177 void MediaPlayerManagerAndroid::OnReleaseResources(int player_id) {
178 MediaPlayerBridge* player = GetPlayer(player_id);
179 // Don't release the fullscreen player when tab visibility changes,
180 // it will be released when user hit the back/home button or when
181 // OnDestroyPlayer is called.
182 if (player && player_id != fullscreen_player_id_)
183 player->Release();
184 }
185
186 void MediaPlayerManagerAndroid::OnDestroyPlayer(int player_id) {
187 for (ScopedVector<MediaPlayerBridge>::iterator it = players_.begin();
188 it != players_.end(); ++it) {
189 if ((*it)->player_id() == player_id) {
190 players_.erase(it);
191 break;
192 }
193 }
194 if (fullscreen_player_id_ == player_id)
195 fullscreen_player_id_ = -1;
196 }
197
198 void MediaPlayerManagerAndroid::DestroyAllMediaPlayers() {
199 players_.clear();
200 if (fullscreen_player_id_ != -1) {
201 video_view_.DestroyContentVideoView();
202 fullscreen_player_id_ = -1;
203 }
204 }
205
206 #if defined(GOOGLE_TV)
207 void MediaPlayerManagerAndroid::AttachExternalVideoSurface(int player_id,
208 jobject surface) {
209 MediaPlayerBridge* player = GetPlayer(player_id);
210 if (player)
211 player->SetVideoSurface(surface);
212 }
213
214 void MediaPlayerManagerAndroid::DetachExternalVideoSurface(int player_id) {
215 MediaPlayerBridge* player = GetPlayer(player_id);
216 if (player)
217 player->SetVideoSurface(NULL);
218 }
219
220 void MediaPlayerManagerAndroid::OnRequestExternalSurface(int player_id) {
221 if (!web_contents_)
222 return;
223
224 WebContentsViewAndroid* view =
225 static_cast<WebContentsViewAndroid*>(web_contents_->GetView());
226 if (view)
227 view->RequestExternalVideoSurface(player_id);
228 }
229
230 void MediaPlayerManagerAndroid::OnNotifyGeometryChange(int player_id,
231 const gfx::RectF& rect) {
232 if (!web_contents_)
233 return;
234
235 WebContentsViewAndroid* view =
236 static_cast<WebContentsViewAndroid*>(web_contents_->GetView());
237 if (view)
238 view->NotifyGeometryChange(player_id, rect);
239 }
240 #endif
241
242 MediaPlayerBridge* MediaPlayerManagerAndroid::GetPlayer(int player_id) {
243 for (ScopedVector<MediaPlayerBridge>::iterator it = players_.begin();
244 it != players_.end(); ++it) {
245 if ((*it)->player_id() == player_id)
246 return *it;
247 }
248 return NULL;
249 }
250
251 MediaPlayerBridge* MediaPlayerManagerAndroid::GetFullscreenPlayer() {
252 return GetPlayer(fullscreen_player_id_);
253 }
254
255 void MediaPlayerManagerAndroid::OnMediaMetadataChanged(
256 int player_id, base::TimeDelta duration, int width, int height,
257 bool success) {
258 Send(new MediaPlayerMsg_MediaMetadataChanged(
259 routing_id(), player_id, duration, width, height, success));
260 if (fullscreen_player_id_ != -1)
261 video_view_.UpdateMediaMetadata();
262 }
263
264 void MediaPlayerManagerAndroid::OnPlaybackComplete(int player_id) {
265 Send(new MediaPlayerMsg_MediaPlaybackCompleted(routing_id(), player_id));
266 if (fullscreen_player_id_ != -1)
267 video_view_.OnPlaybackComplete();
268 }
269
270 void MediaPlayerManagerAndroid::OnMediaInterrupted(int player_id) {
271 // Tell WebKit that the audio should be paused, then release all resources
272 Send(new MediaPlayerMsg_DidMediaPlayerPause(routing_id(), player_id));
273 OnReleaseResources(player_id);
274 }
275
276 void MediaPlayerManagerAndroid::OnBufferingUpdate(
277 int player_id, int percentage) {
278 Send(new MediaPlayerMsg_MediaBufferingUpdate(
279 routing_id(), player_id, percentage));
280 if (fullscreen_player_id_ != -1)
281 video_view_.OnBufferingUpdate(percentage);
282 }
283
284 void MediaPlayerManagerAndroid::OnSeekComplete(int player_id,
285 base::TimeDelta current_time) {
286 Send(new MediaPlayerMsg_MediaSeekCompleted(
287 routing_id(), player_id, current_time));
288 }
289
290 void MediaPlayerManagerAndroid::OnError(int player_id, int error) {
291 Send(new MediaPlayerMsg_MediaError(routing_id(), player_id, error));
292 if (fullscreen_player_id_ != -1)
293 video_view_.OnMediaPlayerError(error);
294 }
295
296 void MediaPlayerManagerAndroid::OnVideoSizeChanged(
297 int player_id, int width, int height) {
298 Send(new MediaPlayerMsg_MediaVideoSizeChanged(routing_id(), player_id,
299 width, height));
300 if (fullscreen_player_id_ != -1)
301 video_view_.OnVideoSizeChanged(width, height);
302 }
303
304 void MediaPlayerManagerAndroid::OnTimeUpdate(int player_id,
305 base::TimeDelta current_time) {
306 Send(new MediaPlayerMsg_MediaTimeUpdate(
307 routing_id(), player_id, current_time));
308 }
309
310 void MediaPlayerManagerAndroid::RequestMediaResources(
311 MediaPlayerBridge* player) {
312 if (player == NULL)
313 return;
314
315 int num_active_player = 0;
316 ScopedVector<MediaPlayerBridge>::iterator it;
317 for (it = players_.begin(); it != players_.end(); ++it) {
318 if (!(*it)->prepared())
319 continue;
320
321 // The player is already active, ignore it.
322 if ((*it) == player)
323 return;
324 else
325 num_active_player++;
326 }
327
328 // Number of active players are less than the threshold, do nothing.
329 if (num_active_player < kMediaPlayerThreshold)
330 return;
331
332 for (it = players_.begin(); it != players_.end(); ++it) {
333 if ((*it)->prepared() && !(*it)->IsPlaying() &&
334 fullscreen_player_id_ != (*it)->player_id()) {
335 (*it)->Release();
336 Send(new MediaPlayerMsg_MediaPlayerReleased(
337 routing_id(), (*it)->player_id()));
338 }
339 }
340 }
341
342 void MediaPlayerManagerAndroid::ReleaseMediaResources(
343 MediaPlayerBridge* player) {
344 // Nothing needs to be done.
345 }
346
347 } // namespace content
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698