Chromium Code Reviews| Index: media/base/android/media_codec_player.cc |
| diff --git a/media/base/android/media_codec_player.cc b/media/base/android/media_codec_player.cc |
| index 44de230061e1e14901f7bc0920938ec9c0632ea1..322649fa6cd2ca197d01b0dcc65b7ca542df1773 100644 |
| --- a/media/base/android/media_codec_player.cc |
| +++ b/media/base/android/media_codec_player.cc |
| @@ -441,8 +441,12 @@ void MediaCodecPlayer::OnDemuxerSeekDone( |
| : seek_info_->seek_time; |
| interpolator_.SetBounds(seek_time, seek_time); |
| + |
| audio_decoder_->SetBaseTimestamp(seek_time); |
| + audio_decoder_->SetPrerollTimestamp(seek_time); |
| + video_decoder_->SetPrerollTimestamp(seek_time); |
| + |
| // The Flush() might set the state to kStateError. |
| if (state_ == kStateError) { |
| // Notify the Renderer. |
| @@ -608,6 +612,12 @@ void MediaCodecPlayer::OnPrerollDone() { |
| DCHECK(GetMediaTaskRunner()->BelongsToCurrentThread()); |
| DVLOG(1) << __FUNCTION__; |
| + if (state_ != kStatePlaying) { |
| + DVLOG(1) << __FUNCTION__ << ": in state " << AsString(state_) |
| + << ", ignoring"; |
| + return; |
| + } |
| + |
| StartStatus status = StartDecoders(); |
| if (status != kStartOk) |
| GetMediaTaskRunner()->PostTask(FROM_HERE, internal_error_cb_); |
| @@ -630,24 +640,14 @@ void MediaCodecPlayer::OnDecoderDrained(DemuxerStream::Type type) { |
| if (type == DemuxerStream::AUDIO && !VideoFinished()) { |
| DVLOG(1) << __FUNCTION__ << " requesting to stop video"; |
| - video_decoder_->SetDecodingUntilOutputIsPresent(); |
| video_decoder_->RequestToStop(); |
| } else if (type == DemuxerStream::VIDEO && !AudioFinished()) { |
| DVLOG(1) << __FUNCTION__ << " requesting to stop audio"; |
| - audio_decoder_->SetDecodingUntilOutputIsPresent(); |
| audio_decoder_->RequestToStop(); |
| } |
| break; |
| - case kStateStopping: |
| - if (type == DemuxerStream::AUDIO && !VideoFinished()) |
| - video_decoder_->SetDecodingUntilOutputIsPresent(); |
| - else if (type == DemuxerStream::VIDEO && !AudioFinished()) |
| - audio_decoder_->SetDecodingUntilOutputIsPresent(); |
| - break; |
| - |
| default: |
| - NOTREACHED(); |
| break; |
| } |
| } |
| @@ -694,7 +694,7 @@ void MediaCodecPlayer::OnStopDone(DemuxerStream::Type type) { |
| // then video posts, then first OnStopDone arrives at which point |
| // both streams are already stopped, then second OnStopDone arrives. When |
| // the second one arrives, the state us not kStateStopping any more. |
| - break; |
| + return; |
|
Tima Vaisburd
2015/09/03 19:55:27
Changed |break| to |return| so we do not post noti
|
| } |
| // DetachListener to UI thread |
| @@ -963,9 +963,7 @@ MediaCodecPlayer::StartStatus MediaCodecPlayer::MaybePrerollDecoders( |
| bool* preroll_required) { |
| DCHECK(GetMediaTaskRunner()->BelongsToCurrentThread()); |
| - base::TimeDelta current_time = GetInterpolatedTime(); |
| - |
| - DVLOG(1) << __FUNCTION__ << " current_time:" << current_time; |
| + DVLOG(1) << __FUNCTION__ << " current_time:" << GetInterpolatedTime(); |
| // If requested, preroll is always done in the beginning of the playback, |
| // after prefetch. The request might not happen at all though, in which case |
| @@ -978,12 +976,12 @@ MediaCodecPlayer::StartStatus MediaCodecPlayer::MaybePrerollDecoders( |
| *preroll_required = false; |
| int count = 0; |
| - const bool do_audio_preroll = audio_decoder_->NotCompletedAndNeedsPreroll(); |
| - if (do_audio_preroll) |
| + const bool do_audio = audio_decoder_->NotCompletedAndNeedsPreroll(); |
| + if (do_audio) |
| ++count; |
| - const bool do_video_preroll = video_decoder_->NotCompletedAndNeedsPreroll(); |
| - if (do_video_preroll) |
| + const bool do_video = video_decoder_->NotCompletedAndNeedsPreroll(); |
| + if (do_video) |
| ++count; |
| if (count == 0) { |
| @@ -994,22 +992,18 @@ MediaCodecPlayer::StartStatus MediaCodecPlayer::MaybePrerollDecoders( |
| *preroll_required = true; |
| DCHECK(count > 0); |
| - DCHECK(do_audio_preroll || do_video_preroll); |
| + DCHECK(do_audio || do_video); |
| DVLOG(1) << __FUNCTION__ << ": preroll for " << count << " stream(s)"; |
| base::Closure preroll_cb = base::BarrierClosure( |
| count, base::Bind(&MediaCodecPlayer::OnPrerollDone, media_weak_this_)); |
| - if (do_audio_preroll) { |
| - if (!audio_decoder_->Preroll(current_time, preroll_cb)) |
| - return kStartFailed; |
| - } |
| + if (do_audio && !audio_decoder_->Preroll(preroll_cb)) |
| + return kStartFailed; |
| - if (do_video_preroll) { |
| - if (!video_decoder_->Preroll(current_time, preroll_cb)) |
| - return kStartFailed; |
| - } |
| + if (do_video && !video_decoder_->Preroll(preroll_cb)) |
| + return kStartFailed; |
| return kStartOk; |
| } |