Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(530)

Unified Diff: content/browser/renderer_host/media/video_capture_buffer_pool.cc

Issue 1267883002: Pass GpuMemoryBuffer backed VideoFrame from browser to renderer processes (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@gmbtracker-multiple
Patch Set: Rebase Created 5 years, 4 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
Index: content/browser/renderer_host/media/video_capture_buffer_pool.cc
diff --git a/content/browser/renderer_host/media/video_capture_buffer_pool.cc b/content/browser/renderer_host/media/video_capture_buffer_pool.cc
index cef4d460ae61f79e6e11fe14453cc7352eb78a39..a157b4e86fc642bf6a4e0577cde71b10c4d04332 100644
--- a/content/browser/renderer_host/media/video_capture_buffer_pool.cc
+++ b/content/browser/renderer_host/media/video_capture_buffer_pool.cc
@@ -19,17 +19,24 @@ const int VideoCaptureBufferPool::kInvalidId = -1;
// A simple holder of a memory-backed buffer and accessors to it.
class SimpleBufferHandle final : public VideoCaptureBufferPool::BufferHandle {
public:
- SimpleBufferHandle(void* data, size_t size, base::SharedMemoryHandle handle)
+ SimpleBufferHandle(void* data,
+ size_t mapped_size,
+ base::SharedMemoryHandle handle)
: data_(data),
- size_(size)
+ mapped_size_(mapped_size)
#if defined(OS_POSIX)
- , handle_(handle)
+ ,
+ handle_(handle)
#endif
{
}
~SimpleBufferHandle() override {}
- size_t size() const override { return size_; }
+ gfx::Size dimensions() const override {
+ NOTREACHED();
+ return gfx::Size();
+ }
+ size_t mapped_size() const override { return mapped_size_; }
void* data(int plane) override {
DCHECK_EQ(plane, 0);
return data_;
@@ -50,7 +57,7 @@ class SimpleBufferHandle final : public VideoCaptureBufferPool::BufferHandle {
private:
void* const data_;
- const size_t size_;
+ const size_t mapped_size_;
#if defined(OS_POSIX)
const base::SharedMemoryHandle handle_;
#endif
@@ -75,9 +82,8 @@ class GpuMemoryBufferBufferHandle final
}
~GpuMemoryBufferBufferHandle() override {}
- size_t size() const override {
- return dimensions_.GetArea();
- }
+ gfx::Size dimensions() const override { return dimensions_; }
+ size_t mapped_size() const override { return dimensions_.GetArea(); }
void* data(int plane) override {
DCHECK_GE(plane, media::VideoFrame::kYPlane);
DCHECK_LT(plane, static_cast<int>(data_->size()));
@@ -109,21 +115,25 @@ class VideoCaptureBufferPool::SharedMemTracker final : public Tracker {
media::VideoPixelStorage storage_type,
const gfx::Size& dimensions) override;
- size_t mapped_size() const override { return shared_memory_.mapped_size(); }
-
scoped_ptr<BufferHandle> GetBufferHandle() override {
return make_scoped_ptr(new SimpleBufferHandle(
- shared_memory_.memory(), mapped_size(), shared_memory_.handle()));
+ shared_memory_.memory(), mapped_size_, shared_memory_.handle()));
}
-
bool ShareToProcess(base::ProcessHandle process_handle,
base::SharedMemoryHandle* new_handle) override {
return shared_memory_.ShareToProcess(process_handle, new_handle);
}
+ bool ShareToProcess2(int plane,
+ base::ProcessHandle process_handle,
+ gfx::GpuMemoryBufferHandle* new_handle) override {
+ NOTREACHED();
+ return false;
+ }
private:
// The memory created to be shared with renderer processes.
base::SharedMemory shared_memory_;
+ size_t mapped_size_;
};
// Tracker specifics for GpuMemoryBuffer. Owns GpuMemoryBuffers and its
@@ -136,18 +146,18 @@ class VideoCaptureBufferPool::GpuMemoryBufferTracker final : public Tracker {
const gfx::Size& dimensions) override;
~GpuMemoryBufferTracker() override;
- size_t mapped_size() const override {
- NOTREACHED();
- return 0;
- }
scoped_ptr<BufferHandle> GetBufferHandle() override {
return make_scoped_ptr(new GpuMemoryBufferBufferHandle(
&data_, dimensions_, &gpu_memory_buffers_));
}
bool ShareToProcess(base::ProcessHandle process_handle,
base::SharedMemoryHandle* new_handle) override {
- return true;
+ NOTREACHED();
+ return false;
}
+ bool ShareToProcess2(int plane,
+ base::ProcessHandle process_handle,
+ gfx::GpuMemoryBufferHandle* new_handle) override;
private:
std::vector<void*> data_;
@@ -156,8 +166,7 @@ class VideoCaptureBufferPool::GpuMemoryBufferTracker final : public Tracker {
ScopedVector<gfx::GpuMemoryBuffer> gpu_memory_buffers_;
};
-VideoCaptureBufferPool::SharedMemTracker::SharedMemTracker() : Tracker() {
-}
+VideoCaptureBufferPool::SharedMemTracker::SharedMemTracker() : Tracker() {}
bool VideoCaptureBufferPool::SharedMemTracker::Init(
media::VideoCapturePixelFormat format,
@@ -168,12 +177,12 @@ bool VideoCaptureBufferPool::SharedMemTracker::Init(
set_storage_type(storage_type);
// |dimensions| can be 0x0 for trackers that do not require memory backing.
set_pixel_count(dimensions.GetArea());
- const size_t byte_count =
+ mapped_size_ =
media::VideoCaptureFormat(dimensions, 0.0f, format, storage_type)
.ImageAllocationSize();
- if (!byte_count)
+ if (!mapped_size_)
return true;
- return shared_memory_.CreateAndMapAnonymous(byte_count);
+ return shared_memory_.CreateAndMapAnonymous(mapped_size_);
}
VideoCaptureBufferPool::GpuMemoryBufferTracker::GpuMemoryBufferTracker()
@@ -229,6 +238,37 @@ bool VideoCaptureBufferPool::GpuMemoryBufferTracker::Init(
return true;
}
+bool VideoCaptureBufferPool::GpuMemoryBufferTracker::ShareToProcess2(
+ int plane,
+ base::ProcessHandle process_handle,
+ gfx::GpuMemoryBufferHandle* new_handle) {
+ DCHECK_LE(plane, static_cast<int>(gpu_memory_buffers_.size()));
+
+ const auto& current_gmb_handle = gpu_memory_buffers_[plane]->GetHandle();
+ switch (current_gmb_handle.type) {
+ case gfx::EMPTY_BUFFER:
+ NOTREACHED();
+ return false;
+ case gfx::SHARED_MEMORY_BUFFER: {
+ DCHECK(base::SharedMemory::IsHandleValid(current_gmb_handle.handle));
+ base::SharedMemory shared_memory(
+ base::SharedMemory::DuplicateHandle(current_gmb_handle.handle),
+ false);
+ shared_memory.ShareToProcess(process_handle, &new_handle->handle);
+ DCHECK(base::SharedMemory::IsHandleValid(new_handle->handle));
+ new_handle->type = gfx::SHARED_MEMORY_BUFFER;
+ return true;
+ }
+ case gfx::IO_SURFACE_BUFFER:
+ case gfx::SURFACE_TEXTURE_BUFFER:
+ case gfx::OZONE_NATIVE_PIXMAP:
+ *new_handle = current_gmb_handle;
+ return true;
+ }
+ NOTREACHED();
+ return true;
+ }
+
// static
scoped_ptr<VideoCaptureBufferPool::Tracker>
VideoCaptureBufferPool::Tracker::CreateTracker(bool use_gmb) {
@@ -250,24 +290,39 @@ VideoCaptureBufferPool::~VideoCaptureBufferPool() {
STLDeleteValues(&trackers_);
}
-base::SharedMemoryHandle VideoCaptureBufferPool::ShareToProcess(
+bool VideoCaptureBufferPool::ShareToProcess(
int buffer_id,
base::ProcessHandle process_handle,
- size_t* memory_size) {
+ base::SharedMemoryHandle* new_handle) {
base::AutoLock lock(lock_);
Tracker* tracker = GetTracker(buffer_id);
if (!tracker) {
NOTREACHED() << "Invalid buffer_id.";
- return base::SharedMemory::NULLHandle();
+ return false;
}
- base::SharedMemoryHandle remote_handle;
- if (tracker->ShareToProcess(process_handle, &remote_handle)) {
- *memory_size = tracker->mapped_size();
- return remote_handle;
+ if (tracker->ShareToProcess(process_handle, new_handle))
+ return true;
+ DPLOG(ERROR) << "Error mapping memory";
+ return false;
+}
+
+bool VideoCaptureBufferPool::ShareToProcess2(
+ int buffer_id,
+ int plane,
+ base::ProcessHandle process_handle,
+ gfx::GpuMemoryBufferHandle* new_handle) {
+ base::AutoLock lock(lock_);
+
+ Tracker* tracker = GetTracker(buffer_id);
+ if (!tracker) {
+ NOTREACHED() << "Invalid buffer_id.";
+ return false;
}
- DPLOG(ERROR) << "Error mapping Shared Memory";
- return base::SharedMemoryHandle();
+ if (tracker->ShareToProcess2(plane, process_handle, new_handle))
+ return true;
+ DPLOG(ERROR) << "Error mapping memory";
+ return false;
}
scoped_ptr<VideoCaptureBufferPool::BufferHandle>

Powered by Google App Engine
This is Rietveld 408576698