Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(415)

Side by Side Diff: content/renderer/media/android/webmediaplayer_android.cc

Issue 136523002: WebMediaPlayerAndroid - handling unseekable durations (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: Created 6 years, 11 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
« no previous file with comments | « no previous file | no next file » | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
1 // Copyright 2013 The Chromium Authors. All rights reserved. 1 // Copyright 2013 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 "content/renderer/media/android/webmediaplayer_android.h" 5 #include "content/renderer/media/android/webmediaplayer_android.h"
6 6
7 #include <limits> 7 #include <limits>
8 8
9 #include "base/bind.h" 9 #include "base/bind.h"
10 #include "base/command_line.h" 10 #include "base/command_line.h"
(...skipping 368 matching lines...) Expand 10 before | Expand all | Expand 10 after
379 pending_seek_ = true; 379 pending_seek_ = true;
380 pending_seek_time_ = new_seek_time; 380 pending_seek_time_ = new_seek_time;
381 381
382 if (media_source_delegate_) 382 if (media_source_delegate_)
383 media_source_delegate_->CancelPendingSeek(pending_seek_time_); 383 media_source_delegate_->CancelPendingSeek(pending_seek_time_);
384 384
385 // Later, OnSeekComplete will trigger the pending seek. 385 // Later, OnSeekComplete will trigger the pending seek.
386 return; 386 return;
387 } 387 }
388 388
389 if (new_seek_time >=
acolwell GONE FROM CHROMIUM 2014/01/13 16:32:07 This should not be needed if maxTimeSeekable() nev
amogh.bihani 2014/01/14 08:03:09 Done.
390 base::TimeDelta::FromMilliseconds(std::numeric_limits<int32>max())) {
391 return;
392 }
393
389 seeking_ = true; 394 seeking_ = true;
390 seek_time_ = new_seek_time; 395 seek_time_ = new_seek_time;
391 396
392 if (media_source_delegate_) 397 if (media_source_delegate_)
393 media_source_delegate_->StartWaitingForSeek(seek_time_); 398 media_source_delegate_->StartWaitingForSeek(seek_time_);
394 399
395 // Kick off the asynchronous seek! 400 // Kick off the asynchronous seek!
396 manager_->Seek(player_id_, seek_time_); 401 manager_->Seek(player_id_, seek_time_);
397 } 402 }
398 403
(...skipping 96 matching lines...) Expand 10 before | Expand all | Expand 10 after
495 return media_source_delegate_->Buffered(); 500 return media_source_delegate_->Buffered();
496 return buffered_; 501 return buffered_;
497 } 502 }
498 503
499 double WebMediaPlayerAndroid::maxTimeSeekable() const { 504 double WebMediaPlayerAndroid::maxTimeSeekable() const {
500 // If we haven't even gotten to ReadyStateHaveMetadata yet then just 505 // If we haven't even gotten to ReadyStateHaveMetadata yet then just
501 // return 0 so that the seekable range is empty. 506 // return 0 so that the seekable range is empty.
502 if (ready_state_ < WebMediaPlayer::ReadyStateHaveMetadata) 507 if (ready_state_ < WebMediaPlayer::ReadyStateHaveMetadata)
503 return 0.0; 508 return 0.0;
504 509
505 // TODO(hclam): If this stream is not seekable this should return 0.
amogh.bihani 2014/01/13 11:43:14 This is handled in this patch automatically
506 return duration(); 510 return duration();
acolwell GONE FROM CHROMIUM 2014/01/13 16:32:07 This does not see right to me. I believe this shou
amogh.bihani 2014/01/14 08:03:09 Done.
507 } 511 }
508 512
509 bool WebMediaPlayerAndroid::didLoadingProgress() const { 513 bool WebMediaPlayerAndroid::didLoadingProgress() const {
510 bool ret = did_loading_progress_; 514 bool ret = did_loading_progress_;
511 did_loading_progress_ = false; 515 did_loading_progress_ = false;
512 return ret; 516 return ret;
513 } 517 }
514 518
515 void WebMediaPlayerAndroid::paint(blink::WebCanvas* canvas, 519 void WebMediaPlayerAndroid::paint(blink::WebCanvas* canvas,
516 const blink::WebRect& rect, 520 const blink::WebRect& rect,
(...skipping 95 matching lines...) Expand 10 before | Expand all | Expand 10 after
612 616
613 void WebMediaPlayerAndroid::OnMediaMetadataChanged( 617 void WebMediaPlayerAndroid::OnMediaMetadataChanged(
614 const base::TimeDelta& duration, int width, int height, bool success) { 618 const base::TimeDelta& duration, int width, int height, bool success) {
615 bool need_to_signal_duration_changed = false; 619 bool need_to_signal_duration_changed = false;
616 620
617 if (url_.SchemeIs("file")) 621 if (url_.SchemeIs("file"))
618 UpdateNetworkState(WebMediaPlayer::NetworkStateLoaded); 622 UpdateNetworkState(WebMediaPlayer::NetworkStateLoaded);
619 623
620 // Update duration, if necessary, prior to ready state updates that may 624 // Update duration, if necessary, prior to ready state updates that may
621 // cause duration() query. 625 // cause duration() query.
622 // TODO(wolenetz): Correctly handle durations that MediaSourcePlayer 626
623 // considers unseekable, including kInfiniteDuration(). 627 // MediaSourcePlayer assumes duration more than 2^31 as unseekable
amogh.bihani 2014/01/13 11:43:14 kInfiniteDuration is 2^63, so this is automaticall
624 // See http://crbug.com/248396 628 // because java player uses 32-bit integer for time at millisecond resolution
629 if (duration >=
acolwell GONE FROM CHROMIUM 2014/01/13 16:32:07 This does not seem right. The clip duration and th
amogh.bihani 2014/01/14 08:03:09 Done.
630 base::TimeDelta::FromMilliseconds(std::numeric_limits<int32>max())) {
631 return;
632 }
633
625 if (!ignore_metadata_duration_change_ && duration_ != duration) { 634 if (!ignore_metadata_duration_change_ && duration_ != duration) {
626 duration_ = duration; 635 duration_ = duration;
627 636
628 // Client readyState transition from HAVE_NOTHING to HAVE_METADATA 637 // Client readyState transition from HAVE_NOTHING to HAVE_METADATA
629 // already triggers a durationchanged event. If this is a different 638 // already triggers a durationchanged event. If this is a different
630 // transition, remember to signal durationchanged. 639 // transition, remember to signal durationchanged.
631 // Do not ever signal durationchanged on metadata change in MSE case 640 // Do not ever signal durationchanged on metadata change in MSE case
632 // because OnDurationChanged() handles this. 641 // because OnDurationChanged() handles this.
633 if (ready_state_ > WebMediaPlayer::ReadyStateHaveNothing && 642 if (ready_state_ > WebMediaPlayer::ReadyStateHaveNothing &&
634 player_type_ != MEDIA_PLAYER_TYPE_MEDIA_SOURCE) { 643 player_type_ != MEDIA_PLAYER_TYPE_MEDIA_SOURCE) {
(...skipping 186 matching lines...) Expand 10 before | Expand all | Expand 10 after
821 830
822 void WebMediaPlayerAndroid::OnRequestFullscreen() { 831 void WebMediaPlayerAndroid::OnRequestFullscreen() {
823 client_->requestFullscreen(); 832 client_->requestFullscreen();
824 } 833 }
825 834
826 void WebMediaPlayerAndroid::OnDurationChanged(const base::TimeDelta& duration) { 835 void WebMediaPlayerAndroid::OnDurationChanged(const base::TimeDelta& duration) {
827 DCHECK(main_loop_->BelongsToCurrentThread()); 836 DCHECK(main_loop_->BelongsToCurrentThread());
828 // Only MSE |player_type_| registers this callback. 837 // Only MSE |player_type_| registers this callback.
829 DCHECK_EQ(player_type_, MEDIA_PLAYER_TYPE_MEDIA_SOURCE); 838 DCHECK_EQ(player_type_, MEDIA_PLAYER_TYPE_MEDIA_SOURCE);
830 839
840 // MediaSourcePlayer assumes duration more than 2^31 as unseekable
841 // because java player uses 32-bit integer for time at millisecond resolution
842 if (duration >=
843 base::TimeDelta::FromMilliseconds(std::numeric_limits<int32>max())) {
844 return;
845 }
846
831 // Cache the new duration value and trust it over any subsequent duration 847 // Cache the new duration value and trust it over any subsequent duration
832 // values received in OnMediaMetadataChanged(). 848 // values received in OnMediaMetadataChanged().
833 // TODO(wolenetz): Correctly handle durations that MediaSourcePlayer
834 // considers unseekable, including kInfiniteDuration().
835 // See http://crbug.com/248396
836 duration_ = duration; 849 duration_ = duration;
837 ignore_metadata_duration_change_ = true; 850 ignore_metadata_duration_change_ = true;
838 851
839 // Notify MediaPlayerClient that duration has changed, if > HAVE_NOTHING. 852 // Notify MediaPlayerClient that duration has changed, if > HAVE_NOTHING.
840 if (ready_state_ > WebMediaPlayer::ReadyStateHaveNothing) 853 if (ready_state_ > WebMediaPlayer::ReadyStateHaveNothing)
841 client_->durationChanged(); 854 client_->durationChanged();
842 } 855 }
843 856
844 void WebMediaPlayerAndroid::UpdateNetworkState( 857 void WebMediaPlayerAndroid::UpdateNetworkState(
845 WebMediaPlayer::NetworkState state) { 858 WebMediaPlayer::NetworkState state) {
(...skipping 616 matching lines...) Expand 10 before | Expand all | Expand 10 after
1462 1475
1463 void WebMediaPlayerAndroid::exitFullscreen() { 1476 void WebMediaPlayerAndroid::exitFullscreen() {
1464 manager_->ExitFullscreen(player_id_); 1477 manager_->ExitFullscreen(player_id_);
1465 } 1478 }
1466 1479
1467 bool WebMediaPlayerAndroid::canEnterFullscreen() const { 1480 bool WebMediaPlayerAndroid::canEnterFullscreen() const {
1468 return manager_->CanEnterFullscreen(frame_); 1481 return manager_->CanEnterFullscreen(frame_);
1469 } 1482 }
1470 1483
1471 } // namespace content 1484 } // namespace content
OLDNEW
« no previous file with comments | « no previous file | no next file » | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698