| 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(const 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 |