Loading include/gui/BufferItemConsumer.h +15 −0 Original line number Original line Diff line number Diff line Loading @@ -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 }; Loading @@ -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 Loading @@ -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 Loading libs/gui/BufferItemConsumer.cpp +17 −1 Original line number Original line Diff line number Diff line Loading @@ -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__) Loading Loading @@ -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; Loading Loading @@ -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 Loading
include/gui/BufferItemConsumer.h +15 −0 Original line number Original line Diff line number Diff line Loading @@ -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 }; Loading @@ -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 Loading @@ -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 Loading
libs/gui/BufferItemConsumer.cpp +17 −1 Original line number Original line Diff line number Diff line Loading @@ -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__) Loading Loading @@ -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; Loading Loading @@ -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