Index: media/base/video_frame.cc |
diff --git a/media/base/video_frame.cc b/media/base/video_frame.cc |
index a372889cb55a9f3ff2dedacdaf023e054cf56bf6..52a18f0b2906d3d85df826e6db576cecc1ba3841 100644 |
--- a/media/base/video_frame.cc |
+++ b/media/base/video_frame.cc |
@@ -118,7 +118,7 @@ void VideoFrame::ReadPixelsFromNativeTexture(const SkBitmap& pixels) { |
} |
// static |
-scoped_refptr<VideoFrame> VideoFrame::WrapExternalSharedMemory( |
+scoped_refptr<VideoFrame> VideoFrame::WrapExternalPackedMemory( |
Format format, |
const gfx::Size& coded_size, |
const gfx::Rect& visible_rect, |
@@ -255,24 +255,64 @@ static inline size_t RoundUp(size_t value, size_t alignment) { |
// static |
size_t VideoFrame::AllocationSize(Format format, const gfx::Size& coded_size) { |
+ size_t total = 0; |
+ for (size_t i = 0; i < NumPlanes(format); ++i) |
+ total += PlaneAllocationSize(format, i, coded_size); |
+ return total; |
+} |
+ |
+// static |
+size_t VideoFrame::PlaneAllocationSize(Format format, |
+ size_t plane, |
+ const gfx::Size& coded_size) { |
switch (format) { |
case VideoFrame::RGB32: |
- return coded_size.GetArea() * 4; |
+ switch (plane) { |
+ case VideoFrame::kRGBPlane: |
+ return coded_size.GetArea() * 4; |
+ default: |
+ break; |
+ } |
case VideoFrame::YV12: |
case VideoFrame::I420: { |
- const size_t rounded_size = |
+ const size_t area = |
RoundUp(coded_size.width(), 2) * RoundUp(coded_size.height(), 2); |
- return rounded_size * 3 / 2; |
+ switch (plane) { |
+ case VideoFrame::kYPlane: |
+ return area; |
+ case VideoFrame::kUPlane: |
+ case VideoFrame::kVPlane: |
+ return area / 4; |
+ default: |
+ break; |
+ } |
} |
case VideoFrame::YV12A: { |
- const size_t rounded_size = |
+ const size_t area = |
RoundUp(coded_size.width(), 2) * RoundUp(coded_size.height(), 2); |
- return rounded_size * 5 / 2; |
+ switch (plane) { |
+ case VideoFrame::kYPlane: |
+ case VideoFrame::kAPlane: |
+ return area; |
+ case VideoFrame::kUPlane: |
+ case VideoFrame::kVPlane: |
+ return area / 4; |
+ default: |
+ break; |
+ } |
} |
case VideoFrame::YV16: { |
- const size_t rounded_size = |
+ const size_t area = |
RoundUp(coded_size.width(), 2) * RoundUp(coded_size.height(), 2); |
- return rounded_size * 2; |
+ switch (plane) { |
+ case VideoFrame::kYPlane: |
+ return area; |
+ case VideoFrame::kUPlane: |
+ case VideoFrame::kVPlane: |
+ return area / 2; |
+ default: |
+ break; |
+ } |
} |
case VideoFrame::INVALID: |
case VideoFrame::EMPTY: |
@@ -282,7 +322,8 @@ size_t VideoFrame::AllocationSize(Format format, const gfx::Size& coded_size) { |
#endif |
break; |
} |
- NOTREACHED() << "Unsupported video frame format: " << format; |
+ NOTREACHED() << "Unsupported video frame format/plane: " |
+ << format << "/" << plane; |
return 0; |
} |