Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(162)

Side by Side Diff: media/base/pipeline_impl.cc

Issue 6648004: DemuxerFactory is born! (Closed)
Patch Set: Created 9 years, 9 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
OLDNEW
1 // Copyright (c) 2011 The Chromium Authors. All rights reserved. 1 // Copyright (c) 2011 The Chromium Authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be 2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file. 3 // found in the LICENSE file.
4 // 4 //
5 // TODO(scherkus): clean up PipelineImpl... too many crazy function names, 5 // TODO(scherkus): clean up PipelineImpl... too many crazy function names,
6 // potential deadlocks, etc... 6 // potential deadlocks, etc...
7 7
8 #include "base/callback.h" 8 #include "base/callback.h"
9 #include "base/compiler_specific.h" 9 #include "base/compiler_specific.h"
10 #include "base/stl_util-inl.h" 10 #include "base/stl_util-inl.h"
(...skipping 539 matching lines...) Expand 10 before | Expand all | Expand 10 after
550 void PipelineImpl::StartTask(FilterCollection* filter_collection, 550 void PipelineImpl::StartTask(FilterCollection* filter_collection,
551 const std::string& url, 551 const std::string& url,
552 PipelineCallback* start_callback) { 552 PipelineCallback* start_callback) {
553 DCHECK_EQ(MessageLoop::current(), message_loop_); 553 DCHECK_EQ(MessageLoop::current(), message_loop_);
554 DCHECK_EQ(kCreated, state_); 554 DCHECK_EQ(kCreated, state_);
555 filter_collection_.reset(filter_collection); 555 filter_collection_.reset(filter_collection);
556 url_ = url; 556 url_ = url;
557 seek_callback_.reset(start_callback); 557 seek_callback_.reset(start_callback);
558 558
559 // Kick off initialization. 559 // Kick off initialization.
560 set_state(kInitDataSource); 560 set_state(kInitDemuxer);
561 pipeline_init_state_.reset(new PipelineInitState()); 561 pipeline_init_state_.reset(new PipelineInitState());
562 pipeline_init_state_->composite_ = new CompositeFilter(message_loop_); 562 pipeline_init_state_->composite_ = new CompositeFilter(message_loop_);
563 pipeline_init_state_->composite_->set_host(this); 563 pipeline_init_state_->composite_->set_host(this);
564 564
565 InitializeDataSource(); 565 InitializeDemuxer();
566 } 566 }
567 567
568 // Main initialization method called on the pipeline thread. This code attempts 568 // Main initialization method called on the pipeline thread. This code attempts
569 // to use the specified filter factory to build a pipeline. 569 // to use the specified filter factory to build a pipeline.
570 // Initialization step performed in this method depends on current state of this 570 // Initialization step performed in this method depends on current state of this
571 // object, indicated by |state_|. After each step of initialization, this 571 // object, indicated by |state_|. After each step of initialization, this
572 // object transits to the next stage. It starts by creating a DataSource, 572 // object transits to the next stage. It starts by creating a Demuxer, and then
573 // connects it to a Demuxer, and then connects the Demuxer's audio stream to an 573 // connects the Demuxer's audio stream to an AudioDecoder which is then
574 // AudioDecoder which is then connected to an AudioRenderer. If the media has 574 // connected to an AudioRenderer. If the media has video, then it connects a
575 // video, then it connects a VideoDecoder to the Demuxer's video stream, and 575 // VideoDecoder to the Demuxer's video stream, and then connects the
576 // then connects the VideoDecoder to a VideoRenderer. 576 // VideoDecoder to a VideoRenderer.
577 // 577 //
578 // When all required filters have been created and have called their 578 // When all required filters have been created and have called their
579 // FilterHost's InitializationComplete() method, the pipeline will update its 579 // FilterHost's InitializationComplete() method, the pipeline will update its
580 // state to kStarted and |init_callback_|, will be executed. 580 // state to kStarted and |init_callback_|, will be executed.
581 // 581 //
582 // TODO(hclam): InitializeTask() is now starting the pipeline asynchronously. It 582 // TODO(hclam): InitializeTask() is now starting the pipeline asynchronously. It
583 // works like a big state change table. If we no longer need to start filters 583 // works like a big state change table. If we no longer need to start filters
584 // in order, we need to get rid of all the state change. 584 // in order, we need to get rid of all the state change.
585 void PipelineImpl::InitializeTask() { 585 void PipelineImpl::InitializeTask() {
acolwell GONE FROM CHROMIUM 2011/03/08 21:48:09 Indentation
Ami GONE FROM CHROMIUM 2011/03/08 22:44:48 Done.
586 DCHECK_EQ(MessageLoop::current(), message_loop_); 586 DCHECK_EQ(MessageLoop::current(), message_loop_);
587 587
588 // If we have received the stop or error signal, return immediately. 588 // If we have received the stop or error signal, return immediately.
589 if (IsPipelineStopPending() || 589 if (IsPipelineStopPending() ||
590 IsPipelineStopped() || 590 IsPipelineStopped() ||
591 PIPELINE_OK != GetError()) { 591 PIPELINE_OK != GetError()) {
592 return; 592 return;
593 } 593 }
594 594
595 DCHECK(state_ == kInitDemuxer || 595 DCHECK(state_ == kInitDemuxer ||
(...skipping 346 matching lines...) Expand 10 before | Expand all | Expand 10 after
942 NewCallback(this, &PipelineImpl::OnTeardownStateTransition)); 942 NewCallback(this, &PipelineImpl::OnTeardownStateTransition));
943 break; 943 break;
944 case kFlushing: 944 case kFlushing:
945 set_state(kStopping); 945 set_state(kStopping);
946 pipeline_filter_->Stop( 946 pipeline_filter_->Stop(
947 NewCallback(this, &PipelineImpl::OnTeardownStateTransition)); 947 NewCallback(this, &PipelineImpl::OnTeardownStateTransition));
948 break; 948 break;
949 949
950 case kCreated: 950 case kCreated:
951 case kError: 951 case kError:
952 case kInitDataSource:
953 case kInitDemuxer: 952 case kInitDemuxer:
954 case kInitAudioDecoder: 953 case kInitAudioDecoder:
955 case kInitAudioRenderer: 954 case kInitAudioRenderer:
956 case kInitVideoDecoder: 955 case kInitVideoDecoder:
957 case kInitVideoRenderer: 956 case kInitVideoRenderer:
958 case kSeeking: 957 case kSeeking:
959 case kStarting: 958 case kStarting:
960 case kStopped: 959 case kStopped:
961 case kStarted: 960 case kStarted:
962 case kEnded: 961 case kEnded:
(...skipping 35 matching lines...) Expand 10 before | Expand all | Expand 10 after
998 997
999 bool PipelineImpl::PrepareFilter(scoped_refptr<Filter> filter) { 998 bool PipelineImpl::PrepareFilter(scoped_refptr<Filter> filter) {
1000 bool ret = pipeline_init_state_->composite_->AddFilter(filter.get()); 999 bool ret = pipeline_init_state_->composite_->AddFilter(filter.get());
1001 1000
1002 if (!ret) { 1001 if (!ret) {
1003 SetError(PIPELINE_ERROR_INITIALIZATION_FAILED); 1002 SetError(PIPELINE_ERROR_INITIALIZATION_FAILED);
1004 } 1003 }
1005 return ret; 1004 return ret;
1006 } 1005 }
1007 1006
1008 void PipelineImpl::InitializeDataSource() { 1007 void PipelineImpl::InitializeDemuxer() {
1009 DCHECK_EQ(MessageLoop::current(), message_loop_); 1008 DCHECK_EQ(MessageLoop::current(), message_loop_);
1010 DCHECK(IsPipelineOk()); 1009 DCHECK(IsPipelineOk());
1011 1010
1012 filter_collection_->GetDataSourceFactory()->Build(url_, 1011 filter_collection_->GetDemuxerFactory()->Build(url_,
1013 NewCallback(this, &PipelineImpl::OnDataSourceBuilt)); 1012 NewCallback(this, &PipelineImpl::OnDemuxerBuilt));
1014 } 1013 }
1015 1014
1016 void PipelineImpl::OnDataSourceBuilt(PipelineError error, 1015 void PipelineImpl::OnDemuxerBuilt(PipelineError error,
1017 DataSource* data_source) { 1016 Demuxer* demuxer) {
1018 if (MessageLoop::current() != message_loop_) { 1017 if (MessageLoop::current() != message_loop_) {
1019 message_loop_->PostTask(FROM_HERE, 1018 message_loop_->PostTask(FROM_HERE,
1020 NewRunnableMethod(this, 1019 NewRunnableMethod(this,
1021 &PipelineImpl::OnDataSourceBuilt, 1020 &PipelineImpl::OnDemuxerBuilt,
1022 error, 1021 error,
1023 make_scoped_refptr(data_source))); 1022 make_scoped_refptr(demuxer)));
1024 return; 1023 return;
1025 } 1024 }
1026 1025
1027 if (error != PIPELINE_OK) { 1026 if (error != PIPELINE_OK) {
1028 SetError(error); 1027 SetError(error);
1029 return; 1028 return;
1030 } 1029 }
1031 1030
1032 PrepareFilter(data_source);
1033
1034 set_state(kInitDemuxer);
1035 InitializeDemuxer(data_source);
1036 }
1037
1038 void PipelineImpl::InitializeDemuxer(
1039 const scoped_refptr<DataSource>& data_source) {
1040 DCHECK_EQ(MessageLoop::current(), message_loop_);
1041 DCHECK(IsPipelineOk());
1042
1043 scoped_refptr<Demuxer> demuxer;
1044
1045 CHECK(data_source);
1046
1047 filter_collection_->SelectDemuxer(&demuxer);
1048 if (!demuxer) { 1031 if (!demuxer) {
1049 SetError(PIPELINE_ERROR_REQUIRED_FILTER_MISSING); 1032 SetError(PIPELINE_ERROR_REQUIRED_FILTER_MISSING);
1050 return; 1033 return;
1051 } 1034 }
1052 1035
1053 if (!PrepareFilter(demuxer)) 1036 if (!PrepareFilter(demuxer))
1054 return; 1037 return;
1055 1038
1056 pipeline_init_state_->demuxer_ = demuxer; 1039 pipeline_init_state_->demuxer_ = make_scoped_refptr(demuxer);
acolwell GONE FROM CHROMIUM 2011/03/08 21:48:09 I don't think you need make_scoped_refptr() here.
Ami GONE FROM CHROMIUM 2011/03/08 22:44:48 Done.
1057 demuxer->Initialize(data_source, 1040 OnFilterInitialize();
acolwell GONE FROM CHROMIUM 2011/03/08 21:48:09 I think you can call InitializeTask() from here in
Ami GONE FROM CHROMIUM 2011/03/08 22:44:48 But calling OFI() has the additional benefit of de
acolwell GONE FROM CHROMIUM 2011/03/08 23:19:00 Ok. Sounds reasonable to me.
1058 NewCallback(this, &PipelineImpl::OnFilterInitialize));
1059 } 1041 }
1060 1042
1061 bool PipelineImpl::InitializeAudioDecoder( 1043 bool PipelineImpl::InitializeAudioDecoder(
1062 const scoped_refptr<Demuxer>& demuxer) { 1044 const scoped_refptr<Demuxer>& demuxer) {
1063 DCHECK_EQ(MessageLoop::current(), message_loop_); 1045 DCHECK_EQ(MessageLoop::current(), message_loop_);
1064 DCHECK(IsPipelineOk()); 1046 DCHECK(IsPipelineOk());
1065 1047
1066 scoped_refptr<DemuxerStream> stream = 1048 scoped_refptr<DemuxerStream> stream =
1067 FindDemuxerStream(demuxer, mime_type::kMajorTypeAudio); 1049 FindDemuxerStream(demuxer, mime_type::kMajorTypeAudio);
1068 1050
(...skipping 126 matching lines...) Expand 10 before | Expand all | Expand 10 after
1195 switch(state_) { 1177 switch(state_) {
1196 case kCreated: 1178 case kCreated:
1197 case kError: 1179 case kError:
1198 set_state(kStopped); 1180 set_state(kStopped);
1199 // Need to put this in the message loop to make sure that it comes 1181 // Need to put this in the message loop to make sure that it comes
1200 // after any pending callback tasks that are already queued. 1182 // after any pending callback tasks that are already queued.
1201 message_loop_->PostTask(FROM_HERE, 1183 message_loop_->PostTask(FROM_HERE,
1202 NewRunnableMethod(this, &PipelineImpl::FinishDestroyingFiltersTask)); 1184 NewRunnableMethod(this, &PipelineImpl::FinishDestroyingFiltersTask));
1203 break; 1185 break;
1204 1186
1205 case kInitDataSource:
1206 case kInitDemuxer: 1187 case kInitDemuxer:
1207 case kInitAudioDecoder: 1188 case kInitAudioDecoder:
1208 case kInitAudioRenderer: 1189 case kInitAudioRenderer:
1209 case kInitVideoDecoder: 1190 case kInitVideoDecoder:
1210 case kInitVideoRenderer: 1191 case kInitVideoRenderer:
1211 // Make it look like initialization was successful. 1192 // Make it look like initialization was successful.
1212 pipeline_filter_ = pipeline_init_state_->composite_; 1193 pipeline_filter_ = pipeline_init_state_->composite_;
1213 pipeline_init_state_.reset(); 1194 pipeline_init_state_.reset();
1214 filter_collection_.reset(); 1195 filter_collection_.reset();
1215 1196
(...skipping 29 matching lines...) Expand all
1245 case kStopping: 1226 case kStopping:
1246 case kStopped: 1227 case kStopped:
1247 NOTREACHED() << "Unexpected state for teardown: " << state_; 1228 NOTREACHED() << "Unexpected state for teardown: " << state_;
1248 break; 1229 break;
1249 // default: intentionally left out to force new states to cause compiler 1230 // default: intentionally left out to force new states to cause compiler
1250 // errors. 1231 // errors.
1251 }; 1232 };
1252 } 1233 }
1253 1234
1254 } // namespace media 1235 } // namespace media
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698