summaryrefslogtreecommitdiffstats
path: root/media
diff options
context:
space:
mode:
authorfischman@chromium.org <fischman@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98>2012-04-07 01:43:21 +0000
committerfischman@chromium.org <fischman@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98>2012-04-07 01:43:21 +0000
commitbec363c60adf810f5cc88f8d0a6266e7083f9452 (patch)
tree76a334a77fb8bd44a3386f9c25a5a42ce42eb9f3 /media
parent182bdf03f70cd5c6affad99fea8c0c883a6f775a (diff)
downloadchromium_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.cc4
-rw-r--r--media/filters/video_renderer_base.h2
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_;