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

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

Issue 10979047: Upstream fullscreen video implementation for android (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: remove some unused variables and make fullscreen video to work with content shell Created 8 years, 2 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
1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. 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 2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file. 3 // found in the LICENSE file.
4 4
5 #include "content/browser/android/media_player_manager_android.h" 5 #include "content/browser/android/media_player_manager_android.h"
6 6
7 #include "base/bind.h" 7 #include "base/bind.h"
8 #include "content/browser/android/cookie_getter_impl.h" 8 #include "content/browser/android/cookie_getter_impl.h"
9 #include "content/common/view_messages.h" 9 #include "content/common/media/media_player_messages.h"
10 #include "content/public/browser/browser_context.h" 10 #include "content/public/browser/browser_context.h"
11 #include "content/public/browser/browser_thread.h" 11 #include "content/public/browser/browser_thread.h"
12 #include "content/public/browser/render_process_host.h" 12 #include "content/public/browser/render_process_host.h"
13 #include "content/public/browser/render_view_host.h" 13 #include "content/public/browser/render_view_host.h"
14 14
15 using media::MediaPlayerBridge; 15 using media::MediaPlayerBridge;
16 16
17 // Threshold on the number of media players per renderer before we start 17 // Threshold on the number of media players per renderer before we start
18 // attempting to release inactive media players. 18 // attempting to release inactive media players.
19 static const int kMediaPlayerThreshold = 1; 19 static const int kMediaPlayerThreshold = 1;
20 20
21 namespace content { 21 namespace content {
22 22
23 MediaPlayerManagerAndroid::MediaPlayerManagerAndroid( 23 MediaPlayerManagerAndroid::MediaPlayerManagerAndroid(
24 RenderViewHost* render_view_host) 24 RenderViewHost* render_view_host)
25 : RenderViewHostObserver(render_view_host) { 25 : RenderViewHostObserver(render_view_host),
26 ALLOW_THIS_IN_INITIALIZER_LIST(video_view_(this)),
27 fullscreen_player_id_(-1) {
26 } 28 }
27 29
28 MediaPlayerManagerAndroid::~MediaPlayerManagerAndroid() {} 30 MediaPlayerManagerAndroid::~MediaPlayerManagerAndroid() {}
29 31
30 bool MediaPlayerManagerAndroid::OnMessageReceived(const IPC::Message& msg) { 32 bool MediaPlayerManagerAndroid::OnMessageReceived(const IPC::Message& msg) {
31 bool handled = true; 33 bool handled = true;
32 IPC_BEGIN_MESSAGE_MAP(MediaPlayerManagerAndroid, msg) 34 IPC_BEGIN_MESSAGE_MAP(MediaPlayerManagerAndroid, msg)
33 IPC_MESSAGE_HANDLER(ViewHostMsg_MediaPlayerInitialize, 35 IPC_MESSAGE_HANDLER(MediaPlayerHostMsg_EnterFullscreen, OnEnterFullscreen)
34 OnInitialize) 36 IPC_MESSAGE_HANDLER(MediaPlayerHostMsg_ExitFullscreen, OnExitFullscreen)
35 IPC_MESSAGE_HANDLER(ViewHostMsg_MediaPlayerStart, 37 IPC_MESSAGE_HANDLER(MediaPlayerHostMsg_MediaPlayerInitialize, OnInitialize)
36 OnStart) 38 IPC_MESSAGE_HANDLER(MediaPlayerHostMsg_MediaPlayerStart, OnStart)
37 IPC_MESSAGE_HANDLER(ViewHostMsg_MediaPlayerSeek, 39 IPC_MESSAGE_HANDLER(MediaPlayerHostMsg_MediaPlayerSeek, OnSeek)
38 OnSeek) 40 IPC_MESSAGE_HANDLER(MediaPlayerHostMsg_MediaPlayerPause, OnPause)
39 IPC_MESSAGE_HANDLER(ViewHostMsg_MediaPlayerPause, 41 IPC_MESSAGE_HANDLER(MediaPlayerHostMsg_MediaPlayerRelease,
40 OnPause)
41 IPC_MESSAGE_HANDLER(ViewHostMsg_MediaPlayerRelease,
42 OnReleaseResources) 42 OnReleaseResources)
43 IPC_MESSAGE_HANDLER(ViewHostMsg_DestroyMediaPlayer, 43 IPC_MESSAGE_HANDLER(MediaPlayerHostMsg_DestroyMediaPlayer, OnDestroyPlayer)
44 OnDestroyPlayer) 44 IPC_MESSAGE_HANDLER(MediaPlayerHostMsg_DestroyAllMediaPlayers,
45 IPC_MESSAGE_HANDLER(ViewHostMsg_DestroyAllMediaPlayers,
46 DestroyAllMediaPlayers) 45 DestroyAllMediaPlayers)
47 IPC_MESSAGE_UNHANDLED(handled = false) 46 IPC_MESSAGE_UNHANDLED(handled = false)
48 IPC_END_MESSAGE_MAP() 47 IPC_END_MESSAGE_MAP()
49 return handled; 48 return handled;
50 } 49 }
51 50
51 void MediaPlayerManagerAndroid::FullscreenPlayerPlay() {
52 MediaPlayerBridge* player = GetFullscreenPlayer();
53 player->Start();
54 Send(new MediaPlayerMsg_DidMediaPlayerPlay(
55 routing_id(), fullscreen_player_id_));
56 }
57
58 void MediaPlayerManagerAndroid::FullscreenPlayerPause() {
59 MediaPlayerBridge* player = GetFullscreenPlayer();
60 player->Pause();
61 Send(new MediaPlayerMsg_DidMediaPlayerPause(
62 routing_id(), fullscreen_player_id_));
63 }
64
65 void MediaPlayerManagerAndroid::FullscreenPlayerSeek(int msec) {
66 MediaPlayerBridge* player = GetFullscreenPlayer();
67 player->SeekTo(base::TimeDelta::FromMilliseconds(msec));
68 }
69
70 void MediaPlayerManagerAndroid::ExitFullscreen(bool release_media_player) {
71 Send(new MediaPlayerMsg_DidExitFullscreen(
72 routing_id(), fullscreen_player_id_));
73 MediaPlayerBridge* player = GetFullscreenPlayer();
74 if (release_media_player)
75 player->Release();
76 else
77 player->SetVideoSurface(NULL);
78 fullscreen_player_id_ = -1;
79 }
80
81 void MediaPlayerManagerAndroid::SetVideoSurface(jobject surface) {
82 MediaPlayerBridge* player = GetFullscreenPlayer();
83 if (player) {
84 player->SetVideoSurface(surface);
85 Send(new MediaPlayerMsg_DidEnterFullscreen(
86 routing_id(), player->player_id()));
87 }
88 }
89
52 void MediaPlayerManagerAndroid::OnInitialize( 90 void MediaPlayerManagerAndroid::OnInitialize(
53 int player_id, const std::string& url, 91 int player_id, const std::string& url,
54 const std::string& first_party_for_cookies) { 92 const std::string& first_party_for_cookies) {
55 for (ScopedVector<MediaPlayerBridge>::iterator it = players_.begin(); 93 for (ScopedVector<MediaPlayerBridge>::iterator it = players_.begin();
56 it != players_.end(); ++it) { 94 it != players_.end(); ++it) {
57 if ((*it)->player_id() == player_id) { 95 if ((*it)->player_id() == player_id) {
58 players_.erase(it); 96 players_.erase(it);
59 break; 97 break;
60 } 98 }
61 } 99 }
(...skipping 12 matching lines...) Expand all
74 base::Bind(&MediaPlayerManagerAndroid::OnPrepared, 112 base::Bind(&MediaPlayerManagerAndroid::OnPrepared,
75 base::Unretained(this)), 113 base::Unretained(this)),
76 base::Bind(&MediaPlayerManagerAndroid::OnPlaybackComplete, 114 base::Bind(&MediaPlayerManagerAndroid::OnPlaybackComplete,
77 base::Unretained(this)), 115 base::Unretained(this)),
78 base::Bind(&MediaPlayerManagerAndroid::OnSeekComplete, 116 base::Bind(&MediaPlayerManagerAndroid::OnSeekComplete,
79 base::Unretained(this)), 117 base::Unretained(this)),
80 base::Bind(&MediaPlayerManagerAndroid::OnTimeUpdate, 118 base::Bind(&MediaPlayerManagerAndroid::OnTimeUpdate,
81 base::Unretained(this)))); 119 base::Unretained(this))));
82 120
83 // Send a MediaPrepared message to webkit so that Load() can finish. 121 // Send a MediaPrepared message to webkit so that Load() can finish.
84 Send(new ViewMsg_MediaPrepared(routing_id(), player_id, 122 Send(new MediaPlayerMsg_MediaPrepared(routing_id(), player_id,
85 GetPlayer(player_id)->GetDuration())); 123 GetPlayer(player_id)->GetDuration()));
scherkus (not reviewing) 2012/10/02 16:20:16 fix indent
qinmin 2012/10/03 02:32:48 Done.
86 } 124 }
87 125
88 void MediaPlayerManagerAndroid::OnStart(int player_id) { 126 void MediaPlayerManagerAndroid::OnStart(int player_id) {
89 MediaPlayerBridge* player = GetPlayer(player_id); 127 MediaPlayerBridge* player = GetPlayer(player_id);
90 if (player) 128 if (player)
91 player->Start(); 129 player->Start();
92 } 130 }
93 131
94 void MediaPlayerManagerAndroid::OnSeek(int player_id, base::TimeDelta time) { 132 void MediaPlayerManagerAndroid::OnSeek(int player_id, base::TimeDelta time) {
95 MediaPlayerBridge* player = GetPlayer(player_id); 133 MediaPlayerBridge* player = GetPlayer(player_id);
96 if (player) 134 if (player)
97 player->SeekTo(time); 135 player->SeekTo(time);
98 } 136 }
99 137
100 void MediaPlayerManagerAndroid::OnPause(int player_id) { 138 void MediaPlayerManagerAndroid::OnPause(int player_id) {
101 MediaPlayerBridge* player = GetPlayer(player_id); 139 MediaPlayerBridge* player = GetPlayer(player_id);
102 if (player) 140 if (player)
103 player->Pause(); 141 player->Pause();
104 } 142 }
105 143
144 void MediaPlayerManagerAndroid::OnEnterFullscreen(int player_id) {
145 if (fullscreen_player_id_ != -1 && fullscreen_player_id_ != player_id)
Yaron 2012/10/02 00:29:23 Do these cases happen? It seems like you shouldn't
qinmin 2012/10/03 02:32:48 Changed to DCHECK On 2012/10/02 00:29:23, Yaron wr
146 return;
147
148 fullscreen_player_id_ = player_id;
149 video_view_.CreateContentVideoView();
150 }
151
152 void MediaPlayerManagerAndroid::OnExitFullscreen(int player_id) {
153 if (fullscreen_player_id_ == player_id) {
Yaron 2012/10/02 00:29:23 Same here. Is it race-y such that we can't be conf
qinmin 2012/10/03 02:32:48 This could happen if user hit the back button duri
154 MediaPlayerBridge* player = GetPlayer(player_id);
155 if (player)
156 player->SetVideoSurface(NULL);
157 video_view_.DestroyContentVideoView();
158 fullscreen_player_id_ = -1;
159 }
160 }
161
106 void MediaPlayerManagerAndroid::OnReleaseResources(int player_id) { 162 void MediaPlayerManagerAndroid::OnReleaseResources(int player_id) {
107 MediaPlayerBridge* player = GetPlayer(player_id); 163 MediaPlayerBridge* player = GetPlayer(player_id);
108 if (player) 164 if (player)
109 player->Release(); 165 player->Release();
110 } 166 }
111 167
112 void MediaPlayerManagerAndroid::OnDestroyPlayer(int player_id) { 168 void MediaPlayerManagerAndroid::OnDestroyPlayer(int player_id) {
113 for (ScopedVector<MediaPlayerBridge>::iterator it = players_.begin(); 169 for (ScopedVector<MediaPlayerBridge>::iterator it = players_.begin();
114 it != players_.end(); ++it) { 170 it != players_.end(); ++it) {
115 if ((*it)->player_id() == player_id) { 171 if ((*it)->player_id() == player_id) {
116 players_.erase(it); 172 players_.erase(it);
117 break; 173 break;
118 } 174 }
119 } 175 }
176 if (fullscreen_player_id_ == player_id)
177 fullscreen_player_id_ = -1;
120 } 178 }
121 179
122 void MediaPlayerManagerAndroid::DestroyAllMediaPlayers() { 180 void MediaPlayerManagerAndroid::DestroyAllMediaPlayers() {
123 players_.clear(); 181 players_.clear();
182 if (fullscreen_player_id_ != -1) {
183 video_view_.DestroyContentVideoView();
184 fullscreen_player_id_ = -1;
185 }
124 } 186 }
125 187
126 MediaPlayerBridge* MediaPlayerManagerAndroid::GetPlayer(int player_id) { 188 MediaPlayerBridge* MediaPlayerManagerAndroid::GetPlayer(int player_id) {
127 for (ScopedVector<MediaPlayerBridge>::iterator it = players_.begin(); 189 for (ScopedVector<MediaPlayerBridge>::iterator it = players_.begin();
128 it != players_.end(); ++it) { 190 it != players_.end(); ++it) {
129 if ((*it)->player_id() == player_id) 191 if ((*it)->player_id() == player_id)
130 return *it; 192 return *it;
131 } 193 }
132 return NULL; 194 return NULL;
133 } 195 }
134 196
197 MediaPlayerBridge* MediaPlayerManagerAndroid::GetFullscreenPlayer() {
198 return GetPlayer(fullscreen_player_id_);
199 }
200
135 void MediaPlayerManagerAndroid::OnPrepared(int player_id, 201 void MediaPlayerManagerAndroid::OnPrepared(int player_id,
136 base::TimeDelta duration) { 202 base::TimeDelta duration) {
137 Send(new ViewMsg_MediaPrepared(routing_id(), player_id, duration)); 203 Send(new MediaPlayerMsg_MediaPrepared(routing_id(), player_id, duration));
204 if (fullscreen_player_id_ != -1)
205 video_view_.UpdateMediaMetadata();
138 } 206 }
139 207
140 void MediaPlayerManagerAndroid::OnPlaybackComplete(int player_id) { 208 void MediaPlayerManagerAndroid::OnPlaybackComplete(int player_id) {
141 Send(new ViewMsg_MediaPlaybackCompleted(routing_id(), player_id)); 209 Send(new MediaPlayerMsg_MediaPlaybackCompleted(routing_id(), player_id));
210 if (fullscreen_player_id_ != -1)
211 video_view_.OnPlaybackComplete();
142 } 212 }
143 213
144 void MediaPlayerManagerAndroid::OnBufferingUpdate( 214 void MediaPlayerManagerAndroid::OnBufferingUpdate(
145 int player_id, int percentage) { 215 int player_id, int percentage) {
146 Send(new ViewMsg_MediaBufferingUpdate(routing_id(), player_id, percentage)); 216 Send(new MediaPlayerMsg_MediaBufferingUpdate(
217 routing_id(), player_id, percentage));
218 if (fullscreen_player_id_ != -1)
219 video_view_.OnBufferingUpdate(percentage);
147 } 220 }
148 221
149 void MediaPlayerManagerAndroid::OnSeekComplete(int player_id, 222 void MediaPlayerManagerAndroid::OnSeekComplete(int player_id,
150 base::TimeDelta current_time) { 223 base::TimeDelta current_time) {
151 Send(new ViewMsg_MediaSeekCompleted(routing_id(), player_id, current_time)); 224 Send(new MediaPlayerMsg_MediaSeekCompleted(
225 routing_id(), player_id, current_time));
152 } 226 }
153 227
154 void MediaPlayerManagerAndroid::OnError(int player_id, int error) { 228 void MediaPlayerManagerAndroid::OnError(int player_id, int error) {
155 Send(new ViewMsg_MediaError(routing_id(), player_id, error)); 229 Send(new MediaPlayerMsg_MediaError(routing_id(), player_id, error));
230 if (fullscreen_player_id_ != -1)
231 video_view_.OnMediaPlayerError(error);
156 } 232 }
157 233
158 void MediaPlayerManagerAndroid::OnVideoSizeChanged( 234 void MediaPlayerManagerAndroid::OnVideoSizeChanged(
159 int player_id, int width, int height) { 235 int player_id, int width, int height) {
160 Send(new ViewMsg_MediaVideoSizeChanged(routing_id(), player_id, 236 Send(new MediaPlayerMsg_MediaVideoSizeChanged(routing_id(), player_id,
161 width, height)); 237 width, height));
238 if (fullscreen_player_id_ != -1)
239 video_view_.OnVideoSizeChanged(width, height);
162 } 240 }
163 241
164 void MediaPlayerManagerAndroid::OnTimeUpdate(int player_id, 242 void MediaPlayerManagerAndroid::OnTimeUpdate(int player_id,
165 base::TimeDelta current_time) { 243 base::TimeDelta current_time) {
166 Send(new ViewMsg_MediaTimeUpdate(routing_id(), player_id, current_time)); 244 Send(new MediaPlayerMsg_MediaTimeUpdate(
245 routing_id(), player_id, current_time));
167 } 246 }
168 247
169 void MediaPlayerManagerAndroid::RequestMediaResources( 248 void MediaPlayerManagerAndroid::RequestMediaResources(
170 MediaPlayerBridge* player) { 249 MediaPlayerBridge* player) {
171 if (player == NULL) 250 if (player == NULL)
172 return; 251 return;
173 252
174 int num_active_player = 0; 253 int num_active_player = 0;
175 ScopedVector<MediaPlayerBridge>::iterator it; 254 ScopedVector<MediaPlayerBridge>::iterator it;
176 for (it = players_.begin(); it != players_.end(); ++it) { 255 for (it = players_.begin(); it != players_.end(); ++it) {
177 if (!(*it)->prepared()) 256 if (!(*it)->prepared())
178 continue; 257 continue;
179 258
180 // The player is already active, ignore it. 259 // The player is already active, ignore it.
181 if ((*it) == player) 260 if ((*it) == player)
182 return; 261 return;
183 else 262 else
184 num_active_player++; 263 num_active_player++;
185 } 264 }
186 265
187 // Number of active players are less than the threshold, do nothing. 266 // Number of active players are less than the threshold, do nothing.
188 if (num_active_player < kMediaPlayerThreshold) 267 if (num_active_player < kMediaPlayerThreshold)
189 return; 268 return;
190 269
191 for (it = players_.begin(); it != players_.end(); ++it) { 270 for (it = players_.begin(); it != players_.end(); ++it) {
192 if ((*it)->prepared() && !(*it)->IsPlaying()) { 271 if ((*it)->prepared() && !(*it)->IsPlaying() &&
272 fullscreen_player_id_ != (*it)->player_id()) {
193 (*it)->Release(); 273 (*it)->Release();
194 Send(new ViewMsg_MediaPlayerReleased(routing_id(), (*it)->player_id())); 274 Send(new MediaPlayerMsg_MediaPlayerReleased(
275 routing_id(), (*it)->player_id()));
195 } 276 }
196 } 277 }
197 } 278 }
198 279
199 void MediaPlayerManagerAndroid::ReleaseMediaResources( 280 void MediaPlayerManagerAndroid::ReleaseMediaResources(
200 MediaPlayerBridge* player) { 281 MediaPlayerBridge* player) {
201 // Nothing needs to be done. 282 // Nothing needs to be done.
202 } 283 }
203 284
204 } // namespace content 285 } // namespace content
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698