| 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>
|
|
|