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

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

Issue 10919075: Move android mediaplayer from render process to browser process. (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: addressing comments and resolving merge conflicts Created 8 years, 3 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/cookie_getter_impl.h"
9 #include "content/common/view_messages.h"
10 #include "content/public/browser/browser_context.h"
11 #include "content/public/browser/browser_thread.h"
12 #include "content/public/browser/render_process_host.h"
13 #include "content/public/browser/render_view_host.h"
14
15 using media::MediaPlayerBridge;
16
17 // Threshold on the number of media players per renderer before we start
18 // attempting to release inactive media players.
19 static const int kMediaPlayerThreshold = 1;
20
21 namespace content {
22
23 MediaPlayerManagerAndroid::MediaPlayerManagerAndroid(
24 RenderViewHost* render_view_host)
25 : RenderViewHostObserver(render_view_host) {
26 }
27
28 MediaPlayerManagerAndroid::~MediaPlayerManagerAndroid() {}
29
30 bool MediaPlayerManagerAndroid::OnMessageReceived(const IPC::Message& msg) {
31 bool handled = true;
32 IPC_BEGIN_MESSAGE_MAP(MediaPlayerManagerAndroid, msg)
33 IPC_MESSAGE_HANDLER(ViewHostMsg_MediaPlayerInitialize,
34 OnInitialize)
35 IPC_MESSAGE_HANDLER(ViewHostMsg_MediaPlayerStart,
36 OnStart)
37 IPC_MESSAGE_HANDLER(ViewHostMsg_MediaPlayerSeek,
38 OnSeek)
39 IPC_MESSAGE_HANDLER(ViewHostMsg_MediaPlayerPause,
40 OnPause)
41 IPC_MESSAGE_HANDLER(ViewHostMsg_MediaPlayerRelease,
42 OnReleaseResources)
43 IPC_MESSAGE_HANDLER(ViewHostMsg_DestroyMediaPlayer,
44 OnDestroyPlayer)
45 IPC_MESSAGE_HANDLER(ViewHostMsg_DestroyAllMediaPlayers,
46 DestroyAllMediaPlayers)
47 IPC_MESSAGE_UNHANDLED(handled = false)
48 IPC_END_MESSAGE_MAP()
49 return handled;
50 }
51
52 void MediaPlayerManagerAndroid::OnInitialize(
53 int player_id, const std::string& url,
54 const std::string& first_party_for_cookies) {
55 for (ScopedVector<MediaPlayerBridge>::iterator it = players_.begin();
56 it != players_.end(); ++it) {
57 if ((*it)->player_id() == player_id) {
58 players_.erase(it);
59 break;
60 }
61 }
62
63 RenderProcessHost* host = render_view_host()->GetProcess();
64 BrowserContext* context = host->GetBrowserContext();
65 players_.push_back(new MediaPlayerBridge(
66 player_id, url, first_party_for_cookies,
67 new CookieGetterImpl(context, host->GetID(), routing_id()),
68 context->IsOffTheRecord(), this,
69 base::Bind(&MediaPlayerManagerAndroid::OnError, base::Unretained(this)),
70 base::Bind(&MediaPlayerManagerAndroid::OnVideoSizeChanged,
71 base::Unretained(this)),
72 base::Bind(&MediaPlayerManagerAndroid::OnBufferingUpdate,
73 base::Unretained(this)),
74 base::Bind(&MediaPlayerManagerAndroid::OnPrepared,
75 base::Unretained(this)),
76 base::Bind(&MediaPlayerManagerAndroid::OnPlaybackComplete,
77 base::Unretained(this)),
78 base::Bind(&MediaPlayerManagerAndroid::OnSeekComplete,
79 base::Unretained(this)),
80 base::Bind(&MediaPlayerManagerAndroid::OnTimeUpdate,
81 base::Unretained(this))));
82
83 // Send a MediaPrepared message to webkit so that Load() can finish.
84 Send(new ViewMsg_MediaPrepared(routing_id(), player_id,
85 GetPlayer(player_id)->GetDuration()));
86 }
87
88 void MediaPlayerManagerAndroid::OnStart(int player_id) {
89 MediaPlayerBridge* player = GetPlayer(player_id);
90 if (player)
91 player->Start();
92 }
93
94 void MediaPlayerManagerAndroid::OnSeek(int player_id, base::TimeDelta time) {
95 MediaPlayerBridge* player = GetPlayer(player_id);
96 if (player)
97 player->SeekTo(time);
98 }
99
100 void MediaPlayerManagerAndroid::OnPause(int player_id) {
101 MediaPlayerBridge* player = GetPlayer(player_id);
102 if (player)
103 player->Pause();
104 }
105
106 void MediaPlayerManagerAndroid::OnReleaseResources(int player_id) {
107 MediaPlayerBridge* player = GetPlayer(player_id);
108 if (player)
109 player->Release();
110 }
111
112 void MediaPlayerManagerAndroid::OnDestroyPlayer(int player_id) {
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
122 void MediaPlayerManagerAndroid::DestroyAllMediaPlayers() {
123 players_.clear();
124 }
125
126 MediaPlayerBridge* MediaPlayerManagerAndroid::GetPlayer(int player_id) {
127 for (ScopedVector<MediaPlayerBridge>::iterator it = players_.begin();
128 it != players_.end(); ++it) {
129 if ((*it)->player_id() == player_id)
130 return *it;
131 }
132 return NULL;
133 }
134
135 void MediaPlayerManagerAndroid::OnPrepared(int player_id,
136 base::TimeDelta duration) {
137 Send(new ViewMsg_MediaPrepared(routing_id(), player_id, duration));
138 }
139
140 void MediaPlayerManagerAndroid::OnPlaybackComplete(int player_id) {
141 Send(new ViewMsg_MediaPlaybackCompleted(routing_id(), player_id));
142 }
143
144 void MediaPlayerManagerAndroid::OnBufferingUpdate(
145 int player_id, int percentage) {
146 Send(new ViewMsg_MediaBufferingUpdate(routing_id(), player_id, percentage));
147 }
148
149 void MediaPlayerManagerAndroid::OnSeekComplete(int player_id,
150 base::TimeDelta current_time) {
151 Send(new ViewMsg_MediaSeekCompleted(routing_id(), player_id, current_time));
152 }
153
154 void MediaPlayerManagerAndroid::OnError(int player_id, int error) {
155 Send(new ViewMsg_MediaError(routing_id(), player_id, error));
156 }
157
158 void MediaPlayerManagerAndroid::OnVideoSizeChanged(
159 int player_id, int width, int height) {
160 Send(new ViewMsg_MediaVideoSizeChanged(routing_id(), player_id,
161 width, height));
162 }
163
164 void MediaPlayerManagerAndroid::OnTimeUpdate(int player_id,
165 base::TimeDelta current_time) {
166 Send(new ViewMsg_MediaTimeUpdate(routing_id(), player_id, current_time));
167 }
168
169 void MediaPlayerManagerAndroid::RequestMediaResources(
170 MediaPlayerBridge* player) {
171 if (player == NULL)
172 return;
173
174 int num_active_player = 0;
175 ScopedVector<MediaPlayerBridge>::iterator it;
176 for (it = players_.begin(); it != players_.end(); ++it) {
177 if (!(*it)->prepared())
178 continue;
179
180 // The player is already active, ignore it.
181 if ((*it) == player)
182 return;
183 else
184 num_active_player++;
185 }
186
187 // Number of active players are less than the threshold, do nothing.
188 if (num_active_player < kMediaPlayerThreshold)
189 return;
190
191 for (it = players_.begin(); it != players_.end(); ++it) {
192 if ((*it)->prepared() && !(*it)->IsPlaying()) {
193 (*it)->Release();
194 Send(new ViewMsg_MediaPlayerReleased(routing_id(), (*it)->player_id()));
195 }
196 }
197 }
198
199 void MediaPlayerManagerAndroid::ReleaseMediaResources(
200 MediaPlayerBridge* player) {
201 // Nothing needs to be done.
202 }
203
204 } // 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.h » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698