// Copyright 2013 The Chromium Authors. All rights reserved. // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. #include "media/renderers/mock_gpu_video_accelerator_factories.h" #include "ui/gfx/buffer_format_util.h" #include "ui/gfx/gpu_memory_buffer.h" namespace media { namespace { class GpuMemoryBufferImpl : public gfx::GpuMemoryBuffer { public: GpuMemoryBufferImpl(const gfx::Size& size, gfx::BufferFormat format) : format_(format), size_(size), num_planes_(gfx::NumberOfPlanesForBufferFormat(format)) { DCHECK(gfx::BufferFormat::R_8 == format_ || gfx::BufferFormat::YUV_420_BIPLANAR == format_ || gfx::BufferFormat::UYVY_422 == format_); DCHECK(num_planes_ <= kMaxPlanes); for (int i = 0; i < static_cast(num_planes_); ++i) { bytes_[i].resize( gfx::RowSizeForBufferFormat(size_.width(), format_, i) * size_.height() / gfx::SubsamplingFactorForBufferFormat(format_, i)); } } // Overridden from gfx::GpuMemoryBuffer: bool Map(void** data) override { for (size_t plane = 0; plane < num_planes_; ++plane) data[plane] = &bytes_[plane][0]; return true; } void Unmap() override{}; bool IsMapped() const override { NOTREACHED(); return false; } gfx::BufferFormat GetFormat() const override { return format_; } void GetStride(int* strides) const override { for (int plane = 0; plane < static_cast(num_planes_); ++plane) { strides[plane] = static_cast( gfx::RowSizeForBufferFormat(size_.width(), format_, plane)); } } gfx::GpuMemoryBufferId GetId() const override { NOTREACHED(); return gfx::GpuMemoryBufferId(0); } gfx::GpuMemoryBufferHandle GetHandle() const override { NOTREACHED(); return gfx::GpuMemoryBufferHandle(); } ClientBuffer AsClientBuffer() override { return reinterpret_cast(this); } private: static const size_t kMaxPlanes = 3; gfx::BufferFormat format_; const gfx::Size size_; size_t num_planes_; std::vector bytes_[kMaxPlanes]; }; } // unnamed namespace MockGpuVideoAcceleratorFactories::MockGpuVideoAcceleratorFactories() {} MockGpuVideoAcceleratorFactories::~MockGpuVideoAcceleratorFactories() {} bool MockGpuVideoAcceleratorFactories::IsGpuVideoAcceleratorEnabled() { return true; } scoped_ptr MockGpuVideoAcceleratorFactories::AllocateGpuMemoryBuffer( const gfx::Size& size, gfx::BufferFormat format, gfx::BufferUsage usage) { if (fail_to_allocate_gpu_memory_buffer_) return nullptr; return make_scoped_ptr( new GpuMemoryBufferImpl(size, format)); } scoped_ptr MockGpuVideoAcceleratorFactories::CreateSharedMemory(size_t size) { return nullptr; } scoped_ptr MockGpuVideoAcceleratorFactories::CreateVideoDecodeAccelerator() { return scoped_ptr(DoCreateVideoDecodeAccelerator()); } scoped_ptr MockGpuVideoAcceleratorFactories::CreateVideoEncodeAccelerator() { return scoped_ptr(DoCreateVideoEncodeAccelerator()); } bool MockGpuVideoAcceleratorFactories::ShouldUseGpuMemoryBuffersForVideoFrames() const { return false; } unsigned MockGpuVideoAcceleratorFactories::ImageTextureTarget() { return GL_TEXTURE_2D; } } // namespace media