diff options
author | emircan <emircan@chromium.org> | 2015-08-31 10:53:08 -0700 |
---|---|---|
committer | Commit bot <commit-bot@chromium.org> | 2015-08-31 17:53:50 +0000 |
commit | b479059b5368c433bb6a321f53c54f67b0081433 (patch) | |
tree | dd6b5fa4bb9bdc91e9ca85dc1fd0e3bdb6f6603b /media/capture | |
parent | e0096ef8707579fd6507e3e228df0c0c3afc8df8 (diff) | |
download | chromium_src-b479059b5368c433bb6a321f53c54f67b0081433.zip chromium_src-b479059b5368c433bb6a321f53c54f67b0081433.tar.gz chromium_src-b479059b5368c433bb6a321f53c54f67b0081433.tar.bz2 |
Pass GpuMemoryBuffer backed VideoFrame from browser to renderer processes
This is a CL for Video Capture using GpuMemoryBuffers plan[0]. The plans for future CLs can be seen on [1].
[0] https://docs.google.com/document/d/1lobWf168_Kq05TLNLX81gRQwY5oe4k2t3oP-XTBEpIo/edit#heading=h.lflt7hoq3oui
[1] https://docs.google.com/document/d/1lobWf168_Kq05TLNLX81gRQwY5oe4k2t3oP-XTBEpIo/edit#heading=h.exy0h9917c1d
- Changed VideoCaptureBufferPool::ShareToProcess() method to handle sharing both SharedMemory and GpuMemoryBuffer backed video frames.
- Added VideoCaptureBufferPool::GpuMemoryBufferTracker::ShareToProcess() for sharing GMB backed buffers.
- Added dimensions() method to media::VideoCaptureDevice::Client::Buffer and VideoCaptureBufferPool::BufferHandle interfaces as required by GMB mapping. Also, renamed size() to mapped_size() to avoid confusion.
- Added OnGpuMemoryBufferCreated() calls between Browser and Renderer to notify the creation of GMB backed buffers and pass handles.
- Added VideoCaptureImpl::ClientGpuMemoryBuffer on Renderer side to create&map new GMB client buffers.
Also, buffer reuse and destruction is handled behind VideoCaptureDeviceClient::AutoReleaseBuffer like listed below:
Buffer Creation
*Browser
VideoCaptureController::DoIncomingCapturedVideoFrameOnIOThread
- ShareToProcess(Renderer)
VideoCaptureHost::OnBufferCreated
*Renderer
VideoCaptureMessageFilter::OnBufferCreated
VideoCaptureImpl::OnBufferCreated
- Adds to client_buffers_
Buffer Reuse
*Renderer
VideoCaptureImpl::OnClientBufferFinished
*Browser
VideoCaptureHost::OnRendererFinishedWithBuffer
VideoCaptureController::ReturnBuffer
VideoCaptureBufferPool::RelinquishConsumerHold
~AutoReleaseBuffer
VideoCaptureBufferPool::RelinquishProducerReservation
BUG=440843, 503835
TEST=
- Without the kUseGpuMemoryBuffersForCapture flag, AppRTC loopback runs as before.
- With the flag, AppRTC loopback crashes in VideoCaptureHost::OnBufferReady as expected.
Review URL: https://codereview.chromium.org/1267883002
Cr-Commit-Position: refs/heads/master@{#346414}
Diffstat (limited to 'media/capture')
4 files changed, 11 insertions, 7 deletions
diff --git a/media/capture/content/thread_safe_capture_oracle.cc b/media/capture/content/thread_safe_capture_oracle.cc index cbc4948..5bedc4a 100644 --- a/media/capture/content/thread_safe_capture_oracle.cc +++ b/media/capture/content/thread_safe_capture_oracle.cc @@ -119,7 +119,7 @@ bool ThreadSafeCaptureOracle::ObserveEventAndDecideCapture( *storage = VideoFrame::WrapExternalData( media::PIXEL_FORMAT_I420, coded_size, gfx::Rect(visible_size), visible_size, static_cast<uint8*>(output_buffer->data()), - output_buffer->size(), base::TimeDelta()); + output_buffer->mapped_size(), base::TimeDelta()); DCHECK(*storage); } *callback = diff --git a/media/capture/video/fake_video_capture_device.cc b/media/capture/video/fake_video_capture_device.cc index 70c7eb4..59f6625 100644 --- a/media/capture/video/fake_video_capture_device.cc +++ b/media/capture/video/fake_video_capture_device.cc @@ -198,7 +198,7 @@ void FakeVideoCaptureDevice::CaptureUsingClientBuffers( DCHECK_EQ(capture_format_.pixel_storage, PIXEL_STORAGE_CPU); DCHECK_EQ(capture_format_.pixel_format, VIDEO_CAPTURE_PIXEL_FORMAT_ARGB); uint8_t* data_ptr = static_cast<uint8_t*>(capture_buffer->data()); - memset(data_ptr, 0, capture_buffer->size()); + memset(data_ptr, 0, capture_buffer->mapped_size()); DrawPacman(true /* use_argb */, data_ptr, frame_count_, kFakeCapturePeriodMs, capture_format_.frame_size); } diff --git a/media/capture/video/fake_video_capture_device_unittest.cc b/media/capture/video/fake_video_capture_device_unittest.cc index 9b92462..c73f5888 100644 --- a/media/capture/video/fake_video_capture_device_unittest.cc +++ b/media/capture/video/fake_video_capture_device_unittest.cc @@ -27,12 +27,15 @@ namespace { // This class is a Client::Buffer that allocates and frees the requested |size|. class MockBuffer : public VideoCaptureDevice::Client::Buffer { public: - MockBuffer(int buffer_id, size_t size) - : id_(buffer_id), size_(size), data_(new uint8[size_]) {} + MockBuffer(int buffer_id, size_t mapped_size) + : id_(buffer_id), + mapped_size_(mapped_size), + data_(new uint8[mapped_size]) {} ~MockBuffer() override { delete[] data_; } int id() const override { return id_; } - size_t size() const override { return size_; } + gfx::Size dimensions() const override { return gfx::Size(); } + size_t mapped_size() const override { return mapped_size_; } void* data(int plane) override { return data_; } ClientBuffer AsClientBuffer(int plane) override { return nullptr; } #if defined(OS_POSIX) @@ -43,7 +46,7 @@ class MockBuffer : public VideoCaptureDevice::Client::Buffer { private: const int id_; - const size_t size_; + const size_t mapped_size_; uint8* const data_; }; diff --git a/media/capture/video/video_capture_device.h b/media/capture/video/video_capture_device.h index ea219ff..eabefab 100644 --- a/media/capture/video/video_capture_device.h +++ b/media/capture/video/video_capture_device.h @@ -181,7 +181,8 @@ class MEDIA_EXPORT VideoCaptureDevice { public: virtual ~Buffer() = 0; virtual int id() const = 0; - virtual size_t size() const = 0; + virtual gfx::Size dimensions() const = 0; + virtual size_t mapped_size() const = 0; virtual void* data(int plane) = 0; void* data() { return data(0); } virtual ClientBuffer AsClientBuffer(int plane) = 0; |