libgui: Hook up onFrameReplaced

This completes the plumbing from ConsumerListener::onFrameReplaced into
SurfaceFlinger (and other consumers that may care).

Change-Id: I376e78ace95d6748e8662e6b4d47c0dfa697a300
This commit is contained in:
Dan Stoza 2015-05-11 15:33:01 -07:00
parent be451b57b9
commit dc13c5b85b
5 changed files with 42 additions and 22 deletions

View File

@ -62,9 +62,10 @@ public:
public: public:
ProxyConsumerListener(const wp<ConsumerListener>& consumerListener); ProxyConsumerListener(const wp<ConsumerListener>& consumerListener);
virtual ~ProxyConsumerListener(); virtual ~ProxyConsumerListener();
virtual void onFrameAvailable(const BufferItem& item); virtual void onFrameAvailable(const BufferItem& item) override;
virtual void onBuffersReleased(); virtual void onFrameReplaced(const BufferItem& item) override;
virtual void onSidebandStreamChanged(); virtual void onBuffersReleased() override;
virtual void onSidebandStreamChanged() override;
private: private:
// mConsumerListener is a weak reference to the IConsumerListener. This is // mConsumerListener is a weak reference to the IConsumerListener. This is
// the raison d'etre of ProxyConsumerListener. // the raison d'etre of ProxyConsumerListener.

View File

@ -38,15 +38,9 @@ class ConsumerBase : public virtual RefBase,
protected ConsumerListener { protected ConsumerListener {
public: public:
struct FrameAvailableListener : public virtual RefBase { struct FrameAvailableListener : public virtual RefBase {
// onFrameAvailable() is called each time an additional frame becomes // See IConsumerListener::onFrame{Available,Replaced}
// available for consumption. This means that frames that are queued
// while in asynchronous mode only trigger the callback if no previous
// frames are pending. Frames queued while in synchronous mode always
// trigger the callback.
//
// This is called without any lock held and can be called concurrently
// by multiple threads.
virtual void onFrameAvailable(const BufferItem& item) = 0; virtual void onFrameAvailable(const BufferItem& item) = 0;
virtual void onFrameReplaced(const BufferItem& /* item */) {}
}; };
virtual ~ConsumerBase(); virtual ~ConsumerBase();
@ -104,14 +98,16 @@ protected:
// Implementation of the IConsumerListener interface. These // Implementation of the IConsumerListener interface. These
// calls are used to notify the ConsumerBase of asynchronous events in the // calls are used to notify the ConsumerBase of asynchronous events in the
// BufferQueue. The onFrameAvailable and onBuffersReleased methods should // BufferQueue. The onFrameAvailable, onFrameReplaced, and
// not need to be overridden by derived classes, but if they are overridden // onBuffersReleased methods should not need to be overridden by derived
// the ConsumerBase implementation must be called from the derived class. // classes, but if they are overridden the ConsumerBase implementation must
// The ConsumerBase version of onSidebandStreamChanged does nothing and can // be called from the derived class. The ConsumerBase version of
// be overriden by derived classes if they want the notification. // onSidebandStreamChanged does nothing and can be overriden by derived
virtual void onFrameAvailable(const BufferItem& item); // classes if they want the notification.
virtual void onBuffersReleased(); virtual void onFrameAvailable(const BufferItem& item) override;
virtual void onSidebandStreamChanged(); virtual void onFrameReplaced(const BufferItem& item) override;
virtual void onBuffersReleased() override;
virtual void onSidebandStreamChanged() override;
// freeBufferLocked frees up the given buffer slot. If the slot has been // freeBufferLocked frees up the given buffer slot. If the slot has been
// initialized this will release the reference to the GraphicBuffer in that // initialized this will release the reference to the GraphicBuffer in that

View File

@ -39,6 +39,14 @@ void BufferQueue::ProxyConsumerListener::onFrameAvailable(
} }
} }
void BufferQueue::ProxyConsumerListener::onFrameReplaced(
const BufferItem& item) {
sp<ConsumerListener> listener(mConsumerListener.promote());
if (listener != NULL) {
listener->onFrameReplaced(item);
}
}
void BufferQueue::ProxyConsumerListener::onBuffersReleased() { void BufferQueue::ProxyConsumerListener::onBuffersReleased() {
sp<ConsumerListener> listener(mConsumerListener.promote()); sp<ConsumerListener> listener(mConsumerListener.promote());
if (listener != NULL) { if (listener != NULL) {

View File

@ -114,6 +114,21 @@ void ConsumerBase::onFrameAvailable(const BufferItem& item) {
} }
} }
void ConsumerBase::onFrameReplaced(const BufferItem &item) {
CB_LOGV("onFrameReplaced");
sp<FrameAvailableListener> listener;
{
Mutex::Autolock lock(mMutex);
listener = mFrameAvailableListener.promote();
}
if (listener != NULL) {
CB_LOGV("actually calling onFrameReplaced");
listener->onFrameReplaced(item);
}
}
void ConsumerBase::onBuffersReleased() { void ConsumerBase::onBuffersReleased() {
Mutex::Autolock lock(mMutex); Mutex::Autolock lock(mMutex);

View File

@ -339,9 +339,9 @@ protected:
private: private:
// Interface implementation for SurfaceFlingerConsumer::ContentsChangedListener // Interface implementation for SurfaceFlingerConsumer::ContentsChangedListener
virtual void onFrameAvailable(const BufferItem& item); virtual void onFrameAvailable(const BufferItem& item) override;
virtual void onFrameReplaced(const BufferItem& item); virtual void onFrameReplaced(const BufferItem& item) override;
virtual void onSidebandStreamChanged(); virtual void onSidebandStreamChanged() override;
void commitTransaction(); void commitTransaction();