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

Side by Side Diff: webkit/media/android/webmediaplayer_in_process_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 "webkit/media/android/webmediaplayer_in_process_android.h"
6
7 #include "base/bind.h"
8 #include "base/logging.h"
9 #include "base/utf_string_conversions.h"
10 #include "media/base/android/media_player_bridge.h"
11 #include "media/base/android/media_player_bridge_manager.h"
12 #include "third_party/WebKit/Source/WebKit/chromium/public/WebDocument.h"
13 #include "third_party/WebKit/Source/WebKit/chromium/public/WebFrame.h"
14 #include "third_party/WebKit/Source/WebKit/chromium/public/WebMediaPlayerClient. h"
15 #include "third_party/WebKit/Source/WebKit/chromium/public/platform/WebCookieJar .h"
16 #include "webkit/media/android/stream_texture_factory_android.h"
17 #include "webkit/media/android/webmediaplayer_manager_android.h"
18
19 using WebKit::WebMediaPlayerClient;
20 using WebKit::WebMediaPlayer;
21 using WebKit::WebURL;
22 using media::MediaPlayerBridge;
23
24 namespace webkit_media {
25
26 InProcessCookieGetter::InProcessCookieGetter(WebKit::WebCookieJar* cookie_jar)
27 : cookie_jar_(cookie_jar) {
28 }
29
30 InProcessCookieGetter::~InProcessCookieGetter() {}
31
32 void InProcessCookieGetter::GetCookies(
33 const std::string& url,
34 const std::string& first_party_for_cookies,
35 const GetCookieCB& callback) {
36 std::string cookies;
37 if (cookie_jar_ != NULL) {
38 cookies = UTF16ToUTF8(
39 cookie_jar_->cookies(GURL(url), GURL(first_party_for_cookies)));
40 }
41 callback.Run(cookies);
42 }
43
44 WebMediaPlayerInProcessAndroid::WebMediaPlayerInProcessAndroid(
45 WebKit::WebFrame* frame,
46 WebMediaPlayerClient* client,
47 WebKit::WebCookieJar* cookie_jar,
48 WebMediaPlayerManagerAndroid* manager,
49 media::MediaPlayerBridgeManager* resource_manager,
50 StreamTextureFactory* factory,
51 bool disable_media_history_logging)
52 : WebMediaPlayerAndroid(client, manager, factory),
53 frame_(frame),
54 playback_completed_(false),
55 cookie_jar_(cookie_jar),
56 resource_manager_(resource_manager),
57 disable_history_logging_(disable_media_history_logging) {
58 }
59
60 WebMediaPlayerInProcessAndroid::~WebMediaPlayerInProcessAndroid() {}
61
62 void WebMediaPlayerInProcessAndroid::PlayInternal() {
63 if (paused())
64 media_player_->Start();
65 }
66
67 void WebMediaPlayerInProcessAndroid::PauseInternal() {
68 if (!paused())
69 media_player_->Pause();
70 }
71
72 void WebMediaPlayerInProcessAndroid::SeekInternal(base::TimeDelta time) {
73 playback_completed_ = false;
74 media_player_->SeekTo(time);
75 }
76
77 bool WebMediaPlayerInProcessAndroid::paused() const {
78 return !media_player_->IsPlaying();
79 }
80
81 float WebMediaPlayerInProcessAndroid::GetCurrentTimeInternal() const {
82 // When playback is about to finish, android media player often stops
83 // at a time which is smaller than the duration. This makes webkit never
84 // know that the playback has finished. To solve this, we set the
85 // current time to media duration when OnPlaybackComplete() get called.
86 if (playback_completed_)
87 return duration();
88 return static_cast<float>(media_player_->GetCurrentTime().InSecondsF());
89 }
90
91 void WebMediaPlayerInProcessAndroid::ReleaseResourcesInternal() {
92 media_player_->Release();
93 }
94
95 void WebMediaPlayerInProcessAndroid::MediaPreparedCallback(
96 int player_id, base::TimeDelta duration) {
97 OnMediaPrepared(duration);
98 }
99
100 void WebMediaPlayerInProcessAndroid::PlaybackCompleteCallback(int player_id) {
101 // Set the current time equal to duration to let webkit know that play back
102 // is completed.
103 playback_completed_ = true;
104 client()->timeChanged();
105 }
106
107 void WebMediaPlayerInProcessAndroid::SeekCompleteCallback(
108 int player_id, base::TimeDelta current_time) {
109 OnSeekComplete(current_time);
110 }
111
112 void WebMediaPlayerInProcessAndroid::MediaErrorCallback(int player_id,
113 int error_type) {
114 OnMediaError(error_type);
115 }
116
117 void WebMediaPlayerInProcessAndroid::VideoSizeChangedCallback(
118 int player_id, int width, int height) {
119 OnVideoSizeChanged(width, height);
120 }
121
122 void WebMediaPlayerInProcessAndroid::BufferingUpdateCallback(
123 int player_id, int percent) {
124 OnBufferingUpdate(percent);
125 }
126
127 void WebMediaPlayerInProcessAndroid::SetVideoSurface(jobject j_surface) {
128 media_player_->SetVideoSurface(j_surface);
129 }
130
131 void WebMediaPlayerInProcessAndroid::InitializeMediaPlayer(GURL url) {
132 GURL first_party_url = frame_->document().firstPartyForCookies();
133 media_player_.reset(new MediaPlayerBridge(
134 player_id(), url.spec(), first_party_url.spec(),
135 new InProcessCookieGetter(cookie_jar_),
136 disable_history_logging_,
137 resource_manager_,
138 base::Bind(&WebMediaPlayerInProcessAndroid::MediaErrorCallback,
139 base::Unretained(this)),
140 base::Bind(&WebMediaPlayerInProcessAndroid::VideoSizeChangedCallback,
141 base::Unretained(this)),
142 base::Bind(&WebMediaPlayerInProcessAndroid::BufferingUpdateCallback,
143 base::Unretained(this)),
144 base::Bind(&WebMediaPlayerInProcessAndroid::MediaPreparedCallback,
145 base::Unretained(this)),
146 base::Bind(&WebMediaPlayerInProcessAndroid::PlaybackCompleteCallback,
147 base::Unretained(this)),
148 base::Bind(&WebMediaPlayerInProcessAndroid::SeekCompleteCallback,
149 base::Unretained(this)),
150 base::Bind(&WebMediaPlayerInProcessAndroid::TimeUpdateCallback,
151 base::Unretained(this))));
152
153 UpdateNetworkState(WebMediaPlayer::NetworkStateLoading);
154 UpdateReadyState(WebMediaPlayer::ReadyStateHaveNothing);
155
156 // Calling Prepare() will cause android mediaplayer to start
157 // buffering and decoding the data. On mobile devices, this costs a lot of
158 // data usage and could even introduce performance issues. So we don't
159 // initialize the player unless it is a local file. We will start loading
160 // the media only when play/seek/fullsceen button is clicked.
161 if (url.SchemeIs("file")) {
162 media_player_->Prepare();
163 return;
164 }
165
166 // Pretend everything has been loaded so that webkit can
167 // still call play() and seek().
168 UpdateReadyState(WebMediaPlayer::ReadyStateHaveMetadata);
169 UpdateReadyState(WebMediaPlayer::ReadyStateHaveEnoughData);
170 }
171
172 void WebMediaPlayerInProcessAndroid::OnTimeUpdate(
173 base::TimeDelta current_time) {}
174
175 void WebMediaPlayerInProcessAndroid::Destroy() {}
176
177 } // namespace webkit_media
OLDNEW
« no previous file with comments | « webkit/media/android/webmediaplayer_in_process_android.h ('k') | webkit/media/android/webmediaplayer_manager_android.h » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698