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

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

Powered by Google App Engine
This is Rietveld 408576698