summaryrefslogtreecommitdiffstats
path: root/media/capture
diff options
context:
space:
mode:
authoremircan <emircan@chromium.org>2015-08-31 10:53:08 -0700
committerCommit bot <commit-bot@chromium.org>2015-08-31 17:53:50 +0000
commitb479059b5368c433bb6a321f53c54f67b0081433 (patch)
treedd6b5fa4bb9bdc91e9ca85dc1fd0e3bdb6f6603b /media/capture
parente0096ef8707579fd6507e3e228df0c0c3afc8df8 (diff)
downloadchromium_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')
-rw-r--r--media/capture/content/thread_safe_capture_oracle.cc2
-rw-r--r--media/capture/video/fake_video_capture_device.cc2
-rw-r--r--media/capture/video/fake_video_capture_device_unittest.cc11
-rw-r--r--media/capture/video/video_capture_device.h3
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;