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

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: merging latest changes 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(
85 GetPlayer(player_id)->GetDuration())); 123 routing_id(), player_id, GetPlayer(player_id)->GetDuration()));
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 DCHECK_EQ(fullscreen_player_id_, -1);
146
147 fullscreen_player_id_ = player_id;
148 video_view_.CreateContentVideoView();
149 }
150
151 void MediaPlayerManagerAndroid::OnExitFullscreen(int player_id) {
152 if (fullscreen_player_id_ == player_id) {
153 MediaPlayerBridge* player = GetPlayer(player_id);
154 if (player)
155 player->SetVideoSurface(NULL);
156 video_view_.DestroyContentVideoView();
157 fullscreen_player_id_ = -1;
158 }
159 }
160
106 void MediaPlayerManagerAndroid::OnReleaseResources(int player_id) { 161 void MediaPlayerManagerAndroid::OnReleaseResources(int player_id) {
107 MediaPlayerBridge* player = GetPlayer(player_id); 162 MediaPlayerBridge* player = GetPlayer(player_id);
108 if (player) 163 if (player)
109 player->Release(); 164 player->Release();
110 } 165 }
111 166
112 void MediaPlayerManagerAndroid::OnDestroyPlayer(int player_id) { 167 void MediaPlayerManagerAndroid::OnDestroyPlayer(int player_id) {
113 for (ScopedVector<MediaPlayerBridge>::iterator it = players_.begin(); 168 for (ScopedVector<MediaPlayerBridge>::iterator it = players_.begin();
114 it != players_.end(); ++it) { 169 it != players_.end(); ++it) {
115 if ((*it)->player_id() == player_id) { 170 if ((*it)->player_id() == player_id) {
116 players_.erase(it); 171 players_.erase(it);
117 break; 172 break;
118 } 173 }
119 } 174 }
175 if (fullscreen_player_id_ == player_id)
176 fullscreen_player_id_ = -1;
120 } 177 }
121 178
122 void MediaPlayerManagerAndroid::DestroyAllMediaPlayers() { 179 void MediaPlayerManagerAndroid::DestroyAllMediaPlayers() {
123 players_.clear(); 180 players_.clear();
181 if (fullscreen_player_id_ != -1) {
182 video_view_.DestroyContentVideoView();
183 fullscreen_player_id_ = -1;
184 }
124 } 185 }
125 186
126 MediaPlayerBridge* MediaPlayerManagerAndroid::GetPlayer(int player_id) { 187 MediaPlayerBridge* MediaPlayerManagerAndroid::GetPlayer(int player_id) {
127 for (ScopedVector<MediaPlayerBridge>::iterator it = players_.begin(); 188 for (ScopedVector<MediaPlayerBridge>::iterator it = players_.begin();
128 it != players_.end(); ++it) { 189 it != players_.end(); ++it) {
129 if ((*it)->player_id() == player_id) 190 if ((*it)->player_id() == player_id)
130 return *it; 191 return *it;
131 } 192 }
132 return NULL; 193 return NULL;
133 } 194 }
134 195
196 MediaPlayerBridge* MediaPlayerManagerAndroid::GetFullscreenPlayer() {
197 return GetPlayer(fullscreen_player_id_);
198 }
199
135 void MediaPlayerManagerAndroid::OnPrepared(int player_id, 200 void MediaPlayerManagerAndroid::OnPrepared(int player_id,
136 base::TimeDelta duration) { 201 base::TimeDelta duration) {
137 Send(new ViewMsg_MediaPrepared(routing_id(), player_id, duration)); 202 Send(new MediaPlayerMsg_MediaPrepared(routing_id(), player_id, duration));
203 if (fullscreen_player_id_ != -1)
204 video_view_.UpdateMediaMetadata();
138 } 205 }
139 206
140 void MediaPlayerManagerAndroid::OnPlaybackComplete(int player_id) { 207 void MediaPlayerManagerAndroid::OnPlaybackComplete(int player_id) {
141 Send(new ViewMsg_MediaPlaybackCompleted(routing_id(), player_id)); 208 Send(new MediaPlayerMsg_MediaPlaybackCompleted(routing_id(), player_id));
209 if (fullscreen_player_id_ != -1)
210 video_view_.OnPlaybackComplete();
142 } 211 }
143 212
144 void MediaPlayerManagerAndroid::OnBufferingUpdate( 213 void MediaPlayerManagerAndroid::OnBufferingUpdate(
145 int player_id, int percentage) { 214 int player_id, int percentage) {
146 Send(new ViewMsg_MediaBufferingUpdate(routing_id(), player_id, percentage)); 215 Send(new MediaPlayerMsg_MediaBufferingUpdate(
216 routing_id(), player_id, percentage));
217 if (fullscreen_player_id_ != -1)
218 video_view_.OnBufferingUpdate(percentage);
147 } 219 }
148 220
149 void MediaPlayerManagerAndroid::OnSeekComplete(int player_id, 221 void MediaPlayerManagerAndroid::OnSeekComplete(int player_id,
150 base::TimeDelta current_time) { 222 base::TimeDelta current_time) {
151 Send(new ViewMsg_MediaSeekCompleted(routing_id(), player_id, current_time)); 223 Send(new MediaPlayerMsg_MediaSeekCompleted(
224 routing_id(), player_id, current_time));
152 } 225 }
153 226
154 void MediaPlayerManagerAndroid::OnError(int player_id, int error) { 227 void MediaPlayerManagerAndroid::OnError(int player_id, int error) {
155 Send(new ViewMsg_MediaError(routing_id(), player_id, error)); 228 Send(new MediaPlayerMsg_MediaError(routing_id(), player_id, error));
229 if (fullscreen_player_id_ != -1)
230 video_view_.OnMediaPlayerError(error);
156 } 231 }
157 232
158 void MediaPlayerManagerAndroid::OnVideoSizeChanged( 233 void MediaPlayerManagerAndroid::OnVideoSizeChanged(
159 int player_id, int width, int height) { 234 int player_id, int width, int height) {
160 Send(new ViewMsg_MediaVideoSizeChanged(routing_id(), player_id, 235 Send(new MediaPlayerMsg_MediaVideoSizeChanged(routing_id(), player_id,
161 width, height)); 236 width, height));
237 if (fullscreen_player_id_ != -1)
238 video_view_.OnVideoSizeChanged(width, height);
162 } 239 }
163 240
164 void MediaPlayerManagerAndroid::OnTimeUpdate(int player_id, 241 void MediaPlayerManagerAndroid::OnTimeUpdate(int player_id,
165 base::TimeDelta current_time) { 242 base::TimeDelta current_time) {
166 Send(new ViewMsg_MediaTimeUpdate(routing_id(), player_id, current_time)); 243 Send(new MediaPlayerMsg_MediaTimeUpdate(
244 routing_id(), player_id, current_time));
167 } 245 }
168 246
169 void MediaPlayerManagerAndroid::RequestMediaResources( 247 void MediaPlayerManagerAndroid::RequestMediaResources(
170 MediaPlayerBridge* player) { 248 MediaPlayerBridge* player) {
171 if (player == NULL) 249 if (player == NULL)
172 return; 250 return;
173 251
174 int num_active_player = 0; 252 int num_active_player = 0;
175 ScopedVector<MediaPlayerBridge>::iterator it; 253 ScopedVector<MediaPlayerBridge>::iterator it;
176 for (it = players_.begin(); it != players_.end(); ++it) { 254 for (it = players_.begin(); it != players_.end(); ++it) {
177 if (!(*it)->prepared()) 255 if (!(*it)->prepared())
178 continue; 256 continue;
179 257
180 // The player is already active, ignore it. 258 // The player is already active, ignore it.
181 if ((*it) == player) 259 if ((*it) == player)
182 return; 260 return;
183 else 261 else
184 num_active_player++; 262 num_active_player++;
185 } 263 }
186 264
187 // Number of active players are less than the threshold, do nothing. 265 // Number of active players are less than the threshold, do nothing.
188 if (num_active_player < kMediaPlayerThreshold) 266 if (num_active_player < kMediaPlayerThreshold)
189 return; 267 return;
190 268
191 for (it = players_.begin(); it != players_.end(); ++it) { 269 for (it = players_.begin(); it != players_.end(); ++it) {
192 if ((*it)->prepared() && !(*it)->IsPlaying()) { 270 if ((*it)->prepared() && !(*it)->IsPlaying() &&
271 fullscreen_player_id_ != (*it)->player_id()) {
193 (*it)->Release(); 272 (*it)->Release();
194 Send(new ViewMsg_MediaPlayerReleased(routing_id(), (*it)->player_id())); 273 Send(new MediaPlayerMsg_MediaPlayerReleased(
274 routing_id(), (*it)->player_id()));
195 } 275 }
196 } 276 }
197 } 277 }
198 278
199 void MediaPlayerManagerAndroid::ReleaseMediaResources( 279 void MediaPlayerManagerAndroid::ReleaseMediaResources(
200 MediaPlayerBridge* player) { 280 MediaPlayerBridge* player) {
201 // Nothing needs to be done. 281 // Nothing needs to be done.
202 } 282 }
203 283
204 } // namespace content 284 } // namespace content
OLDNEW
« no previous file with comments | « content/browser/android/media_player_manager_android.h ('k') | content/browser/android/surface_texture_peer_browser_impl.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698