1125684aba1a11b7adbf5f9d607ee2bcc9449081cZhijun He/*
2125684aba1a11b7adbf5f9d607ee2bcc9449081cZhijun He * Copyright 2016 The Android Open Source Project
3125684aba1a11b7adbf5f9d607ee2bcc9449081cZhijun He *
4125684aba1a11b7adbf5f9d607ee2bcc9449081cZhijun He * Licensed under the Apache License, Version 2.0 (the "License");
5125684aba1a11b7adbf5f9d607ee2bcc9449081cZhijun He * you may not use this file except in compliance with the License.
6125684aba1a11b7adbf5f9d607ee2bcc9449081cZhijun He * You may obtain a copy of the License at
7125684aba1a11b7adbf5f9d607ee2bcc9449081cZhijun He *
8125684aba1a11b7adbf5f9d607ee2bcc9449081cZhijun He *      http://www.apache.org/licenses/LICENSE-2.0
9125684aba1a11b7adbf5f9d607ee2bcc9449081cZhijun He *
10125684aba1a11b7adbf5f9d607ee2bcc9449081cZhijun He * Unless required by applicable law or agreed to in writing, software
11125684aba1a11b7adbf5f9d607ee2bcc9449081cZhijun He * distributed under the License is distributed on an "AS IS" BASIS,
12125684aba1a11b7adbf5f9d607ee2bcc9449081cZhijun He * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13125684aba1a11b7adbf5f9d607ee2bcc9449081cZhijun He * See the License for the specific language governing permissions and
14125684aba1a11b7adbf5f9d607ee2bcc9449081cZhijun He * limitations under the License.
15125684aba1a11b7adbf5f9d607ee2bcc9449081cZhijun He */
16125684aba1a11b7adbf5f9d607ee2bcc9449081cZhijun He
17125684aba1a11b7adbf5f9d607ee2bcc9449081cZhijun He#ifndef ANDROID_SERVERS_CAMERA3_BUFFER_MANAGER_H
18125684aba1a11b7adbf5f9d607ee2bcc9449081cZhijun He#define ANDROID_SERVERS_CAMERA3_BUFFER_MANAGER_H
19125684aba1a11b7adbf5f9d607ee2bcc9449081cZhijun He
20125684aba1a11b7adbf5f9d607ee2bcc9449081cZhijun He#include <list>
21125684aba1a11b7adbf5f9d607ee2bcc9449081cZhijun He#include <algorithm>
22125684aba1a11b7adbf5f9d607ee2bcc9449081cZhijun He#include <ui/GraphicBuffer.h>
23125684aba1a11b7adbf5f9d607ee2bcc9449081cZhijun He#include <utils/RefBase.h>
24125684aba1a11b7adbf5f9d607ee2bcc9449081cZhijun He#include <utils/KeyedVector.h>
25125684aba1a11b7adbf5f9d607ee2bcc9449081cZhijun He#include "Camera3OutputStream.h"
26125684aba1a11b7adbf5f9d607ee2bcc9449081cZhijun He
27125684aba1a11b7adbf5f9d607ee2bcc9449081cZhijun Henamespace android {
28125684aba1a11b7adbf5f9d607ee2bcc9449081cZhijun He
29125684aba1a11b7adbf5f9d607ee2bcc9449081cZhijun Henamespace camera3 {
30125684aba1a11b7adbf5f9d607ee2bcc9449081cZhijun He
31125684aba1a11b7adbf5f9d607ee2bcc9449081cZhijun Hestruct StreamInfo;
3277c1a3554275a51ac8eb9fbe86f476afc8983192Eino-Ville Talvalaclass Camera3OutputStream;
33125684aba1a11b7adbf5f9d607ee2bcc9449081cZhijun He
34125684aba1a11b7adbf5f9d607ee2bcc9449081cZhijun He/**
35125684aba1a11b7adbf5f9d607ee2bcc9449081cZhijun He * A class managing the graphic buffers that is used by camera output streams. It allocates and
36125684aba1a11b7adbf5f9d607ee2bcc9449081cZhijun He * hands out Gralloc buffers to the clients (e.g., Camera3OutputStream) based on the requests.
37125684aba1a11b7adbf5f9d607ee2bcc9449081cZhijun He * When clients request a buffer, buffer manager will pick a buffer if there are some already
38125684aba1a11b7adbf5f9d607ee2bcc9449081cZhijun He * allocated buffer available, will allocate a buffer otherwise. When there are too many allocated
39125684aba1a11b7adbf5f9d607ee2bcc9449081cZhijun He * buffer maintained by the buffer manager, it will dynamically deallocate some buffers that are
40125684aba1a11b7adbf5f9d607ee2bcc9449081cZhijun He * solely owned by this buffer manager.
41125684aba1a11b7adbf5f9d607ee2bcc9449081cZhijun He * In doing so, it reduces the memory footprint unless it is already minimal without impacting
42125684aba1a11b7adbf5f9d607ee2bcc9449081cZhijun He * performance.
43125684aba1a11b7adbf5f9d607ee2bcc9449081cZhijun He *
44125684aba1a11b7adbf5f9d607ee2bcc9449081cZhijun He */
45125684aba1a11b7adbf5f9d607ee2bcc9449081cZhijun Heclass Camera3BufferManager: public virtual RefBase {
46125684aba1a11b7adbf5f9d607ee2bcc9449081cZhijun Hepublic:
47125684aba1a11b7adbf5f9d607ee2bcc9449081cZhijun He    Camera3BufferManager(const sp<IGraphicBufferAlloc>& allocator = NULL);
48125684aba1a11b7adbf5f9d607ee2bcc9449081cZhijun He
49125684aba1a11b7adbf5f9d607ee2bcc9449081cZhijun He    virtual ~Camera3BufferManager();
50125684aba1a11b7adbf5f9d607ee2bcc9449081cZhijun He
51125684aba1a11b7adbf5f9d607ee2bcc9449081cZhijun He    /**
52125684aba1a11b7adbf5f9d607ee2bcc9449081cZhijun He     * This method registers an output stream to this buffer manager by using the provided stream
53125684aba1a11b7adbf5f9d607ee2bcc9449081cZhijun He     * information.
54125684aba1a11b7adbf5f9d607ee2bcc9449081cZhijun He     *
55125684aba1a11b7adbf5f9d607ee2bcc9449081cZhijun He     * The stream info includes the necessary information such as stream size, format, buffer count,
56125684aba1a11b7adbf5f9d607ee2bcc9449081cZhijun He     * usage flags, etc. for the buffer manager to allocate and hand out buffers for this stream.
57125684aba1a11b7adbf5f9d607ee2bcc9449081cZhijun He     *
58125684aba1a11b7adbf5f9d607ee2bcc9449081cZhijun He     * It's illegal to call this method if the stream is not CONFIGURED yet, as some critical
59125684aba1a11b7adbf5f9d607ee2bcc9449081cZhijun He     * stream properties (e.g., combined usage flags) are only available in this state. It is also
60125684aba1a11b7adbf5f9d607ee2bcc9449081cZhijun He     * illegal to call this method with an invalid stream set ID (CAMERA3_STREAM_SET_ID_INVALID),
61125684aba1a11b7adbf5f9d607ee2bcc9449081cZhijun He     * as the invalid stream set ID indicates that this stream doesn't intend to use buffer manager.
62125684aba1a11b7adbf5f9d607ee2bcc9449081cZhijun He     *
63125684aba1a11b7adbf5f9d607ee2bcc9449081cZhijun He     *
64125684aba1a11b7adbf5f9d607ee2bcc9449081cZhijun He     * Once a stream is successfully registered to this buffer manager, the buffer manager takes
65125684aba1a11b7adbf5f9d607ee2bcc9449081cZhijun He     * over the buffer allocation role and provides buffers to this stream via getBufferForStream().
66125684aba1a11b7adbf5f9d607ee2bcc9449081cZhijun He     * The returned buffer can be sent to the camera HAL for image output, and then queued to the
67125684aba1a11b7adbf5f9d607ee2bcc9449081cZhijun He     * ANativeWindow (Surface) for downstream consumer to acquire. Once the image buffer is released
68125684aba1a11b7adbf5f9d607ee2bcc9449081cZhijun He     * by the consumer end point, the BufferQueueProducer callback onBufferReleased will call
69125684aba1a11b7adbf5f9d607ee2bcc9449081cZhijun He     * returnBufferForStream() to return the free buffer to this buffer manager. If the stream
70125684aba1a11b7adbf5f9d607ee2bcc9449081cZhijun He     * uses buffer manager to manage the stream buffers, it should disable the BufferQueue
71125684aba1a11b7adbf5f9d607ee2bcc9449081cZhijun He     * allocation via IGraphicBufferProducer::allowAllocation(false).
72125684aba1a11b7adbf5f9d607ee2bcc9449081cZhijun He     *
73125684aba1a11b7adbf5f9d607ee2bcc9449081cZhijun He     * Registering an already registered stream has no effect.
74125684aba1a11b7adbf5f9d607ee2bcc9449081cZhijun He     *
75125684aba1a11b7adbf5f9d607ee2bcc9449081cZhijun He     * Return values:
76125684aba1a11b7adbf5f9d607ee2bcc9449081cZhijun He     *
77125684aba1a11b7adbf5f9d607ee2bcc9449081cZhijun He     *  OK:                Registration of the new stream was successful.
78125684aba1a11b7adbf5f9d607ee2bcc9449081cZhijun He     *  BAD_VALUE:         This stream is not at CONFIGURED state, or the stream ID or stream set
79125684aba1a11b7adbf5f9d607ee2bcc9449081cZhijun He     *                     ID are invalid, or attempting to register the same stream to multiple
80125684aba1a11b7adbf5f9d607ee2bcc9449081cZhijun He     *                     stream sets, or other stream properties are invalid.
81125684aba1a11b7adbf5f9d607ee2bcc9449081cZhijun He     *  INVALID_OPERATION: This buffer manager doesn't support buffer sharing across this stream
82125684aba1a11b7adbf5f9d607ee2bcc9449081cZhijun He     *                     and other streams that were already registered with the same stream set
83125684aba1a11b7adbf5f9d607ee2bcc9449081cZhijun He     *                     ID.
84125684aba1a11b7adbf5f9d607ee2bcc9449081cZhijun He     */
8577c1a3554275a51ac8eb9fbe86f476afc8983192Eino-Ville Talvala    status_t registerStream(wp<Camera3OutputStream>& stream, const StreamInfo &streamInfo);
86125684aba1a11b7adbf5f9d607ee2bcc9449081cZhijun He
87125684aba1a11b7adbf5f9d607ee2bcc9449081cZhijun He    /**
88125684aba1a11b7adbf5f9d607ee2bcc9449081cZhijun He     * This method unregisters a stream from this buffer manager.
89125684aba1a11b7adbf5f9d607ee2bcc9449081cZhijun He     *
90125684aba1a11b7adbf5f9d607ee2bcc9449081cZhijun He     * After a stream is unregistered, further getBufferForStream() calls will fail for this stream.
91125684aba1a11b7adbf5f9d607ee2bcc9449081cZhijun He     * After all streams for a given stream set are unregistered, all the buffers solely owned (for
92125684aba1a11b7adbf5f9d607ee2bcc9449081cZhijun He     * this stream set) by this buffer manager will be freed; all buffers subsequently returned to
93125684aba1a11b7adbf5f9d607ee2bcc9449081cZhijun He     * this buffer manager for this stream set will be freed immediately.
94125684aba1a11b7adbf5f9d607ee2bcc9449081cZhijun He     *
95125684aba1a11b7adbf5f9d607ee2bcc9449081cZhijun He     * Return values:
96125684aba1a11b7adbf5f9d607ee2bcc9449081cZhijun He     *
97125684aba1a11b7adbf5f9d607ee2bcc9449081cZhijun He     *  OK:        Removal of the a stream from this buffer manager was successful.
98125684aba1a11b7adbf5f9d607ee2bcc9449081cZhijun He     *  BAD_VALUE: stream ID or stream set ID are invalid, or stream ID and stream set ID
99125684aba1a11b7adbf5f9d607ee2bcc9449081cZhijun He     *             combination doesn't match what was registered, or this stream wasn't registered
100125684aba1a11b7adbf5f9d607ee2bcc9449081cZhijun He     *             to this buffer manager before.
101125684aba1a11b7adbf5f9d607ee2bcc9449081cZhijun He     */
102125684aba1a11b7adbf5f9d607ee2bcc9449081cZhijun He    status_t unregisterStream(int streamId, int streamSetId);
103125684aba1a11b7adbf5f9d607ee2bcc9449081cZhijun He
104125684aba1a11b7adbf5f9d607ee2bcc9449081cZhijun He    /**
105125684aba1a11b7adbf5f9d607ee2bcc9449081cZhijun He     * This method obtains a buffer for a stream from this buffer manager.
106125684aba1a11b7adbf5f9d607ee2bcc9449081cZhijun He     *
107125684aba1a11b7adbf5f9d607ee2bcc9449081cZhijun He     * This method returns the first free buffer from the free buffer list (associated with this
108125684aba1a11b7adbf5f9d607ee2bcc9449081cZhijun He     * stream set) if there is any. Otherwise, it will allocate a buffer for this stream, return
109125684aba1a11b7adbf5f9d607ee2bcc9449081cZhijun He     * it and increment its count of handed-out buffers. When the total number of allocated buffers
110125684aba1a11b7adbf5f9d607ee2bcc9449081cZhijun He     * is too high, it may deallocate the unused buffers to save memory footprint of this stream
111125684aba1a11b7adbf5f9d607ee2bcc9449081cZhijun He     * set.
112125684aba1a11b7adbf5f9d607ee2bcc9449081cZhijun He     *
113125684aba1a11b7adbf5f9d607ee2bcc9449081cZhijun He     * After this call, the client takes over the ownership of this buffer if it is not freed.
114125684aba1a11b7adbf5f9d607ee2bcc9449081cZhijun He     *
115125684aba1a11b7adbf5f9d607ee2bcc9449081cZhijun He     * Return values:
116125684aba1a11b7adbf5f9d607ee2bcc9449081cZhijun He     *
117125684aba1a11b7adbf5f9d607ee2bcc9449081cZhijun He     *  OK:        Getting buffer for this stream was successful.
11877c1a3554275a51ac8eb9fbe86f476afc8983192Eino-Ville Talvala     *  ALREADY_EXISTS: Enough free buffers are already attached to this output buffer queue,
11977c1a3554275a51ac8eb9fbe86f476afc8983192Eino-Ville Talvala     *             user should just dequeue from the buffer queue.
120125684aba1a11b7adbf5f9d607ee2bcc9449081cZhijun He     *  BAD_VALUE: stream ID or streamSetId are invalid, or stream ID and stream set ID
121125684aba1a11b7adbf5f9d607ee2bcc9449081cZhijun He     *             combination doesn't match what was registered, or this stream wasn't registered
122125684aba1a11b7adbf5f9d607ee2bcc9449081cZhijun He     *             to this buffer manager before.
123125684aba1a11b7adbf5f9d607ee2bcc9449081cZhijun He     *  NO_MEMORY: Unable to allocate a buffer for this stream at this time.
124125684aba1a11b7adbf5f9d607ee2bcc9449081cZhijun He     */
125125684aba1a11b7adbf5f9d607ee2bcc9449081cZhijun He    status_t getBufferForStream(int streamId, int streamSetId, sp<GraphicBuffer>* gb, int* fenceFd);
126125684aba1a11b7adbf5f9d607ee2bcc9449081cZhijun He
127125684aba1a11b7adbf5f9d607ee2bcc9449081cZhijun He    /**
12877c1a3554275a51ac8eb9fbe86f476afc8983192Eino-Ville Talvala     * This method notifies the manager that a buffer has been released by the consumer.
12977c1a3554275a51ac8eb9fbe86f476afc8983192Eino-Ville Talvala     *
13077c1a3554275a51ac8eb9fbe86f476afc8983192Eino-Ville Talvala     * The buffer is not returned to the buffer manager, but is available for the stream the buffer
13177c1a3554275a51ac8eb9fbe86f476afc8983192Eino-Ville Talvala     * is attached to for dequeuing.
13277c1a3554275a51ac8eb9fbe86f476afc8983192Eino-Ville Talvala     *
13377c1a3554275a51ac8eb9fbe86f476afc8983192Eino-Ville Talvala     * The notification lets the manager know how many buffers are directly available to the stream.
13477c1a3554275a51ac8eb9fbe86f476afc8983192Eino-Ville Talvala     *
13577c1a3554275a51ac8eb9fbe86f476afc8983192Eino-Ville Talvala     * If onBufferReleased is called for a given released buffer,
13677c1a3554275a51ac8eb9fbe86f476afc8983192Eino-Ville Talvala     * returnBufferForStream may not be called for the same buffer, until the
13777c1a3554275a51ac8eb9fbe86f476afc8983192Eino-Ville Talvala     * buffer has been reused. The manager will call detachBuffer on the stream
13877c1a3554275a51ac8eb9fbe86f476afc8983192Eino-Ville Talvala     * if it needs the released buffer otherwise.
13977c1a3554275a51ac8eb9fbe86f476afc8983192Eino-Ville Talvala     *
14077c1a3554275a51ac8eb9fbe86f476afc8983192Eino-Ville Talvala     * Return values:
14177c1a3554275a51ac8eb9fbe86f476afc8983192Eino-Ville Talvala     *
14277c1a3554275a51ac8eb9fbe86f476afc8983192Eino-Ville Talvala     *  OK:        Buffer release was processed succesfully
14377c1a3554275a51ac8eb9fbe86f476afc8983192Eino-Ville Talvala     *  BAD_VALUE: stream ID or streamSetId are invalid, or stream ID and stream set ID
14477c1a3554275a51ac8eb9fbe86f476afc8983192Eino-Ville Talvala     *             combination doesn't match what was registered, or this stream wasn't registered
14577c1a3554275a51ac8eb9fbe86f476afc8983192Eino-Ville Talvala     *             to this buffer manager before.
14677c1a3554275a51ac8eb9fbe86f476afc8983192Eino-Ville Talvala     */
14777c1a3554275a51ac8eb9fbe86f476afc8983192Eino-Ville Talvala    status_t onBufferReleased(int streamId, int streamSetId);
14877c1a3554275a51ac8eb9fbe86f476afc8983192Eino-Ville Talvala
14977c1a3554275a51ac8eb9fbe86f476afc8983192Eino-Ville Talvala    /**
150125684aba1a11b7adbf5f9d607ee2bcc9449081cZhijun He     * This method returns a buffer for a stream to this buffer manager.
151125684aba1a11b7adbf5f9d607ee2bcc9449081cZhijun He     *
152125684aba1a11b7adbf5f9d607ee2bcc9449081cZhijun He     * When a buffer is returned, it is treated as a free buffer and may either be reused for future
153125684aba1a11b7adbf5f9d607ee2bcc9449081cZhijun He     * getBufferForStream() calls, or freed if there total number of outstanding allocated buffers
154125684aba1a11b7adbf5f9d607ee2bcc9449081cZhijun He     * is too large. The latter only applies to the case where the buffer are physically shared
155125684aba1a11b7adbf5f9d607ee2bcc9449081cZhijun He     * between streams in the same stream set. A physically shared buffer is the buffer that has one
156125684aba1a11b7adbf5f9d607ee2bcc9449081cZhijun He     * physical back store but multiple handles. Multiple stream can access the same physical memory
157125684aba1a11b7adbf5f9d607ee2bcc9449081cZhijun He     * with their own handles. Physically shared buffer can only be supported by Gralloc HAL V1.
158125684aba1a11b7adbf5f9d607ee2bcc9449081cZhijun He     * See hardware/libhardware/include/hardware/gralloc1.h for more details.
159125684aba1a11b7adbf5f9d607ee2bcc9449081cZhijun He     *
160125684aba1a11b7adbf5f9d607ee2bcc9449081cZhijun He     *
161125684aba1a11b7adbf5f9d607ee2bcc9449081cZhijun He     * This call takes the ownership of the returned buffer if it was allocated by this buffer
162125684aba1a11b7adbf5f9d607ee2bcc9449081cZhijun He     * manager; clients should not use this buffer after this call. Attempting to access this buffer
163125684aba1a11b7adbf5f9d607ee2bcc9449081cZhijun He     * after this call will have undefined behavior. Holding a reference to this buffer after this
164125684aba1a11b7adbf5f9d607ee2bcc9449081cZhijun He     * call may cause memory leakage. If a BufferQueue is used to track the buffers handed out by
165125684aba1a11b7adbf5f9d607ee2bcc9449081cZhijun He     * this buffer queue, it is recommended to call detachNextBuffer() from the buffer queue after
166125684aba1a11b7adbf5f9d607ee2bcc9449081cZhijun He     * BufferQueueProducer onBufferReleased callback is fired, and return it to this buffer manager.
167125684aba1a11b7adbf5f9d607ee2bcc9449081cZhijun He     *
168125684aba1a11b7adbf5f9d607ee2bcc9449081cZhijun He     *  OK:        Buffer return for this stream was successful.
169125684aba1a11b7adbf5f9d607ee2bcc9449081cZhijun He     *  BAD_VALUE: stream ID or streamSetId are invalid, or stream ID and stream set ID combination
170125684aba1a11b7adbf5f9d607ee2bcc9449081cZhijun He     *             doesn't match what was registered, or this stream wasn't registered to this
171125684aba1a11b7adbf5f9d607ee2bcc9449081cZhijun He     *             buffer manager before.
172125684aba1a11b7adbf5f9d607ee2bcc9449081cZhijun He     */
173125684aba1a11b7adbf5f9d607ee2bcc9449081cZhijun He    status_t returnBufferForStream(int streamId, int streamSetId, const sp<GraphicBuffer>& buffer,
174125684aba1a11b7adbf5f9d607ee2bcc9449081cZhijun He            int fenceFd);
175125684aba1a11b7adbf5f9d607ee2bcc9449081cZhijun He
176125684aba1a11b7adbf5f9d607ee2bcc9449081cZhijun He    /**
177125684aba1a11b7adbf5f9d607ee2bcc9449081cZhijun He     * Dump the buffer manager statistics.
178125684aba1a11b7adbf5f9d607ee2bcc9449081cZhijun He     */
179125684aba1a11b7adbf5f9d607ee2bcc9449081cZhijun He    void     dump(int fd, const Vector<String16> &args) const;
180125684aba1a11b7adbf5f9d607ee2bcc9449081cZhijun He
181125684aba1a11b7adbf5f9d607ee2bcc9449081cZhijun Heprivate:
182125684aba1a11b7adbf5f9d607ee2bcc9449081cZhijun He    /**
183125684aba1a11b7adbf5f9d607ee2bcc9449081cZhijun He     * Lock to synchronize the access to the methods of this class.
184125684aba1a11b7adbf5f9d607ee2bcc9449081cZhijun He     */
185125684aba1a11b7adbf5f9d607ee2bcc9449081cZhijun He    mutable Mutex mLock;
186125684aba1a11b7adbf5f9d607ee2bcc9449081cZhijun He
187125684aba1a11b7adbf5f9d607ee2bcc9449081cZhijun He    static const size_t kMaxBufferCount = BufferQueueDefs::NUM_BUFFER_SLOTS;
188125684aba1a11b7adbf5f9d607ee2bcc9449081cZhijun He
189125684aba1a11b7adbf5f9d607ee2bcc9449081cZhijun He    /**
190125684aba1a11b7adbf5f9d607ee2bcc9449081cZhijun He     * mAllocator is the connection to SurfaceFlinger that is used to allocate new GraphicBuffer
191125684aba1a11b7adbf5f9d607ee2bcc9449081cZhijun He     * objects.
192125684aba1a11b7adbf5f9d607ee2bcc9449081cZhijun He     */
193125684aba1a11b7adbf5f9d607ee2bcc9449081cZhijun He    sp<IGraphicBufferAlloc> mAllocator;
194125684aba1a11b7adbf5f9d607ee2bcc9449081cZhijun He
195125684aba1a11b7adbf5f9d607ee2bcc9449081cZhijun He    struct GraphicBufferEntry {
196125684aba1a11b7adbf5f9d607ee2bcc9449081cZhijun He        sp<GraphicBuffer> graphicBuffer;
197125684aba1a11b7adbf5f9d607ee2bcc9449081cZhijun He        int fenceFd;
198125684aba1a11b7adbf5f9d607ee2bcc9449081cZhijun He        GraphicBufferEntry(const sp<GraphicBuffer>& gb = 0, int fd = -1) :
199125684aba1a11b7adbf5f9d607ee2bcc9449081cZhijun He            graphicBuffer(gb),
200125684aba1a11b7adbf5f9d607ee2bcc9449081cZhijun He            fenceFd(fd) {}
201125684aba1a11b7adbf5f9d607ee2bcc9449081cZhijun He    };
202125684aba1a11b7adbf5f9d607ee2bcc9449081cZhijun He
203125684aba1a11b7adbf5f9d607ee2bcc9449081cZhijun He    /**
204125684aba1a11b7adbf5f9d607ee2bcc9449081cZhijun He     * A buffer entry (indexed by stream ID) represents a single physically allocated buffer. For
205125684aba1a11b7adbf5f9d607ee2bcc9449081cZhijun He     * Gralloc V0, since each physical buffer is associated with one stream, this is
206125684aba1a11b7adbf5f9d607ee2bcc9449081cZhijun He     * a single entry map. For Gralloc V1, one physical buffer can be shared between different
207125684aba1a11b7adbf5f9d607ee2bcc9449081cZhijun He     * streams in one stream set, so this entry may include multiple entries, where the different
208125684aba1a11b7adbf5f9d607ee2bcc9449081cZhijun He     * graphic buffers have the same common Gralloc backing store.
209125684aba1a11b7adbf5f9d607ee2bcc9449081cZhijun He     */
210125684aba1a11b7adbf5f9d607ee2bcc9449081cZhijun He    typedef int StreamId;
211125684aba1a11b7adbf5f9d607ee2bcc9449081cZhijun He    typedef KeyedVector<StreamId, GraphicBufferEntry> BufferEntry;
212125684aba1a11b7adbf5f9d607ee2bcc9449081cZhijun He
213125684aba1a11b7adbf5f9d607ee2bcc9449081cZhijun He    typedef std::list<BufferEntry> BufferList;
214125684aba1a11b7adbf5f9d607ee2bcc9449081cZhijun He
215125684aba1a11b7adbf5f9d607ee2bcc9449081cZhijun He    /**
216125684aba1a11b7adbf5f9d607ee2bcc9449081cZhijun He     * Stream info map (indexed by stream ID) tracks all the streams registered to a particular
217125684aba1a11b7adbf5f9d607ee2bcc9449081cZhijun He     * stream set.
218125684aba1a11b7adbf5f9d607ee2bcc9449081cZhijun He     */
219125684aba1a11b7adbf5f9d607ee2bcc9449081cZhijun He    typedef KeyedVector<StreamId, StreamInfo> InfoMap;
220125684aba1a11b7adbf5f9d607ee2bcc9449081cZhijun He
221125684aba1a11b7adbf5f9d607ee2bcc9449081cZhijun He    /**
222125684aba1a11b7adbf5f9d607ee2bcc9449081cZhijun He     * Stream set buffer count map (indexed by stream ID) tracks all buffer counts of the streams
223125684aba1a11b7adbf5f9d607ee2bcc9449081cZhijun He     * registered to a particular stream set.
224125684aba1a11b7adbf5f9d607ee2bcc9449081cZhijun He     */
225125684aba1a11b7adbf5f9d607ee2bcc9449081cZhijun He    typedef KeyedVector<StreamId, size_t> BufferCountMap;
226125684aba1a11b7adbf5f9d607ee2bcc9449081cZhijun He
227125684aba1a11b7adbf5f9d607ee2bcc9449081cZhijun He    /**
228125684aba1a11b7adbf5f9d607ee2bcc9449081cZhijun He     * StreamSet keeps track of the stream info, free buffer list and hand-out buffer counts for
229125684aba1a11b7adbf5f9d607ee2bcc9449081cZhijun He     * each stream set.
230125684aba1a11b7adbf5f9d607ee2bcc9449081cZhijun He     */
231125684aba1a11b7adbf5f9d607ee2bcc9449081cZhijun He    struct StreamSet {
232125684aba1a11b7adbf5f9d607ee2bcc9449081cZhijun He        /**
233125684aba1a11b7adbf5f9d607ee2bcc9449081cZhijun He         * Stream set buffer count water mark representing the max number of allocated buffers
234125684aba1a11b7adbf5f9d607ee2bcc9449081cZhijun He         * (hand-out buffers + free buffers) count for each stream set. For a given stream set, when
235125684aba1a11b7adbf5f9d607ee2bcc9449081cZhijun He         * getBufferForStream() is called on this buffer manager, if the total allocated buffer
236125684aba1a11b7adbf5f9d607ee2bcc9449081cZhijun He         * count exceeds this water mark, the buffer manager will attempt to reduce it as follows:
237125684aba1a11b7adbf5f9d607ee2bcc9449081cZhijun He         *
238125684aba1a11b7adbf5f9d607ee2bcc9449081cZhijun He         * In getBufferForStream(), find a buffer associated with other streams (inside the same
239125684aba1a11b7adbf5f9d607ee2bcc9449081cZhijun He         * stream set) on the free buffer list and free it. For Gralloc V1, can just free the top
240125684aba1a11b7adbf5f9d607ee2bcc9449081cZhijun He         * of the free buffer list if the physical buffer sharing in this stream is supported.
241125684aba1a11b7adbf5f9d607ee2bcc9449081cZhijun He         *
242125684aba1a11b7adbf5f9d607ee2bcc9449081cZhijun He         * For a particular stream set, a larger allocatedBufferWaterMark increases the memory
243125684aba1a11b7adbf5f9d607ee2bcc9449081cZhijun He         * footprint of the stream set, but reduces the chance that getBufferForStream() will have
244125684aba1a11b7adbf5f9d607ee2bcc9449081cZhijun He         * to allocate a new buffer. We assume that the streams in one stream set are not streaming
245125684aba1a11b7adbf5f9d607ee2bcc9449081cZhijun He         * simultaneously, the max allocated buffer count water mark for a stream set will the max
246125684aba1a11b7adbf5f9d607ee2bcc9449081cZhijun He         * of all streams' total buffer counts. This will avoid new buffer allocation in steady
247125684aba1a11b7adbf5f9d607ee2bcc9449081cZhijun He         * streaming state.
2488d1a154cc6239096edda698ea638e6ab6fe53c4eZhijun He         *
2498d1a154cc6239096edda698ea638e6ab6fe53c4eZhijun He         * This water mark can be dynamically changed, and will grow when the hand-out buffer count
2508d1a154cc6239096edda698ea638e6ab6fe53c4eZhijun He         * of each stream increases, until it reaches the maxAllowedBufferCount.
251125684aba1a11b7adbf5f9d607ee2bcc9449081cZhijun He         */
252125684aba1a11b7adbf5f9d607ee2bcc9449081cZhijun He        size_t allocatedBufferWaterMark;
2538d1a154cc6239096edda698ea638e6ab6fe53c4eZhijun He
2548d1a154cc6239096edda698ea638e6ab6fe53c4eZhijun He        /**
2558d1a154cc6239096edda698ea638e6ab6fe53c4eZhijun He         * The max allowed buffer count for this stream set. It is the max of total number of
2568d1a154cc6239096edda698ea638e6ab6fe53c4eZhijun He         * buffers for each stream. This is the upper bound of the allocatedBufferWaterMark.
2578d1a154cc6239096edda698ea638e6ab6fe53c4eZhijun He         */
2588d1a154cc6239096edda698ea638e6ab6fe53c4eZhijun He        size_t maxAllowedBufferCount;
2598d1a154cc6239096edda698ea638e6ab6fe53c4eZhijun He
260125684aba1a11b7adbf5f9d607ee2bcc9449081cZhijun He        /**
261125684aba1a11b7adbf5f9d607ee2bcc9449081cZhijun He         * The stream info for all streams in this set
262125684aba1a11b7adbf5f9d607ee2bcc9449081cZhijun He         */
263125684aba1a11b7adbf5f9d607ee2bcc9449081cZhijun He        InfoMap streamInfoMap;
264125684aba1a11b7adbf5f9d607ee2bcc9449081cZhijun He        /**
265125684aba1a11b7adbf5f9d607ee2bcc9449081cZhijun He         * The free buffer list for all the buffers belong to this set. The free buffers are
266125684aba1a11b7adbf5f9d607ee2bcc9449081cZhijun He         * returned by the returnBufferForStream() call, and available for reuse.
267125684aba1a11b7adbf5f9d607ee2bcc9449081cZhijun He         */
268125684aba1a11b7adbf5f9d607ee2bcc9449081cZhijun He        BufferList freeBuffers;
269125684aba1a11b7adbf5f9d607ee2bcc9449081cZhijun He        /**
270125684aba1a11b7adbf5f9d607ee2bcc9449081cZhijun He         * The count of the buffers that were handed out to the streams of this set.
271125684aba1a11b7adbf5f9d607ee2bcc9449081cZhijun He         */
272125684aba1a11b7adbf5f9d607ee2bcc9449081cZhijun He        BufferCountMap handoutBufferCountMap;
27377c1a3554275a51ac8eb9fbe86f476afc8983192Eino-Ville Talvala        /**
27477c1a3554275a51ac8eb9fbe86f476afc8983192Eino-Ville Talvala         * The count of the buffers that are attached to the streams of this set.
27577c1a3554275a51ac8eb9fbe86f476afc8983192Eino-Ville Talvala         * An attached buffer may be free or handed out
27677c1a3554275a51ac8eb9fbe86f476afc8983192Eino-Ville Talvala         */
27777c1a3554275a51ac8eb9fbe86f476afc8983192Eino-Ville Talvala        BufferCountMap attachedBufferCountMap;
27877c1a3554275a51ac8eb9fbe86f476afc8983192Eino-Ville Talvala
279125684aba1a11b7adbf5f9d607ee2bcc9449081cZhijun He        StreamSet() {
280125684aba1a11b7adbf5f9d607ee2bcc9449081cZhijun He            allocatedBufferWaterMark = 0;
2818d1a154cc6239096edda698ea638e6ab6fe53c4eZhijun He            maxAllowedBufferCount = 0;
282125684aba1a11b7adbf5f9d607ee2bcc9449081cZhijun He        }
283125684aba1a11b7adbf5f9d607ee2bcc9449081cZhijun He    };
284125684aba1a11b7adbf5f9d607ee2bcc9449081cZhijun He
285125684aba1a11b7adbf5f9d607ee2bcc9449081cZhijun He    /**
286125684aba1a11b7adbf5f9d607ee2bcc9449081cZhijun He     * Stream set map managed by this buffer manager.
287125684aba1a11b7adbf5f9d607ee2bcc9449081cZhijun He     */
288125684aba1a11b7adbf5f9d607ee2bcc9449081cZhijun He    typedef int StreamSetId;
289125684aba1a11b7adbf5f9d607ee2bcc9449081cZhijun He    KeyedVector<StreamSetId, StreamSet> mStreamSetMap;
29077c1a3554275a51ac8eb9fbe86f476afc8983192Eino-Ville Talvala    KeyedVector<StreamId, wp<Camera3OutputStream>> mStreamMap;
291125684aba1a11b7adbf5f9d607ee2bcc9449081cZhijun He
292125684aba1a11b7adbf5f9d607ee2bcc9449081cZhijun He    // TODO: There is no easy way to query the Gralloc version in this code yet, we have different
293125684aba1a11b7adbf5f9d607ee2bcc9449081cZhijun He    // code paths for different Gralloc versions, hardcode something here for now.
294125684aba1a11b7adbf5f9d607ee2bcc9449081cZhijun He    const uint32_t mGrallocVersion = GRALLOC_DEVICE_API_VERSION_0_1;
295125684aba1a11b7adbf5f9d607ee2bcc9449081cZhijun He
296125684aba1a11b7adbf5f9d607ee2bcc9449081cZhijun He    /**
297125684aba1a11b7adbf5f9d607ee2bcc9449081cZhijun He     * Check if this stream was successfully registered already. This method needs to be called with
298125684aba1a11b7adbf5f9d607ee2bcc9449081cZhijun He     * mLock held.
299125684aba1a11b7adbf5f9d607ee2bcc9449081cZhijun He     */
300125684aba1a11b7adbf5f9d607ee2bcc9449081cZhijun He    bool checkIfStreamRegisteredLocked(int streamId, int streamSetId) const;
301125684aba1a11b7adbf5f9d607ee2bcc9449081cZhijun He
302125684aba1a11b7adbf5f9d607ee2bcc9449081cZhijun He    /**
303125684aba1a11b7adbf5f9d607ee2bcc9449081cZhijun He     * Add a buffer entry to the BufferList. This method needs to be called with mLock held.
304125684aba1a11b7adbf5f9d607ee2bcc9449081cZhijun He     */
305125684aba1a11b7adbf5f9d607ee2bcc9449081cZhijun He    status_t addBufferToBufferListLocked(BufferList &bufList, const BufferEntry &buffer);
306125684aba1a11b7adbf5f9d607ee2bcc9449081cZhijun He
307125684aba1a11b7adbf5f9d607ee2bcc9449081cZhijun He    /**
308125684aba1a11b7adbf5f9d607ee2bcc9449081cZhijun He     * Remove all buffers from the BufferList.
309125684aba1a11b7adbf5f9d607ee2bcc9449081cZhijun He     *
310125684aba1a11b7adbf5f9d607ee2bcc9449081cZhijun He     * Note that this doesn't mean that the buffers are freed after this call. A buffer is freed
311125684aba1a11b7adbf5f9d607ee2bcc9449081cZhijun He     * only if all other references to it are dropped.
312125684aba1a11b7adbf5f9d607ee2bcc9449081cZhijun He     *
313125684aba1a11b7adbf5f9d607ee2bcc9449081cZhijun He     * This method needs to be called with mLock held.
314125684aba1a11b7adbf5f9d607ee2bcc9449081cZhijun He     */
315125684aba1a11b7adbf5f9d607ee2bcc9449081cZhijun He    status_t removeBuffersFromBufferListLocked(BufferList &bufList, int streamId);
316125684aba1a11b7adbf5f9d607ee2bcc9449081cZhijun He
317125684aba1a11b7adbf5f9d607ee2bcc9449081cZhijun He    /**
318125684aba1a11b7adbf5f9d607ee2bcc9449081cZhijun He     * Get the first available buffer from the buffer list for this stream. The graphicBuffer inside
319125684aba1a11b7adbf5f9d607ee2bcc9449081cZhijun He     * this entry will be NULL if there is no any GraphicBufferEntry found. After this call, the
320125684aba1a11b7adbf5f9d607ee2bcc9449081cZhijun He     * GraphicBufferEntry will be removed from the BufferList if a GraphicBufferEntry is found.
321125684aba1a11b7adbf5f9d607ee2bcc9449081cZhijun He     *
322125684aba1a11b7adbf5f9d607ee2bcc9449081cZhijun He     * This method needs to be called with mLock held.
323125684aba1a11b7adbf5f9d607ee2bcc9449081cZhijun He     *
324125684aba1a11b7adbf5f9d607ee2bcc9449081cZhijun He     */
325125684aba1a11b7adbf5f9d607ee2bcc9449081cZhijun He    GraphicBufferEntry getFirstBufferFromBufferListLocked(BufferList& buffers, int streamId);
3268d1a154cc6239096edda698ea638e6ab6fe53c4eZhijun He
3278d1a154cc6239096edda698ea638e6ab6fe53c4eZhijun He    /**
3288d1a154cc6239096edda698ea638e6ab6fe53c4eZhijun He     * Check if there is any buffer associated with this stream in the given buffer list.
3298d1a154cc6239096edda698ea638e6ab6fe53c4eZhijun He     *
3308d1a154cc6239096edda698ea638e6ab6fe53c4eZhijun He     * This method needs to be called with mLock held.
3318d1a154cc6239096edda698ea638e6ab6fe53c4eZhijun He     *
3328d1a154cc6239096edda698ea638e6ab6fe53c4eZhijun He     */
3338d1a154cc6239096edda698ea638e6ab6fe53c4eZhijun He    bool inline hasBufferForStreamLocked(BufferList& buffers, int streamId);
334125684aba1a11b7adbf5f9d607ee2bcc9449081cZhijun He};
335125684aba1a11b7adbf5f9d607ee2bcc9449081cZhijun He
336125684aba1a11b7adbf5f9d607ee2bcc9449081cZhijun He} // namespace camera3
337125684aba1a11b7adbf5f9d607ee2bcc9449081cZhijun He} // namespace android
338125684aba1a11b7adbf5f9d607ee2bcc9449081cZhijun He
339125684aba1a11b7adbf5f9d607ee2bcc9449081cZhijun He#endif // ANDROID_SERVERS_CAMERA3_BUFFER_MANAGER_H
340