Loading libs/gui/BufferQueue.cpp +21 −0 Original line number Diff line number Diff line Loading @@ -43,6 +43,27 @@ void BufferQueue::ProxyConsumerListener::onDisconnect() { } } void BufferQueue::ProxyConsumerListener::onFrameDequeued(const uint64_t bufferId) { sp<ConsumerListener> listener(mConsumerListener.promote()); if (listener != nullptr) { listener->onFrameDequeued(bufferId); } } void BufferQueue::ProxyConsumerListener::onFrameCancelled(const uint64_t bufferId) { sp<ConsumerListener> listener(mConsumerListener.promote()); if (listener != nullptr) { listener->onFrameCancelled(bufferId); } } void BufferQueue::ProxyConsumerListener::onFrameDetached(const uint64_t bufferId) { sp<ConsumerListener> listener(mConsumerListener.promote()); if (listener != nullptr) { listener->onFrameDetached(bufferId); } } void BufferQueue::ProxyConsumerListener::onFrameAvailable( const BufferItem& item) { sp<ConsumerListener> listener(mConsumerListener.promote()); Loading libs/gui/BufferQueueProducer.cpp +12 −1 Original line number Diff line number Diff line Loading @@ -580,6 +580,11 @@ status_t BufferQueueProducer::dequeueBuffer(int* outSlot, sp<android::Fence>* ou } addAndGetFrameTimestamps(nullptr, outTimestamps); { // Autolock scope std::lock_guard<std::mutex> lock(mCore->mMutex); mCore->mConsumerListener->onFrameDequeued(mSlots[*outSlot].mGraphicBuffer->getId()); } return returnFlags; } Loading Loading @@ -621,13 +626,16 @@ status_t BufferQueueProducer::detachBuffer(int slot) { return BAD_VALUE; } listener = mCore->mConsumerListener; if (listener != nullptr) { listener->onFrameDetached(mSlots[slot].mGraphicBuffer->getId()); } mSlots[slot].mBufferState.detachProducer(); mCore->mActiveBuffers.erase(slot); mCore->mFreeSlots.insert(slot); mCore->clearBufferSlotLocked(slot); mCore->mDequeueCondition.notify_all(); VALIDATE_CONSISTENCY(); listener = mCore->mConsumerListener; } if (listener != nullptr) { Loading Loading @@ -1083,6 +1091,9 @@ status_t BufferQueueProducer::cancelBuffer(int slot, const sp<Fence>& fence) { mCore->mFreeBuffers.push_back(slot); } if (mCore->mConsumerListener != nullptr) { mCore->mConsumerListener->onFrameCancelled(mSlots[slot].mGraphicBuffer->getId()); } mSlots[slot].mFence = fence; mCore->mDequeueCondition.notify_all(); VALIDATE_CONSISTENCY(); Loading libs/gui/ConsumerBase.cpp +42 −0 Original line number Diff line number Diff line Loading @@ -101,6 +101,48 @@ void ConsumerBase::freeBufferLocked(int slotIndex) { mSlots[slotIndex].mFrameNumber = 0; } void ConsumerBase::onFrameDequeued(const uint64_t bufferId) { CB_LOGV("onFrameDequeued"); sp<FrameAvailableListener> listener; { Mutex::Autolock lock(mFrameAvailableMutex); listener = mFrameAvailableListener.promote(); } if (listener != nullptr) { listener->onFrameDequeued(bufferId); } } void ConsumerBase::onFrameCancelled(const uint64_t bufferId) { CB_LOGV("onFrameCancelled"); sp<FrameAvailableListener> listener; { Mutex::Autolock lock(mFrameAvailableMutex); listener = mFrameAvailableListener.promote(); } if (listener != nullptr) { listener->onFrameCancelled(bufferId); } } void ConsumerBase::onFrameDetached(const uint64_t bufferId) { CB_LOGV("onFrameDetached"); sp<FrameAvailableListener> listener; { Mutex::Autolock lock(mFrameAvailableMutex); listener = mFrameAvailableListener.promote(); } if (listener != nullptr) { listener->onFrameDetached(bufferId); } } void ConsumerBase::onFrameAvailable(const BufferItem& item) { CB_LOGV("onFrameAvailable"); Loading libs/gui/IConsumerListener.cpp +25 −1 Original line number Diff line number Diff line Loading @@ -28,7 +28,10 @@ enum class Tag : uint32_t { ON_FRAME_REPLACED, ON_BUFFERS_RELEASED, ON_SIDEBAND_STREAM_CHANGED, LAST = ON_SIDEBAND_STREAM_CHANGED, ON_FRAME_DEQUEUED, ON_FRAME_CANCELLED, ON_FRAME_DETACHED, LAST = ON_FRAME_DETACHED, }; } // Anonymous namespace Loading @@ -44,6 +47,21 @@ public: callRemoteAsync<decltype(&IConsumerListener::onDisconnect)>(Tag::ON_DISCONNECT); } void onFrameDequeued(const uint64_t bufferId) override { callRemoteAsync<decltype(&IConsumerListener::onFrameDequeued)>(Tag::ON_FRAME_DEQUEUED, bufferId); } void onFrameDetached(const uint64_t bufferId) override { callRemoteAsync<decltype(&IConsumerListener::onFrameDetached)>(Tag::ON_FRAME_DETACHED, bufferId); } void onFrameCancelled(const uint64_t bufferId) override { callRemoteAsync<decltype(&IConsumerListener::onFrameCancelled)>(Tag::ON_FRAME_CANCELLED, bufferId); } void onFrameAvailable(const BufferItem& item) override { callRemoteAsync<decltype(&IConsumerListener::onFrameAvailable)>(Tag::ON_FRAME_AVAILABLE, item); Loading Loading @@ -93,6 +111,12 @@ status_t BnConsumerListener::onTransact(uint32_t code, const Parcel& data, Parce return callLocalAsync(data, reply, &IConsumerListener::onBuffersReleased); case Tag::ON_SIDEBAND_STREAM_CHANGED: return callLocalAsync(data, reply, &IConsumerListener::onSidebandStreamChanged); case Tag::ON_FRAME_DEQUEUED: return callLocalAsync(data, reply, &IConsumerListener::onFrameDequeued); case Tag::ON_FRAME_CANCELLED: return callLocalAsync(data, reply, &IConsumerListener::onFrameCancelled); case Tag::ON_FRAME_DETACHED: return callLocalAsync(data, reply, &IConsumerListener::onFrameDetached); } } Loading libs/gui/include/gui/BufferQueue.h +3 −0 Original line number Diff line number Diff line Loading @@ -63,6 +63,9 @@ public: void onFrameReplaced(const BufferItem& item) override; void onBuffersReleased() override; void onSidebandStreamChanged() override; void onFrameDequeued(const uint64_t bufferId) override; void onFrameCancelled(const uint64_t bufferId) override; void onFrameDetached(const uint64_t bufferID) override; void addAndGetFrameTimestamps( const NewFrameEventsEntry* newTimestamps, FrameEventHistoryDelta* outDelta) override; Loading Loading
libs/gui/BufferQueue.cpp +21 −0 Original line number Diff line number Diff line Loading @@ -43,6 +43,27 @@ void BufferQueue::ProxyConsumerListener::onDisconnect() { } } void BufferQueue::ProxyConsumerListener::onFrameDequeued(const uint64_t bufferId) { sp<ConsumerListener> listener(mConsumerListener.promote()); if (listener != nullptr) { listener->onFrameDequeued(bufferId); } } void BufferQueue::ProxyConsumerListener::onFrameCancelled(const uint64_t bufferId) { sp<ConsumerListener> listener(mConsumerListener.promote()); if (listener != nullptr) { listener->onFrameCancelled(bufferId); } } void BufferQueue::ProxyConsumerListener::onFrameDetached(const uint64_t bufferId) { sp<ConsumerListener> listener(mConsumerListener.promote()); if (listener != nullptr) { listener->onFrameDetached(bufferId); } } void BufferQueue::ProxyConsumerListener::onFrameAvailable( const BufferItem& item) { sp<ConsumerListener> listener(mConsumerListener.promote()); Loading
libs/gui/BufferQueueProducer.cpp +12 −1 Original line number Diff line number Diff line Loading @@ -580,6 +580,11 @@ status_t BufferQueueProducer::dequeueBuffer(int* outSlot, sp<android::Fence>* ou } addAndGetFrameTimestamps(nullptr, outTimestamps); { // Autolock scope std::lock_guard<std::mutex> lock(mCore->mMutex); mCore->mConsumerListener->onFrameDequeued(mSlots[*outSlot].mGraphicBuffer->getId()); } return returnFlags; } Loading Loading @@ -621,13 +626,16 @@ status_t BufferQueueProducer::detachBuffer(int slot) { return BAD_VALUE; } listener = mCore->mConsumerListener; if (listener != nullptr) { listener->onFrameDetached(mSlots[slot].mGraphicBuffer->getId()); } mSlots[slot].mBufferState.detachProducer(); mCore->mActiveBuffers.erase(slot); mCore->mFreeSlots.insert(slot); mCore->clearBufferSlotLocked(slot); mCore->mDequeueCondition.notify_all(); VALIDATE_CONSISTENCY(); listener = mCore->mConsumerListener; } if (listener != nullptr) { Loading Loading @@ -1083,6 +1091,9 @@ status_t BufferQueueProducer::cancelBuffer(int slot, const sp<Fence>& fence) { mCore->mFreeBuffers.push_back(slot); } if (mCore->mConsumerListener != nullptr) { mCore->mConsumerListener->onFrameCancelled(mSlots[slot].mGraphicBuffer->getId()); } mSlots[slot].mFence = fence; mCore->mDequeueCondition.notify_all(); VALIDATE_CONSISTENCY(); Loading
libs/gui/ConsumerBase.cpp +42 −0 Original line number Diff line number Diff line Loading @@ -101,6 +101,48 @@ void ConsumerBase::freeBufferLocked(int slotIndex) { mSlots[slotIndex].mFrameNumber = 0; } void ConsumerBase::onFrameDequeued(const uint64_t bufferId) { CB_LOGV("onFrameDequeued"); sp<FrameAvailableListener> listener; { Mutex::Autolock lock(mFrameAvailableMutex); listener = mFrameAvailableListener.promote(); } if (listener != nullptr) { listener->onFrameDequeued(bufferId); } } void ConsumerBase::onFrameCancelled(const uint64_t bufferId) { CB_LOGV("onFrameCancelled"); sp<FrameAvailableListener> listener; { Mutex::Autolock lock(mFrameAvailableMutex); listener = mFrameAvailableListener.promote(); } if (listener != nullptr) { listener->onFrameCancelled(bufferId); } } void ConsumerBase::onFrameDetached(const uint64_t bufferId) { CB_LOGV("onFrameDetached"); sp<FrameAvailableListener> listener; { Mutex::Autolock lock(mFrameAvailableMutex); listener = mFrameAvailableListener.promote(); } if (listener != nullptr) { listener->onFrameDetached(bufferId); } } void ConsumerBase::onFrameAvailable(const BufferItem& item) { CB_LOGV("onFrameAvailable"); Loading
libs/gui/IConsumerListener.cpp +25 −1 Original line number Diff line number Diff line Loading @@ -28,7 +28,10 @@ enum class Tag : uint32_t { ON_FRAME_REPLACED, ON_BUFFERS_RELEASED, ON_SIDEBAND_STREAM_CHANGED, LAST = ON_SIDEBAND_STREAM_CHANGED, ON_FRAME_DEQUEUED, ON_FRAME_CANCELLED, ON_FRAME_DETACHED, LAST = ON_FRAME_DETACHED, }; } // Anonymous namespace Loading @@ -44,6 +47,21 @@ public: callRemoteAsync<decltype(&IConsumerListener::onDisconnect)>(Tag::ON_DISCONNECT); } void onFrameDequeued(const uint64_t bufferId) override { callRemoteAsync<decltype(&IConsumerListener::onFrameDequeued)>(Tag::ON_FRAME_DEQUEUED, bufferId); } void onFrameDetached(const uint64_t bufferId) override { callRemoteAsync<decltype(&IConsumerListener::onFrameDetached)>(Tag::ON_FRAME_DETACHED, bufferId); } void onFrameCancelled(const uint64_t bufferId) override { callRemoteAsync<decltype(&IConsumerListener::onFrameCancelled)>(Tag::ON_FRAME_CANCELLED, bufferId); } void onFrameAvailable(const BufferItem& item) override { callRemoteAsync<decltype(&IConsumerListener::onFrameAvailable)>(Tag::ON_FRAME_AVAILABLE, item); Loading Loading @@ -93,6 +111,12 @@ status_t BnConsumerListener::onTransact(uint32_t code, const Parcel& data, Parce return callLocalAsync(data, reply, &IConsumerListener::onBuffersReleased); case Tag::ON_SIDEBAND_STREAM_CHANGED: return callLocalAsync(data, reply, &IConsumerListener::onSidebandStreamChanged); case Tag::ON_FRAME_DEQUEUED: return callLocalAsync(data, reply, &IConsumerListener::onFrameDequeued); case Tag::ON_FRAME_CANCELLED: return callLocalAsync(data, reply, &IConsumerListener::onFrameCancelled); case Tag::ON_FRAME_DETACHED: return callLocalAsync(data, reply, &IConsumerListener::onFrameDetached); } } Loading
libs/gui/include/gui/BufferQueue.h +3 −0 Original line number Diff line number Diff line Loading @@ -63,6 +63,9 @@ public: void onFrameReplaced(const BufferItem& item) override; void onBuffersReleased() override; void onSidebandStreamChanged() override; void onFrameDequeued(const uint64_t bufferId) override; void onFrameCancelled(const uint64_t bufferId) override; void onFrameDetached(const uint64_t bufferID) override; void addAndGetFrameTimestamps( const NewFrameEventsEntry* newTimestamps, FrameEventHistoryDelta* outDelta) override; Loading