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

Unified Diff: media/base/pipeline.cc

Issue 10854151: Allow transitioning to HAVE_METADATA before pipeline initialization completes. (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: Created 8 years, 4 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 side-by-side diff with in-line comments
Download patch
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;

Powered by Google App Engine
This is Rietveld 408576698