From d65084c86d0760afce46cd889b58b3d982088017 Mon Sep 17 00:00:00 2001 From: Shuzhen Wang Date: Thu, 15 Aug 2019 09:11:56 -0700 Subject: [PATCH] Camera: Handle onBuffersDiscarded callback Use onBuffersDiscarded callback from buffer queue to invalidate the buffer caches in cameraserver process. Test: Run testDiscardFreeBuffers, and use trace to profile memory Bug: 136677409 Bug: 145617243 Change-Id: Ifac5e852e2a1ac50f5c3f2e047966c59eeb5f1ba Merged-In: Ifac5e852e2a1ac50f5c3f2e047966c59eeb5f1ba (cherry picked from commit 0160ddd149893fd14c563ac9a124e49443b69fe4) --- .../device3/Camera3OutputStream.cpp | 48 ++++++++++++------- .../device3/Camera3OutputStream.h | 26 +++++----- 2 files changed, 46 insertions(+), 28 deletions(-) diff --git a/services/camera/libcameraservice/device3/Camera3OutputStream.cpp b/services/camera/libcameraservice/device3/Camera3OutputStream.cpp index acb8b3cac1..e1d35e816e 100644 --- a/services/camera/libcameraservice/device3/Camera3OutputStream.cpp +++ b/services/camera/libcameraservice/device3/Camera3OutputStream.cpp @@ -54,9 +54,8 @@ Camera3OutputStream::Camera3OutputStream(int id, mState = STATE_ERROR; } - if (setId > CAMERA3_STREAM_SET_ID_INVALID) { - mBufferReleasedListener = new BufferReleasedListener(this); - } + bool needsReleaseNotify = setId > CAMERA3_STREAM_SET_ID_INVALID; + mBufferProducerListener = new BufferProducerListener(this, needsReleaseNotify); } Camera3OutputStream::Camera3OutputStream(int id, @@ -87,9 +86,8 @@ Camera3OutputStream::Camera3OutputStream(int id, mState = STATE_ERROR; } - if (setId > CAMERA3_STREAM_SET_ID_INVALID) { - mBufferReleasedListener = new BufferReleasedListener(this); - } + bool needsReleaseNotify = setId > CAMERA3_STREAM_SET_ID_INVALID; + mBufferProducerListener = new BufferProducerListener(this, needsReleaseNotify); } Camera3OutputStream::Camera3OutputStream(int id, @@ -124,10 +122,8 @@ Camera3OutputStream::Camera3OutputStream(int id, } mConsumerName = String8("Deferred"); - if (setId > CAMERA3_STREAM_SET_ID_INVALID) { - mBufferReleasedListener = new BufferReleasedListener(this); - } - + bool needsReleaseNotify = setId > CAMERA3_STREAM_SET_ID_INVALID; + mBufferProducerListener = new BufferProducerListener(this, needsReleaseNotify); } Camera3OutputStream::Camera3OutputStream(int id, camera3_stream_type_t type, @@ -151,9 +147,8 @@ Camera3OutputStream::Camera3OutputStream(int id, camera3_stream_type_t type, mDropBuffers(false), mDequeueBufferLatency(kDequeueLatencyBinSize) { - if (setId > CAMERA3_STREAM_SET_ID_INVALID) { - mBufferReleasedListener = new BufferReleasedListener(this); - } + bool needsReleaseNotify = setId > CAMERA3_STREAM_SET_ID_INVALID; + mBufferProducerListener = new BufferProducerListener(this, needsReleaseNotify); // Subclasses expected to initialize mConsumer themselves } @@ -261,7 +256,7 @@ status_t Camera3OutputStream::returnBufferCheckedLocked( notifyBufferReleased(anwBuffer); if (mUseBufferManager) { // Return this buffer back to buffer manager. - mBufferReleasedListener->onBufferReleased(); + mBufferProducerListener->onBufferReleased(); } } else { if (mTraceFirstBuffer && (stream_type == CAMERA3_STREAM_OUTPUT)) { @@ -387,8 +382,8 @@ status_t Camera3OutputStream::configureConsumerQueueLocked() { // Configure consumer-side ANativeWindow interface. The listener may be used // to notify buffer manager (if it is used) of the returned buffers. res = mConsumer->connect(NATIVE_WINDOW_API_CAMERA, - /*listener*/mBufferReleasedListener, - /*reportBufferRemoval*/true); + /*reportBufferRemoval*/true, + /*listener*/mBufferProducerListener); if (res != OK) { ALOGE("%s: Unable to connect to native window for stream %d", __FUNCTION__, mId); @@ -790,7 +785,7 @@ status_t Camera3OutputStream::updateStream(const std::vector> &/*out return INVALID_OPERATION; } -void Camera3OutputStream::BufferReleasedListener::onBufferReleased() { +void Camera3OutputStream::BufferProducerListener::onBufferReleased() { sp stream = mParent.promote(); if (stream == nullptr) { ALOGV("%s: Parent camera3 output stream was destroyed", __FUNCTION__); @@ -823,6 +818,25 @@ void Camera3OutputStream::BufferReleasedListener::onBufferReleased() { } } +void Camera3OutputStream::BufferProducerListener::onBuffersDiscarded( + const std::vector>& buffers) { + sp stream = mParent.promote(); + if (stream == nullptr) { + ALOGV("%s: Parent camera3 output stream was destroyed", __FUNCTION__); + return; + } + + if (buffers.size() > 0) { + Mutex::Autolock l(stream->mLock); + stream->onBuffersRemovedLocked(buffers); + if (stream->mUseBufferManager) { + stream->mBufferManager->onBuffersRemoved(stream->getId(), + stream->getStreamSetId(), buffers.size()); + } + ALOGV("Stream %d: %zu Buffers discarded.", stream->getId(), buffers.size()); + } +} + void Camera3OutputStream::onBuffersRemovedLocked( const std::vector>& removedBuffers) { sp callback = mBufferFreedListener.promote(); diff --git a/services/camera/libcameraservice/device3/Camera3OutputStream.h b/services/camera/libcameraservice/device3/Camera3OutputStream.h index 729c655d57..b4e49f914e 100644 --- a/services/camera/libcameraservice/device3/Camera3OutputStream.h +++ b/services/camera/libcameraservice/device3/Camera3OutputStream.h @@ -146,18 +146,22 @@ class Camera3OutputStream : */ virtual status_t setConsumers(const std::vector>& consumers); - class BufferReleasedListener : public BnProducerListener { + class BufferProducerListener : public SurfaceListener { public: - BufferReleasedListener(wp parent) : mParent(parent) {} + BufferProducerListener(wp parent, bool needsReleaseNotify) + : mParent(parent), mNeedsReleaseNotify(needsReleaseNotify) {} - /** - * Implementation of IProducerListener, used to notify this stream that the consumer - * has returned a buffer and it is ready to return to Camera3BufferManager for reuse. - */ - virtual void onBufferReleased(); + /** + * Implementation of IProducerListener, used to notify this stream that the consumer + * has returned a buffer and it is ready to return to Camera3BufferManager for reuse. + */ + virtual void onBufferReleased(); + virtual bool needsReleaseNotify() { return mNeedsReleaseNotify; } + virtual void onBuffersDiscarded(const std::vector>& buffers); private: - wp mParent; + wp mParent; + bool mNeedsReleaseNotify; }; virtual status_t detachBuffer(sp* buffer, int* fenceFd); @@ -262,10 +266,10 @@ class Camera3OutputStream : sp mBufferManager; /** - * Buffer released listener, used to notify the buffer manager that a buffer is released - * from consumer side. + * Buffer producer listener, used to handle notification when a buffer is released + * from consumer side, or a set of buffers are discarded by the consumer. */ - sp mBufferReleasedListener; + sp mBufferProducerListener; /** * Flag indicating if the buffer manager is used to allocate the stream buffers