| Index: media/base/pipeline.cc
|
| diff --git a/media/base/pipeline.cc b/media/base/pipeline.cc
|
| index c1f63c40ea22734143788ea0c6557c259f6ab694..44ffdf6d86cf38fcade38e66477e75d65cbc67d7 100644
|
| --- a/media/base/pipeline.cc
|
| +++ b/media/base/pipeline.cc
|
| @@ -71,7 +71,6 @@ Pipeline::Pipeline(MessageLoop* message_loop, MediaLog* media_log)
|
| media_log_(media_log),
|
| running_(false),
|
| seek_pending_(false),
|
| - stop_pending_(false),
|
| tearing_down_(false),
|
| error_caused_teardown_(false),
|
| playback_rate_change_pending_(false),
|
| @@ -100,7 +99,7 @@ Pipeline::Pipeline(MessageLoop* message_loop, MediaLog* media_log)
|
| Pipeline::~Pipeline() {
|
| base::AutoLock auto_lock(lock_);
|
| DCHECK(!running_) << "Stop() must complete before destroying object";
|
| - DCHECK(!stop_pending_);
|
| + DCHECK(stop_cb_.is_null());
|
| DCHECK(!seek_pending_);
|
|
|
| media_log_->AddEvent(
|
| @@ -142,23 +141,6 @@ bool Pipeline::IsRunning() const {
|
| return running_;
|
| }
|
|
|
| -bool Pipeline::IsInitialized() const {
|
| - // TODO(scherkus): perhaps replace this with a bool that is set/get under the
|
| - // lock, because this is breaching the contract that |state_| is only accessed
|
| - // on |message_loop_|.
|
| - base::AutoLock auto_lock(lock_);
|
| - switch (state_) {
|
| - case kPausing:
|
| - case kFlushing:
|
| - case kSeeking:
|
| - case kStarting:
|
| - case kStarted:
|
| - return true;
|
| - default:
|
| - return false;
|
| - }
|
| -}
|
| -
|
| bool Pipeline::HasAudio() const {
|
| base::AutoLock auto_lock(lock_);
|
| return has_audio_;
|
| @@ -256,6 +238,21 @@ PipelineStatistics Pipeline::GetStatistics() const {
|
| return statistics_;
|
| }
|
|
|
| +bool Pipeline::IsInitializedForTesting() {
|
| + DCHECK(message_loop_->BelongsToCurrentThread())
|
| + << "Tests should run on the same thread as Pipeline";
|
| + switch (state_) {
|
| + case kPausing:
|
| + case kFlushing:
|
| + case kSeeking:
|
| + case kStarting:
|
| + case kStarted:
|
| + return true;
|
| + default:
|
| + return false;
|
| + }
|
| +}
|
| +
|
| void Pipeline::SetClockForTesting(Clock* clock) {
|
| clock_.reset(clock);
|
| }
|
| @@ -290,11 +287,6 @@ bool Pipeline::IsPipelineTearingDown() {
|
| return tearing_down_;
|
| }
|
|
|
| -bool Pipeline::IsPipelineStopPending() {
|
| - DCHECK(message_loop_->BelongsToCurrentThread());
|
| - return stop_pending_;
|
| -}
|
| -
|
| bool Pipeline::IsPipelineSeeking() {
|
| DCHECK(message_loop_->BelongsToCurrentThread());
|
| if (!seek_pending_)
|
| @@ -342,7 +334,7 @@ Pipeline::State Pipeline::FindNextState(State current) {
|
| // We will always honor Seek() before Stop(). This is based on the
|
| // assumption that we never accept Seek() after Stop().
|
| DCHECK(IsPipelineSeeking() ||
|
| - IsPipelineStopPending() ||
|
| + !stop_cb_.is_null() ||
|
| IsPipelineTearingDown());
|
| return IsPipelineSeeking() ? kSeeking : kStopping;
|
| } else if (current == kSeeking) {
|
| @@ -632,7 +624,7 @@ void Pipeline::InitializeTask(PipelineStatus last_stage_status) {
|
| }
|
|
|
| // If we have received the stop or error signal, return immediately.
|
| - if (IsPipelineStopPending() || IsPipelineStopped() || !IsPipelineOk())
|
| + if (!stop_cb_.is_null() || IsPipelineStopped() || !IsPipelineOk())
|
| return;
|
|
|
| DCHECK(state_ == kInitDemuxer ||
|
| @@ -713,7 +705,7 @@ void Pipeline::InitializeTask(PipelineStatus last_stage_status) {
|
| // additional calls, however most of this logic will be changing.
|
| void Pipeline::StopTask(const base::Closure& stop_cb) {
|
| DCHECK(message_loop_->BelongsToCurrentThread());
|
| - DCHECK(!IsPipelineStopPending());
|
| + DCHECK(stop_cb_.is_null());
|
| DCHECK_NE(state_, kStopped);
|
|
|
| if (video_decoder_) {
|
| @@ -733,7 +725,6 @@ void Pipeline::StopTask(const base::Closure& stop_cb) {
|
|
|
| stop_cb_ = stop_cb;
|
|
|
| - stop_pending_ = true;
|
| if (!IsPipelineSeeking() && !IsPipelineTearingDown()) {
|
| // We will tear down pipeline immediately when there is no seek operation
|
| // pending and no teardown in progress. This should include the case where
|
| @@ -806,7 +797,7 @@ void Pipeline::VolumeChangedTask(float volume) {
|
|
|
| void Pipeline::SeekTask(TimeDelta time, const PipelineStatusCB& seek_cb) {
|
| DCHECK(message_loop_->BelongsToCurrentThread());
|
| - DCHECK(!IsPipelineStopPending());
|
| + DCHECK(stop_cb_.is_null());
|
|
|
| // Suppress seeking if we're not fully started.
|
| if (state_ != kStarted) {
|
| @@ -976,8 +967,8 @@ void Pipeline::FilterStateTransitionTask() {
|
| StartClockIfWaitingForTimeUpdate_Locked();
|
| }
|
|
|
| - if (IsPipelineStopPending()) {
|
| - // We had a pending stop request need to be honored right now.
|
| + // Check if we have a pending stop request that needs to be honored.
|
| + if (!stop_cb_.is_null()) {
|
| TearDownPipeline();
|
| }
|
| } else {
|
| @@ -1034,8 +1025,7 @@ void Pipeline::FinishDestroyingFiltersTask() {
|
| if (error_caused_teardown_ && !IsPipelineOk() && !error_cb_.is_null())
|
| error_cb_.Run(status_);
|
|
|
| - if (stop_pending_) {
|
| - stop_pending_ = false;
|
| + if (!stop_cb_.is_null()) {
|
| {
|
| base::AutoLock l(lock_);
|
| running_ = false;
|
| @@ -1194,9 +1184,13 @@ void Pipeline::TearDownPipeline() {
|
| DCHECK(message_loop_->BelongsToCurrentThread());
|
| DCHECK_NE(kStopped, state_);
|
|
|
| - DCHECK(!tearing_down_ || // Teardown on Stop().
|
| - (tearing_down_ && error_caused_teardown_) || // Teardown on error.
|
| - (tearing_down_ && stop_pending_)); // Stop during teardown by error.
|
| + // We're either...
|
| + // 1) ...tearing down due to Stop() (it doesn't set tearing_down_)
|
| + // 2) ...tearing down due to an error (it does set tearing_down_)
|
| + // 3) ...tearing down due to an error and Stop() was called during that time
|
| + DCHECK(!tearing_down_ ||
|
| + (tearing_down_ && error_caused_teardown_) ||
|
| + (tearing_down_ && !stop_cb_.is_null()));
|
|
|
| // Mark that we already start tearing down operation.
|
| tearing_down_ = true;
|
|
|