| OLD | NEW | 
|---|
| 1 // Copyright (c) 2008-2009 The Chromium Authors. All rights reserved. | 1 // Copyright (c) 2008-2009 The Chromium Authors. All rights reserved. | 
| 2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be | 
| 3 // found in the LICENSE file. | 3 // found in the LICENSE file. | 
| 4 // | 4 // | 
| 5 // TODO(scherkus): clean up PipelineImpl... too many crazy function names, | 5 // TODO(scherkus): clean up PipelineImpl... too many crazy function names, | 
| 6 // potential deadlocks, etc... | 6 // potential deadlocks, etc... | 
| 7 | 7 | 
| 8 #include "base/compiler_specific.h" | 8 #include "base/compiler_specific.h" | 
| 9 #include "base/condition_variable.h" | 9 #include "base/condition_variable.h" | 
| 10 #include "base/stl_util-inl.h" | 10 #include "base/stl_util-inl.h" | 
| (...skipping 152 matching lines...) Expand 10 before | Expand all | Expand 10 after  Loading... | 
| 163     return; | 163     return; | 
| 164   } | 164   } | 
| 165 | 165 | 
| 166   AutoLock auto_lock(lock_); | 166   AutoLock auto_lock(lock_); | 
| 167   volume_ = volume; | 167   volume_ = volume; | 
| 168   if (pipeline_internal_) { | 168   if (pipeline_internal_) { | 
| 169     pipeline_internal_->VolumeChanged(volume); | 169     pipeline_internal_->VolumeChanged(volume); | 
| 170   } | 170   } | 
| 171 } | 171 } | 
| 172 | 172 | 
| 173 base::TimeDelta PipelineImpl::GetTime() const { | 173 base::TimeDelta PipelineImpl::GetCurrentTime() const { | 
| 174   AutoLock auto_lock(lock_); | 174   AutoLock auto_lock(lock_); | 
| 175   return time_; | 175   return time_; | 
| 176 } | 176 } | 
| 177 | 177 | 
| 178 base::TimeDelta PipelineImpl::GetBufferedTime() const { | 178 base::TimeDelta PipelineImpl::GetBufferedTime() const { | 
| 179   AutoLock auto_lock(lock_); | 179   AutoLock auto_lock(lock_); | 
| 180   return buffered_time_; | 180   return buffered_time_; | 
| 181 } | 181 } | 
| 182 | 182 | 
| 183 base::TimeDelta PipelineImpl::GetDuration() const { | 183 base::TimeDelta PipelineImpl::GetDuration() const { | 
| (...skipping 145 matching lines...) Expand 10 before | Expand all | Expand 10 after  Loading... | 
| 329 } | 329 } | 
| 330 | 330 | 
| 331 // Called from any thread.  Updates the pipeline time. | 331 // Called from any thread.  Updates the pipeline time. | 
| 332 void PipelineInternal::SetTime(base::TimeDelta time) { | 332 void PipelineInternal::SetTime(base::TimeDelta time) { | 
| 333   // TODO(scherkus): why not post a task? | 333   // TODO(scherkus): why not post a task? | 
| 334   pipeline_->SetTime(time); | 334   pipeline_->SetTime(time); | 
| 335 } | 335 } | 
| 336 | 336 | 
| 337 // Called from any thread.  Sets the pipeline |error_| member and destroys all | 337 // Called from any thread.  Sets the pipeline |error_| member and destroys all | 
| 338 // filters. | 338 // filters. | 
| 339 void PipelineInternal::Error(PipelineError error) { | 339 void PipelineInternal::SetError(PipelineError error) { | 
| 340   message_loop_->PostTask(FROM_HERE, | 340   message_loop_->PostTask(FROM_HERE, | 
| 341       NewRunnableMethod(this, &PipelineInternal::ErrorTask, error)); | 341       NewRunnableMethod(this, &PipelineInternal::ErrorTask, error)); | 
| 342 } | 342 } | 
| 343 | 343 | 
| 344 // Called from any thread. | 344 // Called from any thread. | 
| 345 void PipelineInternal::OnFilterInitialize() { | 345 void PipelineInternal::OnFilterInitialize() { | 
| 346   // Continue the initialize task by proceeding to the next stage. | 346   // Continue the initialize task by proceeding to the next stage. | 
| 347   message_loop_->PostTask(FROM_HERE, | 347   message_loop_->PostTask(FROM_HERE, | 
| 348       NewRunnableMethod(this, &PipelineInternal::InitializeTask)); | 348       NewRunnableMethod(this, &PipelineInternal::InitializeTask)); | 
| 349 } | 349 } | 
| (...skipping 87 matching lines...) Expand 10 before | Expand all | Expand 10 after  Loading... | 
| 437   if (state_ == kInitVideoDecoder) { | 437   if (state_ == kInitVideoDecoder) { | 
| 438     state_ = kInitVideoRenderer; | 438     state_ = kInitVideoRenderer; | 
| 439     if (CreateRenderer<VideoDecoder, VideoRenderer>()) { | 439     if (CreateRenderer<VideoDecoder, VideoRenderer>()) { | 
| 440       pipeline_->InsertRenderedMimeType(VideoDecoder::major_mime_type()); | 440       pipeline_->InsertRenderedMimeType(VideoDecoder::major_mime_type()); | 
| 441       return; | 441       return; | 
| 442     } | 442     } | 
| 443   } | 443   } | 
| 444 | 444 | 
| 445   if (state_ == kInitVideoRenderer) { | 445   if (state_ == kInitVideoRenderer) { | 
| 446     if (!IsPipelineOk() || pipeline_->rendered_mime_types_.empty()) { | 446     if (!IsPipelineOk() || pipeline_->rendered_mime_types_.empty()) { | 
| 447       Error(PIPELINE_ERROR_COULD_NOT_RENDER); | 447       SetError(PIPELINE_ERROR_COULD_NOT_RENDER); | 
| 448       return; | 448       return; | 
| 449     } | 449     } | 
| 450 | 450 | 
| 451     // Initialization was successful, set the volume and playback rate. | 451     // Initialization was successful, set the volume and playback rate. | 
| 452     PlaybackRateChangedTask(pipeline_->GetPlaybackRate()); | 452     PlaybackRateChangedTask(pipeline_->GetPlaybackRate()); | 
| 453     VolumeChangedTask(pipeline_->GetVolume()); | 453     VolumeChangedTask(pipeline_->GetVolume()); | 
| 454 | 454 | 
| 455     state_ = kStarted; | 455     state_ = kStarted; | 
| 456     filter_factory_ = NULL; | 456     filter_factory_ = NULL; | 
| 457     if (start_callback_.get()) { | 457     if (start_callback_.get()) { | 
| (...skipping 118 matching lines...) Expand 10 before | Expand all | Expand 10 after  Loading... | 
| 576 template <class Filter, class Source> | 576 template <class Filter, class Source> | 
| 577 void PipelineInternal::CreateFilter(FilterFactory* filter_factory, | 577 void PipelineInternal::CreateFilter(FilterFactory* filter_factory, | 
| 578                                     Source source, | 578                                     Source source, | 
| 579                                     const MediaFormat& media_format) { | 579                                     const MediaFormat& media_format) { | 
| 580   DCHECK_EQ(MessageLoop::current(), message_loop_); | 580   DCHECK_EQ(MessageLoop::current(), message_loop_); | 
| 581   DCHECK(IsPipelineOk()); | 581   DCHECK(IsPipelineOk()); | 
| 582 | 582 | 
| 583   // Create the filter. | 583   // Create the filter. | 
| 584   scoped_refptr<Filter> filter = filter_factory->Create<Filter>(media_format); | 584   scoped_refptr<Filter> filter = filter_factory->Create<Filter>(media_format); | 
| 585   if (!filter) { | 585   if (!filter) { | 
| 586     Error(PIPELINE_ERROR_REQUIRED_FILTER_MISSING); | 586     SetError(PIPELINE_ERROR_REQUIRED_FILTER_MISSING); | 
| 587     return; | 587     return; | 
| 588   } | 588   } | 
| 589 | 589 | 
| 590   // Create a dedicated thread for this filter if applicable. | 590   // Create a dedicated thread for this filter if applicable. | 
| 591   if (SupportsSetMessageLoop<Filter>()) { | 591   if (SupportsSetMessageLoop<Filter>()) { | 
| 592     scoped_ptr<base::Thread> thread(new base::Thread(GetThreadName<Filter>())); | 592     scoped_ptr<base::Thread> thread(new base::Thread(GetThreadName<Filter>())); | 
| 593     if (!thread.get() || !thread->Start()) { | 593     if (!thread.get() || !thread->Start()) { | 
| 594       NOTREACHED() << "Could not start filter thread"; | 594       NOTREACHED() << "Could not start filter thread"; | 
| 595       Error(PIPELINE_ERROR_INITIALIZATION_FAILED); | 595       SetError(PIPELINE_ERROR_INITIALIZATION_FAILED); | 
| 596       return; | 596       return; | 
| 597     } | 597     } | 
| 598 | 598 | 
| 599     filter->set_message_loop(thread->message_loop()); | 599     filter->set_message_loop(thread->message_loop()); | 
| 600     filter_threads_.push_back(thread.release()); | 600     filter_threads_.push_back(thread.release()); | 
| 601   } | 601   } | 
| 602 | 602 | 
| 603   // Create the filter's host. | 603   // Create the filter's host. | 
| 604   DCHECK(IsPipelineOk()); | 604   DCHECK(IsPipelineOk()); | 
| 605   scoped_ptr<FilterHostImpl> host(new FilterHostImpl(this, filter.get())); | 605   scoped_ptr<FilterHostImpl> host(new FilterHostImpl(this, filter.get())); | 
| (...skipping 120 matching lines...) Expand 10 before | Expand all | Expand 10 after  Loading... | 
| 726   } | 726   } | 
| 727 | 727 | 
| 728   // Reset the pipeline, which will decrement a reference to this object. | 728   // Reset the pipeline, which will decrement a reference to this object. | 
| 729   // We will get destroyed as soon as the remaining tasks finish executing. | 729   // We will get destroyed as soon as the remaining tasks finish executing. | 
| 730   // To be safe, we'll set our pipeline reference to NULL. | 730   // To be safe, we'll set our pipeline reference to NULL. | 
| 731   STLDeleteElements(&filter_hosts_); | 731   STLDeleteElements(&filter_hosts_); | 
| 732   STLDeleteElements(&filter_threads_); | 732   STLDeleteElements(&filter_threads_); | 
| 733 } | 733 } | 
| 734 | 734 | 
| 735 }  // namespace media | 735 }  // namespace media | 
| OLD | NEW | 
|---|