summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorNiklas Söderlund <niklas.soderlund@ragnatech.se>2019-12-18 19:38:42 +0100
committerNiklas Söderlund <niklas.soderlund@ragnatech.se>2020-01-12 16:10:37 +0100
commit96312d6dbb8e733142d2e7173ee6fd9eccf80212 (patch)
treeeb9d175d63385ddce7524566128ea183a0ebf00b
parent6e1e847753fd22306db421c6e9b7a37aff42f10d (diff)
libcamera: pipeline: rkisp1: Destroy frame information before completing request
It's common for applications to create and queue a new request in a previous request completion handler. When the new request gets queued to the RkISP1 pipeline handler it tries to find a parameters and statistic buffer to be used with the request. The problem is if the pipeline depth is already filled there are no internal buffers free to be used by the new request. This was solved by allocation one more parameters and statistic buffer then the pipeline depth, this is waste full. Instead free the resources of the request that has completed before it is signaled to the application, this way if the pipeline depth is full it can reuse the internal resources and the wasteful allocation can be removed. Signed-off-by: Niklas Söderlund <niklas.soderlund@ragnatech.se> Reviewed-by: Laurent Pinchart <laurent.pinchart@ideasonboard.com>
-rw-r--r--src/libcamera/pipeline/rkisp1/rkisp1.cpp12
1 files changed, 6 insertions, 6 deletions
diff --git a/src/libcamera/pipeline/rkisp1/rkisp1.cpp b/src/libcamera/pipeline/rkisp1/rkisp1.cpp
index 979b670e..607ff855 100644
--- a/src/libcamera/pipeline/rkisp1/rkisp1.cpp
+++ b/src/libcamera/pipeline/rkisp1/rkisp1.cpp
@@ -671,14 +671,14 @@ int PipelineHandlerRkISP1::allocateBuffers(Camera *camera,
if (ret)
return ret;
- paramPool_.createBuffers(stream->configuration().bufferCount + 1);
+ paramPool_.createBuffers(stream->configuration().bufferCount);
ret = param_->exportBuffers(&paramPool_);
if (ret) {
video_->releaseBuffers();
return ret;
}
- statPool_.createBuffers(stream->configuration().bufferCount + 1);
+ statPool_.createBuffers(stream->configuration().bufferCount);
ret = stat_->exportBuffers(&statPool_);
if (ret) {
param_->releaseBuffers();
@@ -686,13 +686,13 @@ int PipelineHandlerRkISP1::allocateBuffers(Camera *camera,
return ret;
}
- for (unsigned int i = 0; i < stream->configuration().bufferCount + 1; i++) {
+ for (unsigned int i = 0; i < stream->configuration().bufferCount; i++) {
data->ipaBuffers_.push_back({ .id = RKISP1_PARAM_BASE | i,
.planes = paramPool_.buffers()[i].planes() });
paramBuffers_.push(new Buffer(i));
}
- for (unsigned int i = 0; i < stream->configuration().bufferCount + 1; i++) {
+ for (unsigned int i = 0; i < stream->configuration().bufferCount; i++) {
data->ipaBuffers_.push_back({ .id = RKISP1_STAT_BASE | i,
.planes = statPool_.buffers()[i].planes() });
statBuffers_.push(new Buffer(i));
@@ -981,9 +981,9 @@ void PipelineHandlerRkISP1::tryCompleteRequest(Request *request)
if (!info->paramDequeued)
return;
- completeRequest(activeCamera_, request);
-
data->frameInfo_.destroy(info->frame);
+
+ completeRequest(activeCamera_, request);
}
void PipelineHandlerRkISP1::bufferReady(Buffer *buffer)