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 unset_value = -1; | |
mnaganov (inactive)
2014/07/29 08:40:49
kUnsetValue
Ignacio Solla
2014/07/29 09:03:52
Done.
| |
216 | |
217 *fd = unset_value; | |
218 *offset = unset_value; | |
219 *size = unset_value; | |
220 media::MediaUrlInterceptor* url_interceptor = | |
221 manager()->GetMediaUrlInterceptor(); | |
qinmin
2014/07/28 21:16:01
-2 indent
Ignacio Solla
2014/07/29 09:03:52
Done.
| |
222 if (url_interceptor && url_interceptor->Intercept(url, fd, offset, size)) { | |
223 DCHECK_NE(unset_value, *fd); | |
224 DCHECK_NE(unset_value, *offset); | |
225 DCHECK_NE(unset_value, *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 |