Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 8c0761fc authored by TreeHugger Robot's avatar TreeHugger Robot Committed by Android (Google) Code Review
Browse files

Merge "BufferItemConsumer: Add onBufferFreedListener"

parents 28f9c86b 021d92e6
Loading
Loading
Loading
Loading
+15 −0
Original line number Original line Diff line number Diff line
@@ -37,6 +37,10 @@ class BufferItemConsumer: public ConsumerBase
  public:
  public:
    typedef ConsumerBase::FrameAvailableListener FrameAvailableListener;
    typedef ConsumerBase::FrameAvailableListener FrameAvailableListener;


    struct BufferFreedListener : public virtual RefBase {
        virtual void onBufferFreed(const wp<GraphicBuffer>& graphicBuffer) = 0;
    };

    enum { DEFAULT_MAX_BUFFERS = -1 };
    enum { DEFAULT_MAX_BUFFERS = -1 };
    enum { INVALID_BUFFER_SLOT = BufferQueue::INVALID_BUFFER_SLOT };
    enum { INVALID_BUFFER_SLOT = BufferQueue::INVALID_BUFFER_SLOT };
    enum { NO_BUFFER_AVAILABLE = BufferQueue::NO_BUFFER_AVAILABLE };
    enum { NO_BUFFER_AVAILABLE = BufferQueue::NO_BUFFER_AVAILABLE };
@@ -57,6 +61,10 @@ class BufferItemConsumer: public ConsumerBase
    // log messages.
    // log messages.
    void setName(const String8& name);
    void setName(const String8& name);


    // setBufferFreedListener sets the listener object that will be notified
    // when an old buffer is being freed.
    void setBufferFreedListener(const wp<BufferFreedListener>& listener);

    // Gets the next graphics buffer from the producer, filling out the
    // Gets the next graphics buffer from the producer, filling out the
    // passed-in BufferItem structure. Returns NO_BUFFER_AVAILABLE if the queue
    // passed-in BufferItem structure. Returns NO_BUFFER_AVAILABLE if the queue
    // of buffers is empty, and INVALID_OPERATION if the maximum number of
    // of buffers is empty, and INVALID_OPERATION if the maximum number of
@@ -81,6 +89,13 @@ class BufferItemConsumer: public ConsumerBase
    status_t releaseBuffer(const BufferItem &item,
    status_t releaseBuffer(const BufferItem &item,
            const sp<Fence>& releaseFence = Fence::NO_FENCE);
            const sp<Fence>& releaseFence = Fence::NO_FENCE);


   private:
    void freeBufferLocked(int slotIndex) override;

    // mBufferFreedListener is the listener object that will be called when
    // an old buffer is being freed. If it is not NULL it will be called from
    // freeBufferLocked.
    wp<BufferFreedListener> mBufferFreedListener;
};
};


} // namespace android
} // namespace android
+17 −1
Original line number Original line Diff line number Diff line
@@ -22,7 +22,7 @@
#include <gui/BufferItem.h>
#include <gui/BufferItem.h>
#include <gui/BufferItemConsumer.h>
#include <gui/BufferItemConsumer.h>


//#define BI_LOGV(x, ...) ALOGV("[%s] " x, mName.string(), ##__VA_ARGS__)
#define BI_LOGV(x, ...) ALOGV("[%s] " x, mName.string(), ##__VA_ARGS__)
//#define BI_LOGD(x, ...) ALOGD("[%s] " x, mName.string(), ##__VA_ARGS__)
//#define BI_LOGD(x, ...) ALOGD("[%s] " x, mName.string(), ##__VA_ARGS__)
//#define BI_LOGI(x, ...) ALOGI("[%s] " x, mName.string(), ##__VA_ARGS__)
//#define BI_LOGI(x, ...) ALOGI("[%s] " x, mName.string(), ##__VA_ARGS__)
//#define BI_LOGW(x, ...) ALOGW("[%s] " x, mName.string(), ##__VA_ARGS__)
//#define BI_LOGW(x, ...) ALOGW("[%s] " x, mName.string(), ##__VA_ARGS__)
@@ -57,6 +57,12 @@ void BufferItemConsumer::setName(const String8& name) {
    mConsumer->setConsumerName(name);
    mConsumer->setConsumerName(name);
}
}


void BufferItemConsumer::setBufferFreedListener(
        const wp<BufferFreedListener>& listener) {
    Mutex::Autolock _l(mMutex);
    mBufferFreedListener = listener;
}

status_t BufferItemConsumer::acquireBuffer(BufferItem *item,
status_t BufferItemConsumer::acquireBuffer(BufferItem *item,
        nsecs_t presentWhen, bool waitForFence) {
        nsecs_t presentWhen, bool waitForFence) {
    status_t err;
    status_t err;
@@ -104,4 +110,14 @@ status_t BufferItemConsumer::releaseBuffer(const BufferItem &item,
    return err;
    return err;
}
}


void BufferItemConsumer::freeBufferLocked(int slotIndex) {
    sp<BufferFreedListener> listener = mBufferFreedListener.promote();
    if (listener != NULL && mSlots[slotIndex].mGraphicBuffer != NULL) {
        // Fire callback if we have a listener registered and the buffer being freed is valid.
        BI_LOGV("actually calling onBufferFreed");
        listener->onBufferFreed(mSlots[slotIndex].mGraphicBuffer);
    }
    ConsumerBase::freeBufferLocked(slotIndex);
}

} // namespace android
} // namespace android