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