diff --git a/services/camera/libcameraservice/device3/Camera3StreamSplitter.cpp b/services/camera/libcameraservice/device3/Camera3StreamSplitter.cpp index 8bc208dfa7..6d088428bd 100644 --- a/services/camera/libcameraservice/device3/Camera3StreamSplitter.cpp +++ b/services/camera/libcameraservice/device3/Camera3StreamSplitter.cpp @@ -83,8 +83,8 @@ status_t Camera3StreamSplitter::connect(const std::unordered_map& o return res; } - res = mConsumer->setMaxAcquiredBufferCount(mMaxConsumerBuffers+1); + if (mMaxConsumerBuffers > mAcquiredInputBuffers) { + res = mConsumer->setMaxAcquiredBufferCount(mMaxConsumerBuffers); + } return res; } @@ -266,10 +270,12 @@ status_t Camera3StreamSplitter::removeOutput(size_t surfaceId) { return res; } - res = mConsumer->setMaxAcquiredBufferCount(mMaxConsumerBuffers+1); - if (res != OK) { - SP_LOGE("%s: setMaxAcquiredBufferCount failed %d", __FUNCTION__, res); - return res; + if (mAcquiredInputBuffers < mMaxConsumerBuffers) { + res = mConsumer->setMaxAcquiredBufferCount(mMaxConsumerBuffers); + if (res != OK) { + SP_LOGE("%s: setMaxAcquiredBufferCount failed %d", __FUNCTION__, res); + return res; + } } return res; @@ -497,6 +503,7 @@ void Camera3StreamSplitter::onFrameAvailable(const BufferItem& /*item*/) { return; } + mAcquiredInputBuffers++; SP_LOGV("acquired buffer %" PRId64 " from input at slot %d", bufferItem.mGraphicBuffer->getId(), bufferItem.mSlot); @@ -599,6 +606,12 @@ void Camera3StreamSplitter::decrementBufRefCountLocked(uint64_t id, size_t surfa } else { SP_LOGE("%s: releaseBuffer returns %d", __FUNCTION__, res); } + } else { + if (mAcquiredInputBuffers == 0) { + ALOGW("%s: Acquired input buffer count already at zero!", __FUNCTION__); + } else { + mAcquiredInputBuffers--; + } } } diff --git a/services/camera/libcameraservice/device3/Camera3StreamSplitter.h b/services/camera/libcameraservice/device3/Camera3StreamSplitter.h index fea1bdb3d6..1eaf2bda16 100644 --- a/services/camera/libcameraservice/device3/Camera3StreamSplitter.h +++ b/services/camera/libcameraservice/device3/Camera3StreamSplitter.h @@ -269,6 +269,9 @@ private: // Latest onFrameAvailable return value std::atomic mOnFrameAvailableRes{0}; + // Currently acquired input buffers + size_t mAcquiredInputBuffers; + String8 mConsumerName; };