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 8c28aa3aae46cb5315471cf45f169d7abbad764c..70fc00d5f86e68b367c2b48260bd2a72b314f737 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. |
@@ -620,6 +624,12 @@ void MediaCodecPlayer::OnPrerollDone() { |
// http://crbug.com/526755 |
DVLOG(0) << __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_); |
@@ -642,24 +652,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; |
} |
} |
@@ -706,7 +706,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; |
} |
// DetachListener to UI thread |
@@ -975,9 +975,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 |
@@ -990,12 +988,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) { |
@@ -1006,22 +1004,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; |
} |