diff options
author | Torne (Richard Coles) <torne@google.com> | 2013-08-30 15:14:49 +0100 |
---|---|---|
committer | Torne (Richard Coles) <torne@google.com> | 2013-08-30 15:14:49 +0100 |
commit | 424c4d7b64af9d0d8fd9624f381f469654d5e3d2 (patch) | |
tree | af8b16dc2ba7fc8c8bb1c9fa18b907c847f3883d /media/base/video_frame.cc | |
parent | c70ef2906f891fe7d218980660e4cda465717916 (diff) | |
download | chromium_org-424c4d7b64af9d0d8fd9624f381f469654d5e3d2.tar.gz |
Merge from Chromium at DEPS revision r220549
This commit was generated by merge_to_master.py.
Change-Id: I8fcb82db764ec1eb0294280936c177bd9ba8a9e9
Diffstat (limited to 'media/base/video_frame.cc')
-rw-r--r-- | media/base/video_frame.cc | 37 |
1 files changed, 37 insertions, 0 deletions
diff --git a/media/base/video_frame.cc b/media/base/video_frame.cc index 08e7e1ad7a..a372889cb5 100644 --- a/media/base/video_frame.cc +++ b/media/base/video_frame.cc @@ -124,9 +124,13 @@ scoped_refptr<VideoFrame> VideoFrame::WrapExternalSharedMemory( const gfx::Rect& visible_rect, const gfx::Size& natural_size, uint8* data, + size_t data_size, base::SharedMemoryHandle handle, base::TimeDelta timestamp, const base::Closure& no_longer_needed_cb) { + if (data_size < AllocationSize(format, coded_size)) + return NULL; + switch (format) { case I420: { scoped_refptr<VideoFrame> frame(new VideoFrame( @@ -249,6 +253,39 @@ static inline size_t RoundUp(size_t value, size_t alignment) { return ((value + (alignment - 1)) & ~(alignment-1)); } +// static +size_t VideoFrame::AllocationSize(Format format, const gfx::Size& coded_size) { + switch (format) { + case VideoFrame::RGB32: + return coded_size.GetArea() * 4; + case VideoFrame::YV12: + case VideoFrame::I420: { + const size_t rounded_size = + RoundUp(coded_size.width(), 2) * RoundUp(coded_size.height(), 2); + return rounded_size * 3 / 2; + } + case VideoFrame::YV12A: { + const size_t rounded_size = + RoundUp(coded_size.width(), 2) * RoundUp(coded_size.height(), 2); + return rounded_size * 5 / 2; + } + case VideoFrame::YV16: { + const size_t rounded_size = + RoundUp(coded_size.width(), 2) * RoundUp(coded_size.height(), 2); + return rounded_size * 2; + } + case VideoFrame::INVALID: + case VideoFrame::EMPTY: + case VideoFrame::NATIVE_TEXTURE: +#if defined(GOOGLE_TV) + case VideoFrame::HOLE: +#endif + break; + } + NOTREACHED() << "Unsupported video frame format: " << format; + return 0; +} + // Release data allocated by AllocateRGB() or AllocateYUV(). static void ReleaseData(uint8* data) { DCHECK(data); |