Chromium Code Reviews| 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 { |