| 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;
|
| }
|
|
|