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..80168a8723f188dd09d040db7793a81021c67049 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; |
} |
} |
@@ -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,20 +992,20 @@ 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)) |
+ if (do_audio) { |
qinmin
2015/09/03 05:30:04
simply if (do_audio && !audio_decoder_->Preroll(p
Tima Vaisburd
2015/09/03 19:55:27
Done.
|
+ if (!audio_decoder_->Preroll(preroll_cb)) |
return kStartFailed; |
} |
- if (do_video_preroll) { |
- if (!video_decoder_->Preroll(current_time, preroll_cb)) |
+ if (do_video) { |
qinmin
2015/09/03 05:30:04
ditto
Tima Vaisburd
2015/09/03 19:55:27
Done.
|
+ if (!video_decoder_->Preroll(preroll_cb)) |
return kStartFailed; |
} |