summaryrefslogtreecommitdiffstats
path: root/media/base/pipeline.cc
diff options
context:
space:
mode:
authorerikchen@chromium.org <erikchen@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98>2014-03-26 00:05:16 +0000
committererikchen@chromium.org <erikchen@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98>2014-03-26 00:05:16 +0000
commit0b3bf8a498bf255197f21ddba0f645a2a3a9e3bc (patch)
treeb24da4514899327a1a9870464cb7076389edc39a /media/base/pipeline.cc
parent923c7ad68f067f57afcb4edec224ac346f792ad3 (diff)
downloadchromium_src-0b3bf8a498bf255197f21ddba0f645a2a3a9e3bc.zip
chromium_src-0b3bf8a498bf255197f21ddba0f645a2a3a9e3bc.tar.gz
chromium_src-0b3bf8a498bf255197f21ddba0f645a2a3a9e3bc.tar.bz2
Revert of Remove Has{Audio,Video}(), GetInitialNaturalSize() from media::Pipeline. (https://codereview.chromium.org/211313004/)
Reason for revert: This CL breaks Linux Clang (dbg) Build http://build.chromium.org/p/chromium.linux/builders/Linux%20Clang%20%28dbg%29/builds/57597 http://build.chromium.org/p/chromium.linux/builders/Linux%20Clang%20%28dbg%29/builds/57598 from thakis: the problem is probably that ffmpeg_regression_tests doesn't link in gfx_geometry and you're missing a dep on that Original issue's description: > Remove Has{Audio,Video}(), GetInitialNaturalSize() from media::Pipeline. > > This splits PipelineBufferingStateCB in two: PipelineMetadataCB, which > includes the available tracks and natural size in a PipelineMetadata > struct; and PipelinePrerollCompleted, with no parameters. Now > WebMediaPlayerImpl can cache the metadata and the accessors are not > required. > > This was previously committed as r259154. > > BUG=148541 > > Committed: https://src.chromium.org/viewvc/chrome?view=rev&revision=259385 TBR=scherkus@chromium.org,dalecurtis@chromium.org,sandersd@chromium.org NOTREECHECKS=true NOTRY=true BUG=148541 Review URL: https://codereview.chromium.org/209043005 git-svn-id: svn://svn.chromium.org/chrome/trunk/src@259402 0039d316-1c4b-4281-b951-d872f2087c98
Diffstat (limited to 'media/base/pipeline.cc')
-rw-r--r--media/base/pipeline.cc99
1 files changed, 64 insertions, 35 deletions
diff --git a/media/base/pipeline.cc b/media/base/pipeline.cc
index 8c0ca54..824585f 100644
--- a/media/base/pipeline.cc
+++ b/media/base/pipeline.cc
@@ -45,6 +45,8 @@ Pipeline::Pipeline(
clock_(new Clock(&default_tick_clock_)),
waiting_for_clock_update_(false),
status_(PIPELINE_OK),
+ has_audio_(false),
+ has_video_(false),
state_(kCreated),
audio_ended_(false),
video_ended_(false),
@@ -72,29 +74,16 @@ void Pipeline::Start(scoped_ptr<FilterCollection> collection,
const base::Closure& ended_cb,
const PipelineStatusCB& error_cb,
const PipelineStatusCB& seek_cb,
- const PipelineMetadataCB& metadata_cb,
- const base::Closure& preroll_completed_cb,
+ const BufferingStateCB& buffering_state_cb,
const base::Closure& duration_change_cb) {
- DCHECK(!ended_cb.is_null());
- DCHECK(!error_cb.is_null());
- DCHECK(!seek_cb.is_null());
- DCHECK(!metadata_cb.is_null());
- DCHECK(!preroll_completed_cb.is_null());
-
base::AutoLock auto_lock(lock_);
CHECK(!running_) << "Media pipeline is already running";
- running_ = true;
-
- filter_collection_ = collection.Pass();
- ended_cb_ = ended_cb;
- error_cb_ = error_cb;
- seek_cb_ = seek_cb;
- metadata_cb_ = metadata_cb;
- preroll_completed_cb_ = preroll_completed_cb;
- duration_change_cb_ = duration_change_cb;
+ DCHECK(!buffering_state_cb.is_null());
- task_runner_->PostTask(
- FROM_HERE, base::Bind(&Pipeline::StartTask, base::Unretained(this)));
+ running_ = true;
+ task_runner_->PostTask(FROM_HERE, base::Bind(
+ &Pipeline::StartTask, base::Unretained(this), base::Passed(&collection),
+ ended_cb, error_cb, seek_cb, buffering_state_cb, duration_change_cb));
}
void Pipeline::Stop(const base::Closure& stop_cb) {
@@ -119,6 +108,16 @@ bool Pipeline::IsRunning() const {
return running_;
}
+bool Pipeline::HasAudio() const {
+ base::AutoLock auto_lock(lock_);
+ return has_audio_;
+}
+
+bool Pipeline::HasVideo() const {
+ base::AutoLock auto_lock(lock_);
+ return has_video_;
+}
+
float Pipeline::GetPlaybackRate() const {
base::AutoLock auto_lock(lock_);
return playback_rate_;
@@ -189,6 +188,11 @@ int64 Pipeline::GetTotalBytes() const {
return total_bytes_;
}
+gfx::Size Pipeline::GetInitialNaturalSize() const {
+ base::AutoLock auto_lock(lock_);
+ return initial_natural_size_;
+}
+
bool Pipeline::DidLoadingProgress() const {
base::AutoLock auto_lock(lock_);
bool ret = did_loading_progress_;
@@ -329,9 +333,8 @@ void Pipeline::OnAudioTimeUpdate(TimeDelta time, TimeDelta max_time) {
DCHECK(IsRunning());
base::AutoLock auto_lock(lock_);
- if (audio_disabled_)
+ if (!has_audio_)
return;
-
if (waiting_for_clock_update_ && time < clock_->Elapsed())
return;
@@ -348,7 +351,7 @@ void Pipeline::OnVideoTimeUpdate(TimeDelta max_time) {
DCHECK(IsRunning());
base::AutoLock auto_lock(lock_);
- if (audio_renderer_ && !audio_disabled_)
+ if (has_audio_)
return;
// TODO(scherkus): |state_| should only be accessed on pipeline thread, see
@@ -459,21 +462,20 @@ void Pipeline::StateTransitionTask(PipelineStatus status) {
// We do not want to start the clock running. We only want to set the
// base media time so our timestamp calculations will be correct.
clock_->SetTime(demuxer_->GetStartTime(), demuxer_->GetStartTime());
+
+ // TODO(scherkus): |has_audio_| should be true no matter what --
+ // otherwise people with muted/disabled sound cards will make our
+ // default controls look as if every video doesn't contain an audio
+ // track.
+ has_audio_ = audio_renderer_ != NULL && !audio_disabled_;
+ has_video_ = video_renderer_ != NULL;
}
if (!audio_renderer_ && !video_renderer_) {
done_cb.Run(PIPELINE_ERROR_COULD_NOT_RENDER);
return;
}
- {
- PipelineMetadata metadata;
- metadata.has_audio = audio_renderer_;
- metadata.has_video = video_renderer_;
- DemuxerStream* stream = demuxer_->GetStream(DemuxerStream::VIDEO);
- if (stream)
- metadata.natural_size = stream->video_decoder_config().natural_size();
- metadata_cb_.Run(metadata);
- }
+ buffering_state_cb_.Run(kHaveMetadata);
return DoInitialPreroll(done_cb);
@@ -486,7 +488,7 @@ void Pipeline::StateTransitionTask(PipelineStatus status) {
// We use audio stream to update the clock. So if there is such a
// stream, we pause the clock until we receive a valid timestamp.
waiting_for_clock_update_ = true;
- if (!audio_renderer_ || audio_disabled_) {
+ if (!has_audio_) {
clock_->SetMaxTime(clock_->Duration());
StartClockIfWaitingForTimeUpdate_Locked();
}
@@ -498,7 +500,7 @@ void Pipeline::StateTransitionTask(PipelineStatus status) {
// Fire canplaythrough immediately after playback begins because of
// crbug.com/106480.
// TODO(vrk): set ready state to HaveFutureData when bug above is fixed.
- preroll_completed_cb_.Run();
+ buffering_state_cb_.Run(kPrerollCompleted);
return base::ResetAndReturn(&seek_cb_).Run(PIPELINE_OK);
case kStopping:
@@ -729,11 +731,23 @@ void Pipeline::OnUpdateStatistics(const PipelineStatistics& stats) {
statistics_.video_frames_dropped += stats.video_frames_dropped;
}
-void Pipeline::StartTask() {
+void Pipeline::StartTask(scoped_ptr<FilterCollection> filter_collection,
+ const base::Closure& ended_cb,
+ const PipelineStatusCB& error_cb,
+ const PipelineStatusCB& seek_cb,
+ const BufferingStateCB& buffering_state_cb,
+ const base::Closure& duration_change_cb) {
DCHECK(task_runner_->BelongsToCurrentThread());
CHECK_EQ(kCreated, state_)
<< "Media pipeline cannot be started more than once";
+ filter_collection_ = filter_collection.Pass();
+ ended_cb_ = ended_cb;
+ error_cb_ = error_cb;
+ seek_cb_ = seek_cb;
+ buffering_state_cb_ = buffering_state_cb;
+ duration_change_cb_ = duration_change_cb;
+
text_renderer_ = filter_collection_->GetTextRenderer();
if (text_renderer_) {
@@ -911,6 +925,7 @@ void Pipeline::AudioDisabledTask() {
DCHECK(task_runner_->BelongsToCurrentThread());
base::AutoLock auto_lock(lock_);
+ has_audio_ = false;
audio_disabled_ = true;
// Notify our demuxer that we're no longer rendering audio.
@@ -959,9 +974,23 @@ void Pipeline::InitializeAudioRenderer(const PipelineStatusCB& done_cb) {
void Pipeline::InitializeVideoRenderer(const PipelineStatusCB& done_cb) {
DCHECK(task_runner_->BelongsToCurrentThread());
+ // Get an initial natural size so we have something when we signal
+ // the kHaveMetadata buffering state.
+ //
+ // TODO(acolwell): We have to query demuxer outside of the lock to prevent a
+ // deadlock between ChunkDemuxer and Pipeline. See http://crbug.com/334325 for
+ // ideas on removing locking from ChunkDemuxer.
+ DemuxerStream* stream = demuxer_->GetStream(DemuxerStream::VIDEO);
+ gfx::Size initial_natural_size =
+ stream->video_decoder_config().natural_size();
+ {
+ base::AutoLock l(lock_);
+ initial_natural_size_ = initial_natural_size;
+ }
+
video_renderer_ = filter_collection_->GetVideoRenderer();
video_renderer_->Initialize(
- demuxer_->GetStream(DemuxerStream::VIDEO),
+ stream,
done_cb,
base::Bind(&Pipeline::OnUpdateStatistics, base::Unretained(this)),
base::Bind(&Pipeline::OnVideoTimeUpdate, base::Unretained(this)),