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