diff options
author | Chong Zhang <chz@google.com> | 2015-06-05 18:38:28 -0700 |
---|---|---|
committer | Chong Zhang <chz@google.com> | 2015-06-08 13:23:32 -0700 |
commit | ffd8cbb288f096b53df0392bf40d99b89e34bea7 (patch) | |
tree | 8eba9d637c0e08b976396089b01152166415bdab /media/libstagefright/omx/GraphicBufferSource.h | |
parent | 26a48f304a8754d655e554178ffb6d7ba4c5aac3 (diff) | |
download | frameworks_av-ffd8cbb288f096b53df0392bf40d99b89e34bea7.zip frameworks_av-ffd8cbb288f096b53df0392bf40d99b89e34bea7.tar.gz frameworks_av-ffd8cbb288f096b53df0392bf40d99b89e34bea7.tar.bz2 |
fix graphic buffer leak with persistent input surface
implement PersistentProxyListener that returns buffers during period
when actual listener is not connected.
also clear old buffer slot in GraphicBufferSource when re-attaching.
bug: 21473584
Change-Id: I3bcf1a208e745397d6cc6ce9aef9e4f5aa604f3c
Diffstat (limited to 'media/libstagefright/omx/GraphicBufferSource.h')
-rw-r--r-- | media/libstagefright/omx/GraphicBufferSource.h | 25 |
1 files changed, 25 insertions, 0 deletions
diff --git a/media/libstagefright/omx/GraphicBufferSource.h b/media/libstagefright/omx/GraphicBufferSource.h index 555bbec..2a8c218 100644 --- a/media/libstagefright/omx/GraphicBufferSource.h +++ b/media/libstagefright/omx/GraphicBufferSource.h @@ -160,6 +160,31 @@ protected: virtual void onSidebandStreamChanged(); private: + // PersistentProxyListener is similar to BufferQueue::ProxyConsumerListener + // except that it returns (acquire/detach/re-attache/release) buffers + // in onFrameAvailable() if the actual consumer object is no longer valid. + // + // This class is used in persistent input surface case to prevent buffer + // loss when onFrameAvailable() is received while we don't have a valid + // consumer around. + class PersistentProxyListener : public BnConsumerListener { + public: + PersistentProxyListener( + const wp<IGraphicBufferConsumer> &consumer, + const wp<ConsumerListener>& consumerListener); + virtual ~PersistentProxyListener(); + virtual void onFrameAvailable(const BufferItem& item) override; + virtual void onFrameReplaced(const BufferItem& item) override; + virtual void onBuffersReleased() override; + virtual void onSidebandStreamChanged() override; + private: + // mConsumerListener is a weak reference to the IConsumerListener. + wp<ConsumerListener> mConsumerListener; + // mConsumer is a weak reference to the IGraphicBufferConsumer, use + // a weak ref to avoid circular ref between mConsumer and this class + wp<IGraphicBufferConsumer> mConsumer; + }; + // Keep track of codec input buffers. They may either be available // (mGraphicBuffer == NULL) or in use by the codec. struct CodecBuffer { |