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

Unified Diff: media/base/pipeline.cc

Issue 294133003: Extract media::Clock::IsPlaying() into media::Pipeline::ClockState enum. (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: fixes + rebase Created 6 years, 7 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
« no previous file with comments | « media/base/pipeline.h ('k') | media/base/pipeline_unittest.cc » ('j') | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
Index: media/base/pipeline.cc
diff --git a/media/base/pipeline.cc b/media/base/pipeline.cc
index e177e188c90be6a6a5c9984415279555cdd8d48a..5cfc144bc3823e0de96eed5345a952526709fc57 100644
--- a/media/base/pipeline.cc
+++ b/media/base/pipeline.cc
@@ -42,7 +42,7 @@ Pipeline::Pipeline(
volume_(1.0f),
playback_rate_(0.0f),
clock_(new Clock(&default_tick_clock_)),
- waiting_for_clock_update_(false),
+ clock_state_(CLOCK_PAUSED),
status_(PIPELINE_OK),
state_(kCreated),
audio_ended_(false),
@@ -297,8 +297,10 @@ void Pipeline::OnAudioTimeUpdate(TimeDelta time, TimeDelta max_time) {
DCHECK(IsRunning());
base::AutoLock auto_lock(lock_);
- if (waiting_for_clock_update_ && time < clock_->Elapsed())
+ if (clock_state_ == CLOCK_WAITING_FOR_AUDIO_TIME_UPDATE &&
+ time < clock_->Elapsed()) {
return;
+ }
// TODO(scherkus): |state_| should only be accessed on pipeline thread, see
// http://crbug.com/137973
@@ -321,7 +323,7 @@ void Pipeline::OnVideoTimeUpdate(TimeDelta max_time) {
if (state_ == kSeeking)
return;
- DCHECK(!waiting_for_clock_update_);
+ DCHECK_NE(clock_state_, CLOCK_WAITING_FOR_AUDIO_TIME_UPDATE);
clock_->SetMaxTime(max_time);
}
@@ -753,12 +755,8 @@ void Pipeline::SeekTask(TimeDelta time, const PipelineStatusCB& seek_cb) {
// Kick off seeking!
{
- if (audio_renderer_)
- audio_renderer_->StopRendering();
-
base::AutoLock auto_lock(lock_);
- if (clock_->IsPlaying())
- clock_->Pause();
+ PauseClockAndStopRendering_Locked();
clock_->SetTime(seek_timestamp, seek_timestamp);
}
DoSeek(seek_timestamp, base::Bind(
@@ -822,7 +820,8 @@ void Pipeline::RunEndedCallbackIfNeeded() {
{
base::AutoLock auto_lock(lock_);
- clock_->EndOfStream();
+ PauseClockAndStopRendering_Locked();
+ clock_->SetTime(clock_->Duration(), clock_->Duration());
}
DCHECK_EQ(status_, PIPELINE_OK);
@@ -931,27 +930,25 @@ void Pipeline::StartWaitingForEnoughData() {
DCHECK_EQ(state_, kPlaying);
DCHECK(WaitingForEnoughData());
- if (audio_renderer_)
- audio_renderer_->StopRendering();
-
base::AutoLock auto_lock(lock_);
- clock_->Pause();
+ PauseClockAndStopRendering_Locked();
}
void Pipeline::StartPlayback() {
DVLOG(1) << __FUNCTION__;
DCHECK_EQ(state_, kPlaying);
+ DCHECK_EQ(clock_state_, CLOCK_PAUSED);
DCHECK(!WaitingForEnoughData());
if (audio_renderer_) {
// 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.
base::AutoLock auto_lock(lock_);
- waiting_for_clock_update_ = true;
+ clock_state_ = CLOCK_WAITING_FOR_AUDIO_TIME_UPDATE;
audio_renderer_->StartRendering();
} else {
base::AutoLock auto_lock(lock_);
- DCHECK(!waiting_for_clock_update_);
+ clock_state_ = CLOCK_PLAYING;
clock_->SetMaxTime(clock_->Duration());
clock_->Play();
}
@@ -961,12 +958,32 @@ void Pipeline::StartPlayback() {
base::ResetAndReturn(&seek_cb_).Run(PIPELINE_OK);
}
+void Pipeline::PauseClockAndStopRendering_Locked() {
+ lock_.AssertAcquired();
+ switch (clock_state_) {
+ case CLOCK_PAUSED:
+ return;
+
+ case CLOCK_WAITING_FOR_AUDIO_TIME_UPDATE:
+ audio_renderer_->StopRendering();
+ break;
+
+ case CLOCK_PLAYING:
+ if (audio_renderer_)
+ audio_renderer_->StopRendering();
+ clock_->Pause();
+ break;
+ }
+
+ clock_state_ = CLOCK_PAUSED;
+}
+
void Pipeline::StartClockIfWaitingForTimeUpdate_Locked() {
lock_.AssertAcquired();
- if (!waiting_for_clock_update_)
+ if (clock_state_ != CLOCK_WAITING_FOR_AUDIO_TIME_UPDATE)
return;
- waiting_for_clock_update_ = false;
+ clock_state_ = CLOCK_PLAYING;
clock_->Play();
}
« no previous file with comments | « media/base/pipeline.h ('k') | media/base/pipeline_unittest.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698