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