| 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 b3ee9628a7ad7cd64298bd39c91ff307ff94f982..adf0ec88a17f344071243e126248300c6632fd4a 100644
|
| --- a/media/base/android/media_codec_player.cc
|
| +++ b/media/base/android/media_codec_player.cc
|
| @@ -498,6 +498,16 @@ void MediaCodecPlayer::SetDecodersTimeCallbackForTests(
|
| decoders_time_cb_ = cb;
|
| }
|
|
|
| +void MediaCodecPlayer::SetAlwaysReconfigureForTests(DemuxerStream::Type type) {
|
| + DCHECK(ui_task_runner_->BelongsToCurrentThread());
|
| + DCHECK(audio_decoder_ && video_decoder_);
|
| +
|
| + if (type == DemuxerStream::AUDIO)
|
| + audio_decoder_->SetAlwaysReconfigureForTests();
|
| + else if (type == DemuxerStream::VIDEO)
|
| + video_decoder_->SetAlwaysReconfigureForTests();
|
| +}
|
| +
|
| bool MediaCodecPlayer::IsPrerollingForTests(DemuxerStream::Type type) const {
|
| DCHECK(ui_task_runner_->BelongsToCurrentThread());
|
| DCHECK(audio_decoder_ && video_decoder_);
|
| @@ -594,9 +604,49 @@ void MediaCodecPlayer::OnPrerollDone() {
|
| GetMediaTaskRunner()->PostTask(FROM_HERE, internal_error_cb_);
|
| }
|
|
|
| -void MediaCodecPlayer::OnStopDone() {
|
| +void MediaCodecPlayer::OnDecoderDrained(DemuxerStream::Type type) {
|
| DCHECK(GetMediaTaskRunner()->BelongsToCurrentThread());
|
| - DVLOG(1) << __FUNCTION__;
|
| + DVLOG(1) << __FUNCTION__ << " " << type;
|
| +
|
| + // We expect that OnStopDone() comes next.
|
| +
|
| + DCHECK(type == DemuxerStream::AUDIO || type == DemuxerStream::VIDEO);
|
| + DCHECK(state_ == kStatePlaying || state_ == kStateStopping)
|
| + << __FUNCTION__ << " illegal state: " << AsString(state_);
|
| +
|
| + switch (state_) {
|
| + case kStatePlaying:
|
| + SetState(kStateStopping);
|
| + SetPendingStart(true);
|
| +
|
| + if (type == DemuxerStream::AUDIO && !VideoFinished()) {
|
| + DVLOG(1) << __FUNCTION__ << " requesting to stop video";
|
| + video_decoder_->SetNeedsPreroll();
|
| + video_decoder_->RequestToStop();
|
| + } else if (type == DemuxerStream::VIDEO && !AudioFinished()) {
|
| + DVLOG(1) << __FUNCTION__ << " requesting to stop audio";
|
| + audio_decoder_->SetNeedsPreroll();
|
| + audio_decoder_->RequestToStop();
|
| + }
|
| + break;
|
| +
|
| + case kStateStopping:
|
| + if (type == DemuxerStream::AUDIO && !VideoFinished())
|
| + video_decoder_->SetNeedsPreroll();
|
| + else if (type == DemuxerStream::VIDEO && !AudioFinished())
|
| + audio_decoder_->SetNeedsPreroll();
|
| + break;
|
| +
|
| + default:
|
| + NOTREACHED();
|
| + break;
|
| + }
|
| +}
|
| +
|
| +void MediaCodecPlayer::OnStopDone(DemuxerStream::Type type) {
|
| + DCHECK(GetMediaTaskRunner()->BelongsToCurrentThread());
|
| + DVLOG(1) << __FUNCTION__ << " " << type
|
| + << " interpolated time:" << GetInterpolatedTime();
|
|
|
| if (!(audio_decoder_->IsStopped() && video_decoder_->IsStopped())) {
|
| DVLOG(1) << __FUNCTION__ << " both audio and video has to be stopped"
|
| @@ -987,7 +1037,8 @@ void MediaCodecPlayer::RequestToStopDecoders() {
|
|
|
| if (!do_audio && !do_video) {
|
| GetMediaTaskRunner()->PostTask(
|
| - FROM_HERE, base::Bind(&MediaCodecPlayer::OnStopDone, media_weak_this_));
|
| + FROM_HERE, base::Bind(&MediaCodecPlayer::OnStopDone, media_weak_this_,
|
| + DemuxerStream::UNKNOWN));
|
| return;
|
| }
|
|
|
| @@ -1040,7 +1091,10 @@ void MediaCodecPlayer::CreateDecoders() {
|
| media_weak_this_, DemuxerStream::AUDIO),
|
| base::Bind(&MediaCodecPlayer::OnStarvation, media_weak_this_,
|
| DemuxerStream::AUDIO),
|
| - base::Bind(&MediaCodecPlayer::OnStopDone, media_weak_this_),
|
| + base::Bind(&MediaCodecPlayer::OnDecoderDrained, media_weak_this_,
|
| + DemuxerStream::AUDIO),
|
| + base::Bind(&MediaCodecPlayer::OnStopDone, media_weak_this_,
|
| + DemuxerStream::AUDIO),
|
| internal_error_cb_,
|
| base::Bind(&MediaCodecPlayer::OnTimeIntervalUpdate, media_weak_this_,
|
| DemuxerStream::AUDIO)));
|
| @@ -1050,7 +1104,10 @@ void MediaCodecPlayer::CreateDecoders() {
|
| media_weak_this_, DemuxerStream::VIDEO),
|
| base::Bind(&MediaCodecPlayer::OnStarvation, media_weak_this_,
|
| DemuxerStream::VIDEO),
|
| - base::Bind(&MediaCodecPlayer::OnStopDone, media_weak_this_),
|
| + base::Bind(&MediaCodecPlayer::OnDecoderDrained, media_weak_this_,
|
| + DemuxerStream::VIDEO),
|
| + base::Bind(&MediaCodecPlayer::OnStopDone, media_weak_this_,
|
| + DemuxerStream::VIDEO),
|
| internal_error_cb_,
|
| base::Bind(&MediaCodecPlayer::OnTimeIntervalUpdate, media_weak_this_,
|
| DemuxerStream::VIDEO),
|
|
|