OLD | NEW |
1 // Copyright 2015 The Chromium Authors. All rights reserved. | 1 // Copyright 2015 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_codec_player.h" | 5 #include "media/base/android/media_codec_player.h" |
6 | 6 |
7 #include "base/barrier_closure.h" | 7 #include "base/barrier_closure.h" |
8 #include "base/bind.h" | 8 #include "base/bind.h" |
9 #include "base/lazy_instance.h" | 9 #include "base/lazy_instance.h" |
10 #include "base/logging.h" | 10 #include "base/logging.h" |
(...skipping 403 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
414 | 414 |
415 // Restrict the current time to be equal to seek_time | 415 // Restrict the current time to be equal to seek_time |
416 // for the next StartPlaybackDecoders() call. | 416 // for the next StartPlaybackDecoders() call. |
417 | 417 |
418 base::TimeDelta seek_time = seek_info_->is_browser_seek | 418 base::TimeDelta seek_time = seek_info_->is_browser_seek |
419 ? actual_browser_seek_time | 419 ? actual_browser_seek_time |
420 : seek_info_->seek_time; | 420 : seek_info_->seek_time; |
421 | 421 |
422 interpolator_.SetBounds(seek_time, seek_time); | 422 interpolator_.SetBounds(seek_time, seek_time); |
423 audio_decoder_->SetBaseTimestamp(seek_time); | 423 audio_decoder_->SetBaseTimestamp(seek_time); |
| 424 audio_decoder_->SetPrerollTimestamp(seek_time); |
| 425 video_decoder_->SetPrerollTimestamp(seek_time); |
424 | 426 |
425 base::TimeDelta pending_seek_time = GetPendingSeek(); | 427 base::TimeDelta pending_seek_time = GetPendingSeek(); |
426 if (pending_seek_time != kNoTimestamp()) { | 428 if (pending_seek_time != kNoTimestamp()) { |
427 // Keep STATE_WAITING_FOR_SEEK | 429 // Keep STATE_WAITING_FOR_SEEK |
428 SetPendingSeek(kNoTimestamp()); | 430 SetPendingSeek(kNoTimestamp()); |
429 RequestDemuxerSeek(pending_seek_time); | 431 RequestDemuxerSeek(pending_seek_time); |
430 return; | 432 return; |
431 } | 433 } |
432 | 434 |
433 if (HasPendingStart()) { | 435 if (HasPendingStart()) { |
(...skipping 89 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
523 | 525 |
524 if (HasVideo() && !video_decoder_->HasVideoSurface()) { | 526 if (HasVideo() && !video_decoder_->HasVideoSurface()) { |
525 SetState(STATE_WAITING_FOR_SURFACE); | 527 SetState(STATE_WAITING_FOR_SURFACE); |
526 return; | 528 return; |
527 } | 529 } |
528 | 530 |
529 SetState(STATE_PLAYING); | 531 SetState(STATE_PLAYING); |
530 StartPlaybackOrBrowserSeek(); | 532 StartPlaybackOrBrowserSeek(); |
531 } | 533 } |
532 | 534 |
| 535 void MediaCodecPlayer::OnPrerollDone() { |
| 536 DCHECK(GetMediaTaskRunner()->BelongsToCurrentThread()); |
| 537 DVLOG(1) << __FUNCTION__; |
| 538 |
| 539 if (!(audio_decoder_->IsPrerollDone() && video_decoder_->IsPrerollDone())) { |
| 540 DVLOG(1) << __FUNCTION__ << " both audio and video needs to be done" |
| 541 << " prerolling, ignoring"; |
| 542 return; // Wait until both streams are done prerolling. |
| 543 } |
| 544 |
| 545 if (!AudioFinished()) |
| 546 audio_decoder_->ResumeAfterPreroll(); |
| 547 if (!VideoFinished()) |
| 548 video_decoder_->ResumeAfterPreroll(); |
| 549 } |
| 550 |
533 void MediaCodecPlayer::OnStopDone() { | 551 void MediaCodecPlayer::OnStopDone() { |
534 DCHECK(GetMediaTaskRunner()->BelongsToCurrentThread()); | 552 DCHECK(GetMediaTaskRunner()->BelongsToCurrentThread()); |
535 DVLOG(1) << __FUNCTION__; | 553 DVLOG(1) << __FUNCTION__; |
536 | 554 |
537 if (!(audio_decoder_->IsStopped() && video_decoder_->IsStopped())) | 555 if (!(audio_decoder_->IsStopped() && video_decoder_->IsStopped())) { |
| 556 DVLOG(1) << __FUNCTION__ << " both audio and video has to be stopped" |
| 557 << ", ignoring"; |
538 return; // Wait until other stream is stopped | 558 return; // Wait until other stream is stopped |
| 559 } |
539 | 560 |
540 // At this point decoder threads should not be running | 561 // At this point decoder threads should not be running |
541 if (interpolator_.interpolating()) | 562 if (interpolator_.interpolating()) |
542 interpolator_.StopInterpolating(); | 563 interpolator_.StopInterpolating(); |
543 | 564 |
544 base::TimeDelta seek_time; | 565 base::TimeDelta seek_time; |
545 switch (state_) { | 566 switch (state_) { |
546 case STATE_STOPPING: { | 567 case STATE_STOPPING: { |
547 base::TimeDelta seek_time = GetPendingSeek(); | 568 base::TimeDelta seek_time = GetPendingSeek(); |
548 if (seek_time != kNoTimestamp()) { | 569 if (seek_time != kNoTimestamp()) { |
(...skipping 341 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
890 DCHECK(GetMediaTaskRunner()->BelongsToCurrentThread()); | 911 DCHECK(GetMediaTaskRunner()->BelongsToCurrentThread()); |
891 DVLOG(1) << __FUNCTION__; | 912 DVLOG(1) << __FUNCTION__; |
892 | 913 |
893 internal_error_cb_ = base::Bind(&MediaCodecPlayer::OnError, media_weak_this_); | 914 internal_error_cb_ = base::Bind(&MediaCodecPlayer::OnError, media_weak_this_); |
894 | 915 |
895 audio_decoder_.reset(new MediaCodecAudioDecoder( | 916 audio_decoder_.reset(new MediaCodecAudioDecoder( |
896 GetMediaTaskRunner(), base::Bind(&MediaCodecPlayer::RequestDemuxerData, | 917 GetMediaTaskRunner(), base::Bind(&MediaCodecPlayer::RequestDemuxerData, |
897 media_weak_this_, DemuxerStream::AUDIO), | 918 media_weak_this_, DemuxerStream::AUDIO), |
898 base::Bind(&MediaCodecPlayer::OnStarvation, media_weak_this_, | 919 base::Bind(&MediaCodecPlayer::OnStarvation, media_weak_this_, |
899 DemuxerStream::AUDIO), | 920 DemuxerStream::AUDIO), |
| 921 base::Bind(&MediaCodecPlayer::OnPrerollDone, media_weak_this_), |
900 base::Bind(&MediaCodecPlayer::OnStopDone, media_weak_this_), | 922 base::Bind(&MediaCodecPlayer::OnStopDone, media_weak_this_), |
901 internal_error_cb_, | 923 internal_error_cb_, |
902 base::Bind(&MediaCodecPlayer::OnTimeIntervalUpdate, media_weak_this_, | 924 base::Bind(&MediaCodecPlayer::OnTimeIntervalUpdate, media_weak_this_, |
903 DemuxerStream::AUDIO))); | 925 DemuxerStream::AUDIO))); |
904 | 926 |
905 video_decoder_.reset(new MediaCodecVideoDecoder( | 927 video_decoder_.reset(new MediaCodecVideoDecoder( |
906 GetMediaTaskRunner(), base::Bind(&MediaCodecPlayer::RequestDemuxerData, | 928 GetMediaTaskRunner(), base::Bind(&MediaCodecPlayer::RequestDemuxerData, |
907 media_weak_this_, DemuxerStream::VIDEO), | 929 media_weak_this_, DemuxerStream::VIDEO), |
908 base::Bind(&MediaCodecPlayer::OnStarvation, media_weak_this_, | 930 base::Bind(&MediaCodecPlayer::OnStarvation, media_weak_this_, |
909 DemuxerStream::VIDEO), | 931 DemuxerStream::VIDEO), |
| 932 base::Bind(&MediaCodecPlayer::OnPrerollDone, media_weak_this_), |
910 base::Bind(&MediaCodecPlayer::OnStopDone, media_weak_this_), | 933 base::Bind(&MediaCodecPlayer::OnStopDone, media_weak_this_), |
911 internal_error_cb_, | 934 internal_error_cb_, |
912 base::Bind(&MediaCodecPlayer::OnTimeIntervalUpdate, media_weak_this_, | 935 base::Bind(&MediaCodecPlayer::OnTimeIntervalUpdate, media_weak_this_, |
913 DemuxerStream::VIDEO), | 936 DemuxerStream::VIDEO), |
914 base::Bind(&MediaCodecPlayer::OnVideoResolutionChanged, media_weak_this_), | 937 base::Bind(&MediaCodecPlayer::OnVideoResolutionChanged, media_weak_this_), |
915 base::Bind(&MediaCodecPlayer::OnVideoCodecCreated, media_weak_this_))); | 938 base::Bind(&MediaCodecPlayer::OnVideoCodecCreated, media_weak_this_))); |
916 } | 939 } |
917 | 940 |
918 bool MediaCodecPlayer::AudioFinished() const { | 941 bool MediaCodecPlayer::AudioFinished() const { |
919 return audio_decoder_->IsCompleted() || !audio_decoder_->HasStream(); | 942 return audio_decoder_->IsCompleted() || !audio_decoder_->HasStream(); |
(...skipping 25 matching lines...) Expand all Loading... |
945 RETURN_STRING(STATE_WAITING_FOR_SURFACE); | 968 RETURN_STRING(STATE_WAITING_FOR_SURFACE); |
946 RETURN_STRING(STATE_WAITING_FOR_SEEK); | 969 RETURN_STRING(STATE_WAITING_FOR_SEEK); |
947 RETURN_STRING(STATE_ERROR); | 970 RETURN_STRING(STATE_ERROR); |
948 } | 971 } |
949 return nullptr; // crash early | 972 return nullptr; // crash early |
950 } | 973 } |
951 | 974 |
952 #undef RETURN_STRING | 975 #undef RETURN_STRING |
953 | 976 |
954 } // namespace media | 977 } // namespace media |
OLD | NEW |