Index: media/filters/skcanvas_video_renderer.cc |
diff --git a/media/filters/skcanvas_video_renderer.cc b/media/filters/skcanvas_video_renderer.cc |
index 6c73a17216114029fe6b2aa793bed4f375f1cf4f..9dcf67a7ada815ea478a3ef9c00777c3ad04b918 100644 |
--- a/media/filters/skcanvas_video_renderer.cc |
+++ b/media/filters/skcanvas_video_renderer.cc |
@@ -208,7 +208,9 @@ static void ConvertVideoFrameToRGBPixels( |
// Generates an RGB image from a VideoFrame. |
class VideoImageGenerator : public SkImageGenerator { |
public: |
- VideoImageGenerator(const scoped_refptr<VideoFrame>& frame) : frame_(frame) {} |
+ VideoImageGenerator(const scoped_refptr<VideoFrame>& frame) : frame_(frame) { |
+ DCHECK(frame_.get()); |
+ } |
virtual ~VideoImageGenerator() {} |
void set_frame(const scoped_refptr<VideoFrame>& frame) { frame_ = frame; } |
@@ -230,10 +232,9 @@ class VideoImageGenerator : public SkImageGenerator { |
if (!frame_.get()) |
return false; |
if (!pixels) |
- return true; |
+ return false; |
// If skia couldn't do the YUV conversion, we will. |
ConvertVideoFrameToRGBPixels(frame_, pixels, row_bytes); |
- frame_ = NULL; |
return true; |
} |
@@ -278,13 +279,13 @@ class VideoImageGenerator : public SkImageGenerator { |
planes[plane] = frame_->data(plane) + offset; |
} |
} |
- if (planes && row_bytes) |
- frame_ = NULL; |
return true; |
} |
private: |
scoped_refptr<VideoFrame> frame_; |
+ |
+ DISALLOW_IMPLICIT_CONSTRUCTORS(VideoImageGenerator); |
}; |
SkCanvasVideoRenderer::SkCanvasVideoRenderer() |
@@ -379,6 +380,10 @@ void SkCanvasVideoRenderer::Paint(const scoped_refptr<VideoFrame>& video_frame, |
if (need_transform) |
canvas->restore(); |
canvas->flush(); |
+ // SkCanvas::flush() causes the generator to generate SkImage, so delete |
+ // |video_frame| not to be outlived. |
+ if (generator_) |
+ generator_->set_frame(NULL); |
} |
void SkCanvasVideoRenderer::Copy(const scoped_refptr<VideoFrame>& video_frame, |