summaryrefslogtreecommitdiffstats
path: root/media/base/pipeline_impl.cc
diff options
context:
space:
mode:
Diffstat (limited to 'media/base/pipeline_impl.cc')
-rw-r--r--media/base/pipeline_impl.cc60
1 files changed, 26 insertions, 34 deletions
diff --git a/media/base/pipeline_impl.cc b/media/base/pipeline_impl.cc
index d4009c8..4f19fcc 100644
--- a/media/base/pipeline_impl.cc
+++ b/media/base/pipeline_impl.cc
@@ -18,7 +18,6 @@ namespace media {
class PipelineImpl::PipelineInitState {
public:
- scoped_refptr<DataSource> data_source_;
scoped_refptr<Demuxer> demuxer_;
scoped_refptr<AudioDecoder> audio_decoder_;
scoped_refptr<VideoDecoder> video_decoder_;
@@ -550,7 +549,12 @@ void PipelineImpl::StartTask(FilterCollection* filter_collection,
seek_callback_.reset(start_callback);
// Kick off initialization.
- InitializeTask();
+ set_state(kInitDataSource);
+ pipeline_init_state_.reset(new PipelineInitState());
+ pipeline_init_state_->composite_ = new CompositeFilter(message_loop_);
+ pipeline_init_state_->composite_->set_host(this);
+
+ InitializeDataSource();
}
// Main initialization method called on the pipeline thread. This code attempts
@@ -580,31 +584,12 @@ void PipelineImpl::InitializeTask() {
return;
}
- DCHECK(state_ == kCreated ||
- state_ == kInitDataSource ||
- state_ == kInitDemuxer ||
+ DCHECK(state_ == kInitDemuxer ||
state_ == kInitAudioDecoder ||
state_ == kInitAudioRenderer ||
state_ == kInitVideoDecoder ||
state_ == kInitVideoRenderer);
- // Just created, create data source.
- if (state_ == kCreated) {
- set_state(kInitDataSource);
- pipeline_init_state_.reset(new PipelineInitState());
- pipeline_init_state_->composite_ = new CompositeFilter(message_loop_);
- pipeline_init_state_->composite_->set_host(this);
-
- InitializeDataSource();
- return;
- }
-
- // Data source created, create demuxer.
- if (state_ == kInitDataSource) {
- set_state(kInitDemuxer);
- InitializeDemuxer(pipeline_init_state_->data_source_);
- return;
- }
// Demuxer created, create audio decoder.
if (state_ == kInitDemuxer) {
@@ -1013,24 +998,30 @@ void PipelineImpl::InitializeDataSource() {
DCHECK_EQ(MessageLoop::current(), message_loop_);
DCHECK(IsPipelineOk());
- scoped_refptr<DataSource> data_source;
- while (true) {
- filter_collection_->SelectDataSource(&data_source);
- if (!data_source || data_source->IsUrlSupported(url_))
- break;
- }
+ filter_collection_->GetDataSourceFactory()->Build(url_,
+ NewCallback(this, &PipelineImpl::OnDataSourceBuilt));
+}
- if (!data_source) {
- SetError(PIPELINE_ERROR_REQUIRED_FILTER_MISSING);
+void PipelineImpl::OnDataSourceBuilt(PipelineError error,
+ DataSource* data_source) {
+ if (MessageLoop::current() != message_loop_) {
+ message_loop_->PostTask(FROM_HERE,
+ NewRunnableMethod(this,
+ &PipelineImpl::OnDataSourceBuilt,
+ error,
+ make_scoped_refptr(data_source)));
return;
}
- if (!PrepareFilter(data_source))
+ if (error != PIPELINE_OK) {
+ SetError(error);
return;
+ }
+
+ PrepareFilter(data_source);
- pipeline_init_state_->data_source_ = data_source;
- data_source->Initialize(
- url_, NewCallback(this, &PipelineImpl::OnFilterInitialize));
+ set_state(kInitDemuxer);
+ InitializeDemuxer(data_source);
}
void PipelineImpl::InitializeDemuxer(
@@ -1207,6 +1198,7 @@ void PipelineImpl::TearDownPipeline() {
// Make it look like initialization was successful.
pipeline_filter_ = pipeline_init_state_->composite_;
pipeline_init_state_.reset();
+ filter_collection_.reset();
set_state(kStopping);
pipeline_filter_->Stop(