diff options
author | scherkus@chromium.org <scherkus@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98> | 2009-07-09 00:12:04 +0000 |
---|---|---|
committer | scherkus@chromium.org <scherkus@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98> | 2009-07-09 00:12:04 +0000 |
commit | 83548cfb4900fa35d3f34a88340f10d2bcce74fc (patch) | |
tree | 4317a48420047c6c3d170d4a430743b832cc9ef9 /media/base/pipeline_impl.cc | |
parent | cfdae27555853c2c57f7aa91179bc39407dc77bc (diff) | |
download | chromium_src-83548cfb4900fa35d3f34a88340f10d2bcce74fc.zip chromium_src-83548cfb4900fa35d3f34a88340f10d2bcce74fc.tar.gz chromium_src-83548cfb4900fa35d3f34a88340f10d2bcce74fc.tar.bz2 |
Big media::Pipeline cleanup.
Before I can even start refactoring, I need to remove a lot of accumulated cruft and fix some style stuff. PipelineStatus has been merged into Pipeline and I got rid of GetInterpolatedTime() as well as the ability to schedule callbacks when time has updated. We haven't found a need for these features and they introduced a good amount of code complexity.
TEST=media_unittests should still pass
BUG=16008
Review URL: http://codereview.chromium.org/149215
git-svn-id: svn://svn.chromium.org/chrome/trunk/src@20218 0039d316-1c4b-4281-b951-d872f2087c98
Diffstat (limited to 'media/base/pipeline_impl.cc')
-rw-r--r-- | media/base/pipeline_impl.cc | 293 |
1 files changed, 127 insertions, 166 deletions
diff --git a/media/base/pipeline_impl.cc b/media/base/pipeline_impl.cc index 16148d3..e9edc4f 100644 --- a/media/base/pipeline_impl.cc +++ b/media/base/pipeline_impl.cc @@ -54,110 +54,6 @@ PipelineImpl::~PipelineImpl() { Stop(); } -bool PipelineImpl::IsInitialized() const { - AutoLock auto_lock(const_cast<Lock&>(lock_)); - return initialized_; -} - -base::TimeDelta PipelineImpl::GetDuration() const { - AutoLock auto_lock(const_cast<Lock&>(lock_)); - return duration_; -} - -base::TimeDelta PipelineImpl::GetBufferedTime() const { - AutoLock auto_lock(const_cast<Lock&>(lock_)); - return buffered_time_; -} - -int64 PipelineImpl::GetTotalBytes() const { - AutoLock auto_lock(const_cast<Lock&>(lock_)); - return total_bytes_; -} - -int64 PipelineImpl::GetBufferedBytes() const { - AutoLock auto_lock(const_cast<Lock&>(lock_)); - return buffered_bytes_; -} - -void PipelineImpl::GetVideoSize(size_t* width_out, size_t* height_out) const { - DCHECK(width_out); - DCHECK(height_out); - AutoLock auto_lock(const_cast<Lock&>(lock_)); - *width_out = video_width_; - *height_out = video_height_; -} - -float PipelineImpl::GetVolume() const { - AutoLock auto_lock(const_cast<Lock&>(lock_)); - return volume_; -} - -float PipelineImpl::GetPlaybackRate() const { - AutoLock auto_lock(const_cast<Lock&>(lock_)); - return playback_rate_; -} - -base::TimeDelta PipelineImpl::GetTime() const { - AutoLock auto_lock(const_cast<Lock&>(lock_)); - return time_; -} - -base::TimeDelta PipelineImpl::GetInterpolatedTime() const { - AutoLock auto_lock(const_cast<Lock&>(lock_)); - base::TimeDelta time = time_; - if (playback_rate_ > 0.0f) { - base::TimeDelta delta = base::TimeTicks::Now() - ticks_at_last_set_time_; - if (playback_rate_ == 1.0f) { - time += delta; - } else { - int64 adjusted_delta = static_cast<int64>(delta.InMicroseconds() * - playback_rate_); - time += base::TimeDelta::FromMicroseconds(adjusted_delta); - } - } - return time; -} - -void PipelineImpl::SetTime(base::TimeDelta time) { - AutoLock auto_lock(lock_); - time_ = time; - ticks_at_last_set_time_ = base::TimeTicks::Now(); -} - -void PipelineImpl::InternalSetPlaybackRate(float rate) { - AutoLock auto_lock(lock_); - if (playback_rate_ == 0.0f && rate > 0.0f) { - ticks_at_last_set_time_ = base::TimeTicks::Now(); - } - playback_rate_ = rate; -} - -PipelineError PipelineImpl::GetError() const { - AutoLock auto_lock(const_cast<Lock&>(lock_)); - return error_; -} - -bool PipelineImpl::IsRendered(const std::string& major_mime_type) const { - AutoLock auto_lock(const_cast<Lock&>(lock_)); - bool is_rendered = (rendered_mime_types_.find(major_mime_type) != - rendered_mime_types_.end()); - return is_rendered; -} - - -bool PipelineImpl::InternalSetError(PipelineError error) { - // Don't want callers to set an error of "OK". STOPPING is a special value - // that should only be used internally by the StopTask() method. - DCHECK(PIPELINE_OK != error && PIPELINE_STOPPING != error); - AutoLock auto_lock(lock_); - bool changed_error = false; - if (PIPELINE_OK == error_) { - error_ = error; - changed_error = true; - } - return changed_error; -} - // Creates the PipelineThread and calls it's start method. bool PipelineImpl::Start(FilterFactory* factory, const std::string& url, @@ -192,6 +88,34 @@ void PipelineImpl::Stop() { ResetState(); } +void PipelineImpl::Seek(base::TimeDelta time, + PipelineCallback* seek_callback) { + DCHECK(!IsPipelineThread()); + + if (IsPipelineOk()) { + pipeline_thread_->Seek(time, seek_callback); + } else { + NOTREACHED(); + } +} + +bool PipelineImpl::IsInitialized() const { + AutoLock auto_lock(lock_); + return initialized_; +} + +bool PipelineImpl::IsRendered(const std::string& major_mime_type) const { + AutoLock auto_lock(lock_); + bool is_rendered = (rendered_mime_types_.find(major_mime_type) != + rendered_mime_types_.end()); + return is_rendered; +} + +float PipelineImpl::GetPlaybackRate() const { + AutoLock auto_lock(lock_); + return playback_rate_; +} + void PipelineImpl::SetPlaybackRate(float rate) { DCHECK(!IsPipelineThread()); @@ -203,15 +127,9 @@ void PipelineImpl::SetPlaybackRate(float rate) { } } -void PipelineImpl::Seek(base::TimeDelta time, - PipelineCallback* seek_callback) { - DCHECK(!IsPipelineThread()); - - if (IsPipelineOk()) { - pipeline_thread_->Seek(time, seek_callback); - } else { - NOTREACHED(); - } +float PipelineImpl::GetVolume() const { + AutoLock auto_lock(lock_); + return volume_; } void PipelineImpl::SetVolume(float volume) { @@ -224,6 +142,44 @@ void PipelineImpl::SetVolume(float volume) { } } +base::TimeDelta PipelineImpl::GetTime() const { + AutoLock auto_lock(lock_); + return time_; +} + +base::TimeDelta PipelineImpl::GetBufferedTime() const { + AutoLock auto_lock(lock_); + return buffered_time_; +} + +base::TimeDelta PipelineImpl::GetDuration() const { + AutoLock auto_lock(lock_); + return duration_; +} + +int64 PipelineImpl::GetBufferedBytes() const { + AutoLock auto_lock(lock_); + return buffered_bytes_; +} + +int64 PipelineImpl::GetTotalBytes() const { + AutoLock auto_lock(lock_); + return total_bytes_; +} + +void PipelineImpl::GetVideoSize(size_t* width_out, size_t* height_out) const { + CHECK(width_out); + CHECK(height_out); + AutoLock auto_lock(lock_); + *width_out = video_width_; + *height_out = video_height_; +} + +PipelineError PipelineImpl::GetError() const { + AutoLock auto_lock(lock_); + return error_; +} + void PipelineImpl::ResetState() { AutoLock auto_lock(lock_); pipeline_thread_ = NULL; @@ -238,7 +194,6 @@ void PipelineImpl::ResetState() { playback_rate_ = 0.0f; error_ = PIPELINE_OK; time_ = base::TimeDelta(); - ticks_at_last_set_time_ = base::TimeTicks::Now(); rendered_mime_types_.clear(); } @@ -277,6 +232,29 @@ void PipelineImpl::SetVideoSize(size_t width, size_t height) { video_height_ = height; } +void PipelineImpl::SetTime(base::TimeDelta time) { + AutoLock auto_lock(lock_); + time_ = time; +} + +void PipelineImpl::InternalSetPlaybackRate(float rate) { + AutoLock auto_lock(lock_); + playback_rate_ = rate; +} + +bool PipelineImpl::InternalSetError(PipelineError error) { + // Don't want callers to set an error of "OK". STOPPING is a special value + // that should only be used internally by the StopTask() method. + DCHECK(PIPELINE_OK != error && PIPELINE_STOPPING != error); + AutoLock auto_lock(lock_); + bool changed_error = false; + if (PIPELINE_OK == error_) { + error_ = error; + changed_error = true; + } + return changed_error; +} + void PipelineImpl::InsertRenderedMimeType(const std::string& major_mime_type) { AutoLock auto_lock(lock_); rendered_mime_types_.insert(major_mime_type); @@ -288,7 +266,6 @@ void PipelineImpl::InsertRenderedMimeType(const std::string& major_mime_type) { PipelineThread::PipelineThread(PipelineImpl* pipeline) : pipeline_(pipeline), thread_("PipelineThread"), - time_update_callback_scheduled_(false), state_(kCreated) { } @@ -308,7 +285,8 @@ bool PipelineThread::Start(FilterFactory* filter_factory, filter_factory_ = filter_factory; url_ = url; init_callback_.reset(init_complete_callback); - PostTask(NewRunnableMethod(this, &PipelineThread::StartTask)); + message_loop()->PostTask(FROM_HERE, + NewRunnableMethod(this, &PipelineThread::StartTask)); return true; } return false; @@ -319,7 +297,8 @@ bool PipelineThread::Start(FilterFactory* filter_factory, // stopped. void PipelineThread::Stop() { if (thread_.IsRunning()) { - PostTask(NewRunnableMethod(this, &PipelineThread::StopTask)); + message_loop()->PostTask(FROM_HERE, + NewRunnableMethod(this, &PipelineThread::StopTask)); thread_.Stop(); } DCHECK(filter_hosts_.empty()); @@ -327,37 +306,36 @@ void PipelineThread::Stop() { } // Called on client's thread. -void PipelineThread::SetPlaybackRate(float rate) { - PostTask(NewRunnableMethod(this, &PipelineThread::SetPlaybackRateTask, rate)); +void PipelineThread::Seek(base::TimeDelta time, + PipelineCallback* seek_callback) { + message_loop()->PostTask(FROM_HERE, + NewRunnableMethod(this, &PipelineThread::SeekTask, time, seek_callback)); } // Called on client's thread. -void PipelineThread::Seek(base::TimeDelta time, - PipelineCallback* seek_callback) { - PostTask(NewRunnableMethod(this, &PipelineThread::SeekTask, time, - seek_callback)); +void PipelineThread::SetPlaybackRate(float rate) { + message_loop()->PostTask(FROM_HERE, + NewRunnableMethod(this, &PipelineThread::SetPlaybackRateTask, rate)); } // Called on client's thread. void PipelineThread::SetVolume(float volume) { - PostTask(NewRunnableMethod(this, &PipelineThread::SetVolumeTask, volume)); + message_loop()->PostTask(FROM_HERE, + NewRunnableMethod(this, &PipelineThread::SetVolumeTask, volume)); } +// Called from any thread. void PipelineThread::InitializationComplete(FilterHostImpl* host) { if (IsPipelineOk()) { // Continue the start task by proceeding to the next stage. - PostTask(NewRunnableMethod(this, &PipelineThread::StartTask)); + message_loop()->PostTask(FROM_HERE, + NewRunnableMethod(this, &PipelineThread::StartTask)); } } -// Called from any thread. Updates the pipeline time and schedules a task to -// call back to filters that have registered a callback for time updates. +// Called from any thread. Updates the pipeline time. void PipelineThread::SetTime(base::TimeDelta time) { pipeline()->SetTime(time); - if (!time_update_callback_scheduled_) { - time_update_callback_scheduled_ = true; - PostTask(NewRunnableMethod(this, &PipelineThread::SetTimeTask)); - } } // Called from any thread. Sets the pipeline |error_| member and schedules a @@ -368,17 +346,19 @@ void PipelineThread::Error(PipelineError error) { // If this method returns false, then an error has already happened, so no // reason to run the StopTask again. It's going to happen. if (pipeline()->InternalSetError(error)) { - PostTask(NewRunnableMethod(this, &PipelineThread::StopTask)); + message_loop()->PostTask(FROM_HERE, + NewRunnableMethod(this, &PipelineThread::StopTask)); } } -// This is a helper method to post task on message_loop(). This method is only -// called from this class or from Pipeline. -void PipelineThread::PostTask(Task* task) { - message_loop()->PostTask(FROM_HERE, task); +// Called as a result of destruction of the thread. +// +// TODO(scherkus): this can block the client due to synchronous Stop() API call. +void PipelineThread::WillDestroyCurrentMessageLoop() { + STLDeleteElements(&filter_hosts_); + STLDeleteElements(&filter_threads_); } - // Main initialization method called on the pipeline thread. This code attempts // to use the specified filter factory to build a pipeline. // Initialization step performed in this method depends on current state of this @@ -603,29 +583,6 @@ void PipelineThread::SetVolumeTask(float volume) { } } -void PipelineThread::SetTimeTask() { - DCHECK_EQ(PlatformThread::CurrentId(), thread_.thread_id()); - - time_update_callback_scheduled_ = false; - for (FilterHostVector::iterator iter = filter_hosts_.begin(); - iter != filter_hosts_.end(); - ++iter) { - (*iter)->RunTimeUpdateCallback(pipeline_->time_); - } -} - -template <class Filter> -void PipelineThread::GetFilter(scoped_refptr<Filter>* filter_out) const { - DCHECK_EQ(PlatformThread::CurrentId(), thread_.thread_id()); - - *filter_out = NULL; - for (FilterHostVector::const_iterator iter = filter_hosts_.begin(); - iter != filter_hosts_.end() && NULL == *filter_out; - iter++) { - (*iter)->GetFilter(filter_out); - } -} - template <class Filter, class Source> void PipelineThread::CreateFilter(FilterFactory* filter_factory, Source source, @@ -723,12 +680,16 @@ bool PipelineThread::CreateRenderer() { return false; } -// Called as a result of destruction of the thread. -// -// TODO(scherkus): this can block the client due to synchronous Stop() API call. -void PipelineThread::WillDestroyCurrentMessageLoop() { - STLDeleteElements(&filter_hosts_); - STLDeleteElements(&filter_threads_); +template <class Filter> +void PipelineThread::GetFilter(scoped_refptr<Filter>* filter_out) const { + DCHECK_EQ(PlatformThread::CurrentId(), thread_.thread_id()); + + *filter_out = NULL; + for (FilterHostVector::const_iterator iter = filter_hosts_.begin(); + iter != filter_hosts_.end() && NULL == *filter_out; + iter++) { + (*iter)->GetFilter(filter_out); + } } } // namespace media |