11a4d883dcc1725892bfb5c28dec255a233186524Jamie Gennis/*
21a4d883dcc1725892bfb5c28dec255a233186524Jamie Gennis * Copyright (C) 2010 The Android Open Source Project
31a4d883dcc1725892bfb5c28dec255a233186524Jamie Gennis *
41a4d883dcc1725892bfb5c28dec255a233186524Jamie Gennis * Licensed under the Apache License, Version 2.0 (the "License");
51a4d883dcc1725892bfb5c28dec255a233186524Jamie Gennis * you may not use this file except in compliance with the License.
61a4d883dcc1725892bfb5c28dec255a233186524Jamie Gennis * You may obtain a copy of the License at
71a4d883dcc1725892bfb5c28dec255a233186524Jamie Gennis *
81a4d883dcc1725892bfb5c28dec255a233186524Jamie Gennis *      http://www.apache.org/licenses/LICENSE-2.0
91a4d883dcc1725892bfb5c28dec255a233186524Jamie Gennis *
101a4d883dcc1725892bfb5c28dec255a233186524Jamie Gennis * Unless required by applicable law or agreed to in writing, software
111a4d883dcc1725892bfb5c28dec255a233186524Jamie Gennis * distributed under the License is distributed on an "AS IS" BASIS,
121a4d883dcc1725892bfb5c28dec255a233186524Jamie Gennis * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
131a4d883dcc1725892bfb5c28dec255a233186524Jamie Gennis * See the License for the specific language governing permissions and
141a4d883dcc1725892bfb5c28dec255a233186524Jamie Gennis * limitations under the License.
151a4d883dcc1725892bfb5c28dec255a233186524Jamie Gennis */
161a4d883dcc1725892bfb5c28dec255a233186524Jamie Gennis
171a4d883dcc1725892bfb5c28dec255a233186524Jamie Gennis#ifndef ANDROID_GUI_CONSUMERBASE_H
181a4d883dcc1725892bfb5c28dec255a233186524Jamie Gennis#define ANDROID_GUI_CONSUMERBASE_H
191a4d883dcc1725892bfb5c28dec255a233186524Jamie Gennis
201a4d883dcc1725892bfb5c28dec255a233186524Jamie Gennis#include <gui/BufferQueue.h>
211a4d883dcc1725892bfb5c28dec255a233186524Jamie Gennis
221a4d883dcc1725892bfb5c28dec255a233186524Jamie Gennis#include <ui/GraphicBuffer.h>
231a4d883dcc1725892bfb5c28dec255a233186524Jamie Gennis
241a4d883dcc1725892bfb5c28dec255a233186524Jamie Gennis#include <utils/String8.h>
251a4d883dcc1725892bfb5c28dec255a233186524Jamie Gennis#include <utils/Vector.h>
261a4d883dcc1725892bfb5c28dec255a233186524Jamie Gennis#include <utils/threads.h>
27a4e19521ac4563f2ff6517bcfd63d9b8d33a6d0bMathias Agopian#include <gui/IConsumerListener.h>
281a4d883dcc1725892bfb5c28dec255a233186524Jamie Gennis
291a4d883dcc1725892bfb5c28dec255a233186524Jamie Gennisnamespace android {
301a4d883dcc1725892bfb5c28dec255a233186524Jamie Gennis// ----------------------------------------------------------------------------
311a4d883dcc1725892bfb5c28dec255a233186524Jamie Gennis
321a4d883dcc1725892bfb5c28dec255a233186524Jamie Gennisclass String8;
331a4d883dcc1725892bfb5c28dec255a233186524Jamie Gennis
341a4d883dcc1725892bfb5c28dec255a233186524Jamie Gennis// ConsumerBase is a base class for BufferQueue consumer end-points. It
351a4d883dcc1725892bfb5c28dec255a233186524Jamie Gennis// handles common tasks like management of the connection to the BufferQueue
361a4d883dcc1725892bfb5c28dec255a233186524Jamie Gennis// and the buffer pool.
371a4d883dcc1725892bfb5c28dec255a233186524Jamie Gennisclass ConsumerBase : public virtual RefBase,
38a4e19521ac4563f2ff6517bcfd63d9b8d33a6d0bMathias Agopian        protected ConsumerListener {
391a4d883dcc1725892bfb5c28dec255a233186524Jamie Gennispublic:
401a4d883dcc1725892bfb5c28dec255a233186524Jamie Gennis    struct FrameAvailableListener : public virtual RefBase {
411a4d883dcc1725892bfb5c28dec255a233186524Jamie Gennis        // onFrameAvailable() is called each time an additional frame becomes
421a4d883dcc1725892bfb5c28dec255a233186524Jamie Gennis        // available for consumption. This means that frames that are queued
431a4d883dcc1725892bfb5c28dec255a233186524Jamie Gennis        // while in asynchronous mode only trigger the callback if no previous
441a4d883dcc1725892bfb5c28dec255a233186524Jamie Gennis        // frames are pending. Frames queued while in synchronous mode always
451a4d883dcc1725892bfb5c28dec255a233186524Jamie Gennis        // trigger the callback.
461a4d883dcc1725892bfb5c28dec255a233186524Jamie Gennis        //
471a4d883dcc1725892bfb5c28dec255a233186524Jamie Gennis        // This is called without any lock held and can be called concurrently
481a4d883dcc1725892bfb5c28dec255a233186524Jamie Gennis        // by multiple threads.
498dc55396fc9bc425b5e2c82e76a38080f2a655ffDan Stoza        virtual void onFrameAvailable(const BufferItem& item) = 0;
501a4d883dcc1725892bfb5c28dec255a233186524Jamie Gennis    };
511a4d883dcc1725892bfb5c28dec255a233186524Jamie Gennis
521a4d883dcc1725892bfb5c28dec255a233186524Jamie Gennis    virtual ~ConsumerBase();
531a4d883dcc1725892bfb5c28dec255a233186524Jamie Gennis
541a4d883dcc1725892bfb5c28dec255a233186524Jamie Gennis    // abandon frees all the buffers and puts the ConsumerBase into the
551a4d883dcc1725892bfb5c28dec255a233186524Jamie Gennis    // 'abandoned' state.  Once put in this state the ConsumerBase can never
561a4d883dcc1725892bfb5c28dec255a233186524Jamie Gennis    // leave it.  When in the 'abandoned' state, all methods of the
572adaf04fab35cf47c824d74d901b54094e01ccd3Andy McFadden    // IGraphicBufferProducer interface will fail with the NO_INIT error.
581a4d883dcc1725892bfb5c28dec255a233186524Jamie Gennis    //
591a4d883dcc1725892bfb5c28dec255a233186524Jamie Gennis    // Note that while calling this method causes all the buffers to be freed
601a4d883dcc1725892bfb5c28dec255a233186524Jamie Gennis    // from the perspective of the the ConsumerBase, if there are additional
611a4d883dcc1725892bfb5c28dec255a233186524Jamie Gennis    // references on the buffers (e.g. if a buffer is referenced by a client
621a4d883dcc1725892bfb5c28dec255a233186524Jamie Gennis    // or by OpenGL ES as a texture) then those buffer will remain allocated.
631a4d883dcc1725892bfb5c28dec255a233186524Jamie Gennis    void abandon();
641a4d883dcc1725892bfb5c28dec255a233186524Jamie Gennis
651a4d883dcc1725892bfb5c28dec255a233186524Jamie Gennis    // set the name of the ConsumerBase that will be used to identify it in
661a4d883dcc1725892bfb5c28dec255a233186524Jamie Gennis    // log messages.
671a4d883dcc1725892bfb5c28dec255a233186524Jamie Gennis    void setName(const String8& name);
681a4d883dcc1725892bfb5c28dec255a233186524Jamie Gennis
697adb0f8a9fdb961692ffd2f0c65cacb155143f64Jesse Hall    // dump writes the current state to a string. Child classes should add
707adb0f8a9fdb961692ffd2f0c65cacb155143f64Jesse Hall    // their state to the dump by overriding the dumpLocked method, which is
717adb0f8a9fdb961692ffd2f0c65cacb155143f64Jesse Hall    // called by these methods after locking the mutex.
721a4d883dcc1725892bfb5c28dec255a233186524Jamie Gennis    void dump(String8& result) const;
7374d211ae26a0257c6075a823812e40b55aa1e653Mathias Agopian    void dump(String8& result, const char* prefix) const;
741a4d883dcc1725892bfb5c28dec255a233186524Jamie Gennis
751a4d883dcc1725892bfb5c28dec255a233186524Jamie Gennis    // setFrameAvailableListener sets the listener object that will be notified
761a4d883dcc1725892bfb5c28dec255a233186524Jamie Gennis    // when a new frame becomes available.
77a4a3149a36bc69a06e4824aeae909ab910661070Igor Murashkin    void setFrameAvailableListener(const wp<FrameAvailableListener>& listener);
781a4d883dcc1725892bfb5c28dec255a233186524Jamie Gennis
791a4d883dcc1725892bfb5c28dec255a233186524Jamie Gennisprivate:
801a4d883dcc1725892bfb5c28dec255a233186524Jamie Gennis    ConsumerBase(const ConsumerBase&);
811a4d883dcc1725892bfb5c28dec255a233186524Jamie Gennis    void operator=(const ConsumerBase&);
821a4d883dcc1725892bfb5c28dec255a233186524Jamie Gennis
831a4d883dcc1725892bfb5c28dec255a233186524Jamie Gennisprotected:
849fea3421ffddf6480f57f55a25936a886043d909Jamie Gennis    // ConsumerBase constructs a new ConsumerBase object to consume image
85db89edc94bd2a78226b407f9f7261e202e7fa325Mathias Agopian    // buffers from the given IGraphicBufferConsumer.
86595264f1af12e25dce57d7c5b1d52ed86ac0d0c9Mathias Agopian    // The controlledByApp flag indicates that this consumer is under the application's
87595264f1af12e25dce57d7c5b1d52ed86ac0d0c9Mathias Agopian    // control.
88db89edc94bd2a78226b407f9f7261e202e7fa325Mathias Agopian    ConsumerBase(const sp<IGraphicBufferConsumer>& consumer, bool controlledByApp = false);
891a4d883dcc1725892bfb5c28dec255a233186524Jamie Gennis
90ad669b04f4633957eea55b8ad2d8253adcefe39bJamie Gennis    // onLastStrongRef gets called by RefBase just before the dtor of the most
91ad669b04f4633957eea55b8ad2d8253adcefe39bJamie Gennis    // derived class.  It is used to clean up the buffers so that ConsumerBase
92ad669b04f4633957eea55b8ad2d8253adcefe39bJamie Gennis    // can coordinate the clean-up by calling into virtual methods implemented
93ad669b04f4633957eea55b8ad2d8253adcefe39bJamie Gennis    // by the derived classes.  This would not be possible from the
94ad669b04f4633957eea55b8ad2d8253adcefe39bJamie Gennis    // ConsuemrBase dtor because by the time that gets called the derived
95ad669b04f4633957eea55b8ad2d8253adcefe39bJamie Gennis    // classes have already been destructed.
96ad669b04f4633957eea55b8ad2d8253adcefe39bJamie Gennis    //
97ad669b04f4633957eea55b8ad2d8253adcefe39bJamie Gennis    // This methods should not need to be overridden by derived classes, but
98ad669b04f4633957eea55b8ad2d8253adcefe39bJamie Gennis    // if they are overridden the ConsumerBase implementation must be called
99ad669b04f4633957eea55b8ad2d8253adcefe39bJamie Gennis    // from the derived class.
100ad669b04f4633957eea55b8ad2d8253adcefe39bJamie Gennis    virtual void onLastStrongRef(const void* id);
101ad669b04f4633957eea55b8ad2d8253adcefe39bJamie Gennis
102db89edc94bd2a78226b407f9f7261e202e7fa325Mathias Agopian    // Implementation of the IConsumerListener interface.  These
1031a4d883dcc1725892bfb5c28dec255a233186524Jamie Gennis    // calls are used to notify the ConsumerBase of asynchronous events in the
104399184a4cd728ea1421fb0bc1722274a29e38f4aJesse Hall    // BufferQueue.  The onFrameAvailable and onBuffersReleased methods should
105399184a4cd728ea1421fb0bc1722274a29e38f4aJesse Hall    // not need to be overridden by derived classes, but if they are overridden
106399184a4cd728ea1421fb0bc1722274a29e38f4aJesse Hall    // the ConsumerBase implementation must be called from the derived class.
107399184a4cd728ea1421fb0bc1722274a29e38f4aJesse Hall    // The ConsumerBase version of onSidebandStreamChanged does nothing and can
108399184a4cd728ea1421fb0bc1722274a29e38f4aJesse Hall    // be overriden by derived classes if they want the notification.
1098dc55396fc9bc425b5e2c82e76a38080f2a655ffDan Stoza    virtual void onFrameAvailable(const BufferItem& item);
1101a4d883dcc1725892bfb5c28dec255a233186524Jamie Gennis    virtual void onBuffersReleased();
111399184a4cd728ea1421fb0bc1722274a29e38f4aJesse Hall    virtual void onSidebandStreamChanged();
1121a4d883dcc1725892bfb5c28dec255a233186524Jamie Gennis
1131a4d883dcc1725892bfb5c28dec255a233186524Jamie Gennis    // freeBufferLocked frees up the given buffer slot.  If the slot has been
1141a4d883dcc1725892bfb5c28dec255a233186524Jamie Gennis    // initialized this will release the reference to the GraphicBuffer in that
1159fea3421ffddf6480f57f55a25936a886043d909Jamie Gennis    // slot.  Otherwise it has no effect.
1169fea3421ffddf6480f57f55a25936a886043d909Jamie Gennis    //
1179fea3421ffddf6480f57f55a25936a886043d909Jamie Gennis    // Derived classes should override this method to clean up any state they
1189fea3421ffddf6480f57f55a25936a886043d909Jamie Gennis    // keep per slot.  If it is overridden, the derived class's implementation
1199fea3421ffddf6480f57f55a25936a886043d909Jamie Gennis    // must call ConsumerBase::freeBufferLocked.
1201a4d883dcc1725892bfb5c28dec255a233186524Jamie Gennis    //
1211a4d883dcc1725892bfb5c28dec255a233186524Jamie Gennis    // This method must be called with mMutex locked.
1221a4d883dcc1725892bfb5c28dec255a233186524Jamie Gennis    virtual void freeBufferLocked(int slotIndex);
1231a4d883dcc1725892bfb5c28dec255a233186524Jamie Gennis
1241a4d883dcc1725892bfb5c28dec255a233186524Jamie Gennis    // abandonLocked puts the BufferQueue into the abandoned state, causing
1251a4d883dcc1725892bfb5c28dec255a233186524Jamie Gennis    // all future operations on it to fail. This method rather than the public
1261a4d883dcc1725892bfb5c28dec255a233186524Jamie Gennis    // abandon method should be overridden by child classes to add abandon-
1271a4d883dcc1725892bfb5c28dec255a233186524Jamie Gennis    // time behavior.
1281a4d883dcc1725892bfb5c28dec255a233186524Jamie Gennis    //
1299fea3421ffddf6480f57f55a25936a886043d909Jamie Gennis    // Derived classes should override this method to clean up any object
1309fea3421ffddf6480f57f55a25936a886043d909Jamie Gennis    // state they keep (as opposed to per-slot state).  If it is overridden,
1319fea3421ffddf6480f57f55a25936a886043d909Jamie Gennis    // the derived class's implementation must call ConsumerBase::abandonLocked.
1329fea3421ffddf6480f57f55a25936a886043d909Jamie Gennis    //
1331a4d883dcc1725892bfb5c28dec255a233186524Jamie Gennis    // This method must be called with mMutex locked.
1341a4d883dcc1725892bfb5c28dec255a233186524Jamie Gennis    virtual void abandonLocked();
1351a4d883dcc1725892bfb5c28dec255a233186524Jamie Gennis
1369fea3421ffddf6480f57f55a25936a886043d909Jamie Gennis    // dumpLocked dumps the current state of the ConsumerBase object to the
1379fea3421ffddf6480f57f55a25936a886043d909Jamie Gennis    // result string.  Each line is prefixed with the string pointed to by the
1389fea3421ffddf6480f57f55a25936a886043d909Jamie Gennis    // prefix argument.  The buffer argument points to a buffer that may be
1399fea3421ffddf6480f57f55a25936a886043d909Jamie Gennis    // used for intermediate formatting data, and the size of that buffer is
1409fea3421ffddf6480f57f55a25936a886043d909Jamie Gennis    // indicated by the size argument.
1419fea3421ffddf6480f57f55a25936a886043d909Jamie Gennis    //
1429fea3421ffddf6480f57f55a25936a886043d909Jamie Gennis    // Derived classes should override this method to dump their internal
1439fea3421ffddf6480f57f55a25936a886043d909Jamie Gennis    // state.  If this method is overridden the derived class's implementation
1449fea3421ffddf6480f57f55a25936a886043d909Jamie Gennis    // should call ConsumerBase::dumpLocked.
1459fea3421ffddf6480f57f55a25936a886043d909Jamie Gennis    //
1469fea3421ffddf6480f57f55a25936a886043d909Jamie Gennis    // This method must be called with mMutex locked.
14774d211ae26a0257c6075a823812e40b55aa1e653Mathias Agopian    virtual void dumpLocked(String8& result, const char* prefix) const;
1481a4d883dcc1725892bfb5c28dec255a233186524Jamie Gennis
1491a4d883dcc1725892bfb5c28dec255a233186524Jamie Gennis    // acquireBufferLocked fetches the next buffer from the BufferQueue and
1501a4d883dcc1725892bfb5c28dec255a233186524Jamie Gennis    // updates the buffer slot for the buffer returned.
1519fea3421ffddf6480f57f55a25936a886043d909Jamie Gennis    //
1529fea3421ffddf6480f57f55a25936a886043d909Jamie Gennis    // Derived classes should override this method to perform any
1539fea3421ffddf6480f57f55a25936a886043d909Jamie Gennis    // initialization that must take place the first time a buffer is assigned
1549fea3421ffddf6480f57f55a25936a886043d909Jamie Gennis    // to a slot.  If it is overridden the derived class's implementation must
1559fea3421ffddf6480f57f55a25936a886043d909Jamie Gennis    // call ConsumerBase::acquireBufferLocked.
156db89edc94bd2a78226b407f9f7261e202e7fa325Mathias Agopian    virtual status_t acquireBufferLocked(IGraphicBufferConsumer::BufferItem *item,
1571585c4d9fbbba3ba70ae625923b85cd02cb8a0fdAndy McFadden        nsecs_t presentWhen);
1581a4d883dcc1725892bfb5c28dec255a233186524Jamie Gennis
1591a4d883dcc1725892bfb5c28dec255a233186524Jamie Gennis    // releaseBufferLocked relinquishes control over a buffer, returning that
1601a4d883dcc1725892bfb5c28dec255a233186524Jamie Gennis    // control to the BufferQueue.
1619fea3421ffddf6480f57f55a25936a886043d909Jamie Gennis    //
1629fea3421ffddf6480f57f55a25936a886043d909Jamie Gennis    // Derived classes should override this method to perform any cleanup that
1639fea3421ffddf6480f57f55a25936a886043d909Jamie Gennis    // must take place when a buffer is released back to the BufferQueue.  If
1649fea3421ffddf6480f57f55a25936a886043d909Jamie Gennis    // it is overridden the derived class's implementation must call
165c5d7b7d323bba8772a9005f7d300ad983a04733aLajos Molnar    // ConsumerBase::releaseBufferLocked.e
166c5d7b7d323bba8772a9005f7d300ad983a04733aLajos Molnar    virtual status_t releaseBufferLocked(int slot,
167c5d7b7d323bba8772a9005f7d300ad983a04733aLajos Molnar            const sp<GraphicBuffer> graphicBuffer,
168c5d7b7d323bba8772a9005f7d300ad983a04733aLajos Molnar            EGLDisplay display, EGLSyncKHR eglFence);
169c5d7b7d323bba8772a9005f7d300ad983a04733aLajos Molnar
170c5d7b7d323bba8772a9005f7d300ad983a04733aLajos Molnar    // returns true iff the slot still has the graphicBuffer in it.
171c5d7b7d323bba8772a9005f7d300ad983a04733aLajos Molnar    bool stillTracking(int slot, const sp<GraphicBuffer> graphicBuffer);
172b27254154642575dfb4bbfa79fbedde7d7ee23ddJamie Gennis
1739504eb915c9628e130f45019bdefda0168089886Jesse Hall    // addReleaseFence* adds the sync points associated with a fence to the set
174b27254154642575dfb4bbfa79fbedde7d7ee23ddJamie Gennis    // of sync points that must be reached before the buffer in the given slot
175b27254154642575dfb4bbfa79fbedde7d7ee23ddJamie Gennis    // may be used after the slot has been released.  This should be called by
176b27254154642575dfb4bbfa79fbedde7d7ee23ddJamie Gennis    // derived classes each time some asynchronous work is kicked off that
177b27254154642575dfb4bbfa79fbedde7d7ee23ddJamie Gennis    // references the buffer.
178c5d7b7d323bba8772a9005f7d300ad983a04733aLajos Molnar    status_t addReleaseFence(int slot,
179c5d7b7d323bba8772a9005f7d300ad983a04733aLajos Molnar            const sp<GraphicBuffer> graphicBuffer, const sp<Fence>& fence);
180c5d7b7d323bba8772a9005f7d300ad983a04733aLajos Molnar    status_t addReleaseFenceLocked(int slot,
181c5d7b7d323bba8772a9005f7d300ad983a04733aLajos Molnar            const sp<GraphicBuffer> graphicBuffer, const sp<Fence>& fence);
1821a4d883dcc1725892bfb5c28dec255a233186524Jamie Gennis
1831a4d883dcc1725892bfb5c28dec255a233186524Jamie Gennis    // Slot contains the information and object references that
1841a4d883dcc1725892bfb5c28dec255a233186524Jamie Gennis    // ConsumerBase maintains about a BufferQueue buffer slot.
1851a4d883dcc1725892bfb5c28dec255a233186524Jamie Gennis    struct Slot {
1861a4d883dcc1725892bfb5c28dec255a233186524Jamie Gennis        // mGraphicBuffer is the Gralloc buffer store in the slot or NULL if
1871a4d883dcc1725892bfb5c28dec255a233186524Jamie Gennis        // no Gralloc buffer is in the slot.
1881a4d883dcc1725892bfb5c28dec255a233186524Jamie Gennis        sp<GraphicBuffer> mGraphicBuffer;
1891a4d883dcc1725892bfb5c28dec255a233186524Jamie Gennis
1901a4d883dcc1725892bfb5c28dec255a233186524Jamie Gennis        // mFence is a fence which will signal when the buffer associated with
1911a4d883dcc1725892bfb5c28dec255a233186524Jamie Gennis        // this buffer slot is no longer being used by the consumer and can be
1921a4d883dcc1725892bfb5c28dec255a233186524Jamie Gennis        // overwritten. The buffer can be dequeued before the fence signals;
1931a4d883dcc1725892bfb5c28dec255a233186524Jamie Gennis        // the producer is responsible for delaying writes until it signals.
1941a4d883dcc1725892bfb5c28dec255a233186524Jamie Gennis        sp<Fence> mFence;
195c5d7b7d323bba8772a9005f7d300ad983a04733aLajos Molnar
196c5d7b7d323bba8772a9005f7d300ad983a04733aLajos Molnar        // the frame number of the last acquired frame for this slot
197c5d7b7d323bba8772a9005f7d300ad983a04733aLajos Molnar        uint64_t mFrameNumber;
1981a4d883dcc1725892bfb5c28dec255a233186524Jamie Gennis    };
1991a4d883dcc1725892bfb5c28dec255a233186524Jamie Gennis
2001a4d883dcc1725892bfb5c28dec255a233186524Jamie Gennis    // mSlots stores the buffers that have been allocated by the BufferQueue
2011a4d883dcc1725892bfb5c28dec255a233186524Jamie Gennis    // for each buffer slot.  It is initialized to null pointers, and gets
2021a4d883dcc1725892bfb5c28dec255a233186524Jamie Gennis    // filled in with the result of BufferQueue::acquire when the
2031a4d883dcc1725892bfb5c28dec255a233186524Jamie Gennis    // client dequeues a buffer from a
2041a4d883dcc1725892bfb5c28dec255a233186524Jamie Gennis    // slot that has not yet been used. The buffer allocated to a slot will also
2051a4d883dcc1725892bfb5c28dec255a233186524Jamie Gennis    // be replaced if the requested buffer usage or geometry differs from that
2061a4d883dcc1725892bfb5c28dec255a233186524Jamie Gennis    // of the buffer allocated to a slot.
2071a4d883dcc1725892bfb5c28dec255a233186524Jamie Gennis    Slot mSlots[BufferQueue::NUM_BUFFER_SLOTS];
2081a4d883dcc1725892bfb5c28dec255a233186524Jamie Gennis
2091a4d883dcc1725892bfb5c28dec255a233186524Jamie Gennis    // mAbandoned indicates that the BufferQueue will no longer be used to
2102adaf04fab35cf47c824d74d901b54094e01ccd3Andy McFadden    // consume images buffers pushed to it using the IGraphicBufferProducer
2111a4d883dcc1725892bfb5c28dec255a233186524Jamie Gennis    // interface. It is initialized to false, and set to true in the abandon
2121a4d883dcc1725892bfb5c28dec255a233186524Jamie Gennis    // method.  A BufferQueue that has been abandoned will return the NO_INIT
2131a4d883dcc1725892bfb5c28dec255a233186524Jamie Gennis    // error from all IConsumerBase methods capable of returning an error.
2141a4d883dcc1725892bfb5c28dec255a233186524Jamie Gennis    bool mAbandoned;
2151a4d883dcc1725892bfb5c28dec255a233186524Jamie Gennis
2161a4d883dcc1725892bfb5c28dec255a233186524Jamie Gennis    // mName is a string used to identify the ConsumerBase in log messages.
2171a4d883dcc1725892bfb5c28dec255a233186524Jamie Gennis    // It can be set by the setName method.
2181a4d883dcc1725892bfb5c28dec255a233186524Jamie Gennis    String8 mName;
2191a4d883dcc1725892bfb5c28dec255a233186524Jamie Gennis
2201a4d883dcc1725892bfb5c28dec255a233186524Jamie Gennis    // mFrameAvailableListener is the listener object that will be called when a
2211a4d883dcc1725892bfb5c28dec255a233186524Jamie Gennis    // new frame becomes available. If it is not NULL it will be called from
2221a4d883dcc1725892bfb5c28dec255a233186524Jamie Gennis    // queueBuffer.
223a4a3149a36bc69a06e4824aeae909ab910661070Igor Murashkin    wp<FrameAvailableListener> mFrameAvailableListener;
2241a4d883dcc1725892bfb5c28dec255a233186524Jamie Gennis
2251a4d883dcc1725892bfb5c28dec255a233186524Jamie Gennis    // The ConsumerBase has-a BufferQueue and is responsible for creating this object
2261a4d883dcc1725892bfb5c28dec255a233186524Jamie Gennis    // if none is supplied
227db89edc94bd2a78226b407f9f7261e202e7fa325Mathias Agopian    sp<IGraphicBufferConsumer> mConsumer;
2281a4d883dcc1725892bfb5c28dec255a233186524Jamie Gennis
2291a4d883dcc1725892bfb5c28dec255a233186524Jamie Gennis    // mMutex is the mutex used to prevent concurrent access to the member
2301a4d883dcc1725892bfb5c28dec255a233186524Jamie Gennis    // variables of ConsumerBase objects. It must be locked whenever the
2319fea3421ffddf6480f57f55a25936a886043d909Jamie Gennis    // member variables are accessed or when any of the *Locked methods are
2329fea3421ffddf6480f57f55a25936a886043d909Jamie Gennis    // called.
2339fea3421ffddf6480f57f55a25936a886043d909Jamie Gennis    //
2349fea3421ffddf6480f57f55a25936a886043d909Jamie Gennis    // This mutex is intended to be locked by derived classes.
2351a4d883dcc1725892bfb5c28dec255a233186524Jamie Gennis    mutable Mutex mMutex;
2361a4d883dcc1725892bfb5c28dec255a233186524Jamie Gennis};
2371a4d883dcc1725892bfb5c28dec255a233186524Jamie Gennis
2381a4d883dcc1725892bfb5c28dec255a233186524Jamie Gennis// ----------------------------------------------------------------------------
2391a4d883dcc1725892bfb5c28dec255a233186524Jamie Gennis}; // namespace android
2401a4d883dcc1725892bfb5c28dec255a233186524Jamie Gennis
2411a4d883dcc1725892bfb5c28dec255a233186524Jamie Gennis#endif // ANDROID_GUI_CONSUMERBASE_H
242