| OLD | NEW |
| 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 Loading... |
| 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 Loading... |
| 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 Loading... |
| 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 |
| OLD | NEW |