Chromium Code Reviews| Index: media/filters/video_renderer_base.cc |
| diff --git a/media/filters/video_renderer_base.cc b/media/filters/video_renderer_base.cc |
| index 8f6bf8a3d0254dc82578f0fb4a5f7b20f1a7f029..07c0141bf71c740076237e34d953d62d85ffd01b 100644 |
| --- a/media/filters/video_renderer_base.cc |
| +++ b/media/filters/video_renderer_base.cc |
| @@ -7,6 +7,7 @@ |
| #include "base/bind.h" |
| #include "base/callback.h" |
| #include "base/callback_helpers.h" |
| +#include "base/message_loop.h" |
| #include "base/threading/platform_thread.h" |
| #include "media/base/buffers.h" |
| #include "media/base/limits.h" |
| @@ -19,9 +20,11 @@ base::TimeDelta VideoRendererBase::kMaxLastFrameDuration() { |
| return base::TimeDelta::FromMilliseconds(250); |
| } |
| -VideoRendererBase::VideoRendererBase(const base::Closure& paint_cb, |
| - const SetOpaqueCB& set_opaque_cb, |
| - bool drop_frames) |
| +VideoRendererBase::VideoRendererBase( |
| + const base::Closure& paint_cb, |
| + const SetOpaqueCB& set_opaque_cb, |
| + bool drop_frames, |
| + const scoped_refptr<base::MessageLoopProxy>& message_loop) |
| : frame_available_(&lock_), |
| state_(kUninitialized), |
| thread_(base::kNullThreadHandle), |
| @@ -31,7 +34,8 @@ VideoRendererBase::VideoRendererBase(const base::Closure& paint_cb, |
| drop_frames_(drop_frames), |
| playback_rate_(0), |
| paint_cb_(paint_cb), |
| - set_opaque_cb_(set_opaque_cb) { |
| + set_opaque_cb_(set_opaque_cb), |
| + decoder_message_loop_(message_loop) { |
|
Ami GONE FROM CHROMIUM
2012/11/29 23:34:23
Could DCHECK that this is *not* the current loop,
|
| DCHECK(!paint_cb_.is_null()); |
| } |
| @@ -55,11 +59,9 @@ void VideoRendererBase::Flush(const base::Closure& callback) { |
| flush_cb_ = callback; |
| state_ = kFlushingDecoder; |
| - // We must unlock here because the callback might run within the Flush() |
| - // call. |
| - // TODO: Remove this line when fixing http://crbug.com/125020 |
| - base::AutoUnlock auto_unlock(lock_); |
| - decoder_->Reset(base::Bind(&VideoRendererBase::OnDecoderFlushDone, this)); |
| + decoder_message_loop_->PostTask(FROM_HERE, base::Bind( |
| + &VideoDecoder::Reset, decoder_, base::Bind( |
| + &VideoRendererBase::OnDecoderFlushDone, this))); |
| } |
| void VideoRendererBase::Stop(const base::Closure& callback) { |
| @@ -90,7 +92,8 @@ void VideoRendererBase::Stop(const base::Closure& callback) { |
| if (thread_to_join != base::kNullThreadHandle) |
| base::PlatformThread::Join(thread_to_join); |
| - decoder_->Stop(callback); |
| + decoder_message_loop_->PostTask(FROM_HERE, base::Bind( |
| + &VideoDecoder::Stop, decoder_, callback)); |
| } |
| void VideoRendererBase::SetPlaybackRate(float playback_rate) { |
| @@ -195,6 +198,7 @@ void VideoRendererBase::OnDecoderInitDone( |
| // have not populated any buffers yet. |
| state_ = kFlushed; |
| + // XXX we're taking advantage of the fact this is already on the right thread |
| set_opaque_cb_.Run(!decoder_->HasAlpha()); |
| set_opaque_cb_.Reset(); |
| @@ -571,7 +575,9 @@ void VideoRendererBase::AttemptRead_Locked() { |
| } |
| pending_read_ = true; |
| - decoder_->Read(base::Bind(&VideoRendererBase::FrameReady, this)); |
| + decoder_message_loop_->PostTask(FROM_HERE, base::Bind( |
| + &VideoDecoder::Read, decoder_, base::Bind( |
| + &VideoRendererBase::FrameReady, this))); |
| } |
| void VideoRendererBase::OnDecoderFlushDone() { |