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

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: additional rebase conflict 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 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 IPC_MESSAGE_HANDLER(MediaPlayerHostMsg_DemuxerReady,
54 OnDemuxerReady)
55 IPC_MESSAGE_HANDLER(MediaPlayerHostMsg_ReadFromDemuxerAck,
56 OnReadFromDemuxerAck)
57 #endif
58 IPC_MESSAGE_UNHANDLED(handled = false)
59 IPC_END_MESSAGE_MAP()
60 return handled;
61 }
62
63 void MediaPlayerManagerAndroid::FullscreenPlayerPlay() {
64 MediaPlayerBridge* player = GetFullscreenPlayer();
65 if (player) {
66 player->Start();
67 Send(new MediaPlayerMsg_DidMediaPlayerPlay(
68 routing_id(), fullscreen_player_id_));
69 }
70 }
71
72 void MediaPlayerManagerAndroid::FullscreenPlayerPause() {
73 MediaPlayerBridge* player = GetFullscreenPlayer();
74 if (player) {
75 player->Pause();
76 Send(new MediaPlayerMsg_DidMediaPlayerPause(
77 routing_id(), fullscreen_player_id_));
78 }
79 }
80
81 void MediaPlayerManagerAndroid::FullscreenPlayerSeek(int msec) {
82 MediaPlayerBridge* player = GetFullscreenPlayer();
83 if (player)
84 player->SeekTo(base::TimeDelta::FromMilliseconds(msec));
85 }
86
87 void MediaPlayerManagerAndroid::ExitFullscreen(bool release_media_player) {
88 Send(new MediaPlayerMsg_DidExitFullscreen(
89 routing_id(), fullscreen_player_id_));
90 MediaPlayerBridge* player = GetFullscreenPlayer();
91 fullscreen_player_id_ = -1;
92 if (!player)
93 return;
94 if (release_media_player)
95 player->Release();
96 else
97 player->SetVideoSurface(NULL);
98 }
99
100 void MediaPlayerManagerAndroid::SetVideoSurface(jobject surface) {
101 MediaPlayerBridge* player = GetFullscreenPlayer();
102 if (player) {
103 player->SetVideoSurface(surface);
104 Send(new MediaPlayerMsg_DidEnterFullscreen(
105 routing_id(), player->player_id()));
106 }
107 }
108
109 void MediaPlayerManagerAndroid::OnInitialize(
110 int player_id, const GURL& url,
111 bool is_media_source,
112 const GURL& first_party_for_cookies) {
113 for (ScopedVector<MediaPlayerBridge>::iterator it = players_.begin();
114 it != players_.end(); ++it) {
115 if ((*it)->player_id() == player_id) {
116 players_.erase(it);
117 break;
118 }
119 }
120
121 RenderProcessHost* host = render_view_host()->GetProcess();
122 BrowserContext* context = host->GetBrowserContext();
123 StoragePartition* partition = host->GetStoragePartition();
124 fileapi::FileSystemContext* file_system_context =
125 partition ? partition->GetFileSystemContext() : NULL;
126 players_.push_back(media::MediaPlayerBridge::Create(
127 player_id, url, is_media_source, first_party_for_cookies,
128 new MediaResourceGetterImpl(context, file_system_context, host->GetID(),
129 routing_id()),
130 context->IsOffTheRecord(), this,
131 #if defined(GOOGLE_TV)
132 base::Bind(&MediaPlayerManagerAndroid::OnReadFromDemuxer,
133 base::Unretained(this)),
134 #endif
135 base::Bind(&MediaPlayerManagerAndroid::OnError, base::Unretained(this)),
136 base::Bind(&MediaPlayerManagerAndroid::OnVideoSizeChanged,
137 base::Unretained(this)),
138 base::Bind(&MediaPlayerManagerAndroid::OnBufferingUpdate,
139 base::Unretained(this)),
140 base::Bind(&MediaPlayerManagerAndroid::OnMediaMetadataChanged,
141 base::Unretained(this)),
142 base::Bind(&MediaPlayerManagerAndroid::OnPlaybackComplete,
143 base::Unretained(this)),
144 base::Bind(&MediaPlayerManagerAndroid::OnSeekComplete,
145 base::Unretained(this)),
146 base::Bind(&MediaPlayerManagerAndroid::OnTimeUpdate,
147 base::Unretained(this)),
148 base::Bind(&MediaPlayerManagerAndroid::OnMediaInterrupted,
149 base::Unretained(this))));
150 }
151
152 void MediaPlayerManagerAndroid::OnStart(int player_id) {
153 MediaPlayerBridge* player = GetPlayer(player_id);
154 if (player)
155 player->Start();
156 }
157
158 void MediaPlayerManagerAndroid::OnSeek(int player_id, base::TimeDelta time) {
159 MediaPlayerBridge* player = GetPlayer(player_id);
160 if (player)
161 player->SeekTo(time);
162 }
163
164 void MediaPlayerManagerAndroid::OnPause(int player_id) {
165 MediaPlayerBridge* player = GetPlayer(player_id);
166 if (player)
167 player->Pause();
168 }
169
170 void MediaPlayerManagerAndroid::OnEnterFullscreen(int player_id) {
171 DCHECK_EQ(fullscreen_player_id_, -1);
172
173 fullscreen_player_id_ = player_id;
174 video_view_.CreateContentVideoView();
175 }
176
177 void MediaPlayerManagerAndroid::OnExitFullscreen(int player_id) {
178 if (fullscreen_player_id_ == player_id) {
179 MediaPlayerBridge* player = GetPlayer(player_id);
180 if (player)
181 player->SetVideoSurface(NULL);
182 video_view_.DestroyContentVideoView();
183 fullscreen_player_id_ = -1;
184 }
185 }
186
187 void MediaPlayerManagerAndroid::OnReleaseResources(int player_id) {
188 MediaPlayerBridge* player = GetPlayer(player_id);
189 // Don't release the fullscreen player when tab visibility changes,
190 // it will be released when user hit the back/home button or when
191 // OnDestroyPlayer is called.
192 if (player && player_id != fullscreen_player_id_)
193 player->Release();
194 }
195
196 void MediaPlayerManagerAndroid::OnDestroyPlayer(int player_id) {
197 for (ScopedVector<MediaPlayerBridge>::iterator it = players_.begin();
198 it != players_.end(); ++it) {
199 if ((*it)->player_id() == player_id) {
200 players_.erase(it);
201 break;
202 }
203 }
204 if (fullscreen_player_id_ == player_id)
205 fullscreen_player_id_ = -1;
206 }
207
208 void MediaPlayerManagerAndroid::DestroyAllMediaPlayers() {
209 players_.clear();
210 if (fullscreen_player_id_ != -1) {
211 video_view_.DestroyContentVideoView();
212 fullscreen_player_id_ = -1;
213 }
214 }
215
216 #if defined(GOOGLE_TV)
217 void MediaPlayerManagerAndroid::AttachExternalVideoSurface(int player_id,
218 jobject surface) {
219 MediaPlayerBridge* player = GetPlayer(player_id);
220 if (player)
221 player->SetVideoSurface(surface);
222 }
223
224 void MediaPlayerManagerAndroid::DetachExternalVideoSurface(int player_id) {
225 MediaPlayerBridge* player = GetPlayer(player_id);
226 if (player)
227 player->SetVideoSurface(NULL);
228 }
229
230 void MediaPlayerManagerAndroid::OnRequestExternalSurface(int player_id) {
231 if (!web_contents_)
232 return;
233
234 WebContentsViewAndroid* view =
235 static_cast<WebContentsViewAndroid*>(web_contents_->GetView());
236 if (view)
237 view->RequestExternalVideoSurface(player_id);
238 }
239
240 void MediaPlayerManagerAndroid::OnNotifyGeometryChange(int player_id,
241 const gfx::RectF& rect) {
242 if (!web_contents_)
243 return;
244
245 WebContentsViewAndroid* view =
246 static_cast<WebContentsViewAndroid*>(web_contents_->GetView());
247 if (view)
248 view->NotifyGeometryChange(player_id, rect);
249 }
250
251 void MediaPlayerManagerAndroid::OnDemuxerReady(
252 int player_id,
253 const media::MediaPlayerHostMsg_DemuxerReady_Params& params) {
254 MediaPlayerBridge* player = GetPlayer(player_id);
255 if (player)
256 player->DemuxerReady(params);
257 }
258
259 void MediaPlayerManagerAndroid::OnReadFromDemuxerAck(
260 int player_id,
261 const media::MediaPlayerHostMsg_ReadFromDemuxerAck_Params& params) {
262 MediaPlayerBridge* player = GetPlayer(player_id);
263 if (player)
264 player->ReadFromDemuxerAck(params);
265 }
266 #endif
267
268 MediaPlayerBridge* MediaPlayerManagerAndroid::GetPlayer(int player_id) {
269 for (ScopedVector<MediaPlayerBridge>::iterator it = players_.begin();
270 it != players_.end(); ++it) {
271 if ((*it)->player_id() == player_id)
272 return *it;
273 }
274 return NULL;
275 }
276
277 MediaPlayerBridge* MediaPlayerManagerAndroid::GetFullscreenPlayer() {
278 return GetPlayer(fullscreen_player_id_);
279 }
280
281 void MediaPlayerManagerAndroid::OnMediaMetadataChanged(
282 int player_id, base::TimeDelta duration, int width, int height,
283 bool success) {
284 Send(new MediaPlayerMsg_MediaMetadataChanged(
285 routing_id(), player_id, duration, width, height, success));
286 if (fullscreen_player_id_ != -1)
287 video_view_.UpdateMediaMetadata();
288 }
289
290 void MediaPlayerManagerAndroid::OnPlaybackComplete(int player_id) {
291 Send(new MediaPlayerMsg_MediaPlaybackCompleted(routing_id(), player_id));
292 if (fullscreen_player_id_ != -1)
293 video_view_.OnPlaybackComplete();
294 }
295
296 void MediaPlayerManagerAndroid::OnMediaInterrupted(int player_id) {
297 // Tell WebKit that the audio should be paused, then release all resources
298 Send(new MediaPlayerMsg_DidMediaPlayerPause(routing_id(), player_id));
299 OnReleaseResources(player_id);
300 }
301
302 void MediaPlayerManagerAndroid::OnBufferingUpdate(
303 int player_id, int percentage) {
304 Send(new MediaPlayerMsg_MediaBufferingUpdate(
305 routing_id(), player_id, percentage));
306 if (fullscreen_player_id_ != -1)
307 video_view_.OnBufferingUpdate(percentage);
308 }
309
310 void MediaPlayerManagerAndroid::OnSeekComplete(int player_id,
311 base::TimeDelta current_time) {
312 Send(new MediaPlayerMsg_MediaSeekCompleted(
313 routing_id(), player_id, current_time));
314 }
315
316 void MediaPlayerManagerAndroid::OnError(int player_id, int error) {
317 Send(new MediaPlayerMsg_MediaError(routing_id(), player_id, error));
318 if (fullscreen_player_id_ != -1)
319 video_view_.OnMediaPlayerError(error);
320 }
321
322 void MediaPlayerManagerAndroid::OnVideoSizeChanged(
323 int player_id, int width, int height) {
324 Send(new MediaPlayerMsg_MediaVideoSizeChanged(routing_id(), player_id,
325 width, height));
326 if (fullscreen_player_id_ != -1)
327 video_view_.OnVideoSizeChanged(width, height);
328 }
329
330 void MediaPlayerManagerAndroid::OnTimeUpdate(int player_id,
331 base::TimeDelta current_time) {
332 Send(new MediaPlayerMsg_MediaTimeUpdate(
333 routing_id(), player_id, current_time));
334 }
335
336 #if defined(GOOGLE_TV)
337 void MediaPlayerManagerAndroid::OnReadFromDemuxer(
338 int player_id, media::DemuxerStream::Type type, bool seek_done) {
339 Send(new MediaPlayerMsg_ReadFromDemuxer(
340 routing_id(), player_id, type, seek_done));
341 }
342 #endif
343
344 void MediaPlayerManagerAndroid::RequestMediaResources(
345 MediaPlayerBridge* player) {
346 if (player == NULL)
347 return;
348
349 int num_active_player = 0;
350 ScopedVector<MediaPlayerBridge>::iterator it;
351 for (it = players_.begin(); it != players_.end(); ++it) {
352 if (!(*it)->prepared())
353 continue;
354
355 // The player is already active, ignore it.
356 if ((*it) == player)
357 return;
358 else
359 num_active_player++;
360 }
361
362 // Number of active players are less than the threshold, do nothing.
363 if (num_active_player < kMediaPlayerThreshold)
364 return;
365
366 for (it = players_.begin(); it != players_.end(); ++it) {
367 if ((*it)->prepared() && !(*it)->IsPlaying() &&
368 fullscreen_player_id_ != (*it)->player_id()) {
369 (*it)->Release();
370 Send(new MediaPlayerMsg_MediaPlayerReleased(
371 routing_id(), (*it)->player_id()));
372 }
373 }
374 }
375
376 void MediaPlayerManagerAndroid::ReleaseMediaResources(
377 MediaPlayerBridge* player) {
378 // Nothing needs to be done.
379 }
380
381 } // namespace content
OLDNEW
« no previous file with comments | « content/browser/android/media_player_manager_android.h ('k') | content/browser/android/media_player_manager_impl.h » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698