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