Upstream version 10.39.225.0
[platform/framework/web/crosswalk.git] / src / content / renderer / media / android / renderer_media_player_manager.cc
1 // Copyright 2013 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/renderer/media/android/renderer_media_player_manager.h"
6
7 #include "content/common/media/media_player_messages_android.h"
8 #include "content/public/common/renderer_preferences.h"
9 #include "content/renderer/media/android/renderer_media_player_manager.h"
10 #include "content/renderer/media/android/webmediaplayer_android.h"
11 #include "content/renderer/media/crypto/renderer_cdm_manager.h"
12 #include "content/renderer/render_view_impl.h"
13 #include "ui/gfx/rect_f.h"
14
15 namespace content {
16
17 RendererMediaPlayerManager::RendererMediaPlayerManager(
18     RenderFrame* render_frame)
19     : RenderFrameObserver(render_frame),
20       next_media_player_id_(0),
21       fullscreen_frame_(NULL),
22       pending_fullscreen_frame_(NULL) {
23 }
24
25 RendererMediaPlayerManager::~RendererMediaPlayerManager() {
26   DCHECK(media_players_.empty())
27       << "RendererMediaPlayerManager is owned by RenderFrameImpl and is "
28          "destroyed only after all media players are destroyed.";
29 }
30
31 bool RendererMediaPlayerManager::OnMessageReceived(const IPC::Message& msg) {
32   bool handled = true;
33   IPC_BEGIN_MESSAGE_MAP(RendererMediaPlayerManager, msg)
34     IPC_MESSAGE_HANDLER(MediaPlayerMsg_MediaMetadataChanged,
35                         OnMediaMetadataChanged)
36     IPC_MESSAGE_HANDLER(MediaPlayerMsg_MediaPlaybackCompleted,
37                         OnMediaPlaybackCompleted)
38     IPC_MESSAGE_HANDLER(MediaPlayerMsg_MediaBufferingUpdate,
39                         OnMediaBufferingUpdate)
40     IPC_MESSAGE_HANDLER(MediaPlayerMsg_SeekRequest, OnSeekRequest)
41     IPC_MESSAGE_HANDLER(MediaPlayerMsg_SeekCompleted, OnSeekCompleted)
42     IPC_MESSAGE_HANDLER(MediaPlayerMsg_MediaError, OnMediaError)
43     IPC_MESSAGE_HANDLER(MediaPlayerMsg_MediaVideoSizeChanged,
44                         OnVideoSizeChanged)
45     IPC_MESSAGE_HANDLER(MediaPlayerMsg_MediaTimeUpdate, OnTimeUpdate)
46     IPC_MESSAGE_HANDLER(MediaPlayerMsg_MediaPlayerReleased,
47                         OnMediaPlayerReleased)
48     IPC_MESSAGE_HANDLER(MediaPlayerMsg_ConnectedToRemoteDevice,
49                         OnConnectedToRemoteDevice)
50     IPC_MESSAGE_HANDLER(MediaPlayerMsg_DisconnectedFromRemoteDevice,
51                         OnDisconnectedFromRemoteDevice)
52     IPC_MESSAGE_HANDLER(MediaPlayerMsg_RequestFullscreen,
53                         OnRequestFullscreen)
54     IPC_MESSAGE_HANDLER(MediaPlayerMsg_DidEnterFullscreen, OnDidEnterFullscreen)
55     IPC_MESSAGE_HANDLER(MediaPlayerMsg_DidExitFullscreen, OnDidExitFullscreen)
56     IPC_MESSAGE_HANDLER(MediaPlayerMsg_DidMediaPlayerPlay, OnPlayerPlay)
57     IPC_MESSAGE_HANDLER(MediaPlayerMsg_DidMediaPlayerPause, OnPlayerPause)
58     IPC_MESSAGE_HANDLER(MediaPlayerMsg_RemoteRouteAvailabilityChanged,
59                         OnRemoteRouteAvailabilityChanged)
60   IPC_MESSAGE_UNHANDLED(handled = false)
61   IPC_END_MESSAGE_MAP()
62   return handled;
63 }
64
65 void RendererMediaPlayerManager::WasHidden() {
66   ReleaseVideoResources();
67 }
68
69 void RendererMediaPlayerManager::Initialize(
70     MediaPlayerHostMsg_Initialize_Type type,
71     int player_id,
72     const GURL& url,
73     const GURL& first_party_for_cookies,
74     int demuxer_client_id,
75     const GURL& frame_url,
76     bool allow_credentials) {
77   MediaPlayerHostMsg_Initialize_Params media_player_params;
78   media_player_params.type = type;
79   media_player_params.player_id = player_id;
80   media_player_params.demuxer_client_id = demuxer_client_id;
81   media_player_params.url = url;
82   media_player_params.first_party_for_cookies = first_party_for_cookies;
83   media_player_params.frame_url = frame_url;
84   media_player_params.allow_credentials = allow_credentials;
85
86   Send(new MediaPlayerHostMsg_Initialize(routing_id(), media_player_params));
87 }
88
89 void RendererMediaPlayerManager::Start(int player_id) {
90   Send(new MediaPlayerHostMsg_Start(routing_id(), player_id));
91 }
92
93 void RendererMediaPlayerManager::Pause(
94     int player_id,
95     bool is_media_related_action) {
96   Send(new MediaPlayerHostMsg_Pause(
97       routing_id(), player_id, is_media_related_action));
98 }
99
100 void RendererMediaPlayerManager::Seek(
101     int player_id,
102     const base::TimeDelta& time) {
103   Send(new MediaPlayerHostMsg_Seek(routing_id(), player_id, time));
104 }
105
106 void RendererMediaPlayerManager::SetVolume(int player_id, double volume) {
107   Send(new MediaPlayerHostMsg_SetVolume(routing_id(), player_id, volume));
108 }
109
110 void RendererMediaPlayerManager::SetPoster(int player_id, const GURL& poster) {
111   Send(new MediaPlayerHostMsg_SetPoster(routing_id(), player_id, poster));
112 }
113
114 void RendererMediaPlayerManager::ReleaseResources(int player_id) {
115   Send(new MediaPlayerHostMsg_Release(routing_id(), player_id));
116 }
117
118 void RendererMediaPlayerManager::DestroyPlayer(int player_id) {
119   Send(new MediaPlayerHostMsg_DestroyMediaPlayer(routing_id(), player_id));
120 }
121
122 void RendererMediaPlayerManager::RequestRemotePlayback(int player_id) {
123   Send(new MediaPlayerHostMsg_RequestRemotePlayback(routing_id(), player_id));
124 }
125
126 void RendererMediaPlayerManager::RequestRemotePlaybackControl(int player_id) {
127   Send(new MediaPlayerHostMsg_RequestRemotePlaybackControl(routing_id(),
128                                                            player_id));
129 }
130
131 void RendererMediaPlayerManager::OnMediaMetadataChanged(
132     int player_id,
133     base::TimeDelta duration,
134     int width,
135     int height,
136     bool success) {
137   WebMediaPlayerAndroid* player = GetMediaPlayer(player_id);
138   if (player)
139     player->OnMediaMetadataChanged(duration, width, height, success);
140 }
141
142 void RendererMediaPlayerManager::OnMediaPlaybackCompleted(int player_id) {
143   WebMediaPlayerAndroid* player = GetMediaPlayer(player_id);
144   if (player)
145     player->OnPlaybackComplete();
146 }
147
148 void RendererMediaPlayerManager::OnMediaBufferingUpdate(int player_id,
149                                                         int percent) {
150   WebMediaPlayerAndroid* player = GetMediaPlayer(player_id);
151   if (player)
152     player->OnBufferingUpdate(percent);
153 }
154
155 void RendererMediaPlayerManager::OnSeekRequest(
156     int player_id,
157     const base::TimeDelta& time_to_seek) {
158   WebMediaPlayerAndroid* player = GetMediaPlayer(player_id);
159   if (player)
160     player->OnSeekRequest(time_to_seek);
161 }
162
163 void RendererMediaPlayerManager::OnSeekCompleted(
164     int player_id,
165     const base::TimeDelta& current_time) {
166   WebMediaPlayerAndroid* player = GetMediaPlayer(player_id);
167   if (player)
168     player->OnSeekComplete(current_time);
169 }
170
171 void RendererMediaPlayerManager::OnMediaError(int player_id, int error) {
172   WebMediaPlayerAndroid* player = GetMediaPlayer(player_id);
173   if (player)
174     player->OnMediaError(error);
175 }
176
177 void RendererMediaPlayerManager::OnVideoSizeChanged(int player_id,
178                                                     int width,
179                                                     int height) {
180   WebMediaPlayerAndroid* player = GetMediaPlayer(player_id);
181   if (player)
182     player->OnVideoSizeChanged(width, height);
183 }
184
185 void RendererMediaPlayerManager::OnTimeUpdate(
186     int player_id,
187     base::TimeDelta current_timestamp,
188     base::TimeTicks current_time_ticks) {
189   WebMediaPlayerAndroid* player = GetMediaPlayer(player_id);
190   if (player)
191     player->OnTimeUpdate(current_timestamp, current_time_ticks);
192 }
193
194 void RendererMediaPlayerManager::OnMediaPlayerReleased(int player_id) {
195   WebMediaPlayerAndroid* player = GetMediaPlayer(player_id);
196   if (player)
197     player->OnPlayerReleased();
198 }
199
200 void RendererMediaPlayerManager::OnConnectedToRemoteDevice(int player_id,
201     const std::string& remote_playback_message) {
202   WebMediaPlayerAndroid* player = GetMediaPlayer(player_id);
203   if (player)
204     player->OnConnectedToRemoteDevice(remote_playback_message);
205 }
206
207 void RendererMediaPlayerManager::OnDisconnectedFromRemoteDevice(int player_id) {
208   WebMediaPlayerAndroid* player = GetMediaPlayer(player_id);
209   if (player)
210     player->OnDisconnectedFromRemoteDevice();
211 }
212
213 void RendererMediaPlayerManager::OnDidEnterFullscreen(int player_id) {
214   WebMediaPlayerAndroid* player = GetMediaPlayer(player_id);
215   if (player)
216     player->OnDidEnterFullscreen();
217 }
218
219 void RendererMediaPlayerManager::OnDidExitFullscreen(int player_id) {
220   WebMediaPlayerAndroid* player = GetMediaPlayer(player_id);
221   if (player)
222     player->OnDidExitFullscreen();
223 }
224
225 void RendererMediaPlayerManager::OnPlayerPlay(int player_id) {
226   WebMediaPlayerAndroid* player = GetMediaPlayer(player_id);
227   if (player)
228     player->OnMediaPlayerPlay();
229 }
230
231 void RendererMediaPlayerManager::OnPlayerPause(int player_id) {
232   WebMediaPlayerAndroid* player = GetMediaPlayer(player_id);
233   if (player)
234     player->OnMediaPlayerPause();
235 }
236
237 void RendererMediaPlayerManager::OnRequestFullscreen(int player_id) {
238   WebMediaPlayerAndroid* player = GetMediaPlayer(player_id);
239   if (player)
240     player->OnRequestFullscreen();
241 }
242
243 void RendererMediaPlayerManager::OnRemoteRouteAvailabilityChanged(
244     int player_id,
245     bool routes_available) {
246   WebMediaPlayerAndroid* player = GetMediaPlayer(player_id);
247   if (player)
248     player->OnRemoteRouteAvailabilityChanged(routes_available);
249 }
250
251 void RendererMediaPlayerManager::EnterFullscreen(int player_id,
252                                                  blink::WebFrame* frame) {
253   pending_fullscreen_frame_ = frame;
254   Send(new MediaPlayerHostMsg_EnterFullscreen(routing_id(), player_id));
255 }
256
257 void RendererMediaPlayerManager::ExitFullscreen(int player_id) {
258   pending_fullscreen_frame_ = NULL;
259   fullscreen_frame_ = NULL;
260   Send(new MediaPlayerHostMsg_ExitFullscreen(routing_id(), player_id));
261 }
262
263 void RendererMediaPlayerManager::SetCdm(int player_id, int cdm_id) {
264   if (cdm_id == RendererCdmManager::kInvalidCdmId) {
265     NOTREACHED();
266     return;
267   }
268   Send(new MediaPlayerHostMsg_SetCdm(routing_id(), player_id, cdm_id));
269 }
270
271 int RendererMediaPlayerManager::RegisterMediaPlayer(
272     WebMediaPlayerAndroid* player) {
273   media_players_[next_media_player_id_] = player;
274   return next_media_player_id_++;
275 }
276
277 void RendererMediaPlayerManager::UnregisterMediaPlayer(int player_id) {
278   media_players_.erase(player_id);
279 }
280
281 void RendererMediaPlayerManager::ReleaseVideoResources() {
282   std::map<int, WebMediaPlayerAndroid*>::iterator player_it;
283   for (player_it = media_players_.begin(); player_it != media_players_.end();
284        ++player_it) {
285     WebMediaPlayerAndroid* player = player_it->second;
286
287     // Do not release if an audio track is still playing
288     if (player && (player->paused() || player->hasVideo()))
289       player->ReleaseMediaResources();
290   }
291 }
292
293 WebMediaPlayerAndroid* RendererMediaPlayerManager::GetMediaPlayer(
294     int player_id) {
295   std::map<int, WebMediaPlayerAndroid*>::iterator iter =
296       media_players_.find(player_id);
297   if (iter != media_players_.end())
298     return iter->second;
299   return NULL;
300 }
301
302 bool RendererMediaPlayerManager::CanEnterFullscreen(blink::WebFrame* frame) {
303   return (!fullscreen_frame_ && !pending_fullscreen_frame_)
304       || ShouldEnterFullscreen(frame);
305 }
306
307 void RendererMediaPlayerManager::DidEnterFullscreen(blink::WebFrame* frame) {
308   pending_fullscreen_frame_ = NULL;
309   fullscreen_frame_ = frame;
310 }
311
312 void RendererMediaPlayerManager::DidExitFullscreen() {
313   fullscreen_frame_ = NULL;
314 }
315
316 bool RendererMediaPlayerManager::IsInFullscreen(blink::WebFrame* frame) {
317   return fullscreen_frame_ == frame;
318 }
319
320 bool RendererMediaPlayerManager::ShouldEnterFullscreen(blink::WebFrame* frame) {
321   return fullscreen_frame_ == frame || pending_fullscreen_frame_ == frame;
322 }
323
324 #if defined(VIDEO_HOLE)
325 void RendererMediaPlayerManager::RequestExternalSurface(
326     int player_id,
327     const gfx::RectF& geometry) {
328   Send(new MediaPlayerHostMsg_NotifyExternalSurface(
329       routing_id(), player_id, true, geometry));
330 }
331
332 void RendererMediaPlayerManager::DidCommitCompositorFrame() {
333   std::map<int, gfx::RectF> geometry_change;
334   RetrieveGeometryChanges(&geometry_change);
335   for (std::map<int, gfx::RectF>::iterator it = geometry_change.begin();
336        it != geometry_change.end();
337        ++it) {
338     Send(new MediaPlayerHostMsg_NotifyExternalSurface(
339         routing_id(), it->first, false, it->second));
340   }
341 }
342
343 void RendererMediaPlayerManager::RetrieveGeometryChanges(
344     std::map<int, gfx::RectF>* changes) {
345   DCHECK(changes->empty());
346   for (std::map<int, WebMediaPlayerAndroid*>::iterator player_it =
347            media_players_.begin();
348        player_it != media_players_.end();
349        ++player_it) {
350     WebMediaPlayerAndroid* player = player_it->second;
351
352     if (player && player->hasVideo()) {
353       if (player->UpdateBoundaryRectangle())
354         (*changes)[player_it->first] = player->GetBoundaryRectangle();
355     }
356   }
357 }
358
359 bool
360 RendererMediaPlayerManager::ShouldUseVideoOverlayForEmbeddedEncryptedVideo() {
361   const RendererPreferences& prefs = static_cast<RenderFrameImpl*>(
362       render_frame())->render_view()->renderer_preferences();
363   return prefs.use_video_overlay_for_embedded_encrypted_video;
364 }
365 #endif  // defined(VIDEO_HOLE)
366
367 }  // namespace content