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

Side by Side Diff: media/base/android/media_player_bridge.cc

Issue 411353002: MediaUrlInterceptor for embedders to handle custom urls. (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: Copyright nit Created 6 years, 4 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
« no previous file with comments | « media/base/android/media_player_bridge.h ('k') | media/base/android/media_player_manager.h » ('j') | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. 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 2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file. 3 // found in the LICENSE file.
4 4
5 #include "media/base/android/media_player_bridge.h" 5 #include "media/base/android/media_player_bridge.h"
6 6
7 #include "base/android/jni_android.h" 7 #include "base/android/jni_android.h"
8 #include "base/android/jni_string.h" 8 #include "base/android/jni_string.h"
9 #include "base/basictypes.h" 9 #include "base/basictypes.h"
10 #include "base/logging.h" 10 #include "base/logging.h"
11 #include "base/message_loop/message_loop_proxy.h" 11 #include "base/message_loop/message_loop_proxy.h"
12 #include "base/strings/string_util.h" 12 #include "base/strings/string_util.h"
13 #include "jni/MediaPlayerBridge_jni.h" 13 #include "jni/MediaPlayerBridge_jni.h"
14 #include "media/base/android/media_player_manager.h" 14 #include "media/base/android/media_player_manager.h"
15 #include "media/base/android/media_resource_getter.h" 15 #include "media/base/android/media_resource_getter.h"
16 #include "media/base/android/media_url_interceptor.h"
16 17
17 using base::android::ConvertUTF8ToJavaString; 18 using base::android::ConvertUTF8ToJavaString;
18 using base::android::ScopedJavaLocalRef; 19 using base::android::ScopedJavaLocalRef;
19 20
20 // Time update happens every 250ms. 21 // Time update happens every 250ms.
21 const int kTimeUpdateInterval = 250; 22 const int kTimeUpdateInterval = 250;
22 23
23 // blob url scheme. 24 // blob url scheme.
24 const char kBlobScheme[] = "blob"; 25 const char kBlobScheme[] = "blob";
25 26
(...skipping 131 matching lines...) Expand 10 before | Expand all | Expand 10 after
157 SetDataSource(url_.spec()); 158 SetDataSource(url_.spec());
158 } 159 }
159 160
160 void MediaPlayerBridge::SetDataSource(const std::string& url) { 161 void MediaPlayerBridge::SetDataSource(const std::string& url) {
161 if (j_media_player_bridge_.is_null()) 162 if (j_media_player_bridge_.is_null())
162 return; 163 return;
163 164
164 JNIEnv* env = base::android::AttachCurrentThread(); 165 JNIEnv* env = base::android::AttachCurrentThread();
165 CHECK(env); 166 CHECK(env);
166 167
167 // Create a Java String for the URL. 168 int fd;
168 ScopedJavaLocalRef<jstring> j_url_string = ConvertUTF8ToJavaString(env, url); 169 int64 offset;
169 ScopedJavaLocalRef<jstring> j_cookies = ConvertUTF8ToJavaString( 170 int64 size;
170 env, cookies_); 171 if (InterceptMediaUrl(url, &fd, &offset, &size)) {
171 ScopedJavaLocalRef<jstring> j_user_agent = ConvertUTF8ToJavaString( 172 if (!Java_MediaPlayerBridge_setDataSourceFromFd(
172 env, user_agent_); 173 env, j_media_player_bridge_.obj(), fd, offset, size)) {
174 OnMediaError(MEDIA_ERROR_FORMAT);
175 return;
176 }
177 } else {
178 // Create a Java String for the URL.
179 ScopedJavaLocalRef<jstring> j_url_string =
180 ConvertUTF8ToJavaString(env, url);
173 181
174 jobject j_context = base::android::GetApplicationContext(); 182 jobject j_context = base::android::GetApplicationContext();
175 DCHECK(j_context); 183 DCHECK(j_context);
176 184
177 const std::string data_uri_prefix("data:"); 185 const std::string data_uri_prefix("data:");
178 if (StartsWithASCII(url, data_uri_prefix, true)) { 186 if (StartsWithASCII(url, data_uri_prefix, true)) {
179 if (!Java_MediaPlayerBridge_setDataUriDataSource( 187 if (!Java_MediaPlayerBridge_setDataUriDataSource(
180 env, j_media_player_bridge_.obj(), j_context, j_url_string.obj())) { 188 env, j_media_player_bridge_.obj(), j_context, j_url_string.obj())) {
189 OnMediaError(MEDIA_ERROR_FORMAT);
190 }
191 return;
192 }
193
194 ScopedJavaLocalRef<jstring> j_cookies = ConvertUTF8ToJavaString(
195 env, cookies_);
196 ScopedJavaLocalRef<jstring> j_user_agent = ConvertUTF8ToJavaString(
197 env, user_agent_);
198
199 if (!Java_MediaPlayerBridge_setDataSource(
200 env, j_media_player_bridge_.obj(), j_context, j_url_string.obj(),
201 j_cookies.obj(), j_user_agent.obj(), hide_url_log_)) {
181 OnMediaError(MEDIA_ERROR_FORMAT); 202 OnMediaError(MEDIA_ERROR_FORMAT);
203 return;
182 } 204 }
183 return;
184 }
185
186 if (!Java_MediaPlayerBridge_setDataSource(
187 env, j_media_player_bridge_.obj(), j_context, j_url_string.obj(),
188 j_cookies.obj(), j_user_agent.obj(), hide_url_log_)) {
189 OnMediaError(MEDIA_ERROR_FORMAT);
190 return;
191 } 205 }
192 206
193 request_media_resources_cb_.Run(player_id()); 207 request_media_resources_cb_.Run(player_id());
194 if (!Java_MediaPlayerBridge_prepareAsync(env, j_media_player_bridge_.obj())) 208 if (!Java_MediaPlayerBridge_prepareAsync(env, j_media_player_bridge_.obj()))
195 OnMediaError(MEDIA_ERROR_FORMAT); 209 OnMediaError(MEDIA_ERROR_FORMAT);
196 } 210 }
197 211
212 bool MediaPlayerBridge::InterceptMediaUrl(
213 const std::string& url, int* fd, int64* offset, int64* size) {
214 // Sentinel value to check whether the output arguments have been set.
215 const int kUnsetValue = -1;
216
217 *fd = kUnsetValue;
218 *offset = kUnsetValue;
219 *size = kUnsetValue;
220 media::MediaUrlInterceptor* url_interceptor =
221 manager()->GetMediaUrlInterceptor();
222 if (url_interceptor && url_interceptor->Intercept(url, fd, offset, size)) {
223 DCHECK_NE(kUnsetValue, *fd);
224 DCHECK_NE(kUnsetValue, *offset);
225 DCHECK_NE(kUnsetValue, *size);
226 return true;
227 }
228 return false;
229 }
230
198 void MediaPlayerBridge::OnDidSetDataUriDataSource(JNIEnv* env, jobject obj, 231 void MediaPlayerBridge::OnDidSetDataUriDataSource(JNIEnv* env, jobject obj,
199 jboolean success) { 232 jboolean success) {
200 if (!success) { 233 if (!success) {
201 OnMediaError(MEDIA_ERROR_FORMAT); 234 OnMediaError(MEDIA_ERROR_FORMAT);
202 return; 235 return;
203 } 236 }
204 237
205 request_media_resources_cb_.Run(player_id()); 238 request_media_resources_cb_.Run(player_id());
206 if (!Java_MediaPlayerBridge_prepareAsync(env, j_media_player_bridge_.obj())) 239 if (!Java_MediaPlayerBridge_prepareAsync(env, j_media_player_bridge_.obj()))
207 OnMediaError(MEDIA_ERROR_FORMAT); 240 OnMediaError(MEDIA_ERROR_FORMAT);
(...skipping 13 matching lines...) Expand all
221 if (!username.empty()) { 254 if (!username.empty()) {
222 replacements.SetUsernameStr(username); 255 replacements.SetUsernameStr(username);
223 if (!password.empty()) 256 if (!password.empty())
224 replacements.SetPasswordStr(password); 257 replacements.SetPasswordStr(password);
225 url_ = url_.ReplaceComponents(replacements); 258 url_ = url_.ReplaceComponents(replacements);
226 } 259 }
227 ExtractMediaMetadata(url_.spec()); 260 ExtractMediaMetadata(url_.spec());
228 } 261 }
229 262
230 void MediaPlayerBridge::ExtractMediaMetadata(const std::string& url) { 263 void MediaPlayerBridge::ExtractMediaMetadata(const std::string& url) {
231 manager()->GetMediaResourceGetter()->ExtractMediaMetadata( 264 int fd;
232 url, 265 int64 offset;
233 cookies_, 266 int64 size;
234 user_agent_, 267 if (InterceptMediaUrl(url, &fd, &offset, &size)) {
235 base::Bind(&MediaPlayerBridge::OnMediaMetadataExtracted, 268 manager()->GetMediaResourceGetter()->ExtractMediaMetadata(
236 weak_factory_.GetWeakPtr())); 269 fd, offset, size,
270 base::Bind(&MediaPlayerBridge::OnMediaMetadataExtracted,
271 weak_factory_.GetWeakPtr()));
272 } else {
273 manager()->GetMediaResourceGetter()->ExtractMediaMetadata(
274 url, cookies_, user_agent_,
275 base::Bind(&MediaPlayerBridge::OnMediaMetadataExtracted,
276 weak_factory_.GetWeakPtr()));
277 }
237 } 278 }
238 279
239 void MediaPlayerBridge::OnMediaMetadataExtracted( 280 void MediaPlayerBridge::OnMediaMetadataExtracted(
240 base::TimeDelta duration, int width, int height, bool success) { 281 base::TimeDelta duration, int width, int height, bool success) {
241 if (success) { 282 if (success) {
242 duration_ = duration; 283 duration_ = duration;
243 width_ = width; 284 width_ = width;
244 height_ = height; 285 height_ = height;
245 } 286 }
246 manager()->OnMediaMetadataChanged( 287 manager()->OnMediaMetadataChanged(
(...skipping 249 matching lines...) Expand 10 before | Expand all | Expand 10 after
496 537
497 GURL MediaPlayerBridge::GetFirstPartyForCookies() { 538 GURL MediaPlayerBridge::GetFirstPartyForCookies() {
498 return first_party_for_cookies_; 539 return first_party_for_cookies_;
499 } 540 }
500 541
501 bool MediaPlayerBridge::IsSurfaceInUse() const { 542 bool MediaPlayerBridge::IsSurfaceInUse() const {
502 return is_surface_in_use_; 543 return is_surface_in_use_;
503 } 544 }
504 545
505 } // namespace media 546 } // namespace media
OLDNEW
« no previous file with comments | « media/base/android/media_player_bridge.h ('k') | media/base/android/media_player_manager.h » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698