| Index: media/base/pipeline_impl.cc
|
| diff --git a/media/base/pipeline_impl.cc b/media/base/pipeline_impl.cc
|
| index d4c1b8eb841b4b4fd16257818f7977f7d0566644..aa5ac3b2d4527b6e6ef3b1865ab2978866db97ce 100644
|
| --- a/media/base/pipeline_impl.cc
|
| +++ b/media/base/pipeline_impl.cc
|
| @@ -586,10 +586,10 @@ void PipelineImpl::DisableAudioRenderer() {
|
| }
|
|
|
| // Called from any thread.
|
| -void PipelineImpl::OnFilterInitialize() {
|
| +void PipelineImpl::OnFilterInitialize(PipelineStatus status) {
|
| // Continue the initialize task by proceeding to the next stage.
|
| - message_loop_->PostTask(FROM_HERE,
|
| - base::Bind(&PipelineImpl::InitializeTask, this));
|
| + message_loop_->PostTask(
|
| + FROM_HERE, base::Bind(&PipelineImpl::InitializeTask, this, status));
|
| }
|
|
|
| // Called from any thread.
|
| @@ -661,9 +661,21 @@ void PipelineImpl::StartTask(FilterCollection* filter_collection,
|
| // TODO(hclam): InitializeTask() is now starting the pipeline asynchronously. It
|
| // works like a big state change table. If we no longer need to start filters
|
| // in order, we need to get rid of all the state change.
|
| -void PipelineImpl::InitializeTask() {
|
| +void PipelineImpl::InitializeTask(PipelineStatus last_stage_status) {
|
| DCHECK_EQ(MessageLoop::current(), message_loop_);
|
|
|
| + if (last_stage_status != PIPELINE_OK) {
|
| + // Currently only VideoDecoders have a recoverable error code.
|
| + if (state_ == kInitVideoDecoder &&
|
| + last_stage_status == DECODER_ERROR_NOT_SUPPORTED) {
|
| + pipeline_init_state_->composite_->RemoveFilter(
|
| + pipeline_init_state_->video_decoder_.get());
|
| + state_ = kInitAudioRenderer;
|
| + } else {
|
| + SetError(last_stage_status);
|
| + }
|
| + }
|
| +
|
| // If we have received the stop or error signal, return immediately.
|
| if (IsPipelineStopPending() || IsPipelineStopped() || !IsPipelineOk())
|
| return;
|
| @@ -1111,10 +1123,8 @@ void PipelineImpl::FinishDestroyingFiltersTask() {
|
|
|
| bool PipelineImpl::PrepareFilter(scoped_refptr<Filter> filter) {
|
| bool ret = pipeline_init_state_->composite_->AddFilter(filter.get());
|
| -
|
| - if (!ret) {
|
| + if (!ret)
|
| SetError(PIPELINE_ERROR_INITIALIZATION_FAILED);
|
| - }
|
| return ret;
|
| }
|
|
|
| @@ -1155,7 +1165,7 @@ void PipelineImpl::OnDemuxerBuilt(PipelineStatus status, Demuxer* demuxer) {
|
| clock_->SetTime(demuxer_->GetStartTime());
|
| }
|
|
|
| - OnFilterInitialize();
|
| + OnFilterInitialize(PIPELINE_OK);
|
| }
|
|
|
| bool PipelineImpl::InitializeAudioDecoder(
|
| @@ -1183,7 +1193,7 @@ bool PipelineImpl::InitializeAudioDecoder(
|
| pipeline_init_state_->audio_decoder_ = audio_decoder;
|
| audio_decoder->Initialize(
|
| stream,
|
| - base::Bind(&PipelineImpl::OnFilterInitialize, this),
|
| + base::Bind(&PipelineImpl::OnFilterInitialize, this, PIPELINE_OK),
|
| base::Bind(&PipelineImpl::OnUpdateStatistics, this));
|
| return true;
|
| }
|
| @@ -1240,7 +1250,7 @@ bool PipelineImpl::InitializeAudioRenderer(
|
|
|
| audio_renderer_->Initialize(
|
| decoder,
|
| - base::Bind(&PipelineImpl::OnFilterInitialize, this),
|
| + base::Bind(&PipelineImpl::OnFilterInitialize, this, PIPELINE_OK),
|
| base::Bind(&PipelineImpl::OnAudioUnderflow, this));
|
| return true;
|
| }
|
| @@ -1264,7 +1274,7 @@ bool PipelineImpl::InitializeVideoRenderer(
|
|
|
| video_renderer_->Initialize(
|
| decoder,
|
| - base::Bind(&PipelineImpl::OnFilterInitialize, this),
|
| + base::Bind(&PipelineImpl::OnFilterInitialize, this, PIPELINE_OK),
|
| base::Bind(&PipelineImpl::OnUpdateStatistics, this));
|
| return true;
|
| }
|
|
|