| Index: media/filters/video_renderer_base.cc
|
| diff --git a/media/filters/video_renderer_base.cc b/media/filters/video_renderer_base.cc
|
| index 7eace6f71833779124a17f07eca6a63812569772..3ca45dc63b73f1cc42caff89a58156bfb49f167d 100644
|
| --- a/media/filters/video_renderer_base.cc
|
| +++ b/media/filters/video_renderer_base.cc
|
| @@ -81,7 +81,7 @@ void VideoRendererBase::SetPlaybackRate(float playback_rate) {
|
| playback_rate_ = playback_rate;
|
| }
|
|
|
| -void VideoRendererBase::Seek(base::TimeDelta time) {
|
| +void VideoRendererBase::Seek(base::TimeDelta time, FilterCallback* callback) {
|
| AutoLock auto_lock(lock_);
|
| // We need the first frame in |frames_| to run the VideoRendererBase main
|
| // loop, but we don't need decoded frames after the first frame since we are
|
| @@ -93,29 +93,44 @@ void VideoRendererBase::Seek(base::TimeDelta time) {
|
| }
|
| }
|
|
|
| -bool VideoRendererBase::Initialize(VideoDecoder* decoder) {
|
| +void VideoRendererBase::Initialize(VideoDecoder* decoder,
|
| + FilterCallback* callback) {
|
| AutoLock auto_lock(lock_);
|
| + DCHECK(decoder);
|
| + DCHECK(callback);
|
| DCHECK_EQ(state_, UNINITIALIZED);
|
| state_ = INITIALIZING;
|
| decoder_ = decoder;
|
| + initialize_callback_.reset(callback);
|
|
|
| // Notify the pipeline of the video dimensions.
|
| int width = 0;
|
| int height = 0;
|
| - if (!ParseMediaFormat(decoder->media_format(), &width, &height))
|
| - return false;
|
| + if (!ParseMediaFormat(decoder->media_format(), &width, &height)) {
|
| + host()->Error(PIPELINE_ERROR_INITIALIZATION_FAILED);
|
| + initialize_callback_->Run();
|
| + initialize_callback_.reset();
|
| + return;
|
| + }
|
| host()->SetVideoSize(width, height);
|
|
|
| // Initialize the subclass.
|
| // TODO(scherkus): do we trust subclasses not to do something silly while
|
| // we're holding the lock?
|
| - if (!OnInitialize(decoder))
|
| - return false;
|
| + if (!OnInitialize(decoder)) {
|
| + host()->Error(PIPELINE_ERROR_INITIALIZATION_FAILED);
|
| + initialize_callback_->Run();
|
| + initialize_callback_.reset();
|
| + return;
|
| + }
|
|
|
| // Create our video thread.
|
| if (!PlatformThread::Create(0, this, &thread_)) {
|
| NOTREACHED() << "Video thread creation failed";
|
| - return false;
|
| + host()->Error(PIPELINE_ERROR_INITIALIZATION_FAILED);
|
| + initialize_callback_->Run();
|
| + initialize_callback_.reset();
|
| + return;
|
| }
|
|
|
| #if defined(OS_WIN)
|
| @@ -128,8 +143,6 @@ bool VideoRendererBase::Initialize(VideoDecoder* decoder) {
|
| for (size_t i = 0; i < kMaxFrames; ++i) {
|
| ScheduleRead();
|
| }
|
| -
|
| - return true;
|
| }
|
|
|
| // PlatformThread::Delegate implementation.
|
| @@ -248,11 +261,15 @@ void VideoRendererBase::OnReadComplete(VideoFrame* frame) {
|
| if (frames_.empty()) {
|
| // We should have initialized but there's no decoded frames in the queue.
|
| // Raise an error.
|
| + state_ = ERRORED;
|
| host()->Error(PIPELINE_ERROR_NO_DATA);
|
| + initialize_callback_->Run();
|
| + initialize_callback_.reset();
|
| } else {
|
| state_ = INITIALIZED;
|
| current_frame_ = frames_.front();
|
| - host()->InitializationComplete();
|
| + initialize_callback_->Run();
|
| + initialize_callback_.reset();
|
| }
|
| }
|
| }
|
| @@ -266,12 +283,11 @@ bool VideoRendererBase::WaitForInitialized() {
|
| // initialized so we can call OnFrameAvailable() to provide subclasses with
|
| // the first frame.
|
| AutoLock auto_lock(lock_);
|
| - DCHECK_EQ(state_, INITIALIZING);
|
| while (state_ == INITIALIZING) {
|
| frame_available_.Wait();
|
| - if (state_ == STOPPED) {
|
| - return false;
|
| - }
|
| + }
|
| + if (state_ == STOPPED || state_ == ERRORED) {
|
| + return false;
|
| }
|
| DCHECK_EQ(state_, INITIALIZED);
|
| DCHECK(current_frame_);
|
|
|