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" |
(...skipping 310 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
321 } | 321 } |
322 | 322 |
323 void MediaPlayerBridge::SeekTo(base::TimeDelta timestamp) { | 323 void MediaPlayerBridge::SeekTo(base::TimeDelta timestamp) { |
324 // Record the time to seek when OnMediaPrepared() is called. | 324 // Record the time to seek when OnMediaPrepared() is called. |
325 pending_seek_ = timestamp; | 325 pending_seek_ = timestamp; |
326 should_seek_on_prepare_ = true; | 326 should_seek_on_prepare_ = true; |
327 | 327 |
328 if (j_media_player_bridge_.is_null()) | 328 if (j_media_player_bridge_.is_null()) |
329 Prepare(); | 329 Prepare(); |
330 else if (prepared_) | 330 else if (prepared_) |
331 SeekInternal(timestamp); | 331 SeekInternal(GetCurrentTime(), timestamp); |
332 } | 332 } |
333 | 333 |
334 base::TimeDelta MediaPlayerBridge::GetCurrentTime() { | 334 base::TimeDelta MediaPlayerBridge::GetCurrentTime() { |
335 if (!prepared_) | 335 if (!prepared_) |
336 return pending_seek_; | 336 return pending_seek_; |
337 JNIEnv* env = base::android::AttachCurrentThread(); | 337 JNIEnv* env = base::android::AttachCurrentThread(); |
338 return base::TimeDelta::FromMilliseconds( | 338 return base::TimeDelta::FromMilliseconds( |
339 Java_MediaPlayerBridge_getCurrentPosition( | 339 Java_MediaPlayerBridge_getCurrentPosition( |
340 env, j_media_player_bridge_.obj())); | 340 env, j_media_player_bridge_.obj())); |
341 } | 341 } |
(...skipping 132 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
474 | 474 |
475 void MediaPlayerBridge::PauseInternal() { | 475 void MediaPlayerBridge::PauseInternal() { |
476 SetAudible(false); | 476 SetAudible(false); |
477 | 477 |
478 JNIEnv* env = base::android::AttachCurrentThread(); | 478 JNIEnv* env = base::android::AttachCurrentThread(); |
479 Java_MediaPlayerBridge_pause(env, j_media_player_bridge_.obj()); | 479 Java_MediaPlayerBridge_pause(env, j_media_player_bridge_.obj()); |
480 time_update_timer_.Stop(); | 480 time_update_timer_.Stop(); |
481 } | 481 } |
482 | 482 |
483 void MediaPlayerBridge::PendingSeekInternal(const base::TimeDelta& time) { | 483 void MediaPlayerBridge::PendingSeekInternal(const base::TimeDelta& time) { |
484 SeekInternal(time); | 484 SeekInternal(GetCurrentTime(), time); |
485 } | 485 } |
486 | 486 |
487 void MediaPlayerBridge::SeekInternal(base::TimeDelta time) { | 487 bool MediaPlayerBridge::SeekInternal(base::TimeDelta current_time, |
| 488 base::TimeDelta time) { |
| 489 // Seeking on content like live streams may cause the media player to |
| 490 // get stuck in an error state. |
| 491 if (time < current_time && !CanSeekBackward()) |
| 492 return false; |
| 493 |
| 494 if (time >= current_time && !CanSeekForward()) |
| 495 return false; |
| 496 |
488 if (time > duration_) | 497 if (time > duration_) |
489 time = duration_; | 498 time = duration_; |
490 | 499 |
491 // Seeking to an invalid position may cause media player to stuck in an | 500 // Seeking to an invalid position may cause media player to stuck in an |
492 // error state. | 501 // error state. |
493 if (time < base::TimeDelta()) { | 502 if (time < base::TimeDelta()) { |
494 DCHECK_EQ(-1.0, time.InMillisecondsF()); | 503 DCHECK_EQ(-1.0, time.InMillisecondsF()); |
495 return; | 504 return false; |
496 } | 505 } |
497 | 506 |
498 JNIEnv* env = base::android::AttachCurrentThread(); | 507 JNIEnv* env = base::android::AttachCurrentThread(); |
499 CHECK(env); | 508 CHECK(env); |
500 int time_msec = static_cast<int>(time.InMilliseconds()); | 509 int time_msec = static_cast<int>(time.InMilliseconds()); |
501 Java_MediaPlayerBridge_seekTo( | 510 Java_MediaPlayerBridge_seekTo( |
502 env, j_media_player_bridge_.obj(), time_msec); | 511 env, j_media_player_bridge_.obj(), time_msec); |
| 512 return true; |
503 } | 513 } |
504 | 514 |
505 void MediaPlayerBridge::OnTimeUpdateTimerFired() { | 515 void MediaPlayerBridge::OnTimeUpdateTimerFired() { |
506 manager()->OnTimeUpdate( | 516 manager()->OnTimeUpdate( |
507 player_id(), GetCurrentTime(), base::TimeTicks::Now()); | 517 player_id(), GetCurrentTime(), base::TimeTicks::Now()); |
508 } | 518 } |
509 | 519 |
510 bool MediaPlayerBridge::RegisterMediaPlayerBridge(JNIEnv* env) { | 520 bool MediaPlayerBridge::RegisterMediaPlayerBridge(JNIEnv* env) { |
511 return RegisterNativesImpl(env); | 521 return RegisterNativesImpl(env); |
512 } | 522 } |
(...skipping 16 matching lines...) Expand all Loading... |
529 | 539 |
530 GURL MediaPlayerBridge::GetUrl() { | 540 GURL MediaPlayerBridge::GetUrl() { |
531 return url_; | 541 return url_; |
532 } | 542 } |
533 | 543 |
534 GURL MediaPlayerBridge::GetFirstPartyForCookies() { | 544 GURL MediaPlayerBridge::GetFirstPartyForCookies() { |
535 return first_party_for_cookies_; | 545 return first_party_for_cookies_; |
536 } | 546 } |
537 | 547 |
538 } // namespace media | 548 } // namespace media |
OLD | NEW |