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

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

Powered by Google App Engine
This is Rietveld 408576698