• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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 
RendererMediaPlayerManager(RenderFrame * render_frame)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 
~RendererMediaPlayerManager()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 
OnMessageReceived(const IPC::Message & msg)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_PauseVideo, OnPauseVideo)
59   IPC_MESSAGE_UNHANDLED(handled = false)
60   IPC_END_MESSAGE_MAP()
61   return handled;
62 }
63 
Initialize(MediaPlayerHostMsg_Initialize_Type type,int player_id,const GURL & url,const GURL & first_party_for_cookies,int demuxer_client_id,const GURL & frame_url,bool allow_credentials)64 void RendererMediaPlayerManager::Initialize(
65     MediaPlayerHostMsg_Initialize_Type type,
66     int player_id,
67     const GURL& url,
68     const GURL& first_party_for_cookies,
69     int demuxer_client_id,
70     const GURL& frame_url,
71     bool allow_credentials) {
72   MediaPlayerHostMsg_Initialize_Params media_player_params;
73   media_player_params.type = type;
74   media_player_params.player_id = player_id;
75   media_player_params.demuxer_client_id = demuxer_client_id;
76   media_player_params.url = url;
77   media_player_params.first_party_for_cookies = first_party_for_cookies;
78   media_player_params.frame_url = frame_url;
79   media_player_params.allow_credentials = allow_credentials;
80 
81   Send(new MediaPlayerHostMsg_Initialize(routing_id(), media_player_params));
82 }
83 
Start(int player_id)84 void RendererMediaPlayerManager::Start(int player_id) {
85   Send(new MediaPlayerHostMsg_Start(routing_id(), player_id));
86 }
87 
Pause(int player_id,bool is_media_related_action)88 void RendererMediaPlayerManager::Pause(
89     int player_id,
90     bool is_media_related_action) {
91   Send(new MediaPlayerHostMsg_Pause(
92       routing_id(), player_id, is_media_related_action));
93 }
94 
Seek(int player_id,const base::TimeDelta & time)95 void RendererMediaPlayerManager::Seek(
96     int player_id,
97     const base::TimeDelta& time) {
98   Send(new MediaPlayerHostMsg_Seek(routing_id(), player_id, time));
99 }
100 
SetVolume(int player_id,double volume)101 void RendererMediaPlayerManager::SetVolume(int player_id, double volume) {
102   Send(new MediaPlayerHostMsg_SetVolume(routing_id(), player_id, volume));
103 }
104 
SetPoster(int player_id,const GURL & poster)105 void RendererMediaPlayerManager::SetPoster(int player_id, const GURL& poster) {
106   Send(new MediaPlayerHostMsg_SetPoster(routing_id(), player_id, poster));
107 }
108 
ReleaseResources(int player_id)109 void RendererMediaPlayerManager::ReleaseResources(int player_id) {
110   Send(new MediaPlayerHostMsg_Release(routing_id(), player_id));
111 }
112 
DestroyPlayer(int player_id)113 void RendererMediaPlayerManager::DestroyPlayer(int player_id) {
114   Send(new MediaPlayerHostMsg_DestroyMediaPlayer(routing_id(), player_id));
115 }
116 
OnMediaMetadataChanged(int player_id,base::TimeDelta duration,int width,int height,bool success)117 void RendererMediaPlayerManager::OnMediaMetadataChanged(
118     int player_id,
119     base::TimeDelta duration,
120     int width,
121     int height,
122     bool success) {
123   WebMediaPlayerAndroid* player = GetMediaPlayer(player_id);
124   if (player)
125     player->OnMediaMetadataChanged(duration, width, height, success);
126 }
127 
OnMediaPlaybackCompleted(int player_id)128 void RendererMediaPlayerManager::OnMediaPlaybackCompleted(int player_id) {
129   WebMediaPlayerAndroid* player = GetMediaPlayer(player_id);
130   if (player)
131     player->OnPlaybackComplete();
132 }
133 
OnMediaBufferingUpdate(int player_id,int percent)134 void RendererMediaPlayerManager::OnMediaBufferingUpdate(int player_id,
135                                                         int percent) {
136   WebMediaPlayerAndroid* player = GetMediaPlayer(player_id);
137   if (player)
138     player->OnBufferingUpdate(percent);
139 }
140 
OnSeekRequest(int player_id,const base::TimeDelta & time_to_seek)141 void RendererMediaPlayerManager::OnSeekRequest(
142     int player_id,
143     const base::TimeDelta& time_to_seek) {
144   WebMediaPlayerAndroid* player = GetMediaPlayer(player_id);
145   if (player)
146     player->OnSeekRequest(time_to_seek);
147 }
148 
OnSeekCompleted(int player_id,const base::TimeDelta & current_time)149 void RendererMediaPlayerManager::OnSeekCompleted(
150     int player_id,
151     const base::TimeDelta& current_time) {
152   WebMediaPlayerAndroid* player = GetMediaPlayer(player_id);
153   if (player)
154     player->OnSeekComplete(current_time);
155 }
156 
OnMediaError(int player_id,int error)157 void RendererMediaPlayerManager::OnMediaError(int player_id, int error) {
158   WebMediaPlayerAndroid* player = GetMediaPlayer(player_id);
159   if (player)
160     player->OnMediaError(error);
161 }
162 
OnVideoSizeChanged(int player_id,int width,int height)163 void RendererMediaPlayerManager::OnVideoSizeChanged(int player_id,
164                                                     int width,
165                                                     int height) {
166   WebMediaPlayerAndroid* player = GetMediaPlayer(player_id);
167   if (player)
168     player->OnVideoSizeChanged(width, height);
169 }
170 
OnTimeUpdate(int player_id,base::TimeDelta current_time)171 void RendererMediaPlayerManager::OnTimeUpdate(int player_id,
172                                               base::TimeDelta current_time) {
173   WebMediaPlayerAndroid* player = GetMediaPlayer(player_id);
174   if (player)
175     player->OnTimeUpdate(current_time);
176 }
177 
OnMediaPlayerReleased(int player_id)178 void RendererMediaPlayerManager::OnMediaPlayerReleased(int player_id) {
179   WebMediaPlayerAndroid* player = GetMediaPlayer(player_id);
180   if (player)
181     player->OnPlayerReleased();
182 }
183 
OnConnectedToRemoteDevice(int player_id,const std::string & remote_playback_message)184 void RendererMediaPlayerManager::OnConnectedToRemoteDevice(int player_id,
185     const std::string& remote_playback_message) {
186   WebMediaPlayerAndroid* player = GetMediaPlayer(player_id);
187   if (player)
188     player->OnConnectedToRemoteDevice(remote_playback_message);
189 }
190 
OnDisconnectedFromRemoteDevice(int player_id)191 void RendererMediaPlayerManager::OnDisconnectedFromRemoteDevice(int player_id) {
192   WebMediaPlayerAndroid* player = GetMediaPlayer(player_id);
193   if (player)
194     player->OnDisconnectedFromRemoteDevice();
195 }
196 
OnDidEnterFullscreen(int player_id)197 void RendererMediaPlayerManager::OnDidEnterFullscreen(int player_id) {
198   WebMediaPlayerAndroid* player = GetMediaPlayer(player_id);
199   if (player)
200     player->OnDidEnterFullscreen();
201 }
202 
OnDidExitFullscreen(int player_id)203 void RendererMediaPlayerManager::OnDidExitFullscreen(int player_id) {
204   WebMediaPlayerAndroid* player = GetMediaPlayer(player_id);
205   if (player)
206     player->OnDidExitFullscreen();
207 }
208 
OnPlayerPlay(int player_id)209 void RendererMediaPlayerManager::OnPlayerPlay(int player_id) {
210   WebMediaPlayerAndroid* player = GetMediaPlayer(player_id);
211   if (player)
212     player->OnMediaPlayerPlay();
213 }
214 
OnPlayerPause(int player_id)215 void RendererMediaPlayerManager::OnPlayerPause(int player_id) {
216   WebMediaPlayerAndroid* player = GetMediaPlayer(player_id);
217   if (player)
218     player->OnMediaPlayerPause();
219 }
220 
OnRequestFullscreen(int player_id)221 void RendererMediaPlayerManager::OnRequestFullscreen(int player_id) {
222   WebMediaPlayerAndroid* player = GetMediaPlayer(player_id);
223   if (player)
224     player->OnRequestFullscreen();
225 }
226 
OnPauseVideo()227 void RendererMediaPlayerManager::OnPauseVideo() {
228   ReleaseVideoResources();
229 }
230 
EnterFullscreen(int player_id,blink::WebFrame * frame)231 void RendererMediaPlayerManager::EnterFullscreen(int player_id,
232                                                  blink::WebFrame* frame) {
233   pending_fullscreen_frame_ = frame;
234   Send(new MediaPlayerHostMsg_EnterFullscreen(routing_id(), player_id));
235 }
236 
ExitFullscreen(int player_id)237 void RendererMediaPlayerManager::ExitFullscreen(int player_id) {
238   pending_fullscreen_frame_ = NULL;
239   fullscreen_frame_ = NULL;
240   Send(new MediaPlayerHostMsg_ExitFullscreen(routing_id(), player_id));
241 }
242 
SetCdm(int player_id,int cdm_id)243 void RendererMediaPlayerManager::SetCdm(int player_id, int cdm_id) {
244   if (cdm_id == RendererCdmManager::kInvalidCdmId) {
245     NOTREACHED();
246     return;
247   }
248   Send(new MediaPlayerHostMsg_SetCdm(routing_id(), player_id, cdm_id));
249 }
250 
RegisterMediaPlayer(WebMediaPlayerAndroid * player)251 int RendererMediaPlayerManager::RegisterMediaPlayer(
252     WebMediaPlayerAndroid* player) {
253   media_players_[next_media_player_id_] = player;
254   return next_media_player_id_++;
255 }
256 
UnregisterMediaPlayer(int player_id)257 void RendererMediaPlayerManager::UnregisterMediaPlayer(int player_id) {
258   media_players_.erase(player_id);
259 }
260 
ReleaseVideoResources()261 void RendererMediaPlayerManager::ReleaseVideoResources() {
262   std::map<int, WebMediaPlayerAndroid*>::iterator player_it;
263   for (player_it = media_players_.begin(); player_it != media_players_.end();
264        ++player_it) {
265     WebMediaPlayerAndroid* player = player_it->second;
266 
267     // Do not release if an audio track is still playing
268     if (player && (player->paused() || player->hasVideo()))
269       player->ReleaseMediaResources();
270   }
271 }
272 
GetMediaPlayer(int player_id)273 WebMediaPlayerAndroid* RendererMediaPlayerManager::GetMediaPlayer(
274     int player_id) {
275   std::map<int, WebMediaPlayerAndroid*>::iterator iter =
276       media_players_.find(player_id);
277   if (iter != media_players_.end())
278     return iter->second;
279   return NULL;
280 }
281 
CanEnterFullscreen(blink::WebFrame * frame)282 bool RendererMediaPlayerManager::CanEnterFullscreen(blink::WebFrame* frame) {
283   return (!fullscreen_frame_ && !pending_fullscreen_frame_)
284       || ShouldEnterFullscreen(frame);
285 }
286 
DidEnterFullscreen(blink::WebFrame * frame)287 void RendererMediaPlayerManager::DidEnterFullscreen(blink::WebFrame* frame) {
288   pending_fullscreen_frame_ = NULL;
289   fullscreen_frame_ = frame;
290 }
291 
DidExitFullscreen()292 void RendererMediaPlayerManager::DidExitFullscreen() {
293   fullscreen_frame_ = NULL;
294 }
295 
IsInFullscreen(blink::WebFrame * frame)296 bool RendererMediaPlayerManager::IsInFullscreen(blink::WebFrame* frame) {
297   return fullscreen_frame_ == frame;
298 }
299 
ShouldEnterFullscreen(blink::WebFrame * frame)300 bool RendererMediaPlayerManager::ShouldEnterFullscreen(blink::WebFrame* frame) {
301   return fullscreen_frame_ == frame || pending_fullscreen_frame_ == frame;
302 }
303 
304 #if defined(VIDEO_HOLE)
RequestExternalSurface(int player_id,const gfx::RectF & geometry)305 void RendererMediaPlayerManager::RequestExternalSurface(
306     int player_id,
307     const gfx::RectF& geometry) {
308   Send(new MediaPlayerHostMsg_NotifyExternalSurface(
309       routing_id(), player_id, true, geometry));
310 }
311 
DidCommitCompositorFrame()312 void RendererMediaPlayerManager::DidCommitCompositorFrame() {
313   std::map<int, gfx::RectF> geometry_change;
314   RetrieveGeometryChanges(&geometry_change);
315   for (std::map<int, gfx::RectF>::iterator it = geometry_change.begin();
316        it != geometry_change.end();
317        ++it) {
318     Send(new MediaPlayerHostMsg_NotifyExternalSurface(
319         routing_id(), it->first, false, it->second));
320   }
321 }
322 
RetrieveGeometryChanges(std::map<int,gfx::RectF> * changes)323 void RendererMediaPlayerManager::RetrieveGeometryChanges(
324     std::map<int, gfx::RectF>* changes) {
325   DCHECK(changes->empty());
326   for (std::map<int, WebMediaPlayerAndroid*>::iterator player_it =
327            media_players_.begin();
328        player_it != media_players_.end();
329        ++player_it) {
330     WebMediaPlayerAndroid* player = player_it->second;
331 
332     if (player && player->hasVideo()) {
333       if (player->UpdateBoundaryRectangle())
334         (*changes)[player_it->first] = player->GetBoundaryRectangle();
335     }
336   }
337 }
338 
339 bool
ShouldUseVideoOverlayForEmbeddedEncryptedVideo()340 RendererMediaPlayerManager::ShouldUseVideoOverlayForEmbeddedEncryptedVideo() {
341   const RendererPreferences& prefs = static_cast<RenderFrameImpl*>(
342       render_frame())->render_view()->renderer_preferences();
343   return prefs.use_video_overlay_for_embedded_encrypted_video;
344 }
345 #endif  // defined(VIDEO_HOLE)
346 
347 }  // namespace content
348