Merge "Camera: Consider the currently acquired input buffers"

gugelfrei
Treehugger Robot 6 years ago committed by Gerrit Code Review
commit fc0fa0c91b

@ -83,8 +83,8 @@ status_t Camera3StreamSplitter::connect(const std::unordered_map<size_t, sp<Surf
// from input, and attached to the outputs. In this case, the input queue's // from input, and attached to the outputs. In this case, the input queue's
// dequeueBuffer can still allocate 1 extra buffer before being blocked by // dequeueBuffer can still allocate 1 extra buffer before being blocked by
// the output's attachBuffer(). // the output's attachBuffer().
mBufferItemConsumer = new BufferItemConsumer(mConsumer, consumerUsage, mMaxConsumerBuffers++;
mMaxConsumerBuffers+1); mBufferItemConsumer = new BufferItemConsumer(mConsumer, consumerUsage, mMaxConsumerBuffers);
if (mBufferItemConsumer == nullptr) { if (mBufferItemConsumer == nullptr) {
return NO_MEMORY; return NO_MEMORY;
} }
@ -108,6 +108,7 @@ status_t Camera3StreamSplitter::connect(const std::unordered_map<size_t, sp<Surf
mHeight = height; mHeight = height;
mFormat = format; mFormat = format;
mProducerUsage = producerUsage; mProducerUsage = producerUsage;
mAcquiredInputBuffers = 0;
SP_LOGV("%s: connected", __FUNCTION__); SP_LOGV("%s: connected", __FUNCTION__);
return res; return res;
@ -147,6 +148,7 @@ void Camera3StreamSplitter::disconnect() {
mMaxHalBuffers = 0; mMaxHalBuffers = 0;
mMaxConsumerBuffers = 0; mMaxConsumerBuffers = 0;
mAcquiredInputBuffers = 0;
SP_LOGV("%s: Disconnected", __FUNCTION__); SP_LOGV("%s: Disconnected", __FUNCTION__);
} }
@ -165,7 +167,9 @@ status_t Camera3StreamSplitter::addOutput(size_t surfaceId, const sp<Surface>& o
return res; return res;
} }
res = mConsumer->setMaxAcquiredBufferCount(mMaxConsumerBuffers+1); if (mMaxConsumerBuffers > mAcquiredInputBuffers) {
res = mConsumer->setMaxAcquiredBufferCount(mMaxConsumerBuffers);
}
return res; return res;
} }
@ -266,10 +270,12 @@ status_t Camera3StreamSplitter::removeOutput(size_t surfaceId) {
return res; return res;
} }
res = mConsumer->setMaxAcquiredBufferCount(mMaxConsumerBuffers+1); if (mAcquiredInputBuffers < mMaxConsumerBuffers) {
if (res != OK) { res = mConsumer->setMaxAcquiredBufferCount(mMaxConsumerBuffers);
SP_LOGE("%s: setMaxAcquiredBufferCount failed %d", __FUNCTION__, res); if (res != OK) {
return res; SP_LOGE("%s: setMaxAcquiredBufferCount failed %d", __FUNCTION__, res);
return res;
}
} }
return res; return res;
@ -497,6 +503,7 @@ void Camera3StreamSplitter::onFrameAvailable(const BufferItem& /*item*/) {
return; return;
} }
mAcquiredInputBuffers++;
SP_LOGV("acquired buffer %" PRId64 " from input at slot %d", SP_LOGV("acquired buffer %" PRId64 " from input at slot %d",
bufferItem.mGraphicBuffer->getId(), bufferItem.mSlot); bufferItem.mGraphicBuffer->getId(), bufferItem.mSlot);
@ -599,6 +606,12 @@ void Camera3StreamSplitter::decrementBufRefCountLocked(uint64_t id, size_t surfa
} else { } else {
SP_LOGE("%s: releaseBuffer returns %d", __FUNCTION__, res); SP_LOGE("%s: releaseBuffer returns %d", __FUNCTION__, res);
} }
} else {
if (mAcquiredInputBuffers == 0) {
ALOGW("%s: Acquired input buffer count already at zero!", __FUNCTION__);
} else {
mAcquiredInputBuffers--;
}
} }
} }

@ -269,6 +269,9 @@ private:
// Latest onFrameAvailable return value // Latest onFrameAvailable return value
std::atomic<status_t> mOnFrameAvailableRes{0}; std::atomic<status_t> mOnFrameAvailableRes{0};
// Currently acquired input buffers
size_t mAcquiredInputBuffers;
String8 mConsumerName; String8 mConsumerName;
}; };

Loading…
Cancel
Save