Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(125)

Unified Diff: media/base/android/media_codec_player.cc

Issue 1312103006: MediaCodecPlayer - preroll and reconfiguration fixes (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@mtplayer-reconfig
Patch Set: Added more unit tests Created 5 years, 3 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
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 44de230061e1e14901f7bc0920938ec9c0632ea1..80168a8723f188dd09d040db7793a81021c67049 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.
@@ -608,6 +612,12 @@ void MediaCodecPlayer::OnPrerollDone() {
DCHECK(GetMediaTaskRunner()->BelongsToCurrentThread());
DVLOG(1) << __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_);
@@ -630,24 +640,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;
}
}
@@ -963,9 +963,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
@@ -978,12 +976,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) {
@@ -994,20 +992,20 @@ 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))
+ if (do_audio) {
qinmin 2015/09/03 05:30:04 simply if (do_audio && !audio_decoder_->Preroll(p
Tima Vaisburd 2015/09/03 19:55:27 Done.
+ if (!audio_decoder_->Preroll(preroll_cb))
return kStartFailed;
}
- if (do_video_preroll) {
- if (!video_decoder_->Preroll(current_time, preroll_cb))
+ if (do_video) {
qinmin 2015/09/03 05:30:04 ditto
Tima Vaisburd 2015/09/03 19:55:27 Done.
+ if (!video_decoder_->Preroll(preroll_cb))
return kStartFailed;
}

Powered by Google App Engine
This is Rietveld 408576698