Chromium Code Reviews| Index: media/base/pipeline.cc |
| diff --git a/media/base/pipeline.cc b/media/base/pipeline.cc |
| index de94d0be0677ab76c97b0affa2a9559fa4f233d1..9252da1191cdf1e70b5d50ca841c42afc8347e0e 100644 |
| --- a/media/base/pipeline.cc |
| +++ b/media/base/pipeline.cc |
| @@ -22,6 +22,7 @@ |
| #include "media/base/filter_collection.h" |
| #include "media/base/media_log.h" |
| #include "media/base/video_decoder.h" |
| +#include "media/base/video_decoder_config.h" |
| #include "media/base/video_renderer.h" |
| using base::TimeDelta; |
| @@ -107,14 +108,15 @@ Pipeline::~Pipeline() { |
| void Pipeline::Start(scoped_ptr<FilterCollection> collection, |
| const PipelineStatusCB& ended_cb, |
| const PipelineStatusCB& error_cb, |
| - const PipelineStatusCB& start_cb) { |
| + const PipelineStatusCB& start_cb, |
| + const ReadyStateCB& ready_state_cb) { |
| base::AutoLock auto_lock(lock_); |
| CHECK(!running_) << "Media pipeline is already running"; |
| running_ = true; |
| message_loop_->PostTask(FROM_HERE, base::Bind( |
| &Pipeline::StartTask, this, base::Passed(&collection), |
| - ended_cb, error_cb, start_cb)); |
| + ended_cb, error_cb, start_cb, ready_state_cb)); |
| } |
| void Pipeline::Stop(const base::Closure& stop_cb) { |
| @@ -279,6 +281,9 @@ void Pipeline::ReportStatus(const PipelineStatusCB& cb, PipelineStatus status) { |
| void Pipeline::FinishInitialization() { |
| DCHECK(message_loop_->BelongsToCurrentThread()); |
| + if (!ready_state_cb_.is_null()) |
| + ready_state_cb_.Run(HaveEnoughData); |
|
scherkus (not reviewing)
2012/08/15 19:53:43
fix indent
acolwell GONE FROM CHROMIUM
2012/08/15 23:21:15
Done.
|
| + |
| // Execute the seek callback, if present. Note that this might be the |
| // initial callback passed into Start(). |
| ReportStatus(seek_cb_, status_); |
| @@ -547,13 +552,15 @@ void Pipeline::OnUpdateStatistics(const PipelineStatistics& stats) { |
| void Pipeline::StartTask(scoped_ptr<FilterCollection> filter_collection, |
| const PipelineStatusCB& ended_cb, |
| const PipelineStatusCB& error_cb, |
| - const PipelineStatusCB& start_cb) { |
| + const PipelineStatusCB& start_cb, |
|
Ami GONE FROM CHROMIUM
2012/08/15 18:00:08
AFAICT start_cb.Run() is always called with OK (el
scherkus (not reviewing)
2012/08/15 19:53:43
start_cb is set as seek_cb, meaning it will get ca
acolwell GONE FROM CHROMIUM
2012/08/15 23:21:15
So I've kept the callback for now, but I've rename
|
| + const ReadyStateCB& ready_state_cb) { |
| DCHECK(message_loop_->BelongsToCurrentThread()); |
| DCHECK_EQ(kCreated, state_); |
| filter_collection_ = filter_collection.Pass(); |
| ended_cb_ = ended_cb; |
| error_cb_ = error_cb; |
| seek_cb_ = start_cb; |
| + ready_state_cb_ = ready_state_cb; |
| // Kick off initialization. |
| pipeline_init_state_.reset(new PipelineInitState()); |
| @@ -619,9 +626,15 @@ void Pipeline::InitializeTask(PipelineStatus last_stage_status) { |
| // Assuming audio renderer was created, create video renderer. |
| if (state_ == kInitAudioRenderer) { |
| SetState(kInitVideoRenderer); |
| - if (InitializeVideoRenderer(demuxer_->GetStream(DemuxerStream::VIDEO))) { |
| + scoped_refptr<DemuxerStream> video_stream = |
| + demuxer_->GetStream(DemuxerStream::VIDEO); |
| + if (InitializeVideoRenderer(video_stream)) { |
| base::AutoLock auto_lock(lock_); |
| has_video_ = true; |
| + |
| + // Get an initial natural size so we have something when we signal |
| + // the HaveMetadata ready state. |
| + natural_size_ = video_stream->video_decoder_config().natural_size(); |
| return; |
| } |
| } |
| @@ -641,6 +654,9 @@ void Pipeline::InitializeTask(PipelineStatus last_stage_status) { |
| PlaybackRateChangedTask(GetPlaybackRate()); |
| VolumeChangedTask(GetVolume()); |
| + if (!ready_state_cb_.is_null()) |
| + ready_state_cb_.Run(HaveMetadata); |
| + |
| // Fire a seek request to get the renderers to preroll. We can skip a seek |
| // here as the demuxer should be at the start of the stream. |
| seek_pending_ = true; |