summaryrefslogtreecommitdiffstats
path: root/media/libstagefright/omx/GraphicBufferSource.h
diff options
context:
space:
mode:
authorChong Zhang <chz@google.com>2015-06-05 18:38:28 -0700
committerChong Zhang <chz@google.com>2015-06-08 13:23:32 -0700
commitffd8cbb288f096b53df0392bf40d99b89e34bea7 (patch)
tree8eba9d637c0e08b976396089b01152166415bdab /media/libstagefright/omx/GraphicBufferSource.h
parent26a48f304a8754d655e554178ffb6d7ba4c5aac3 (diff)
downloadframeworks_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.h25
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 {