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