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

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 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(int player_id,
53 const std::string& url) {
54 for (ScopedVector<MediaPlayerBridge>::iterator it = players_.begin();
55 it != players_.end(); ++it) {
56 if ((*it)->player_id() == player_id) {
57 players_.erase(it);
58 break;
59 }
60 }
61
62 content::BrowserContext* context =
63 render_view_host()->GetProcess()->GetBrowserContext();
64 players_.push_back(new MediaPlayerBridge(player_id, url,
65 new content::CookieGetterImpl(context->GetRequestContext()),
66 context->IsOffTheRecord(), this,
67 base::Bind(&MediaPlayerManagerAndroid::OnError, base::Unretained(this)),
68 base::Bind(&MediaPlayerManagerAndroid::OnVideoSizeChanged,
69 base::Unretained(this)),
70 base::Bind(&MediaPlayerManagerAndroid::OnBufferingUpdate,
71 base::Unretained(this)),
72 base::Bind(&MediaPlayerManagerAndroid::OnPrepared,
73 base::Unretained(this)),
74 base::Bind(&MediaPlayerManagerAndroid::OnPlaybackComplete,
75 base::Unretained(this)),
76 base::Bind(&MediaPlayerManagerAndroid::OnSeekComplete,
77 base::Unretained(this)),
78 base::Bind(&MediaPlayerManagerAndroid::OnTimeUpdate,
79 base::Unretained(this))));
80
81 // Send a MediaPrepared message to webkit so that Load() can finish.
82 Send(new ViewMsg_MediaPrepared(routing_id(), player_id,
83 GetPlayer(player_id)->GetDuration()));
84 }
85
86 void MediaPlayerManagerAndroid::OnStart(int player_id) {
87 MediaPlayerBridge* player = GetPlayer(player_id);
88 if (player)
89 player->Start();
90 }
91
92 void MediaPlayerManagerAndroid::OnSeek(int player_id, base::TimeDelta time) {
93 MediaPlayerBridge* player = GetPlayer(player_id);
94 if (player)
95 player->SeekTo(time);
96 }
97
98 void MediaPlayerManagerAndroid::OnPause(int player_id) {
99 MediaPlayerBridge* player = GetPlayer(player_id);
100 if (player)
101 player->Pause();
102 }
103
104 void MediaPlayerManagerAndroid::OnReleaseResources(int player_id) {
105 MediaPlayerBridge* player = GetPlayer(player_id);
106 if (player)
107 player->Release();
108 }
109
110 void MediaPlayerManagerAndroid::OnDestroyPlayer(int player_id) {
111 for (ScopedVector<MediaPlayerBridge>::iterator it = players_.begin();
112 it != players_.end(); ++it) {
113 if ((*it)->player_id() == player_id) {
114 players_.erase(it);
115 break;
116 }
117 }
118 }
119
120 void MediaPlayerManagerAndroid::DestroyAllMediaPlayers() {
121 players_.clear();
122 }
123
124 MediaPlayerBridge* MediaPlayerManagerAndroid::GetPlayer(int player_id) {
125 for (ScopedVector<MediaPlayerBridge>::iterator it = players_.begin();
126 it != players_.end(); ++it) {
127 if ((*it)->player_id() == player_id)
128 return *it;
129 }
130 return NULL;
131 }
132
133 void MediaPlayerManagerAndroid::OnPrepared(int player_id,
134 base::TimeDelta duration) {
135 Send(new ViewMsg_MediaPrepared(routing_id(), player_id, duration));
136 }
137
138 void MediaPlayerManagerAndroid::OnPlaybackComplete(int player_id) {
139 Send(new ViewMsg_MediaPlaybackCompleted(routing_id(), player_id));
140 }
141
142 void MediaPlayerManagerAndroid::OnBufferingUpdate(
143 int player_id, int percentage) {
144 Send(new ViewMsg_MediaBufferingUpdate(routing_id(), player_id, percentage));
145 }
146
147 void MediaPlayerManagerAndroid::OnSeekComplete(int player_id,
148 base::TimeDelta current_time) {
149 Send(new ViewMsg_MediaSeekCompleted(routing_id(), player_id, current_time));
150 }
151
152 void MediaPlayerManagerAndroid::OnError(int player_id, int error) {
153 Send(new ViewMsg_MediaError(routing_id(), player_id, error));
154 }
155
156 void MediaPlayerManagerAndroid::OnVideoSizeChanged(
157 int player_id, int width, int height) {
158 Send(new ViewMsg_MediaVideoSizeChanged(routing_id(), player_id,
159 width, height));
160 }
161
162 void MediaPlayerManagerAndroid::OnTimeUpdate(int player_id,
163 base::TimeDelta current_time) {
164 Send(new ViewMsg_MediaTimeUpdate(routing_id(), player_id, current_time));
165 }
166
167 void MediaPlayerManagerAndroid::RequestMediaResources(
168 MediaPlayerBridge* player) {
169 if (player == NULL)
170 return;
171
172 int num_active_player = 0;
173 ScopedVector<MediaPlayerBridge>::iterator it;
174 for (it = players_.begin(); it != players_.end(); ++it) {
175 if (!(*it)->prepared())
176 continue;
177
178 // The player is already active, ignore it.
179 if ((*it) == player)
180 return;
181 else
182 num_active_player++;
183 }
184
185 // Number of active players are less than the threshold, do nothing.
186 if (num_active_player < kMediaPlayerThreshold)
187 return;
188
189 for (it = players_.begin(); it != players_.end(); ++it) {
190 if ((*it)->prepared() && !(*it)->IsPlaying()) {
191 (*it)->Release();
192 Send(new ViewMsg_MediaPlayerReleased(routing_id(), (*it)->player_id()));
193 }
194 }
195 }
196
197 void MediaPlayerManagerAndroid::ReleaseMediaResources(
198 MediaPlayerBridge* player) {
199 // Nothing needs to be done.
200 }
201
202 } // namespace content
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698