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: 472752e5b66ac80b5d6bcba1db186f29f86722956bMathias Agopian explicit Camera3BufferManager(); 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 * 14089954d931d7b952597dc8e29e7a87da31a4ae0b1Yin-Chia Yeh * When shouldFreeBuffer is set to true, caller must detach and free one buffer from the 14189954d931d7b952597dc8e29e7a87da31a4ae0b1Yin-Chia Yeh * buffer queue, and then call notifyBufferRemoved to update the manager. 14289954d931d7b952597dc8e29e7a87da31a4ae0b1Yin-Chia Yeh * 14377c1a3554275a51ac8eb9fbe86f476afc8983192Eino-Ville Talvala * Return values: 14477c1a3554275a51ac8eb9fbe86f476afc8983192Eino-Ville Talvala * 14577c1a3554275a51ac8eb9fbe86f476afc8983192Eino-Ville Talvala * OK: Buffer release was processed succesfully 14677c1a3554275a51ac8eb9fbe86f476afc8983192Eino-Ville Talvala * BAD_VALUE: stream ID or streamSetId are invalid, or stream ID and stream set ID 14777c1a3554275a51ac8eb9fbe86f476afc8983192Eino-Ville Talvala * combination doesn't match what was registered, or this stream wasn't registered 14889954d931d7b952597dc8e29e7a87da31a4ae0b1Yin-Chia Yeh * to this buffer manager before, or shouldFreeBuffer is null/ 14977c1a3554275a51ac8eb9fbe86f476afc8983192Eino-Ville Talvala */ 15089954d931d7b952597dc8e29e7a87da31a4ae0b1Yin-Chia Yeh status_t onBufferReleased(int streamId, int streamSetId, /*out*/bool* shouldFreeBuffer); 15177c1a3554275a51ac8eb9fbe86f476afc8983192Eino-Ville Talvala 15277c1a3554275a51ac8eb9fbe86f476afc8983192Eino-Ville Talvala /** 153fd76cf5246c714a1c1ef10b2b974cacf0077f216Shuzhen Wang * This method notifies the manager that certain buffers has been removed from the 154fd76cf5246c714a1c1ef10b2b974cacf0077f216Shuzhen Wang * buffer queue by detachBuffer from the consumer. 155125684aba1a11b7adbf5f9d607ee2bcc9449081cZhijun He * 156fd76cf5246c714a1c1ef10b2b974cacf0077f216Shuzhen Wang * The notification lets the manager update its internal handout buffer count and 157fd76cf5246c714a1c1ef10b2b974cacf0077f216Shuzhen Wang * attached buffer counts accordingly. When buffers are detached from 158fd76cf5246c714a1c1ef10b2b974cacf0077f216Shuzhen Wang * consumer, both handout and attached counts are decremented. 159125684aba1a11b7adbf5f9d607ee2bcc9449081cZhijun He * 160fd76cf5246c714a1c1ef10b2b974cacf0077f216Shuzhen Wang * Return values: 161125684aba1a11b7adbf5f9d607ee2bcc9449081cZhijun He * 162fd76cf5246c714a1c1ef10b2b974cacf0077f216Shuzhen Wang * OK: Buffer removal was processed succesfully 163fd76cf5246c714a1c1ef10b2b974cacf0077f216Shuzhen Wang * BAD_VALUE: stream ID or streamSetId are invalid, or stream ID and stream set ID 164fd76cf5246c714a1c1ef10b2b974cacf0077f216Shuzhen Wang * combination doesn't match what was registered, or this stream wasn't registered 165fd76cf5246c714a1c1ef10b2b974cacf0077f216Shuzhen Wang * to this buffer manager before, or the removed buffer count is larger than 166fd76cf5246c714a1c1ef10b2b974cacf0077f216Shuzhen Wang * current total handoutCount or attachedCount. 167125684aba1a11b7adbf5f9d607ee2bcc9449081cZhijun He */ 168fd76cf5246c714a1c1ef10b2b974cacf0077f216Shuzhen Wang status_t onBuffersRemoved(int streamId, int streamSetId, size_t count); 169125684aba1a11b7adbf5f9d607ee2bcc9449081cZhijun He 170125684aba1a11b7adbf5f9d607ee2bcc9449081cZhijun He /** 17189954d931d7b952597dc8e29e7a87da31a4ae0b1Yin-Chia Yeh * This method notifiers the manager that a buffer is freed from the buffer queue, usually 17289954d931d7b952597dc8e29e7a87da31a4ae0b1Yin-Chia Yeh * because onBufferReleased signals the caller to free a buffer via the shouldFreeBuffer flag. 17389954d931d7b952597dc8e29e7a87da31a4ae0b1Yin-Chia Yeh */ 17489954d931d7b952597dc8e29e7a87da31a4ae0b1Yin-Chia Yeh void notifyBufferRemoved(int streamId, int streamSetId); 17589954d931d7b952597dc8e29e7a87da31a4ae0b1Yin-Chia Yeh 17689954d931d7b952597dc8e29e7a87da31a4ae0b1Yin-Chia Yeh /** 177125684aba1a11b7adbf5f9d607ee2bcc9449081cZhijun He * Dump the buffer manager statistics. 178125684aba1a11b7adbf5f9d607ee2bcc9449081cZhijun He */ 179125684aba1a11b7adbf5f9d607ee2bcc9449081cZhijun He void dump(int fd, const Vector<String16> &args) const; 180125684aba1a11b7adbf5f9d607ee2bcc9449081cZhijun He 181125684aba1a11b7adbf5f9d607ee2bcc9449081cZhijun Heprivate: 18289954d931d7b952597dc8e29e7a87da31a4ae0b1Yin-Chia Yeh // allocatedBufferWaterMark will be decreased when: 18389954d931d7b952597dc8e29e7a87da31a4ae0b1Yin-Chia Yeh // numAllocatedBuffersThisSet > numHandoutBuffersThisSet + BUFFER_WATERMARK_DEC_THRESHOLD 18489954d931d7b952597dc8e29e7a87da31a4ae0b1Yin-Chia Yeh // This allows the watermark go back down after a burst of buffer requests 18589954d931d7b952597dc8e29e7a87da31a4ae0b1Yin-Chia Yeh static const int BUFFER_WATERMARK_DEC_THRESHOLD = 3; 18689954d931d7b952597dc8e29e7a87da31a4ae0b1Yin-Chia Yeh 18789954d931d7b952597dc8e29e7a87da31a4ae0b1Yin-Chia Yeh // onBufferReleased will set shouldFreeBuffer to true when: 18889954d931d7b952597dc8e29e7a87da31a4ae0b1Yin-Chia Yeh // numAllocatedBuffersThisSet > allocatedBufferWaterMark AND 18989954d931d7b952597dc8e29e7a87da31a4ae0b1Yin-Chia Yeh // numAllocatedBuffersThisStream > numHandoutBuffersThisStream + BUFFER_FREE_THRESHOLD 19089954d931d7b952597dc8e29e7a87da31a4ae0b1Yin-Chia Yeh // So after a burst of buffer requests and back to steady state, the buffer queue should have 19189954d931d7b952597dc8e29e7a87da31a4ae0b1Yin-Chia Yeh // (BUFFER_FREE_THRESHOLD + steady state handout buffer count) buffers. 19289954d931d7b952597dc8e29e7a87da31a4ae0b1Yin-Chia Yeh static const int BUFFER_FREE_THRESHOLD = 3; 19389954d931d7b952597dc8e29e7a87da31a4ae0b1Yin-Chia Yeh 194125684aba1a11b7adbf5f9d607ee2bcc9449081cZhijun He /** 195125684aba1a11b7adbf5f9d607ee2bcc9449081cZhijun He * Lock to synchronize the access to the methods of this class. 196125684aba1a11b7adbf5f9d607ee2bcc9449081cZhijun He */ 197125684aba1a11b7adbf5f9d607ee2bcc9449081cZhijun He mutable Mutex mLock; 198125684aba1a11b7adbf5f9d607ee2bcc9449081cZhijun He 199125684aba1a11b7adbf5f9d607ee2bcc9449081cZhijun He static const size_t kMaxBufferCount = BufferQueueDefs::NUM_BUFFER_SLOTS; 200125684aba1a11b7adbf5f9d607ee2bcc9449081cZhijun He 201125684aba1a11b7adbf5f9d607ee2bcc9449081cZhijun He struct GraphicBufferEntry { 202125684aba1a11b7adbf5f9d607ee2bcc9449081cZhijun He sp<GraphicBuffer> graphicBuffer; 203125684aba1a11b7adbf5f9d607ee2bcc9449081cZhijun He int fenceFd; 204d19d994770a04f02c204affd29985c5aeaa58baaChih-Hung Hsieh explicit GraphicBufferEntry(const sp<GraphicBuffer>& gb = 0, int fd = -1) : 205125684aba1a11b7adbf5f9d607ee2bcc9449081cZhijun He graphicBuffer(gb), 206125684aba1a11b7adbf5f9d607ee2bcc9449081cZhijun He fenceFd(fd) {} 207125684aba1a11b7adbf5f9d607ee2bcc9449081cZhijun He }; 208125684aba1a11b7adbf5f9d607ee2bcc9449081cZhijun He 209125684aba1a11b7adbf5f9d607ee2bcc9449081cZhijun He /** 210125684aba1a11b7adbf5f9d607ee2bcc9449081cZhijun He * A buffer entry (indexed by stream ID) represents a single physically allocated buffer. For 211125684aba1a11b7adbf5f9d607ee2bcc9449081cZhijun He * Gralloc V0, since each physical buffer is associated with one stream, this is 212125684aba1a11b7adbf5f9d607ee2bcc9449081cZhijun He * a single entry map. For Gralloc V1, one physical buffer can be shared between different 213125684aba1a11b7adbf5f9d607ee2bcc9449081cZhijun He * streams in one stream set, so this entry may include multiple entries, where the different 214125684aba1a11b7adbf5f9d607ee2bcc9449081cZhijun He * graphic buffers have the same common Gralloc backing store. 215125684aba1a11b7adbf5f9d607ee2bcc9449081cZhijun He */ 216125684aba1a11b7adbf5f9d607ee2bcc9449081cZhijun He typedef int StreamId; 217125684aba1a11b7adbf5f9d607ee2bcc9449081cZhijun He typedef KeyedVector<StreamId, GraphicBufferEntry> BufferEntry; 218125684aba1a11b7adbf5f9d607ee2bcc9449081cZhijun He 219125684aba1a11b7adbf5f9d607ee2bcc9449081cZhijun He typedef std::list<BufferEntry> BufferList; 220125684aba1a11b7adbf5f9d607ee2bcc9449081cZhijun He 221125684aba1a11b7adbf5f9d607ee2bcc9449081cZhijun He /** 222125684aba1a11b7adbf5f9d607ee2bcc9449081cZhijun He * Stream info map (indexed by stream ID) tracks all the streams registered to a particular 223125684aba1a11b7adbf5f9d607ee2bcc9449081cZhijun He * stream set. 224125684aba1a11b7adbf5f9d607ee2bcc9449081cZhijun He */ 225125684aba1a11b7adbf5f9d607ee2bcc9449081cZhijun He typedef KeyedVector<StreamId, StreamInfo> InfoMap; 226125684aba1a11b7adbf5f9d607ee2bcc9449081cZhijun He 227125684aba1a11b7adbf5f9d607ee2bcc9449081cZhijun He /** 228125684aba1a11b7adbf5f9d607ee2bcc9449081cZhijun He * Stream set buffer count map (indexed by stream ID) tracks all buffer counts of the streams 229125684aba1a11b7adbf5f9d607ee2bcc9449081cZhijun He * registered to a particular stream set. 230125684aba1a11b7adbf5f9d607ee2bcc9449081cZhijun He */ 231125684aba1a11b7adbf5f9d607ee2bcc9449081cZhijun He typedef KeyedVector<StreamId, size_t> BufferCountMap; 232125684aba1a11b7adbf5f9d607ee2bcc9449081cZhijun He 233125684aba1a11b7adbf5f9d607ee2bcc9449081cZhijun He /** 234125684aba1a11b7adbf5f9d607ee2bcc9449081cZhijun He * StreamSet keeps track of the stream info, free buffer list and hand-out buffer counts for 235125684aba1a11b7adbf5f9d607ee2bcc9449081cZhijun He * each stream set. 236125684aba1a11b7adbf5f9d607ee2bcc9449081cZhijun He */ 237125684aba1a11b7adbf5f9d607ee2bcc9449081cZhijun He struct StreamSet { 238125684aba1a11b7adbf5f9d607ee2bcc9449081cZhijun He /** 239125684aba1a11b7adbf5f9d607ee2bcc9449081cZhijun He * Stream set buffer count water mark representing the max number of allocated buffers 240125684aba1a11b7adbf5f9d607ee2bcc9449081cZhijun He * (hand-out buffers + free buffers) count for each stream set. For a given stream set, when 241125684aba1a11b7adbf5f9d607ee2bcc9449081cZhijun He * getBufferForStream() is called on this buffer manager, if the total allocated buffer 242125684aba1a11b7adbf5f9d607ee2bcc9449081cZhijun He * count exceeds this water mark, the buffer manager will attempt to reduce it as follows: 243125684aba1a11b7adbf5f9d607ee2bcc9449081cZhijun He * 244125684aba1a11b7adbf5f9d607ee2bcc9449081cZhijun He * In getBufferForStream(), find a buffer associated with other streams (inside the same 245125684aba1a11b7adbf5f9d607ee2bcc9449081cZhijun He * stream set) on the free buffer list and free it. For Gralloc V1, can just free the top 246125684aba1a11b7adbf5f9d607ee2bcc9449081cZhijun He * of the free buffer list if the physical buffer sharing in this stream is supported. 247125684aba1a11b7adbf5f9d607ee2bcc9449081cZhijun He * 248125684aba1a11b7adbf5f9d607ee2bcc9449081cZhijun He * For a particular stream set, a larger allocatedBufferWaterMark increases the memory 249125684aba1a11b7adbf5f9d607ee2bcc9449081cZhijun He * footprint of the stream set, but reduces the chance that getBufferForStream() will have 250125684aba1a11b7adbf5f9d607ee2bcc9449081cZhijun He * to allocate a new buffer. We assume that the streams in one stream set are not streaming 251125684aba1a11b7adbf5f9d607ee2bcc9449081cZhijun He * simultaneously, the max allocated buffer count water mark for a stream set will the max 252125684aba1a11b7adbf5f9d607ee2bcc9449081cZhijun He * of all streams' total buffer counts. This will avoid new buffer allocation in steady 253125684aba1a11b7adbf5f9d607ee2bcc9449081cZhijun He * streaming state. 2548d1a154cc6239096edda698ea638e6ab6fe53c4eZhijun He * 2558d1a154cc6239096edda698ea638e6ab6fe53c4eZhijun He * This water mark can be dynamically changed, and will grow when the hand-out buffer count 2568d1a154cc6239096edda698ea638e6ab6fe53c4eZhijun He * of each stream increases, until it reaches the maxAllowedBufferCount. 257125684aba1a11b7adbf5f9d607ee2bcc9449081cZhijun He */ 258125684aba1a11b7adbf5f9d607ee2bcc9449081cZhijun He size_t allocatedBufferWaterMark; 2598d1a154cc6239096edda698ea638e6ab6fe53c4eZhijun He 2608d1a154cc6239096edda698ea638e6ab6fe53c4eZhijun He /** 2618d1a154cc6239096edda698ea638e6ab6fe53c4eZhijun He * The max allowed buffer count for this stream set. It is the max of total number of 2628d1a154cc6239096edda698ea638e6ab6fe53c4eZhijun He * buffers for each stream. This is the upper bound of the allocatedBufferWaterMark. 2638d1a154cc6239096edda698ea638e6ab6fe53c4eZhijun He */ 2648d1a154cc6239096edda698ea638e6ab6fe53c4eZhijun He size_t maxAllowedBufferCount; 2658d1a154cc6239096edda698ea638e6ab6fe53c4eZhijun He 266125684aba1a11b7adbf5f9d607ee2bcc9449081cZhijun He /** 267125684aba1a11b7adbf5f9d607ee2bcc9449081cZhijun He * The stream info for all streams in this set 268125684aba1a11b7adbf5f9d607ee2bcc9449081cZhijun He */ 269125684aba1a11b7adbf5f9d607ee2bcc9449081cZhijun He InfoMap streamInfoMap; 270125684aba1a11b7adbf5f9d607ee2bcc9449081cZhijun He /** 271125684aba1a11b7adbf5f9d607ee2bcc9449081cZhijun He * The count of the buffers that were handed out to the streams of this set. 272125684aba1a11b7adbf5f9d607ee2bcc9449081cZhijun He */ 273125684aba1a11b7adbf5f9d607ee2bcc9449081cZhijun He BufferCountMap handoutBufferCountMap; 27477c1a3554275a51ac8eb9fbe86f476afc8983192Eino-Ville Talvala /** 27577c1a3554275a51ac8eb9fbe86f476afc8983192Eino-Ville Talvala * The count of the buffers that are attached to the streams of this set. 27677c1a3554275a51ac8eb9fbe86f476afc8983192Eino-Ville Talvala * An attached buffer may be free or handed out 27777c1a3554275a51ac8eb9fbe86f476afc8983192Eino-Ville Talvala */ 27877c1a3554275a51ac8eb9fbe86f476afc8983192Eino-Ville Talvala BufferCountMap attachedBufferCountMap; 27977c1a3554275a51ac8eb9fbe86f476afc8983192Eino-Ville Talvala 280125684aba1a11b7adbf5f9d607ee2bcc9449081cZhijun He StreamSet() { 281125684aba1a11b7adbf5f9d607ee2bcc9449081cZhijun He allocatedBufferWaterMark = 0; 2828d1a154cc6239096edda698ea638e6ab6fe53c4eZhijun He maxAllowedBufferCount = 0; 283125684aba1a11b7adbf5f9d607ee2bcc9449081cZhijun He } 284125684aba1a11b7adbf5f9d607ee2bcc9449081cZhijun He }; 285125684aba1a11b7adbf5f9d607ee2bcc9449081cZhijun He 286125684aba1a11b7adbf5f9d607ee2bcc9449081cZhijun He /** 287125684aba1a11b7adbf5f9d607ee2bcc9449081cZhijun He * Stream set map managed by this buffer manager. 288125684aba1a11b7adbf5f9d607ee2bcc9449081cZhijun He */ 289125684aba1a11b7adbf5f9d607ee2bcc9449081cZhijun He typedef int StreamSetId; 290125684aba1a11b7adbf5f9d607ee2bcc9449081cZhijun He KeyedVector<StreamSetId, StreamSet> mStreamSetMap; 29177c1a3554275a51ac8eb9fbe86f476afc8983192Eino-Ville Talvala KeyedVector<StreamId, wp<Camera3OutputStream>> mStreamMap; 292125684aba1a11b7adbf5f9d607ee2bcc9449081cZhijun He 293125684aba1a11b7adbf5f9d607ee2bcc9449081cZhijun He // TODO: There is no easy way to query the Gralloc version in this code yet, we have different 294125684aba1a11b7adbf5f9d607ee2bcc9449081cZhijun He // code paths for different Gralloc versions, hardcode something here for now. 295125684aba1a11b7adbf5f9d607ee2bcc9449081cZhijun He const uint32_t mGrallocVersion = GRALLOC_DEVICE_API_VERSION_0_1; 296125684aba1a11b7adbf5f9d607ee2bcc9449081cZhijun He 297125684aba1a11b7adbf5f9d607ee2bcc9449081cZhijun He /** 298125684aba1a11b7adbf5f9d607ee2bcc9449081cZhijun He * Check if this stream was successfully registered already. This method needs to be called with 299125684aba1a11b7adbf5f9d607ee2bcc9449081cZhijun He * mLock held. 300125684aba1a11b7adbf5f9d607ee2bcc9449081cZhijun He */ 301125684aba1a11b7adbf5f9d607ee2bcc9449081cZhijun He bool checkIfStreamRegisteredLocked(int streamId, int streamSetId) const; 302125684aba1a11b7adbf5f9d607ee2bcc9449081cZhijun He 30389954d931d7b952597dc8e29e7a87da31a4ae0b1Yin-Chia Yeh /** 30489954d931d7b952597dc8e29e7a87da31a4ae0b1Yin-Chia Yeh * Check if other streams in the stream set has extra buffer available to be freed, and 30589954d931d7b952597dc8e29e7a87da31a4ae0b1Yin-Chia Yeh * free one if so. 30689954d931d7b952597dc8e29e7a87da31a4ae0b1Yin-Chia Yeh */ 30789954d931d7b952597dc8e29e7a87da31a4ae0b1Yin-Chia Yeh status_t checkAndFreeBufferOnOtherStreamsLocked(int streamId, int streamSetId); 308125684aba1a11b7adbf5f9d607ee2bcc9449081cZhijun He}; 309125684aba1a11b7adbf5f9d607ee2bcc9449081cZhijun He 310125684aba1a11b7adbf5f9d607ee2bcc9449081cZhijun He} // namespace camera3 311125684aba1a11b7adbf5f9d607ee2bcc9449081cZhijun He} // namespace android 312125684aba1a11b7adbf5f9d607ee2bcc9449081cZhijun He 313125684aba1a11b7adbf5f9d607ee2bcc9449081cZhijun He#endif // ANDROID_SERVERS_CAMERA3_BUFFER_MANAGER_H 314