summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorNiklas Söderlund <niklas.soderlund@ragnatech.se>2020-11-04 14:32:11 +0100
committerNiklas Söderlund <niklas.soderlund@ragnatech.se>2021-02-05 01:20:32 +0100
commit354f1fb933e7cd8f01fb4d16c78d1f851fa08d7b (patch)
treed54061a09be6bf50fdd709eca6af32214586d5e7
parentd4225a23aed82ae22782980cc8ee3a54c2ad48e9 (diff)
libcamera: ipu3: cio2: Return the FrameBuffer pointer used
When adding IPA plumbing to the IPU3 pipeline handler it will be needed to track which raw buffer was queued to the CIO2 for a specific request. Currently if using an internally allocated raw buffer the FrameBuffer is not exposed outside the CIO2Device as it was not needed. Prepare for the IPA by exposing which internal raw buffer is picked for each request, later changes will associate this with a Request. Signed-off-by: Niklas Söderlund <niklas.soderlund@ragnatech.se> Reviewed-by: Jacopo Mondi <jacopo@jmondi.org> Reviewed-by: Laurent Pinchart <laurent.pinchart@ideasonboard.com>
-rw-r--r--src/libcamera/pipeline/ipu3/cio2.cpp10
-rw-r--r--src/libcamera/pipeline/ipu3/cio2.h2
-rw-r--r--src/libcamera/pipeline/ipu3/ipu3.cpp8
3 files changed, 12 insertions, 8 deletions
diff --git a/src/libcamera/pipeline/ipu3/cio2.cpp b/src/libcamera/pipeline/ipu3/cio2.cpp
index 72e88067..c7fabb98 100644
--- a/src/libcamera/pipeline/ipu3/cio2.cpp
+++ b/src/libcamera/pipeline/ipu3/cio2.cpp
@@ -253,7 +253,7 @@ int CIO2Device::stop()
return ret;
}
-int CIO2Device::queueBuffer(Request *request, FrameBuffer *rawBuffer)
+FrameBuffer *CIO2Device::queueBuffer(Request *request, FrameBuffer *rawBuffer)
{
FrameBuffer *buffer = rawBuffer;
@@ -261,7 +261,7 @@ int CIO2Device::queueBuffer(Request *request, FrameBuffer *rawBuffer)
if (!buffer) {
if (availableBuffers_.empty()) {
LOG(IPU3, Error) << "CIO2 buffer underrun";
- return -EINVAL;
+ return nullptr;
}
buffer = availableBuffers_.front();
@@ -270,7 +270,11 @@ int CIO2Device::queueBuffer(Request *request, FrameBuffer *rawBuffer)
buffer->setRequest(request);
- return output_->queueBuffer(buffer);
+ int ret = output_->queueBuffer(buffer);
+ if (ret)
+ return nullptr;
+
+ return buffer;
}
void CIO2Device::tryReturnBuffer(FrameBuffer *buffer)
diff --git a/src/libcamera/pipeline/ipu3/cio2.h b/src/libcamera/pipeline/ipu3/cio2.h
index 236ad287..dca4d40e 100644
--- a/src/libcamera/pipeline/ipu3/cio2.h
+++ b/src/libcamera/pipeline/ipu3/cio2.h
@@ -51,7 +51,7 @@ public:
CameraSensor *sensor() { return sensor_.get(); }
const CameraSensor *sensor() const { return sensor_.get(); }
- int queueBuffer(Request *request, FrameBuffer *rawBuffer);
+ FrameBuffer *queueBuffer(Request *request, FrameBuffer *rawBuffer);
void tryReturnBuffer(FrameBuffer *buffer);
Signal<FrameBuffer *> &bufferReady() { return output_->bufferReady; }
diff --git a/src/libcamera/pipeline/ipu3/ipu3.cpp b/src/libcamera/pipeline/ipu3/ipu3.cpp
index 23845ff3..184986fc 100644
--- a/src/libcamera/pipeline/ipu3/ipu3.cpp
+++ b/src/libcamera/pipeline/ipu3/ipu3.cpp
@@ -646,10 +646,10 @@ int PipelineHandlerIPU3::queueRequestDevice(Camera *camera, Request *request)
* Queue a buffer on the CIO2, using the raw stream buffer provided in
* the request, if any, or a CIO2 internal buffer otherwise.
*/
- FrameBuffer *rawBuffer = request->findBuffer(&data->rawStream_);
- error = data->cio2_.queueBuffer(request, rawBuffer);
- if (error)
- return error;
+ FrameBuffer *reqRawBuffer = request->findBuffer(&data->rawStream_);
+ FrameBuffer *rawBuffer = data->cio2_.queueBuffer(request, reqRawBuffer);
+ if (!rawBuffer)
+ return -ENOMEM;
/* Queue all buffers from the request aimed for the ImgU. */
for (auto it : request->buffers()) {