summaryrefslogtreecommitdiffstats
path: root/media/base/pipeline_impl.cc
diff options
context:
space:
mode:
authorralphl@chromium.org <ralphl@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98>2009-02-10 06:28:43 +0000
committerralphl@chromium.org <ralphl@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98>2009-02-10 06:28:43 +0000
commit170dd4e20beb8cbcf84647157c009172b88d55e8 (patch)
tree58947ae4b6681e11224f940a6d78b227b334d195 /media/base/pipeline_impl.cc
parent91ffedf42400efa66c80f7f7b1f4780e776bcf2d (diff)
downloadchromium_src-170dd4e20beb8cbcf84647157c009172b88d55e8.zip
chromium_src-170dd4e20beb8cbcf84647157c009172b88d55e8.tar.gz
chromium_src-170dd4e20beb8cbcf84647157c009172b88d55e8.tar.bz2
Could you guys get on this one ASAP. My video render code depends on these methods. I also slipped in the critical section code stuff here too.
Review URL: http://codereview.chromium.org/19547 git-svn-id: svn://svn.chromium.org/chrome/trunk/src@9466 0039d316-1c4b-4281-b951-d872f2087c98
Diffstat (limited to 'media/base/pipeline_impl.cc')
-rw-r--r--media/base/pipeline_impl.cc93
1 files changed, 83 insertions, 10 deletions
diff --git a/media/base/pipeline_impl.cc b/media/base/pipeline_impl.cc
index 4f11d62..5792972 100644
--- a/media/base/pipeline_impl.cc
+++ b/media/base/pipeline_impl.cc
@@ -18,49 +18,100 @@ PipelineImpl::~PipelineImpl() {
}
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&>(video_size_access_lock_));
+ 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::InternalSetError(PipelineError error) {
+ AutoLock auto_lock(lock_);
+ bool changed_error = false;
+ DCHECK(PIPELINE_OK != error);
+ 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,
@@ -119,6 +170,7 @@ void PipelineImpl::SetVolume(float volume) {
}
void PipelineImpl::ResetState() {
+ AutoLock auto_lock(lock_);
pipeline_thread_ = NULL;
initialized_ = false;
duration_ = base::TimeDelta();
@@ -129,12 +181,33 @@ void PipelineImpl::ResetState() {
video_height_ = 0;
volume_ = 0.0f;
playback_rate_ = 0.0f;
- time_ = base::TimeDelta();
error_ = PIPELINE_OK;
+ time_ = base::TimeDelta();
+ ticks_at_last_set_time_ = base::TimeTicks::Now();
+}
+
+void PipelineImpl::SetDuration(base::TimeDelta duration) {
+ AutoLock auto_lock(lock_);
+ duration_ = duration;
+}
+
+void PipelineImpl::SetBufferedTime(base::TimeDelta buffered_time) {
+ AutoLock auto_lock(lock_);
+ buffered_time_ = buffered_time;
+}
+
+void PipelineImpl::SetTotalBytes(int64 total_bytes) {
+ AutoLock auto_lock(lock_);
+ total_bytes_ = total_bytes;
+}
+
+void PipelineImpl::SetBufferedBytes(int64 buffered_bytes) {
+ AutoLock auto_lock(lock_);
+ buffered_bytes_ = buffered_bytes;
}
void PipelineImpl::SetVideoSize(size_t width, size_t height) {
- AutoLock auto_lock(video_size_access_lock_);
+ AutoLock auto_lock(lock_);
width = width;
height = height;
}
@@ -221,7 +294,7 @@ void PipelineThread::InitializationComplete(FilterHostImpl* host) {
// 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.
void PipelineThread::SetTime(base::TimeDelta time) {
- pipeline()->time_ = time;
+ pipeline()->SetTime(time);
if (!time_update_callback_scheduled_) {
time_update_callback_scheduled_ = true;
PostTask(NewRunnableMethod(this, &PipelineThread::SetTimeTask));
@@ -233,9 +306,9 @@ void PipelineThread::SetTime(base::TimeDelta time) {
// continue to run until the client calls Pipeline::Stop, but nothing will
// be processed since filters will not be able to post tasks.
void PipelineThread::Error(PipelineError error) {
- DCHECK(PIPELINE_OK != error);
- if (PIPELINE_OK == pipeline()->error_) {
- pipeline()->error_ = 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));
}
}
@@ -296,7 +369,7 @@ void PipelineThread::StartTask(FilterFactory* filter_factory,
}
if (success) {
pipeline_->initialized_ = true;
- } else if (PIPELINE_OK == pipeline_->error_) {
+ } else {
Error(PIPELINE_ERROR_INITIALIZATION_FAILED);
}
@@ -342,7 +415,7 @@ void PipelineThread::InitializationCompleteTask(FilterHostImpl* host) {
}
void PipelineThread::SetPlaybackRateTask(float rate) {
- pipeline_->playback_rate_ = rate;
+ pipeline_->InternalSetPlaybackRate(rate);
FilterHostVector::iterator iter = filter_hosts_.begin();
while (iter != filter_hosts_.end()) {
(*iter)->media_filter()->SetPlaybackRate(rate);
@@ -434,7 +507,7 @@ bool PipelineThread::CreateFilter(FilterFactory* filter_factory,
// If this method fails, but no error set, then indicate a general
// initialization failure.
- if (PIPELINE_OK == pipeline_->error_ && (!success)) {
+ if (!success) {
Error(PIPELINE_ERROR_INITIALIZATION_FAILED);
}
return success;