summaryrefslogtreecommitdiff
path: root/media/base/video_frame.cc
diff options
context:
space:
mode:
authorTorne (Richard Coles) <torne@google.com>2013-08-30 15:14:49 +0100
committerTorne (Richard Coles) <torne@google.com>2013-08-30 15:14:49 +0100
commit424c4d7b64af9d0d8fd9624f381f469654d5e3d2 (patch)
treeaf8b16dc2ba7fc8c8bb1c9fa18b907c847f3883d /media/base/video_frame.cc
parentc70ef2906f891fe7d218980660e4cda465717916 (diff)
downloadchromium_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.cc37
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);