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

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

Issue 1064703002: VideoCaptureBufferPool: Refactor to allow support of non-ShMem backed buffers (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: miu@s nits Created 5 years, 8 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.h
diff --git a/content/browser/renderer_host/media/video_capture_buffer_pool.h b/content/browser/renderer_host/media/video_capture_buffer_pool.h
index 54cb0c34bc5abd1bd649e306f1baafeb1d74085e..25464997c6e4b523c5d5fce46110d153966edfd2 100644
--- a/content/browser/renderer_host/media/video_capture_buffer_pool.h
+++ b/content/browser/renderer_host/media/video_capture_buffer_pool.h
@@ -14,21 +14,18 @@
#include "base/process/process.h"
#include "base/synchronization/lock.h"
#include "content/common/content_export.h"
+#include "media/base/video_capture_types.h"
+#include "media/base/video_frame.h"
#include "ui/gfx/geometry/size.h"
-namespace media {
-
-class VideoFrame;
-
-} // namespace media
-
namespace content {
// A thread-safe class that does the bookkeeping and lifetime management for a
-// pool of shared-memory pixel buffers cycled between an in-process producer
-// (e.g. a VideoCaptureDevice) and a set of out-of-process consumers. The pool
-// is intended to be orchestrated by a VideoCaptureController, but is designed
-// to outlive the controller if necessary.
+// pool of pixel buffers cycled between an in-process producer (e.g. a
+// VideoCaptureDevice) and a set of out-of-process consumers. The pool is
+// intended to be orchestrated by a VideoCaptureController, but is designed
+// to outlive the controller if necessary. The pixel buffers may be backed by a
+// SharedMemory, but this is not compulsory.
//
// Producers get a buffer by calling ReserveForProducer(), and may pass on their
// ownership to the consumer by calling HoldForConsumers(), or drop the buffer
@@ -58,12 +55,12 @@ class CONTENT_EXPORT VideoCaptureBufferPool
// Query the memory parameters of |buffer_id|. Fills in parameters in the
// pointer arguments, and returns true iff the buffer exists.
- bool GetBufferInfo(int buffer_id, void** memory, size_t* size);
+ bool GetBufferInfo(int buffer_id, void** storage, size_t* size);
- // Reserve or allocate a buffer of at least |size| bytes and return its id.
- // This will fail (returning kInvalidId) if the pool already is at its |count|
- // limit of the number of allocations, and all allocated buffers are in use by
- // the producer and/or consumers.
+ // Reserve or allocate a buffer to support a packed frame of |dimensions| of
+ // pixel |format| and return its id. This will fail (returning kInvalidId) if
+ // the pool already is at its |count| limit of the number of allocations, and
+ // all allocated buffers are in use by the producer and/or consumers.
//
// If successful, the reserved buffer remains reserved (and writable by the
// producer) until ownership is transferred either to the consumer via
@@ -73,7 +70,9 @@ class CONTENT_EXPORT VideoCaptureBufferPool
// On occasion, this call will decide to free an old buffer to make room for a
// new allocation at a larger size. If so, the ID of the destroyed buffer is
// returned via |buffer_id_to_drop|.
- int ReserveForProducer(size_t size, int* buffer_id_to_drop);
+ int ReserveForProducer(media::VideoPixelFormat format,
+ const gfx::Size& dimensions,
+ int* buffer_id_to_drop);
// Indicate that a buffer held for the producer should be returned back to the
// pool without passing on to the consumer. This effectively is the opposite
@@ -90,32 +89,50 @@ class CONTENT_EXPORT VideoCaptureBufferPool
// done, a buffer is returned to the pool for reuse.
void RelinquishConsumerHold(int buffer_id, int num_clients);
- int count() const { return count_; }
-
private:
- friend class base::RefCountedThreadSafe<VideoCaptureBufferPool>;
-
- // Per-buffer state.
- struct Buffer {
- Buffer();
-
- // The memory created to be shared with renderer processes.
- base::SharedMemory shared_memory;
-
- // Tracks whether this buffer is currently referenced by the producer.
- bool held_by_producer;
-
- // Number of consumer processes which hold this shared memory.
- int consumer_hold_count;
+ class SharedMemTracker;
+ // Generic class to keep track of the state of a given mappable resource.
+ class Tracker {
+ public:
+ static scoped_ptr<Tracker> CreateTracker();
+
+ Tracker() : held_by_producer_(false), consumer_hold_count_(0) {}
+ virtual bool Init(media::VideoFrame::Format format,
+ const gfx::Size& dimensions) = 0;
+ virtual ~Tracker();
+
+ bool held_by_producer() const { return held_by_producer_; }
+ void set_held_by_producer(bool value) { held_by_producer_ = value; }
+ int consumer_hold_count() const { return consumer_hold_count_; }
+ void set_consumer_hold_count(int value) { consumer_hold_count_ = value; }
+
+ // Returns a void* to the underlying storage, be that a memory block for
+ // Shared Memory, or a GpuMemoryBuffer.
+ virtual void* storage() = 0;
+ // Amount of bytes requested when first created. Can be zero if it does not
+ // need RAM, e.g. is allocated in GPU memory.
+ virtual size_t requested_size() = 0;
+ // The actual size of the underlying backing resource.
+ virtual size_t mapped_size() = 0;
+
+ virtual bool ShareToProcess(base::ProcessHandle process_handle,
+ base::SharedMemoryHandle* new_handle) = 0;
+
+ private:
+ // Indicates whether this Tracker is currently referenced by the producer.
+ bool held_by_producer_;
+ // Number of consumer processes which hold this Tracker.
+ int consumer_hold_count_;
};
- typedef std::map<int, Buffer*> BufferMap;
-
+ friend class base::RefCountedThreadSafe<VideoCaptureBufferPool>;
virtual ~VideoCaptureBufferPool();
- int ReserveForProducerInternal(size_t size, int* buffer_id_to_drop);
+ int ReserveForProducerInternal(media::VideoPixelFormat format,
+ const gfx::Size& dimensions,
+ int* tracker_id_to_drop);
- Buffer* GetBuffer(int buffer_id);
+ Tracker* GetTracker(int buffer_id);
// The max number of buffers that the pool is allowed to have at any moment.
const int count_;
@@ -126,8 +143,9 @@ class CONTENT_EXPORT VideoCaptureBufferPool
// The ID of the next buffer.
int next_buffer_id_;
- // The buffers, indexed by |buffer_id|.
- BufferMap buffers_;
+ // The buffers, indexed by the first parameter, a buffer id.
+ using TrackerMap = std::map<int, Tracker*>;
+ TrackerMap trackers_;
DISALLOW_IMPLICIT_CONSTRUCTORS(VideoCaptureBufferPool);
};

Powered by Google App Engine
This is Rietveld 408576698