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

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: Rebased 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
« no previous file with comments | « media/base/android/media_codec_decoder.cc ('k') | media/base/android/media_codec_player_unittest.cc » ('j') | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
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;
}
« no previous file with comments | « media/base/android/media_codec_decoder.cc ('k') | media/base/android/media_codec_player_unittest.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698