diff options
author | fischman@chromium.org <fischman@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98> | 2012-04-07 01:43:21 +0000 |
---|---|---|
committer | fischman@chromium.org <fischman@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98> | 2012-04-07 01:43:21 +0000 |
commit | bec363c60adf810f5cc88f8d0a6266e7083f9452 (patch) | |
tree | 76a334a77fb8bd44a3386f9c25a5a42ce42eb9f3 /media | |
parent | 182bdf03f70cd5c6affad99fea8c0c883a6f775a (diff) | |
download | chromium_src-bec363c60adf810f5cc88f8d0a6266e7083f9452.zip chromium_src-bec363c60adf810f5cc88f8d0a6266e7083f9452.tar.gz chromium_src-bec363c60adf810f5cc88f8d0a6266e7083f9452.tar.bz2 |
Ref-count VideoRendererBase instead of blindly hoping it outlives the decoder's tasks.
VideoRendererBase::read_cb_ had an Unretained(this) bound into it which can
theoretically let a late demux task trigger the decoder Run()ing read_cb_ after
the renderer has been deleted. This change replaces that with a retaining
callback to ensure VRB outlives any Read requests it initiates.
(notice that it's not legit to simply make read_cb_ retain a reference to |this|
since then the VRB will never be deleted; an alternative is to Reset() read_cb_
on Stop(), but I don't see a reason to complicate things like this).
BUG=121379
Review URL: http://codereview.chromium.org/10006051
git-svn-id: svn://svn.chromium.org/chrome/trunk/src@131230 0039d316-1c4b-4281-b951-d872f2087c98
Diffstat (limited to 'media')
-rw-r--r-- | media/filters/video_renderer_base.cc | 4 | ||||
-rw-r--r-- | media/filters/video_renderer_base.h | 2 |
2 files changed, 1 insertions, 5 deletions
diff --git a/media/filters/video_renderer_base.cc b/media/filters/video_renderer_base.cc index 9f17168..54b7905 100644 --- a/media/filters/video_renderer_base.cc +++ b/media/filters/video_renderer_base.cc @@ -26,8 +26,6 @@ VideoRendererBase::VideoRendererBase(const base::Closure& paint_cb, pending_paint_with_last_available_(false), drop_frames_(drop_frames), playback_rate_(0), - read_cb_(base::Bind(&VideoRendererBase::FrameReady, - base::Unretained(this))), paint_cb_(paint_cb), set_opaque_cb_(set_opaque_cb) { DCHECK(!paint_cb_.is_null()); @@ -451,7 +449,7 @@ void VideoRendererBase::AttemptRead_Locked() { } pending_read_ = true; - decoder_->Read(read_cb_); + decoder_->Read(base::Bind(&VideoRendererBase::FrameReady, this)); } void VideoRendererBase::AttemptFlush_Locked() { diff --git a/media/filters/video_renderer_base.h b/media/filters/video_renderer_base.h index e1f119c..ca9ebea 100644 --- a/media/filters/video_renderer_base.h +++ b/media/filters/video_renderer_base.h @@ -194,8 +194,6 @@ class MEDIA_EXPORT VideoRendererBase base::TimeDelta seek_timestamp_; - VideoDecoder::ReadCB read_cb_; - // Embedder callback for notifying a new frame is available for painting. base::Closure paint_cb_; |