| Index: media/base/android/media_player_bridge.cc
|
| diff --git a/media/base/android/media_player_bridge.cc b/media/base/android/media_player_bridge.cc
|
| index f07f11e3851c62c2670cfd325f5ba0741bde8771..469409d373cfea85e7961d96f65d336b83c8869e 100644
|
| --- a/media/base/android/media_player_bridge.cc
|
| +++ b/media/base/android/media_player_bridge.cc
|
| @@ -13,6 +13,7 @@
|
| #include "jni/MediaPlayerBridge_jni.h"
|
| #include "media/base/android/media_player_manager.h"
|
| #include "media/base/android/media_resource_getter.h"
|
| +#include "media/base/android/media_url_interceptor.h"
|
|
|
| using base::android::ConvertUTF8ToJavaString;
|
| using base::android::ScopedJavaLocalRef;
|
| @@ -164,30 +165,43 @@ void MediaPlayerBridge::SetDataSource(const std::string& url) {
|
| JNIEnv* env = base::android::AttachCurrentThread();
|
| CHECK(env);
|
|
|
| - // Create a Java String for the URL.
|
| - ScopedJavaLocalRef<jstring> j_url_string = ConvertUTF8ToJavaString(env, url);
|
| - ScopedJavaLocalRef<jstring> j_cookies = ConvertUTF8ToJavaString(
|
| - env, cookies_);
|
| - ScopedJavaLocalRef<jstring> j_user_agent = ConvertUTF8ToJavaString(
|
| - env, user_agent_);
|
| + int fd;
|
| + int64 offset;
|
| + int64 size;
|
| + if (InterceptMediaUrl(url, &fd, &offset, &size)) {
|
| + if (!Java_MediaPlayerBridge_setDataSourceFromFd(
|
| + env, j_media_player_bridge_.obj(), fd, offset, size)) {
|
| + OnMediaError(MEDIA_ERROR_FORMAT);
|
| + return;
|
| + }
|
| + } else {
|
| + // Create a Java String for the URL.
|
| + ScopedJavaLocalRef<jstring> j_url_string =
|
| + ConvertUTF8ToJavaString(env, url);
|
| +
|
| + jobject j_context = base::android::GetApplicationContext();
|
| + DCHECK(j_context);
|
| +
|
| + const std::string data_uri_prefix("data:");
|
| + if (StartsWithASCII(url, data_uri_prefix, true)) {
|
| + if (!Java_MediaPlayerBridge_setDataUriDataSource(
|
| + env, j_media_player_bridge_.obj(), j_context, j_url_string.obj())) {
|
| + OnMediaError(MEDIA_ERROR_FORMAT);
|
| + }
|
| + return;
|
| + }
|
|
|
| - jobject j_context = base::android::GetApplicationContext();
|
| - DCHECK(j_context);
|
| + ScopedJavaLocalRef<jstring> j_cookies = ConvertUTF8ToJavaString(
|
| + env, cookies_);
|
| + ScopedJavaLocalRef<jstring> j_user_agent = ConvertUTF8ToJavaString(
|
| + env, user_agent_);
|
|
|
| - const std::string data_uri_prefix("data:");
|
| - if (StartsWithASCII(url, data_uri_prefix, true)) {
|
| - if (!Java_MediaPlayerBridge_setDataUriDataSource(
|
| - env, j_media_player_bridge_.obj(), j_context, j_url_string.obj())) {
|
| + if (!Java_MediaPlayerBridge_setDataSource(
|
| + env, j_media_player_bridge_.obj(), j_context, j_url_string.obj(),
|
| + j_cookies.obj(), j_user_agent.obj(), hide_url_log_)) {
|
| OnMediaError(MEDIA_ERROR_FORMAT);
|
| + return;
|
| }
|
| - return;
|
| - }
|
| -
|
| - if (!Java_MediaPlayerBridge_setDataSource(
|
| - env, j_media_player_bridge_.obj(), j_context, j_url_string.obj(),
|
| - j_cookies.obj(), j_user_agent.obj(), hide_url_log_)) {
|
| - OnMediaError(MEDIA_ERROR_FORMAT);
|
| - return;
|
| }
|
|
|
| request_media_resources_cb_.Run(player_id());
|
| @@ -195,6 +209,25 @@ void MediaPlayerBridge::SetDataSource(const std::string& url) {
|
| OnMediaError(MEDIA_ERROR_FORMAT);
|
| }
|
|
|
| +bool MediaPlayerBridge::InterceptMediaUrl(
|
| + const std::string& url, int* fd, int64* offset, int64* size) {
|
| + // Sentinel value to check whether the output arguments have been set.
|
| + const int kUnsetValue = -1;
|
| +
|
| + *fd = kUnsetValue;
|
| + *offset = kUnsetValue;
|
| + *size = kUnsetValue;
|
| + media::MediaUrlInterceptor* url_interceptor =
|
| + manager()->GetMediaUrlInterceptor();
|
| + if (url_interceptor && url_interceptor->Intercept(url, fd, offset, size)) {
|
| + DCHECK_NE(kUnsetValue, *fd);
|
| + DCHECK_NE(kUnsetValue, *offset);
|
| + DCHECK_NE(kUnsetValue, *size);
|
| + return true;
|
| + }
|
| + return false;
|
| +}
|
| +
|
| void MediaPlayerBridge::OnDidSetDataUriDataSource(JNIEnv* env, jobject obj,
|
| jboolean success) {
|
| if (!success) {
|
| @@ -228,12 +261,20 @@ void MediaPlayerBridge::OnAuthCredentialsRetrieved(
|
| }
|
|
|
| void MediaPlayerBridge::ExtractMediaMetadata(const std::string& url) {
|
| - manager()->GetMediaResourceGetter()->ExtractMediaMetadata(
|
| - url,
|
| - cookies_,
|
| - user_agent_,
|
| - base::Bind(&MediaPlayerBridge::OnMediaMetadataExtracted,
|
| - weak_factory_.GetWeakPtr()));
|
| + int fd;
|
| + int64 offset;
|
| + int64 size;
|
| + if (InterceptMediaUrl(url, &fd, &offset, &size)) {
|
| + manager()->GetMediaResourceGetter()->ExtractMediaMetadata(
|
| + fd, offset, size,
|
| + base::Bind(&MediaPlayerBridge::OnMediaMetadataExtracted,
|
| + weak_factory_.GetWeakPtr()));
|
| + } else {
|
| + manager()->GetMediaResourceGetter()->ExtractMediaMetadata(
|
| + url, cookies_, user_agent_,
|
| + base::Bind(&MediaPlayerBridge::OnMediaMetadataExtracted,
|
| + weak_factory_.GetWeakPtr()));
|
| + }
|
| }
|
|
|
| void MediaPlayerBridge::OnMediaMetadataExtracted(
|
|
|