Camera3StreamSplitter.h revision bee0f0a5e7aa19aa7c59de03b508985b68bc6b5e
15738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/* 25738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project * Copyright 2014,2016 The Android Open Source Project 35738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project * 45738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project * Licensed under the Apache License, Version 2.0 (the "License"); 55738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project * you may not use this file except in compliance with the License. 65738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project * You may obtain a copy of the License at 75738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project * 85738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project * http://www.apache.org/licenses/LICENSE-2.0 95738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project * 105738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project * Unless required by applicable law or agreed to in writing, software 115738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project * distributed under the License is distributed on an "AS IS" BASIS, 125738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 135738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project * See the License for the specific language governing permissions and 145738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project * limitations under the License. 155738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project */ 165738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 175738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#ifndef ANDROID_SERVERS_STREAMSPLITTER_H 185738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#define ANDROID_SERVERS_STREAMSPLITTER_H 195738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 205738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#include <gui/IConsumerListener.h> 215738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#include <gui/IProducerListener.h> 225738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#include <gui/BufferItemConsumer.h> 235738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 245738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#include <utils/Condition.h> 255738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#include <utils/Mutex.h> 265738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#include <utils/StrongPointer.h> 275738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#include <utils/Timers.h> 285738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 295738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#define SP_LOGV(x, ...) ALOGV("[%s] " x, mConsumerName.string(), ##__VA_ARGS__) 305738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#define SP_LOGI(x, ...) ALOGI("[%s] " x, mConsumerName.string(), ##__VA_ARGS__) 315738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#define SP_LOGW(x, ...) ALOGW("[%s] " x, mConsumerName.string(), ##__VA_ARGS__) 325738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#define SP_LOGE(x, ...) ALOGE("[%s] " x, mConsumerName.string(), ##__VA_ARGS__) 335738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 345738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectnamespace android { 355738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 365738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectclass GraphicBuffer; 375738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectclass IGraphicBufferConsumer; 385738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectclass IGraphicBufferProducer; 395738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 405738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project// Camera3StreamSplitter is an autonomous class that manages one input BufferQueue 415738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project// and multiple output BufferQueues. By using the buffer attach and detach logic 425738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project// in BufferQueue, it is able to present the illusion of a single split 435738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project// BufferQueue, where each buffer queued to the input is available to be 445738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project// acquired by each of the outputs, and is able to be dequeued by the input 455738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project// again only once all of the outputs have released it. 465738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectclass Camera3StreamSplitter : public BnConsumerListener { 475738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectpublic: 485738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 495738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project // Constructor 505738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project Camera3StreamSplitter() = default; 515738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 525738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project // Connect to the stream splitter by creating buffer queue and connecting it 535738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project // with output surfaces. 545738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project status_t connect(const std::vector<sp<Surface> >& surfaces, 555738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project uint32_t consumerUsage, size_t halMaxBuffers, 567f3e42943b834ff0f556cd5c063a896f54d53167Matthew Xie sp<Surface>* consumer); 575738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 585738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project // addOutput adds an output BufferQueue to the splitter. The splitter 595738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project // connects to outputQueue as a CPU producer, and any buffers queued 605738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project // to the input will be queued to each output. It is assumed that all of the 615738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project // outputs are added before any buffers are queued on the input. If any 625738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project // output is abandoned by its consumer, the splitter will abandon its input 635738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project // queue (see onAbandoned). 645738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project // 655738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project // A return value other than NO_ERROR means that an error has occurred and 665738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project // outputQueue has not been added to the splitter. BAD_VALUE is returned if 675738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project // outputQueue is NULL. See IGraphicBufferProducer::connect for explanations 685738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project // of other error codes. 695738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project status_t addOutput(const sp<Surface>& outputQueue); 705738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 715738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project // Notification that the graphic buffer has been released to the input 725738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project // BufferQueue. The buffer should be reused by the camera device instead of 735738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project // queuing to the outputs. 745738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project status_t notifyBufferReleased(const sp<GraphicBuffer>& buffer); 755738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 765738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project // Attach a buffer to the specified outputs. This call reserves a buffer 775738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project // slot in the output queue. 785738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project status_t attachBufferToOutputs(ANativeWindowBuffer* anb, 795738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project const std::vector<size_t>& surface_ids); 805738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 815738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project // Get return value of onFrameAvailable to work around problem that 825738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project // onFrameAvailable is void. This function should be called by the producer 835738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project // right after calling queueBuffer(). 845738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project status_t getOnFrameAvailableResult(); 855738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 865738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project // Disconnect the buffer queue from output surfaces. 875738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project void disconnect(); 885738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 895738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectprivate: 905738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project // From IConsumerListener 915738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project // 925738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project // During this callback, we store some tracking information, detach the 935738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project // buffer from the input, and attach it to each of the outputs. This call 945738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project // can block if there are too many outstanding buffers. If it blocks, it 955738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project // will resume when onBufferReleasedByOutput releases a buffer back to the 965738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project // input. 975738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project void onFrameAvailable(const BufferItem& item) override; 985738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 995738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project // From IConsumerListener 1005738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project // We don't care about released buffers because we detach each buffer as 1015738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project // soon as we acquire it. See the comment for onBufferReleased below for 1025738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project // some clarifying notes about the name. 1035738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project void onBuffersReleased() override {} 1045738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 1055738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project // From IConsumerListener 1065738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project // We don't care about sideband streams, since we won't be splitting them 1075738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project void onSidebandStreamChanged() override {} 1085738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 1095738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project // This is the implementation of the onBufferReleased callback from 1105738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project // IProducerListener. It gets called from an OutputListener (see below), and 1115738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project // 'from' is which producer interface from which the callback was received. 1125738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project // 1135738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project // During this callback, we detach the buffer from the output queue that 1145738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project // generated the callback, update our state tracking to see if this is the 1155738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project // last output releasing the buffer, and if so, release it to the input. 1165738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project // If we release the buffer to the input, we allow a blocked 1175738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project // onFrameAvailable call to proceed. 1185738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project void onBufferReleasedByOutput(const sp<IGraphicBufferProducer>& from); 1195738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 1205738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project // This is the implementation of onBufferReleasedByOutput without the mutex locked. 1215738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project // It could either be called from onBufferReleasedByOutput or from 1225738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project // onFrameAvailable when a buffer in the async buffer queue is overwritten. 1235738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project void onBufferReleasedByOutputLocked(const sp<IGraphicBufferProducer>& from); 1245738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 1255738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project // When this is called, the splitter disconnects from (i.e., abandons) its 1265738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project // input queue and signals any waiting onFrameAvailable calls to wake up. 1275738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project // It still processes callbacks from other outputs, but only detaches their 1285738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project // buffers so they can continue operating until they run out of buffers to 1295738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project // acquire. This must be called with mMutex locked. 1305738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project void onAbandonedLocked(); 1315738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 1325738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project // Decrement the buffer's reference count. Once the reference count becomes 1335738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project // 0, return the buffer back to the input BufferQueue. 1345738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project void decrementBufRefCountLocked(uint64_t id, const sp<IGraphicBufferProducer>& from); 1355738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 1365738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project // This is a thin wrapper class that lets us determine which BufferQueue 1375738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project // the IProducerListener::onBufferReleased callback is associated with. We 1385738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project // create one of these per output BufferQueue, and then pass the producer 1395738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project // into onBufferReleasedByOutput above. 1405738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project class OutputListener : public BnProducerListener, 1415738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project public IBinder::DeathRecipient { 1425738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project public: 1435738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project OutputListener(wp<Camera3StreamSplitter> splitter, 1445738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project wp<IGraphicBufferProducer> output); 1455738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project virtual ~OutputListener() = default; 1465738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 1475738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project // From IProducerListener 1485738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project void onBufferReleased() override; 1495738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 1505738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project // From IBinder::DeathRecipient 1515738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project void binderDied(const wp<IBinder>& who) override; 1525738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 1535738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project private: 1545738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project wp<Camera3StreamSplitter> mSplitter; 1555738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project wp<IGraphicBufferProducer> mOutput; 1565738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project }; 1575738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 1585738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project class BufferTracker { 1595738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project public: 1605738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project BufferTracker(const sp<GraphicBuffer>& buffer, 1615738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project const std::vector<size_t>& requestedSurfaces); 1625738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project ~BufferTracker() = default; 1635738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 1645738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project const sp<GraphicBuffer>& getBuffer() const { return mBuffer; } 1655738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project const sp<Fence>& getMergedFence() const { return mMergedFence; } 1665738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 1675738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project void mergeFence(const sp<Fence>& with); 1685738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 1695738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project // Returns the new value 1705738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project // Only called while mMutex is held 1715738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project size_t decrementReferenceCountLocked(); 1725738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 1735738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project const std::vector<size_t> requestedSurfaces() const { return mRequestedSurfaces; } 1745738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 1755738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project private: 1765738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 1775738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project // Disallow copying 1785738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project BufferTracker(const BufferTracker& other); 1795738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project BufferTracker& operator=(const BufferTracker& other); 1805738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 1815738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project sp<GraphicBuffer> mBuffer; // One instance that holds this native handle 1825738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project sp<Fence> mMergedFence; 1835738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 1845738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project // Request surfaces for a particular buffer. And when the buffer becomes 1855738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project // available from the input queue, the registered surfaces are used to decide 1865738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project // which output is the buffer sent to. 1875738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project std::vector<size_t> mRequestedSurfaces; 1885738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project size_t mReferenceCount; 1895738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project }; 1902e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach 1912e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach // Must be accessed through RefBase 1922e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach virtual ~Camera3StreamSplitter(); 1932e7fa68bfd9723b7ec7b6b0b128d89f31a2e06eeAndre Eisenbach 1945738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project status_t addOutputLocked(const sp<Surface>& outputQueue); 1955738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 1965738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project // Send a buffer to particular output, and increment the reference count 1975738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project // of the buffer. If this output is abandoned, the buffer's reference count 1985738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project // won't be incremented. 1995738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project status_t outputBufferLocked(const sp<IGraphicBufferProducer>& output, 2005738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project const BufferItem& bufferItem); 2015738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 2025738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project // Get unique name for the buffer queue consumer 2035738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project String8 getUniqueConsumerName(); 2045738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 2055738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project // Helper function to get the BufferQueue slot where a particular buffer is attached to. 2065738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project int getSlotForOutputLocked(const sp<IGraphicBufferProducer>& gbp, 2075738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project const sp<GraphicBuffer>& gb); 2085738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project // Helper function to remove the buffer from the BufferQueue slot 2095738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project status_t removeSlotForOutputLocked(const sp<IGraphicBufferProducer>& gbp, 2105738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project const sp<GraphicBuffer>& gb); 2115738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 2125738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 2135738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project // Sum of max consumer buffers for all outputs 2145738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project size_t mMaxConsumerBuffers = 0; 2155738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project size_t mMaxHalBuffers = 0; 2165738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 2175738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project static const nsecs_t kDequeueBufferTimeout = s2ns(1); // 1 sec 2185738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 2195738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project Mutex mMutex; 2205738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 2215738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project sp<IGraphicBufferProducer> mProducer; 2225738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project sp<IGraphicBufferConsumer> mConsumer; 2235738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project sp<BufferItemConsumer> mBufferItemConsumer; 2245738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project sp<Surface> mSurface; 2255738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 2265738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project std::vector<sp<IGraphicBufferProducer> > mOutputs; 2275738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project // Map of GraphicBuffer IDs (GraphicBuffer::getId()) to buffer tracking 2285738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project // objects (which are mostly for counting how many outputs have released the 2295738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project // buffer, but also contain merged release fences). 2305738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project std::unordered_map<uint64_t, std::unique_ptr<BufferTracker> > mBuffers; 2315738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 2325738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project struct GBPHash { 2335738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project std::size_t operator()(const sp<IGraphicBufferProducer>& producer) const { 2345738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project return std::hash<IGraphicBufferProducer *>{}(producer.get()); 2355738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 2365738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project }; 2375738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 2385738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project std::unordered_map<sp<IGraphicBufferProducer>, sp<OutputListener>, 2395738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project GBPHash> mNotifiers; 2405738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 2415738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project typedef std::vector<sp<GraphicBuffer>> OutputSlots; 2425738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project std::unordered_map<sp<IGraphicBufferProducer>, std::unique_ptr<OutputSlots>, 2435738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project GBPHash> mOutputSlots; 2445738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 2455738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project // Latest onFrameAvailable return value 2465738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project std::atomic<status_t> mOnFrameAvailableRes{0}; 2475738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 2485738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project String8 mConsumerName; 2495738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project}; 2505738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 2515738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project} // namespace android 2525738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 2535738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#endif 2545738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project