| Index: media/base/pipeline_impl.cc
|
| diff --git a/media/base/pipeline_impl.cc b/media/base/pipeline_impl.cc
|
| index 16148d342d26cd81e1bdb6c353487f3ced656f5f..e9edc4fe2955ba4a6d10d39ed187e8e6dfb7db2f 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
|
|
|