Camera: BufferManager: Don't attach/detach on every frame
- Maintain separate count of attached buffers
- Only attach when new buffers need to be allocated
- Only detach when a buffer needs to be freed
- Fix missing notification initializations
- Remove warning that's always logged
Bug: 28695173
Change-Id: I38e997fa1e69c2b8743e43eed31a6a08a6f9cd7a
diff --git a/services/camera/libcameraservice/device3/Camera3BufferManager.h b/services/camera/libcameraservice/device3/Camera3BufferManager.h
index 7942ae6..ab6541e 100644
--- a/services/camera/libcameraservice/device3/Camera3BufferManager.h
+++ b/services/camera/libcameraservice/device3/Camera3BufferManager.h
@@ -29,6 +29,7 @@
namespace camera3 {
struct StreamInfo;
+class Camera3OutputStream;
/**
* A class managing the graphic buffers that is used by camera output streams. It allocates and
@@ -81,7 +82,7 @@
* and other streams that were already registered with the same stream set
* ID.
*/
- status_t registerStream(const StreamInfo &streamInfo);
+ status_t registerStream(wp<Camera3OutputStream>& stream, const StreamInfo &streamInfo);
/**
* This method unregisters a stream from this buffer manager.
@@ -114,6 +115,8 @@
* Return values:
*
* OK: Getting buffer for this stream was successful.
+ * ALREADY_EXISTS: Enough free buffers are already attached to this output buffer queue,
+ * user should just dequeue from the buffer queue.
* BAD_VALUE: stream ID or streamSetId are invalid, or stream ID and stream set ID
* combination doesn't match what was registered, or this stream wasn't registered
* to this buffer manager before.
@@ -122,6 +125,28 @@
status_t getBufferForStream(int streamId, int streamSetId, sp<GraphicBuffer>* gb, int* fenceFd);
/**
+ * This method notifies the manager that a buffer has been released by the consumer.
+ *
+ * The buffer is not returned to the buffer manager, but is available for the stream the buffer
+ * is attached to for dequeuing.
+ *
+ * The notification lets the manager know how many buffers are directly available to the stream.
+ *
+ * If onBufferReleased is called for a given released buffer,
+ * returnBufferForStream may not be called for the same buffer, until the
+ * buffer has been reused. The manager will call detachBuffer on the stream
+ * if it needs the released buffer otherwise.
+ *
+ * Return values:
+ *
+ * OK: Buffer release was processed succesfully
+ * BAD_VALUE: stream ID or streamSetId are invalid, or stream ID and stream set ID
+ * combination doesn't match what was registered, or this stream wasn't registered
+ * to this buffer manager before.
+ */
+ status_t onBufferReleased(int streamId, int streamSetId);
+
+ /**
* This method returns a buffer for a stream to this buffer manager.
*
* When a buffer is returned, it is treated as a free buffer and may either be reused for future
@@ -245,6 +270,12 @@
* The count of the buffers that were handed out to the streams of this set.
*/
BufferCountMap handoutBufferCountMap;
+ /**
+ * The count of the buffers that are attached to the streams of this set.
+ * An attached buffer may be free or handed out
+ */
+ BufferCountMap attachedBufferCountMap;
+
StreamSet() {
allocatedBufferWaterMark = 0;
maxAllowedBufferCount = 0;
@@ -256,6 +287,7 @@
*/
typedef int StreamSetId;
KeyedVector<StreamSetId, StreamSet> mStreamSetMap;
+ KeyedVector<StreamId, wp<Camera3OutputStream>> mStreamMap;
// TODO: There is no easy way to query the Gralloc version in this code yet, we have different
// code paths for different Gralloc versions, hardcode something here for now.