| // Copyright 2019 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/capture/video/gpu_memory_buffer_utils.h" |
| |
| #include "base/callback_helpers.h" |
| #include "gpu/ipc/common/gpu_memory_buffer_support.h" |
| #include "ui/gfx/gpu_memory_buffer.h" |
| |
| namespace media { |
| |
| ScopedNV12GpuMemoryBufferMapping::ScopedNV12GpuMemoryBufferMapping( |
| std::unique_ptr<gfx::GpuMemoryBuffer> gmb) |
| : gmb_(std::move(gmb)) { |
| gmb_->Map(); |
| } |
| |
| ScopedNV12GpuMemoryBufferMapping::~ScopedNV12GpuMemoryBufferMapping() { |
| gmb_->Unmap(); |
| } |
| |
| uint8_t* ScopedNV12GpuMemoryBufferMapping::y_plane() { |
| return static_cast<uint8_t*>(gmb_->memory(0)); |
| } |
| |
| uint8_t* ScopedNV12GpuMemoryBufferMapping::uv_plane() { |
| return static_cast<uint8_t*>(gmb_->memory(1)); |
| } |
| |
| size_t ScopedNV12GpuMemoryBufferMapping::y_stride() { |
| return gmb_->stride(0); |
| } |
| |
| size_t ScopedNV12GpuMemoryBufferMapping::uv_stride() { |
| return gmb_->stride(1); |
| } |
| |
| VideoCaptureDevice::Client::ReserveResult AllocateNV12GpuMemoryBuffer( |
| VideoCaptureDevice::Client* capture_client, |
| const gfx::Size& buffer_size, |
| gpu::GpuMemoryBufferSupport* gmb_support, |
| std::unique_ptr<gfx::GpuMemoryBuffer>* out_gpu_memory_buffer, |
| VideoCaptureDevice::Client::Buffer* out_capture_buffer) { |
| CHECK(out_gpu_memory_buffer); |
| CHECK(out_capture_buffer); |
| |
| // When GpuMemoryBuffer is used, the frame data is opaque to the CPU for most |
| // of the time. Currently the only supported underlying format is NV12. |
| constexpr VideoPixelFormat kOpaqueVideoFormat = PIXEL_FORMAT_NV12; |
| constexpr gfx::BufferFormat kOpaqueGfxFormat = |
| gfx::BufferFormat::YUV_420_BIPLANAR; |
| |
| const int arbitrary_frame_feedback_id = 0; |
| const auto reserve_result = capture_client->ReserveOutputBuffer( |
| buffer_size, kOpaqueVideoFormat, arbitrary_frame_feedback_id, |
| out_capture_buffer); |
| if (reserve_result != VideoCaptureDevice::Client::ReserveResult::kSucceeded) { |
| return reserve_result; |
| } |
| |
| *out_gpu_memory_buffer = gmb_support->CreateGpuMemoryBufferImplFromHandle( |
| out_capture_buffer->handle_provider->GetGpuMemoryBufferHandle(), |
| buffer_size, kOpaqueGfxFormat, |
| gfx::BufferUsage::VEA_READ_CAMERA_AND_CPU_READ_WRITE, |
| base::NullCallback()); |
| return reserve_result; |
| } |
| |
| } // namespace media |