| 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
|
|
|