| Index: media/base/android/media_source_player.cc
|
| diff --git a/media/base/android/media_source_player.cc b/media/base/android/media_source_player.cc
|
| index 3d51a4a3dd163afb875dd8b8d365850ec967c468..9dd72feaca5dbe00646278993e36f3cc6c9f87ef 100644
|
| --- a/media/base/android/media_source_player.cc
|
| +++ b/media/base/android/media_source_player.cc
|
| @@ -73,8 +73,8 @@ MediaSourcePlayer::MediaSourcePlayer(
|
| video_codec_(kUnknownVideoCodec),
|
| num_channels_(0),
|
| sampling_rate_(0),
|
| - audio_finished_(true),
|
| - video_finished_(true),
|
| + audio_finished_(false),
|
| + video_finished_(false),
|
| playing_(false),
|
| is_audio_encrypted_(false),
|
| is_video_encrypted_(false),
|
| @@ -318,8 +318,6 @@ void MediaSourcePlayer::StartInternal() {
|
| return;
|
| }
|
|
|
| - audio_finished_ = false;
|
| - video_finished_ = false;
|
| SetPendingEvent(PREFETCH_REQUEST_EVENT_PENDING);
|
| ProcessPendingEvents();
|
| }
|
| @@ -451,6 +449,9 @@ void MediaSourcePlayer::OnDemuxerSeekDone(
|
| audio_timestamp_helper_->SetBaseTimestamp(actual_browser_seek_time);
|
| }
|
|
|
| + audio_finished_ = false;
|
| + video_finished_ = false;
|
| +
|
| base::TimeDelta current_time = GetCurrentTime();
|
| // TODO(qinmin): Simplify the logic by using |start_presentation_timestamp_|
|
| // to preroll media decoder jobs. Currently |start_presentation_timestamp_|
|
| @@ -530,15 +531,16 @@ void MediaSourcePlayer::ProcessPendingEvents() {
|
|
|
| if (IsEventPending(PREFETCH_REQUEST_EVENT_PENDING)) {
|
| DVLOG(1) << __FUNCTION__ << " : Handling PREFETCH_REQUEST_EVENT.";
|
| - int count = (audio_decoder_job_ ? 1 : 0) + (video_decoder_job_ ? 1 : 0);
|
| + int count = ((audio_decoder_job_ && !audio_finished_) ? 1 : 0) +
|
| + ((video_decoder_job_ && !video_finished_) ? 1 : 0);
|
|
|
| base::Closure barrier = BarrierClosure(count, base::Bind(
|
| &MediaSourcePlayer::OnPrefetchDone, weak_this_.GetWeakPtr()));
|
|
|
| - if (audio_decoder_job_)
|
| + if (audio_decoder_job_ && !audio_finished_)
|
| audio_decoder_job_->Prefetch(barrier);
|
|
|
| - if (video_decoder_job_)
|
| + if (video_decoder_job_ && !video_finished_)
|
| video_decoder_job_->Prefetch(barrier);
|
|
|
| SetPendingEvent(PREFETCH_DONE_EVENT_PENDING);
|
| @@ -643,6 +645,7 @@ void MediaSourcePlayer::MediaDecoderCallback(
|
| void MediaSourcePlayer::DecodeMoreAudio() {
|
| DVLOG(1) << __FUNCTION__;
|
| DCHECK(!audio_decoder_job_->is_decoding());
|
| + DCHECK(!audio_finished_);
|
|
|
| if (audio_decoder_job_->Decode(
|
| start_time_ticks_, start_presentation_timestamp_, base::Bind(
|
| @@ -672,6 +675,7 @@ void MediaSourcePlayer::DecodeMoreAudio() {
|
| void MediaSourcePlayer::DecodeMoreVideo() {
|
| DVLOG(1) << __FUNCTION__;
|
| DCHECK(!video_decoder_job_->is_decoding());
|
| + DCHECK(!video_finished_);
|
|
|
| if (video_decoder_job_->Decode(
|
| start_time_ticks_, start_presentation_timestamp_, base::Bind(
|
| @@ -916,9 +920,9 @@ void MediaSourcePlayer::OnPrefetchDone() {
|
| if (!clock_.IsPlaying())
|
| clock_.Play();
|
|
|
| - if (audio_decoder_job_)
|
| + if (audio_decoder_job_ && !audio_finished_)
|
| DecodeMoreAudio();
|
| - if (video_decoder_job_)
|
| + if (video_decoder_job_ && !video_finished_)
|
| DecodeMoreVideo();
|
| }
|
|
|
|
|