[libcamera-devel] [PATCH 05/11] pipeline: ipu3: Add needsImgu flag to IPU3Frames
Daniel Scally
dan.scally at ideasonboard.com
Sun Mar 19 00:40:08 CET 2023
Some sensors using the IPU3 pipeline do not transfer data to the
Imgu, so we need the ability to disable the related processing
from this class. Add a boolean flag denoting whether or not to
run the Imgu related processing. For now, hard code this to true
in IPU3CameraData::queuePendingRequests().
Signed-off-by: Daniel Scally <dan.scally at ideasonboard.com>
---
src/libcamera/pipeline/ipu3/frames.cpp | 45 +++++++++++++++-----------
src/libcamera/pipeline/ipu3/frames.h | 3 +-
src/libcamera/pipeline/ipu3/ipu3.cpp | 2 +-
3 files changed, 29 insertions(+), 21 deletions(-)
diff --git a/src/libcamera/pipeline/ipu3/frames.cpp b/src/libcamera/pipeline/ipu3/frames.cpp
index a4c3477c..55b90e9d 100644
--- a/src/libcamera/pipeline/ipu3/frames.cpp
+++ b/src/libcamera/pipeline/ipu3/frames.cpp
@@ -40,28 +40,32 @@ void IPU3Frames::clear()
availableStatBuffers_ = {};
}
-IPU3Frames::Info *IPU3Frames::create(Request *request)
+IPU3Frames::Info *IPU3Frames::create(Request *request, bool needsImgu)
{
unsigned int id = request->sequence();
+ FrameBuffer *paramBuffer = nullptr;
+ FrameBuffer *statBuffer = nullptr;
- if (availableParamBuffers_.empty()) {
- LOG(IPU3, Debug) << "Parameters buffer underrun";
- return nullptr;
- }
+ if (needsImgu) {
+ if (availableParamBuffers_.empty()) {
+ LOG(IPU3, Debug) << "Parameters buffer underrun";
+ return nullptr;
+ }
- if (availableStatBuffers_.empty()) {
- LOG(IPU3, Debug) << "Statistics buffer underrun";
- return nullptr;
- }
+ if (availableStatBuffers_.empty()) {
+ LOG(IPU3, Debug) << "Statistics buffer underrun";
+ return nullptr;
+ }
- FrameBuffer *paramBuffer = availableParamBuffers_.front();
- FrameBuffer *statBuffer = availableStatBuffers_.front();
+ paramBuffer = availableParamBuffers_.front();
+ statBuffer = availableStatBuffers_.front();
- paramBuffer->_d()->setRequest(request);
- statBuffer->_d()->setRequest(request);
+ paramBuffer->_d()->setRequest(request);
+ statBuffer->_d()->setRequest(request);
- availableParamBuffers_.pop();
- availableStatBuffers_.pop();
+ availableParamBuffers_.pop();
+ availableStatBuffers_.pop();
+ }
/* \todo Remove the dynamic allocation of Info */
std::unique_ptr<Info> info = std::make_unique<Info>();
@@ -73,6 +77,7 @@ IPU3Frames::Info *IPU3Frames::create(Request *request)
info->statBuffer = statBuffer;
info->paramDequeued = false;
info->metadataProcessed = false;
+ info->needsImgu = needsImgu;
frameInfo_[id] = std::move(info);
@@ -96,11 +101,13 @@ bool IPU3Frames::tryComplete(IPU3Frames::Info *info)
if (request->hasPendingBuffers())
return false;
- if (!info->metadataProcessed)
- return false;
+ if (info->needsImgu) {
+ if (!info->metadataProcessed)
+ return false;
- if (!info->paramDequeued)
- return false;
+ if (!info->paramDequeued)
+ return false;
+ }
remove(info);
diff --git a/src/libcamera/pipeline/ipu3/frames.h b/src/libcamera/pipeline/ipu3/frames.h
index 6e3cb915..d58fd998 100644
--- a/src/libcamera/pipeline/ipu3/frames.h
+++ b/src/libcamera/pipeline/ipu3/frames.h
@@ -40,6 +40,7 @@ public:
bool paramDequeued;
bool metadataProcessed;
+ bool needsImgu;
};
IPU3Frames();
@@ -48,7 +49,7 @@ public:
const std::vector<std::unique_ptr<FrameBuffer>> &statBuffers);
void clear();
- Info *create(Request *request);
+ Info *create(Request *request, bool needsImgu);
void remove(Info *info);
bool tryComplete(Info *info);
diff --git a/src/libcamera/pipeline/ipu3/ipu3.cpp b/src/libcamera/pipeline/ipu3/ipu3.cpp
index d0d55651..3077c6bb 100644
--- a/src/libcamera/pipeline/ipu3/ipu3.cpp
+++ b/src/libcamera/pipeline/ipu3/ipu3.cpp
@@ -806,7 +806,7 @@ void IPU3CameraData::queuePendingRequests()
while (!pendingRequests_.empty()) {
Request *request = pendingRequests_.front();
- IPU3Frames::Info *info = frameInfos_.create(request);
+ IPU3Frames::Info *info = frameInfos_.create(request, true);
if (!info)
break;
--
2.34.1
More information about the libcamera-devel
mailing list