| 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 73c58179415491e3370d37da4eb560440a93e60c..44de230061e1e14901f7bc0920938ec9c0632ea1 100644
|
| --- a/media/base/android/media_codec_player.cc
|
| +++ b/media/base/android/media_codec_player.cc
|
| @@ -498,6 +498,27 @@ void MediaCodecPlayer::SetDecodersTimeCallbackForTests(
|
| decoders_time_cb_ = cb;
|
| }
|
|
|
| +void MediaCodecPlayer::SetCodecCreatedCallbackForTests(
|
| + CodecCreatedCallback cb) {
|
| + DCHECK(ui_task_runner_->BelongsToCurrentThread());
|
| + DCHECK(audio_decoder_ && video_decoder_);
|
| +
|
| + audio_decoder_->SetCodecCreatedCallbackForTests(
|
| + base::Bind(cb, DemuxerStream::AUDIO));
|
| + video_decoder_->SetCodecCreatedCallbackForTests(
|
| + base::Bind(cb, DemuxerStream::VIDEO));
|
| +}
|
| +
|
| +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_);
|
| @@ -592,9 +613,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_->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;
|
| + }
|
| +}
|
| +
|
| +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"
|
| @@ -1001,7 +1062,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;
|
| }
|
|
|
| @@ -1054,7 +1116,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)));
|
| @@ -1064,7 +1129,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),
|
|
|