summaryrefslogtreecommitdiff
path: root/chromium/media/capture/video/mac/gpu_memory_buffer_tracker_mac.cc
diff options
context:
space:
mode:
Diffstat (limited to 'chromium/media/capture/video/mac/gpu_memory_buffer_tracker_mac.cc')
-rw-r--r--chromium/media/capture/video/mac/gpu_memory_buffer_tracker_mac.cc104
1 files changed, 104 insertions, 0 deletions
diff --git a/chromium/media/capture/video/mac/gpu_memory_buffer_tracker_mac.cc b/chromium/media/capture/video/mac/gpu_memory_buffer_tracker_mac.cc
new file mode 100644
index 00000000000..dcb988d6913
--- /dev/null
+++ b/chromium/media/capture/video/mac/gpu_memory_buffer_tracker_mac.cc
@@ -0,0 +1,104 @@
+// Copyright 2020 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/mac/gpu_memory_buffer_tracker_mac.h"
+
+#include "base/logging.h"
+
+namespace media {
+
+GpuMemoryBufferTrackerMac::GpuMemoryBufferTrackerMac() {}
+
+GpuMemoryBufferTrackerMac::GpuMemoryBufferTrackerMac(
+ base::ScopedCFTypeRef<IOSurfaceRef> io_surface)
+ : is_external_io_surface_(true), io_surface_(std::move(io_surface)) {}
+
+GpuMemoryBufferTrackerMac::~GpuMemoryBufferTrackerMac() {}
+
+bool GpuMemoryBufferTrackerMac::Init(const gfx::Size& dimensions,
+ VideoPixelFormat format,
+ const mojom::PlaneStridesPtr& strides) {
+ DCHECK(!io_surface_);
+ if (format != PIXEL_FORMAT_NV12) {
+ NOTREACHED() << "Unsupported VideoPixelFormat "
+ << VideoPixelFormatToString(format);
+ return false;
+ }
+ if (IOSurfaceRef io_surface =
+ CreateIOSurface(dimensions, gfx::BufferFormat::YUV_420_BIPLANAR,
+ /*should_clear=*/false)) {
+ io_surface_.reset(io_surface, base::scoped_policy::ASSUME);
+ DVLOG(2) << __func__ << " id " << IOSurfaceGetID(io_surface_);
+ return true;
+ } else {
+ LOG(ERROR) << "Unable to create IOSurface!";
+ return false;
+ }
+}
+
+bool GpuMemoryBufferTrackerMac::IsSameGpuMemoryBuffer(
+ const gfx::GpuMemoryBufferHandle& handle) const {
+ if (!is_external_io_surface_)
+ return false;
+ return IOSurfaceGetID(io_surface_) == IOSurfaceGetID(handle.io_surface);
+}
+
+bool GpuMemoryBufferTrackerMac::IsReusableForFormat(
+ const gfx::Size& dimensions,
+ VideoPixelFormat format,
+ const mojom::PlaneStridesPtr& strides) {
+ if (is_external_io_surface_)
+ return false;
+ gfx::Size surface_size(IOSurfaceGetWidth(io_surface_),
+ IOSurfaceGetHeight(io_surface_));
+ return format == PIXEL_FORMAT_NV12 && dimensions == surface_size;
+}
+
+uint32_t GpuMemoryBufferTrackerMac::GetMemorySizeInBytes() {
+ return IOSurfaceGetAllocSize(io_surface_);
+}
+
+std::unique_ptr<VideoCaptureBufferHandle>
+GpuMemoryBufferTrackerMac::GetMemoryMappedAccess() {
+ NOTREACHED() << "Unsupported operation";
+ return std::make_unique<NullHandle>();
+}
+
+base::UnsafeSharedMemoryRegion
+GpuMemoryBufferTrackerMac::DuplicateAsUnsafeRegion() {
+ NOTREACHED() << "Unsupported operation";
+ return base::UnsafeSharedMemoryRegion();
+}
+
+mojo::ScopedSharedBufferHandle
+GpuMemoryBufferTrackerMac::DuplicateAsMojoBuffer() {
+ NOTREACHED() << "Unsupported operation";
+ return mojo::ScopedSharedBufferHandle();
+}
+
+gfx::GpuMemoryBufferHandle
+GpuMemoryBufferTrackerMac::GetGpuMemoryBufferHandle() {
+ DVLOG(2) << __func__ << " id " << IOSurfaceGetID(io_surface_);
+ gfx::GpuMemoryBufferHandle gmb_handle;
+ gmb_handle.type = gfx::GpuMemoryBufferType::IO_SURFACE_BUFFER;
+ gmb_handle.id.id = -1;
+ gmb_handle.io_surface = io_surface_;
+ return gmb_handle;
+}
+
+void GpuMemoryBufferTrackerMac::OnHeldByConsumersChanged(
+ bool is_held_by_consumers) {
+ if (!is_external_io_surface_)
+ return;
+
+ if (is_held_by_consumers) {
+ DCHECK(!in_use_for_consumers_);
+ in_use_for_consumers_.reset(io_surface_.get(), base::scoped_policy::RETAIN);
+ } else {
+ DCHECK(in_use_for_consumers_);
+ in_use_for_consumers_.reset();
+ }
+}
+
+} // namespace media