Index: media/base/video_frame.cc |
diff --git a/media/base/video_frame.cc b/media/base/video_frame.cc |
index 2009664099cab71b3369acd92068d7e3c8f04cff..b906ee22a64097d0cca59fe2ff230d6b1b60a0e9 100644 |
--- a/media/base/video_frame.cc |
+++ b/media/base/video_frame.cc |
@@ -195,35 +195,19 @@ scoped_refptr<VideoFrame> VideoFrame::CreateFrame(VideoPixelFormat format, |
const gfx::Rect& visible_rect, |
const gfx::Size& natural_size, |
base::TimeDelta timestamp) { |
- if (!IsYuvPlanar(format)) { |
- NOTIMPLEMENTED(); |
- return nullptr; |
- } |
- |
- // Since we're creating a new YUV frame (and allocating memory for it |
- // ourselves), we can pad the requested |coded_size| if necessary if the |
- // request does not line up on sample boundaries. See discussion at |
- // http://crrev.com/1240833003 |
- const gfx::Size alignment = CommonAlignment(format); |
- const gfx::Size new_coded_size = |
- gfx::Size(RoundUp(coded_size.width(), alignment.width()), |
- RoundUp(coded_size.height(), alignment.height())); |
- DCHECK((new_coded_size.width() % alignment.width() == 0) && |
- (new_coded_size.height() % alignment.height() == 0)); |
- |
- const StorageType storage = STORAGE_OWNED_MEMORY; |
- if (!IsValidConfig(format, storage, new_coded_size, visible_rect, |
- natural_size)) { |
- DLOG(ERROR) << __FUNCTION__ << " Invalid config." |
- << ConfigToString(format, storage, coded_size, visible_rect, |
- natural_size); |
- return nullptr; |
- } |
+ return CreateFrameInternal(format, coded_size, visible_rect, natural_size, |
+ timestamp, false); |
+} |
- scoped_refptr<VideoFrame> frame(new VideoFrame( |
- format, storage, new_coded_size, visible_rect, natural_size, timestamp)); |
- frame->AllocateYUV(); |
- return frame; |
+// static |
+scoped_refptr<VideoFrame> VideoFrame::CreateZeroInitializedFrame( |
+ VideoPixelFormat format, |
+ const gfx::Size& coded_size, |
+ const gfx::Rect& visible_rect, |
+ const gfx::Size& natural_size, |
+ base::TimeDelta timestamp) { |
+ return CreateFrameInternal(format, coded_size, visible_rect, natural_size, |
+ timestamp, true); |
} |
// static |
@@ -897,7 +881,46 @@ VideoFrame::~VideoFrame() { |
base::ResetAndReturn(&callback).Run(); |
} |
-void VideoFrame::AllocateYUV() { |
+// static |
+scoped_refptr<VideoFrame> VideoFrame::CreateFrameInternal( |
+ VideoPixelFormat format, |
+ const gfx::Size& coded_size, |
+ const gfx::Rect& visible_rect, |
+ const gfx::Size& natural_size, |
+ base::TimeDelta timestamp, |
+ bool zero_initialize_memory) { |
+ if (!IsYuvPlanar(format)) { |
+ NOTIMPLEMENTED(); |
+ return nullptr; |
+ } |
+ |
+ // Since we're creating a new YUV frame (and allocating memory for it |
+ // ourselves), we can pad the requested |coded_size| if necessary if the |
+ // request does not line up on sample boundaries. See discussion at |
+ // http://crrev.com/1240833003 |
+ const gfx::Size alignment = CommonAlignment(format); |
+ const gfx::Size new_coded_size = |
+ gfx::Size(RoundUp(coded_size.width(), alignment.width()), |
+ RoundUp(coded_size.height(), alignment.height())); |
+ DCHECK((new_coded_size.width() % alignment.width() == 0) && |
+ (new_coded_size.height() % alignment.height() == 0)); |
+ |
+ const StorageType storage = STORAGE_OWNED_MEMORY; |
+ if (!IsValidConfig(format, storage, new_coded_size, visible_rect, |
+ natural_size)) { |
+ DLOG(ERROR) << __FUNCTION__ << " Invalid config." |
+ << ConfigToString(format, storage, coded_size, visible_rect, |
+ natural_size); |
+ return nullptr; |
+ } |
+ |
+ scoped_refptr<VideoFrame> frame(new VideoFrame( |
+ format, storage, new_coded_size, visible_rect, natural_size, timestamp)); |
+ frame->AllocateYUV(zero_initialize_memory); |
+ return frame; |
+} |
+ |
+void VideoFrame::AllocateYUV(bool zero_initialize_memory) { |
DCHECK_EQ(storage_type_, STORAGE_OWNED_MEMORY); |
static_assert(0 == kYPlane, "y plane data must be index 0"); |
@@ -923,6 +946,8 @@ void VideoFrame::AllocateYUV() { |
uint8* data = reinterpret_cast<uint8*>( |
base::AlignedAlloc(data_size, kFrameAddressAlignment)); |
+ if (zero_initialize_memory) |
+ memset(data, 0, data_size); |
for (size_t plane = 0; plane < NumPlanes(format_); ++plane) |
data_[plane] = data + offset[plane]; |