Index: media/base/pipeline.cc |
diff --git a/media/base/pipeline.cc b/media/base/pipeline.cc |
index 9a7488094259402a467d4587d1b5c911c6676985..9a8fc7cea96253c22aa5ba2908829b8dab7441f9 100644 |
--- a/media/base/pipeline.cc |
+++ b/media/base/pipeline.cc |
@@ -412,6 +412,10 @@ void Pipeline::StateTransitionTask(PipelineStatus status) { |
PlaybackRateChangedTask(GetPlaybackRate()); |
VolumeChangedTask(GetVolume()); |
+ // Handle renderers that immediately signal they have enough data. |
+ if (!WaitingForEnoughData()) |
+ StartPlayback(); |
+ |
// We enter this state from either kInitPrerolling or kSeeking. As of now |
// both those states call Preroll(), which means by time we enter this |
// state we've already buffered enough data. Forcefully update the |
@@ -420,11 +424,10 @@ void Pipeline::StateTransitionTask(PipelineStatus status) { |
// |
// TODO(scherkus): Remove after renderers are taught to fire buffering |
// state callbacks http://crbug.com/144683 |
- DCHECK(WaitingForEnoughData()); |
- if (audio_renderer_) |
- BufferingStateChanged(&audio_buffering_state_, BUFFERING_HAVE_ENOUGH); |
- if (video_renderer_) |
+ if (video_renderer_) { |
+ DCHECK(WaitingForEnoughData()); |
BufferingStateChanged(&video_buffering_state_, BUFFERING_HAVE_ENOUGH); |
+ } |
return; |
case kStopping: |
@@ -451,9 +454,9 @@ void Pipeline::DoInitialPreroll(const PipelineStatusCB& done_cb) { |
// Preroll renderers. |
if (audio_renderer_) { |
- bound_fns.Push(base::Bind( |
- &AudioRenderer::Preroll, base::Unretained(audio_renderer_.get()), |
- seek_timestamp)); |
+ bound_fns.Push(base::Bind(&AudioRenderer::StartPlayingFrom, |
+ base::Unretained(audio_renderer_.get()), |
+ seek_timestamp)); |
} |
if (video_renderer_) { |
@@ -522,9 +525,9 @@ void Pipeline::DoSeek( |
// Preroll renderers. |
if (audio_renderer_) { |
- bound_fns.Push(base::Bind( |
- &AudioRenderer::Preroll, base::Unretained(audio_renderer_.get()), |
- seek_timestamp)); |
+ bound_fns.Push(base::Bind(&AudioRenderer::StartPlayingFrom, |
+ base::Unretained(audio_renderer_.get()), |
+ seek_timestamp)); |
} |
if (video_renderer_) { |
@@ -857,8 +860,9 @@ void Pipeline::InitializeAudioRenderer(const PipelineStatusCB& done_cb) { |
demuxer_->GetStream(DemuxerStream::AUDIO), |
done_cb, |
base::Bind(&Pipeline::OnUpdateStatistics, base::Unretained(this)), |
- base::Bind(&Pipeline::OnAudioUnderflow, base::Unretained(this)), |
base::Bind(&Pipeline::OnAudioTimeUpdate, base::Unretained(this)), |
+ base::Bind(&Pipeline::BufferingStateChanged, base::Unretained(this), |
+ &audio_buffering_state_), |
base::Bind(&Pipeline::OnAudioRendererEnded, base::Unretained(this)), |
base::Bind(&Pipeline::SetError, base::Unretained(this))); |
} |
@@ -879,20 +883,6 @@ void Pipeline::InitializeVideoRenderer(const PipelineStatusCB& done_cb) { |
base::Bind(&Pipeline::GetMediaDuration, base::Unretained(this))); |
} |
-void Pipeline::OnAudioUnderflow() { |
- if (!task_runner_->BelongsToCurrentThread()) { |
- task_runner_->PostTask(FROM_HERE, base::Bind( |
- &Pipeline::OnAudioUnderflow, base::Unretained(this))); |
- return; |
- } |
- |
- if (state_ != kPlaying) |
- return; |
- |
- if (audio_renderer_) |
- audio_renderer_->ResumeAfterUnderflow(); |
-} |
- |
void Pipeline::BufferingStateChanged(BufferingState* buffering_state, |
BufferingState new_buffering_state) { |
DVLOG(1) << __FUNCTION__ << "(" << *buffering_state << ", " |
@@ -904,7 +894,7 @@ void Pipeline::BufferingStateChanged(BufferingState* buffering_state, |
// Renderer underflowed. |
if (!was_waiting_for_enough_data && WaitingForEnoughData()) { |
- StartWaitingForEnoughData(); |
+ PausePlayback(); |
return; |
} |
@@ -926,10 +916,11 @@ bool Pipeline::WaitingForEnoughData() const { |
return false; |
} |
-void Pipeline::StartWaitingForEnoughData() { |
+void Pipeline::PausePlayback() { |
DVLOG(1) << __FUNCTION__; |
DCHECK_EQ(state_, kPlaying); |
DCHECK(WaitingForEnoughData()); |
+ DCHECK(task_runner_->BelongsToCurrentThread()); |
if (audio_renderer_) |
audio_renderer_->StopRendering(); |
@@ -942,6 +933,7 @@ void Pipeline::StartPlayback() { |
DVLOG(1) << __FUNCTION__; |
DCHECK_EQ(state_, kPlaying); |
DCHECK(!WaitingForEnoughData()); |
+ DCHECK(task_runner_->BelongsToCurrentThread()); |
if (audio_renderer_) { |
// We use audio stream to update the clock. So if there is such a |