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 <utility> | 7 #include <utility> |
8 | 8 |
9 #include "base/android/context_utils.h" | 9 #include "base/android/context_utils.h" |
10 #include "base/android/jni_android.h" | 10 #include "base/android/jni_android.h" |
(...skipping 57 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
68 allow_credentials_(allow_credentials), | 68 allow_credentials_(allow_credentials), |
69 is_active_(false), | 69 is_active_(false), |
70 has_error_(false), | 70 has_error_(false), |
71 has_ever_started_(false), | 71 has_ever_started_(false), |
72 weak_factory_(this) {} | 72 weak_factory_(this) {} |
73 | 73 |
74 MediaPlayerBridge::~MediaPlayerBridge() { | 74 MediaPlayerBridge::~MediaPlayerBridge() { |
75 if (!j_media_player_bridge_.is_null()) { | 75 if (!j_media_player_bridge_.is_null()) { |
76 JNIEnv* env = base::android::AttachCurrentThread(); | 76 JNIEnv* env = base::android::AttachCurrentThread(); |
77 CHECK(env); | 77 CHECK(env); |
78 Java_MediaPlayerBridge_destroy(env, j_media_player_bridge_.obj()); | 78 Java_MediaPlayerBridge_destroy(env, j_media_player_bridge_); |
79 } | 79 } |
80 Release(); | 80 Release(); |
81 | 81 |
82 if (has_ever_started_) { | 82 if (has_ever_started_) { |
83 UMA_HISTOGRAM_ENUMERATION("Media.Android.MediaPlayerSuccess", | 83 UMA_HISTOGRAM_ENUMERATION("Media.Android.MediaPlayerSuccess", |
84 has_error_ ? UMA_EXIT_ERROR : UMA_EXIT_SUCCESS, | 84 has_error_ ? UMA_EXIT_ERROR : UMA_EXIT_SUCCESS, |
85 UMA_EXIT_STATUS_MAX + 1); | 85 UMA_EXIT_STATUS_MAX + 1); |
86 } | 86 } |
87 } | 87 } |
88 | 88 |
(...skipping 45 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
134 | 134 |
135 void MediaPlayerBridge::SetVideoSurface(gl::ScopedJavaSurface surface) { | 135 void MediaPlayerBridge::SetVideoSurface(gl::ScopedJavaSurface surface) { |
136 surface_ = std::move(surface); | 136 surface_ = std::move(surface); |
137 | 137 |
138 if (j_media_player_bridge_.is_null()) | 138 if (j_media_player_bridge_.is_null()) |
139 return; | 139 return; |
140 | 140 |
141 JNIEnv* env = base::android::AttachCurrentThread(); | 141 JNIEnv* env = base::android::AttachCurrentThread(); |
142 CHECK(env); | 142 CHECK(env); |
143 | 143 |
144 Java_MediaPlayerBridge_setSurface( | 144 Java_MediaPlayerBridge_setSurface(env, j_media_player_bridge_, |
145 env, j_media_player_bridge_.obj(), surface_.j_surface().obj()); | 145 surface_.j_surface()); |
146 } | 146 } |
147 | 147 |
148 void MediaPlayerBridge::Prepare() { | 148 void MediaPlayerBridge::Prepare() { |
149 DCHECK(j_media_player_bridge_.is_null()); | 149 DCHECK(j_media_player_bridge_.is_null()); |
150 CreateJavaMediaPlayerBridge(); | 150 CreateJavaMediaPlayerBridge(); |
151 if (url_.SchemeIsFileSystem() || url_.SchemeIsBlob()) { | 151 if (url_.SchemeIsFileSystem() || url_.SchemeIsBlob()) { |
152 manager()->GetMediaResourceGetter()->GetPlatformPathFromURL( | 152 manager()->GetMediaResourceGetter()->GetPlatformPathFromURL( |
153 url_, | 153 url_, |
154 base::Bind(&MediaPlayerBridge::SetDataSource, | 154 base::Bind(&MediaPlayerBridge::SetDataSource, |
155 weak_factory_.GetWeakPtr())); | 155 weak_factory_.GetWeakPtr())); |
156 return; | 156 return; |
157 } | 157 } |
158 | 158 |
159 SetDataSource(url_.spec()); | 159 SetDataSource(url_.spec()); |
160 } | 160 } |
161 | 161 |
162 void MediaPlayerBridge::SetDataSource(const std::string& url) { | 162 void MediaPlayerBridge::SetDataSource(const std::string& url) { |
163 if (j_media_player_bridge_.is_null()) | 163 if (j_media_player_bridge_.is_null()) |
164 return; | 164 return; |
165 | 165 |
166 JNIEnv* env = base::android::AttachCurrentThread(); | 166 JNIEnv* env = base::android::AttachCurrentThread(); |
167 CHECK(env); | 167 CHECK(env); |
168 | 168 |
169 int fd; | 169 int fd; |
170 int64_t offset; | 170 int64_t offset; |
171 int64_t size; | 171 int64_t size; |
172 if (InterceptMediaUrl(url, &fd, &offset, &size)) { | 172 if (InterceptMediaUrl(url, &fd, &offset, &size)) { |
173 if (!Java_MediaPlayerBridge_setDataSourceFromFd( | 173 if (!Java_MediaPlayerBridge_setDataSourceFromFd(env, j_media_player_bridge_, |
174 env, j_media_player_bridge_.obj(), fd, offset, size)) { | 174 fd, offset, size)) { |
175 OnMediaError(MEDIA_ERROR_FORMAT); | 175 OnMediaError(MEDIA_ERROR_FORMAT); |
176 return; | 176 return; |
177 } | 177 } |
178 } else { | 178 } else { |
179 // Create a Java String for the URL. | 179 // Create a Java String for the URL. |
180 ScopedJavaLocalRef<jstring> j_url_string = | 180 ScopedJavaLocalRef<jstring> j_url_string = |
181 ConvertUTF8ToJavaString(env, url); | 181 ConvertUTF8ToJavaString(env, url); |
182 | 182 |
183 const JavaRef<jobject>& j_context = base::android::GetApplicationContext(); | 183 const JavaRef<jobject>& j_context = base::android::GetApplicationContext(); |
184 | 184 |
185 const std::string data_uri_prefix("data:"); | 185 const std::string data_uri_prefix("data:"); |
186 if (base::StartsWith(url, data_uri_prefix, base::CompareCase::SENSITIVE)) { | 186 if (base::StartsWith(url, data_uri_prefix, base::CompareCase::SENSITIVE)) { |
187 if (!Java_MediaPlayerBridge_setDataUriDataSource( | 187 if (!Java_MediaPlayerBridge_setDataUriDataSource( |
188 env, j_media_player_bridge_.obj(), j_context, j_url_string.obj())) { | 188 env, j_media_player_bridge_, j_context, j_url_string)) { |
189 OnMediaError(MEDIA_ERROR_FORMAT); | 189 OnMediaError(MEDIA_ERROR_FORMAT); |
190 } | 190 } |
191 return; | 191 return; |
192 } | 192 } |
193 | 193 |
194 ScopedJavaLocalRef<jstring> j_cookies = ConvertUTF8ToJavaString( | 194 ScopedJavaLocalRef<jstring> j_cookies = ConvertUTF8ToJavaString( |
195 env, cookies_); | 195 env, cookies_); |
196 ScopedJavaLocalRef<jstring> j_user_agent = ConvertUTF8ToJavaString( | 196 ScopedJavaLocalRef<jstring> j_user_agent = ConvertUTF8ToJavaString( |
197 env, user_agent_); | 197 env, user_agent_); |
198 | 198 |
199 if (!Java_MediaPlayerBridge_setDataSource( | 199 if (!Java_MediaPlayerBridge_setDataSource( |
200 env, j_media_player_bridge_.obj(), j_context, j_url_string.obj(), | 200 env, j_media_player_bridge_, j_context, j_url_string, j_cookies, |
201 j_cookies.obj(), j_user_agent.obj(), hide_url_log_)) { | 201 j_user_agent, hide_url_log_)) { |
202 OnMediaError(MEDIA_ERROR_FORMAT); | 202 OnMediaError(MEDIA_ERROR_FORMAT); |
203 return; | 203 return; |
204 } | 204 } |
205 } | 205 } |
206 | 206 |
207 if (!Java_MediaPlayerBridge_prepareAsync(env, j_media_player_bridge_.obj())) | 207 if (!Java_MediaPlayerBridge_prepareAsync(env, j_media_player_bridge_)) |
208 OnMediaError(MEDIA_ERROR_FORMAT); | 208 OnMediaError(MEDIA_ERROR_FORMAT); |
209 } | 209 } |
210 | 210 |
211 bool MediaPlayerBridge::InterceptMediaUrl(const std::string& url, | 211 bool MediaPlayerBridge::InterceptMediaUrl(const std::string& url, |
212 int* fd, | 212 int* fd, |
213 int64_t* offset, | 213 int64_t* offset, |
214 int64_t* size) { | 214 int64_t* size) { |
215 // Sentinel value to check whether the output arguments have been set. | 215 // Sentinel value to check whether the output arguments have been set. |
216 const int kUnsetValue = -1; | 216 const int kUnsetValue = -1; |
217 | 217 |
(...skipping 13 matching lines...) Expand all Loading... |
231 | 231 |
232 void MediaPlayerBridge::OnDidSetDataUriDataSource( | 232 void MediaPlayerBridge::OnDidSetDataUriDataSource( |
233 JNIEnv* env, | 233 JNIEnv* env, |
234 const JavaParamRef<jobject>& obj, | 234 const JavaParamRef<jobject>& obj, |
235 jboolean success) { | 235 jboolean success) { |
236 if (!success) { | 236 if (!success) { |
237 OnMediaError(MEDIA_ERROR_FORMAT); | 237 OnMediaError(MEDIA_ERROR_FORMAT); |
238 return; | 238 return; |
239 } | 239 } |
240 | 240 |
241 if (!Java_MediaPlayerBridge_prepareAsync(env, j_media_player_bridge_.obj())) | 241 if (!Java_MediaPlayerBridge_prepareAsync(env, j_media_player_bridge_)) |
242 OnMediaError(MEDIA_ERROR_FORMAT); | 242 OnMediaError(MEDIA_ERROR_FORMAT); |
243 } | 243 } |
244 | 244 |
245 void MediaPlayerBridge::OnCookiesRetrieved(const std::string& cookies) { | 245 void MediaPlayerBridge::OnCookiesRetrieved(const std::string& cookies) { |
246 cookies_ = cookies; | 246 cookies_ = cookies; |
247 manager()->GetMediaResourceGetter()->GetAuthCredentials( | 247 manager()->GetMediaResourceGetter()->GetAuthCredentials( |
248 url_, | 248 url_, |
249 base::Bind(&MediaPlayerBridge::OnAuthCredentialsRetrieved, | 249 base::Bind(&MediaPlayerBridge::OnAuthCredentialsRetrieved, |
250 weak_factory_.GetWeakPtr())); | 250 weak_factory_.GetWeakPtr())); |
251 } | 251 } |
(...skipping 80 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
332 | 332 |
333 is_active_ = false; | 333 is_active_ = false; |
334 } | 334 } |
335 | 335 |
336 bool MediaPlayerBridge::IsPlaying() { | 336 bool MediaPlayerBridge::IsPlaying() { |
337 if (!prepared_) | 337 if (!prepared_) |
338 return pending_play_; | 338 return pending_play_; |
339 | 339 |
340 JNIEnv* env = base::android::AttachCurrentThread(); | 340 JNIEnv* env = base::android::AttachCurrentThread(); |
341 CHECK(env); | 341 CHECK(env); |
342 jboolean result = Java_MediaPlayerBridge_isPlaying( | 342 jboolean result = |
343 env, j_media_player_bridge_.obj()); | 343 Java_MediaPlayerBridge_isPlaying(env, j_media_player_bridge_); |
344 return result; | 344 return result; |
345 } | 345 } |
346 | 346 |
347 bool MediaPlayerBridge::HasVideo() const { | 347 bool MediaPlayerBridge::HasVideo() const { |
348 DCHECK(prepared_); | 348 DCHECK(prepared_); |
349 JNIEnv* env = base::android::AttachCurrentThread(); | 349 JNIEnv* env = base::android::AttachCurrentThread(); |
350 return Java_MediaPlayerBridge_hasVideo(env, j_media_player_bridge_.obj()); | 350 return Java_MediaPlayerBridge_hasVideo(env, j_media_player_bridge_); |
351 } | 351 } |
352 | 352 |
353 bool MediaPlayerBridge::HasAudio() const { | 353 bool MediaPlayerBridge::HasAudio() const { |
354 DCHECK(prepared_); | 354 DCHECK(prepared_); |
355 JNIEnv* env = base::android::AttachCurrentThread(); | 355 JNIEnv* env = base::android::AttachCurrentThread(); |
356 return Java_MediaPlayerBridge_hasAudio(env, j_media_player_bridge_.obj()); | 356 return Java_MediaPlayerBridge_hasAudio(env, j_media_player_bridge_); |
357 } | 357 } |
358 | 358 |
359 int MediaPlayerBridge::GetVideoWidth() { | 359 int MediaPlayerBridge::GetVideoWidth() { |
360 if (!prepared_) | 360 if (!prepared_) |
361 return width_; | 361 return width_; |
362 JNIEnv* env = base::android::AttachCurrentThread(); | 362 JNIEnv* env = base::android::AttachCurrentThread(); |
363 return Java_MediaPlayerBridge_getVideoWidth( | 363 return Java_MediaPlayerBridge_getVideoWidth(env, j_media_player_bridge_); |
364 env, j_media_player_bridge_.obj()); | |
365 } | 364 } |
366 | 365 |
367 int MediaPlayerBridge::GetVideoHeight() { | 366 int MediaPlayerBridge::GetVideoHeight() { |
368 if (!prepared_) | 367 if (!prepared_) |
369 return height_; | 368 return height_; |
370 JNIEnv* env = base::android::AttachCurrentThread(); | 369 JNIEnv* env = base::android::AttachCurrentThread(); |
371 return Java_MediaPlayerBridge_getVideoHeight( | 370 return Java_MediaPlayerBridge_getVideoHeight(env, j_media_player_bridge_); |
372 env, j_media_player_bridge_.obj()); | |
373 } | 371 } |
374 | 372 |
375 void MediaPlayerBridge::SeekTo(base::TimeDelta timestamp) { | 373 void MediaPlayerBridge::SeekTo(base::TimeDelta timestamp) { |
376 // Record the time to seek when OnMediaPrepared() is called. | 374 // Record the time to seek when OnMediaPrepared() is called. |
377 pending_seek_ = timestamp; | 375 pending_seek_ = timestamp; |
378 should_seek_on_prepare_ = true; | 376 should_seek_on_prepare_ = true; |
379 | 377 |
380 if (prepared_) | 378 if (prepared_) |
381 SeekInternal(GetCurrentTime(), timestamp); | 379 SeekInternal(GetCurrentTime(), timestamp); |
382 } | 380 } |
383 | 381 |
384 base::TimeDelta MediaPlayerBridge::GetCurrentTime() { | 382 base::TimeDelta MediaPlayerBridge::GetCurrentTime() { |
385 if (!prepared_) | 383 if (!prepared_) |
386 return pending_seek_; | 384 return pending_seek_; |
387 JNIEnv* env = base::android::AttachCurrentThread(); | 385 JNIEnv* env = base::android::AttachCurrentThread(); |
388 return base::TimeDelta::FromMilliseconds( | 386 return base::TimeDelta::FromMilliseconds( |
389 Java_MediaPlayerBridge_getCurrentPosition( | 387 Java_MediaPlayerBridge_getCurrentPosition(env, j_media_player_bridge_)); |
390 env, j_media_player_bridge_.obj())); | |
391 } | 388 } |
392 | 389 |
393 base::TimeDelta MediaPlayerBridge::GetDuration() { | 390 base::TimeDelta MediaPlayerBridge::GetDuration() { |
394 if (!prepared_) | 391 if (!prepared_) |
395 return duration_; | 392 return duration_; |
396 JNIEnv* env = base::android::AttachCurrentThread(); | 393 JNIEnv* env = base::android::AttachCurrentThread(); |
397 const int duration_ms = | 394 const int duration_ms = |
398 Java_MediaPlayerBridge_getDuration(env, j_media_player_bridge_.obj()); | 395 Java_MediaPlayerBridge_getDuration(env, j_media_player_bridge_); |
399 return duration_ms < 0 ? media::kInfiniteDuration | 396 return duration_ms < 0 ? media::kInfiniteDuration |
400 : base::TimeDelta::FromMilliseconds(duration_ms); | 397 : base::TimeDelta::FromMilliseconds(duration_ms); |
401 } | 398 } |
402 | 399 |
403 void MediaPlayerBridge::Release() { | 400 void MediaPlayerBridge::Release() { |
404 is_active_ = false; | 401 is_active_ = false; |
405 | 402 |
406 on_decoder_resources_released_cb_.Run(player_id()); | 403 on_decoder_resources_released_cb_.Run(player_id()); |
407 if (j_media_player_bridge_.is_null()) | 404 if (j_media_player_bridge_.is_null()) |
408 return; | 405 return; |
409 | 406 |
410 time_update_timer_.Stop(); | 407 time_update_timer_.Stop(); |
411 if (prepared_) { | 408 if (prepared_) { |
412 pending_seek_ = GetCurrentTime(); | 409 pending_seek_ = GetCurrentTime(); |
413 should_seek_on_prepare_ = true; | 410 should_seek_on_prepare_ = true; |
414 } | 411 } |
415 | 412 |
416 prepared_ = false; | 413 prepared_ = false; |
417 pending_play_ = false; | 414 pending_play_ = false; |
418 SetVideoSurface(gl::ScopedJavaSurface()); | 415 SetVideoSurface(gl::ScopedJavaSurface()); |
419 JNIEnv* env = base::android::AttachCurrentThread(); | 416 JNIEnv* env = base::android::AttachCurrentThread(); |
420 Java_MediaPlayerBridge_release(env, j_media_player_bridge_.obj()); | 417 Java_MediaPlayerBridge_release(env, j_media_player_bridge_); |
421 j_media_player_bridge_.Reset(); | 418 j_media_player_bridge_.Reset(); |
422 DetachListener(); | 419 DetachListener(); |
423 } | 420 } |
424 | 421 |
425 void MediaPlayerBridge::UpdateEffectiveVolumeInternal(double effective_volume) { | 422 void MediaPlayerBridge::UpdateEffectiveVolumeInternal(double effective_volume) { |
426 if (j_media_player_bridge_.is_null()) { | 423 if (j_media_player_bridge_.is_null()) { |
427 return; | 424 return; |
428 } | 425 } |
429 | 426 |
430 JNIEnv* env = base::android::AttachCurrentThread(); | 427 JNIEnv* env = base::android::AttachCurrentThread(); |
431 CHECK(env); | 428 CHECK(env); |
432 | 429 |
433 Java_MediaPlayerBridge_setVolume(env, j_media_player_bridge_.obj(), | 430 Java_MediaPlayerBridge_setVolume(env, j_media_player_bridge_, |
434 effective_volume); | 431 effective_volume); |
435 } | 432 } |
436 | 433 |
437 void MediaPlayerBridge::OnVideoSizeChanged(int width, int height) { | 434 void MediaPlayerBridge::OnVideoSizeChanged(int width, int height) { |
438 width_ = width; | 435 width_ = width; |
439 height_ = height; | 436 height_ = height; |
440 MediaPlayerAndroid::OnVideoSizeChanged(width, height); | 437 MediaPlayerAndroid::OnVideoSizeChanged(width, height); |
441 } | 438 } |
442 | 439 |
443 void MediaPlayerBridge::OnMediaError(int error_type) { | 440 void MediaPlayerBridge::OnMediaError(int error_type) { |
(...skipping 47 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
491 | 488 |
492 UpdateAllowedOperations(); | 489 UpdateAllowedOperations(); |
493 manager()->OnMediaMetadataChanged( | 490 manager()->OnMediaMetadataChanged( |
494 player_id(), duration_, width_, height_, true); | 491 player_id(), duration_, width_, height_, true); |
495 } | 492 } |
496 | 493 |
497 ScopedJavaLocalRef<jobject> MediaPlayerBridge::GetAllowedOperations() { | 494 ScopedJavaLocalRef<jobject> MediaPlayerBridge::GetAllowedOperations() { |
498 JNIEnv* env = base::android::AttachCurrentThread(); | 495 JNIEnv* env = base::android::AttachCurrentThread(); |
499 CHECK(env); | 496 CHECK(env); |
500 | 497 |
501 return Java_MediaPlayerBridge_getAllowedOperations( | 498 return Java_MediaPlayerBridge_getAllowedOperations(env, |
502 env, j_media_player_bridge_.obj()); | 499 j_media_player_bridge_); |
503 } | 500 } |
504 | 501 |
505 void MediaPlayerBridge::UpdateAllowedOperations() { | 502 void MediaPlayerBridge::UpdateAllowedOperations() { |
506 JNIEnv* env = base::android::AttachCurrentThread(); | 503 JNIEnv* env = base::android::AttachCurrentThread(); |
507 CHECK(env); | 504 CHECK(env); |
508 | 505 |
509 ScopedJavaLocalRef<jobject> allowedOperations = GetAllowedOperations(); | 506 ScopedJavaLocalRef<jobject> allowedOperations = GetAllowedOperations(); |
510 | 507 |
511 can_pause_ = Java_AllowedOperations_canPause(env, allowedOperations.obj()); | 508 can_pause_ = Java_AllowedOperations_canPause(env, allowedOperations); |
512 can_seek_forward_ = Java_AllowedOperations_canSeekForward( | 509 can_seek_forward_ = |
513 env, allowedOperations.obj()); | 510 Java_AllowedOperations_canSeekForward(env, allowedOperations); |
514 can_seek_backward_ = Java_AllowedOperations_canSeekBackward( | 511 can_seek_backward_ = |
515 env, allowedOperations.obj()); | 512 Java_AllowedOperations_canSeekBackward(env, allowedOperations); |
516 } | 513 } |
517 | 514 |
518 void MediaPlayerBridge::StartInternal() { | 515 void MediaPlayerBridge::StartInternal() { |
519 if (!manager()->RequestPlay(player_id(), duration_, HasAudio())) { | 516 if (!manager()->RequestPlay(player_id(), duration_, HasAudio())) { |
520 Pause(true); | 517 Pause(true); |
521 return; | 518 return; |
522 } | 519 } |
523 | 520 |
524 JNIEnv* env = base::android::AttachCurrentThread(); | 521 JNIEnv* env = base::android::AttachCurrentThread(); |
525 Java_MediaPlayerBridge_start(env, j_media_player_bridge_.obj()); | 522 Java_MediaPlayerBridge_start(env, j_media_player_bridge_); |
526 if (!time_update_timer_.IsRunning()) { | 523 if (!time_update_timer_.IsRunning()) { |
527 time_update_timer_.Start( | 524 time_update_timer_.Start( |
528 FROM_HERE, | 525 FROM_HERE, |
529 base::TimeDelta::FromMilliseconds(kTimeUpdateInterval), | 526 base::TimeDelta::FromMilliseconds(kTimeUpdateInterval), |
530 this, &MediaPlayerBridge::OnTimeUpdateTimerFired); | 527 this, &MediaPlayerBridge::OnTimeUpdateTimerFired); |
531 } | 528 } |
532 } | 529 } |
533 | 530 |
534 void MediaPlayerBridge::PauseInternal() { | 531 void MediaPlayerBridge::PauseInternal() { |
535 JNIEnv* env = base::android::AttachCurrentThread(); | 532 JNIEnv* env = base::android::AttachCurrentThread(); |
536 Java_MediaPlayerBridge_pause(env, j_media_player_bridge_.obj()); | 533 Java_MediaPlayerBridge_pause(env, j_media_player_bridge_); |
537 time_update_timer_.Stop(); | 534 time_update_timer_.Stop(); |
538 } | 535 } |
539 | 536 |
540 void MediaPlayerBridge::PendingSeekInternal(const base::TimeDelta& time) { | 537 void MediaPlayerBridge::PendingSeekInternal(const base::TimeDelta& time) { |
541 SeekInternal(GetCurrentTime(), time); | 538 SeekInternal(GetCurrentTime(), time); |
542 } | 539 } |
543 | 540 |
544 bool MediaPlayerBridge::SeekInternal(base::TimeDelta current_time, | 541 bool MediaPlayerBridge::SeekInternal(base::TimeDelta current_time, |
545 base::TimeDelta time) { | 542 base::TimeDelta time) { |
546 // Seeking on content like live streams may cause the media player to | 543 // Seeking on content like live streams may cause the media player to |
(...skipping 10 matching lines...) Expand all Loading... |
557 // Seeking to an invalid position may cause media player to stuck in an | 554 // Seeking to an invalid position may cause media player to stuck in an |
558 // error state. | 555 // error state. |
559 if (time < base::TimeDelta()) { | 556 if (time < base::TimeDelta()) { |
560 DCHECK_EQ(-1.0, time.InMillisecondsF()); | 557 DCHECK_EQ(-1.0, time.InMillisecondsF()); |
561 return false; | 558 return false; |
562 } | 559 } |
563 | 560 |
564 JNIEnv* env = base::android::AttachCurrentThread(); | 561 JNIEnv* env = base::android::AttachCurrentThread(); |
565 CHECK(env); | 562 CHECK(env); |
566 int time_msec = static_cast<int>(time.InMilliseconds()); | 563 int time_msec = static_cast<int>(time.InMilliseconds()); |
567 Java_MediaPlayerBridge_seekTo( | 564 Java_MediaPlayerBridge_seekTo(env, j_media_player_bridge_, time_msec); |
568 env, j_media_player_bridge_.obj(), time_msec); | |
569 return true; | 565 return true; |
570 } | 566 } |
571 | 567 |
572 void MediaPlayerBridge::OnTimeUpdateTimerFired() { | 568 void MediaPlayerBridge::OnTimeUpdateTimerFired() { |
573 base::TimeDelta current_timestamp = GetCurrentTime(); | 569 base::TimeDelta current_timestamp = GetCurrentTime(); |
574 if (last_time_update_timestamp_ == current_timestamp) | 570 if (last_time_update_timestamp_ == current_timestamp) |
575 return; | 571 return; |
576 manager()->OnTimeUpdate(player_id(), current_timestamp, | 572 manager()->OnTimeUpdate(player_id(), current_timestamp, |
577 base::TimeTicks::Now()); | 573 base::TimeTicks::Now()); |
578 last_time_update_timestamp_ = current_timestamp; | 574 last_time_update_timestamp_ = current_timestamp; |
(...skipping 21 matching lines...) Expand all Loading... |
600 | 596 |
601 GURL MediaPlayerBridge::GetUrl() { | 597 GURL MediaPlayerBridge::GetUrl() { |
602 return url_; | 598 return url_; |
603 } | 599 } |
604 | 600 |
605 GURL MediaPlayerBridge::GetFirstPartyForCookies() { | 601 GURL MediaPlayerBridge::GetFirstPartyForCookies() { |
606 return first_party_for_cookies_; | 602 return first_party_for_cookies_; |
607 } | 603 } |
608 | 604 |
609 } // namespace media | 605 } // namespace media |
OLD | NEW |