Index: content/common/gpu/client/gpu_memory_buffer_impl.cc |
diff --git a/content/common/gpu/client/gpu_memory_buffer_impl.cc b/content/common/gpu/client/gpu_memory_buffer_impl.cc |
index 208261dd0831e940f8f858b63a4169888c706db8..92f02fcc4305be0b308594ff55f104b55491672e 100644 |
--- a/content/common/gpu/client/gpu_memory_buffer_impl.cc |
+++ b/content/common/gpu/client/gpu_memory_buffer_impl.cc |
@@ -77,57 +77,105 @@ GpuMemoryBufferImpl* GpuMemoryBufferImpl::FromClientBuffer( |
} |
// static |
+size_t GpuMemoryBufferImpl::NumberOfPlanesForGpuMemoryBufferFormat( |
+ gfx::GpuMemoryBuffer::Format format) { |
+ switch (format) { |
+ case gfx::GpuMemoryBuffer::Format::ATC: |
+ case gfx::GpuMemoryBuffer::Format::ATCIA: |
+ case gfx::GpuMemoryBuffer::Format::DXT1: |
+ case gfx::GpuMemoryBuffer::Format::DXT5: |
+ case gfx::GpuMemoryBuffer::Format::ETC1: |
+ case gfx::GpuMemoryBuffer::Format::RGBA_8888: |
+ case gfx::GpuMemoryBuffer::Format::RGBX_8888: |
+ case gfx::GpuMemoryBuffer::Format::BGRA_8888: |
+ return 1; |
+ case gfx::GpuMemoryBuffer::Format::YUV_420: |
+ return 3; |
+ } |
+ NOTREACHED(); |
+ return 0; |
+} |
+ |
+// static |
bool GpuMemoryBufferImpl::StrideInBytes(size_t width, |
Format format, |
+ int plane, |
size_t* stride_in_bytes) { |
- base::CheckedNumeric<size_t> s = width; |
switch (format) { |
case ATCIA: |
case DXT5: |
+ DCHECK_EQ(plane, 0); |
*stride_in_bytes = width; |
return true; |
case ATC: |
case DXT1: |
case ETC1: |
+ DCHECK_EQ(plane, 0); |
DCHECK_EQ(width % 2, 0U); |
- s /= 2; |
- if (!s.IsValid()) |
- return false; |
- |
- *stride_in_bytes = s.ValueOrDie(); |
+ *stride_in_bytes = width / 2; |
return true; |
case RGBA_8888: |
case RGBX_8888: |
- case BGRA_8888: |
+ case BGRA_8888: { |
+ base::CheckedNumeric<size_t> s = width; |
+ DCHECK_EQ(plane, 0); |
s *= 4; |
if (!s.IsValid()) |
return false; |
- |
*stride_in_bytes = s.ValueOrDie(); |
return true; |
+ } |
+ case YUV_420: { |
+ DCHECK_EQ(width % 2, 0u); |
+ *stride_in_bytes = width / SubsamplingFactor(format, plane); |
+ return true; |
+ } |
} |
- |
NOTREACHED(); |
return false; |
} |
// static |
-size_t GpuMemoryBufferImpl::NumberOfPlanesForGpuMemoryBufferFormat( |
- gfx::GpuMemoryBuffer::Format format) { |
+size_t GpuMemoryBufferImpl::SubsamplingFactor( |
+ gfx::GpuMemoryBuffer::Format format, |
+ int plane) { |
switch (format) { |
- case gfx::GpuMemoryBuffer::Format::ATC: |
- case gfx::GpuMemoryBuffer::Format::ATCIA: |
- case gfx::GpuMemoryBuffer::Format::DXT1: |
- case gfx::GpuMemoryBuffer::Format::DXT5: |
- case gfx::GpuMemoryBuffer::Format::ETC1: |
- case gfx::GpuMemoryBuffer::Format::RGBA_8888: |
- case gfx::GpuMemoryBuffer::Format::RGBX_8888: |
- case gfx::GpuMemoryBuffer::Format::BGRA_8888: |
+ case gfx::GpuMemoryBuffer::ATC: |
+ case gfx::GpuMemoryBuffer::ATCIA: |
+ case gfx::GpuMemoryBuffer::DXT1: |
+ case gfx::GpuMemoryBuffer::DXT5: |
+ case gfx::GpuMemoryBuffer::ETC1: |
+ case gfx::GpuMemoryBuffer::RGBA_8888: |
+ case gfx::GpuMemoryBuffer::RGBX_8888: |
+ case gfx::GpuMemoryBuffer::BGRA_8888: |
return 1; |
- default: |
- NOTREACHED(); |
- return 0; |
+ case gfx::GpuMemoryBuffer::YUV_420: { |
+ static size_t factor[] = {1, 2, 2}; |
+ DCHECK_LT(static_cast<size_t>(plane), arraysize(factor)); |
+ return factor[plane]; |
+ } |
+ } |
+ NOTREACHED(); |
+ return 0; |
+} |
+ |
+// static |
+bool GpuMemoryBufferImpl::TotalBufferSizeInBytes( |
+ const gfx::Size& size, |
+ gfx::GpuMemoryBuffer::Format format, |
+ size_t* total_size_in_bytes) { |
+ base::CheckedNumeric<size_t> size_in_bytes = 0u; |
+ for (size_t i = 0; i < NumberOfPlanesForGpuMemoryBufferFormat(format); ++i) { |
+ size_t stride_in_bytes = 0; |
+ if (!StrideInBytes(size.width(), format, i, &stride_in_bytes)) |
+ return false; |
+ size_in_bytes += |
+ stride_in_bytes * (size.height() / SubsamplingFactor(format, i)); |
reveman
2015/04/07 19:03:25
This multiplication can overflow. You need another
emircan
2015/04/07 20:08:12
Done.
|
+ if (!size_in_bytes.IsValid()) |
+ return false; |
} |
+ *total_size_in_bytes = size_in_bytes.ValueOrDie(); |
+ return true; |
} |
gfx::GpuMemoryBuffer::Format GpuMemoryBufferImpl::GetFormat() const { |