[libcamera-devel] [PATCH v4 08/32] ipa: libipa: algorithm: queueRequest(): Pass frame context

Laurent Pinchart laurent.pinchart at ideasonboard.com
Thu Sep 8 03:41:36 CEST 2022


From: Kieran Bingham <kieran.bingham at ideasonboard.com>

IPA modules have access to incoming Request's controls list and
need to store them in the frame context at queueRequest() time.

As each algorithm is expected to have ownership of a certain set of
controls it should have access to the frame context where they have been
stored, and where the algorithm computation results can be stored to
later populate metadata.

Now that both the IPU3 and RkISP1 IPA modules comply with the same
interface, propagate the queueRequest() call to algorithms in the IPU3
IPA module.

Signed-off-by: Kieran Bingham <kieran.bingham at ideasonboard.com>
Signed-off-by: Jacopo Mondi <jacopo at jmondi.org>
Reviewed-by: Umang Jain <umang.jain at ideasonboard.com>
---
 src/ipa/libipa/algorithm.cpp         | 1 +
 src/ipa/libipa/algorithm.h           | 1 +
 src/ipa/rkisp1/algorithms/awb.cpp    | 1 +
 src/ipa/rkisp1/algorithms/awb.h      | 1 +
 src/ipa/rkisp1/algorithms/cproc.cpp  | 1 +
 src/ipa/rkisp1/algorithms/cproc.h    | 1 +
 src/ipa/rkisp1/algorithms/dpf.cpp    | 1 +
 src/ipa/rkisp1/algorithms/dpf.h      | 1 +
 src/ipa/rkisp1/algorithms/filter.cpp | 1 +
 src/ipa/rkisp1/algorithms/filter.h   | 1 +
 src/ipa/rkisp1/rkisp1.cpp            | 5 ++++-
 11 files changed, 14 insertions(+), 1 deletion(-)

diff --git a/src/ipa/libipa/algorithm.cpp b/src/ipa/libipa/algorithm.cpp
index 30eab67f71fc..c152b885aee1 100644
--- a/src/ipa/libipa/algorithm.cpp
+++ b/src/ipa/libipa/algorithm.cpp
@@ -88,6 +88,7 @@ namespace ipa {
  * \brief Provide control values to the algorithm
  * \param[in] context The shared IPA context
  * \param[in] frame The frame number to apply the control values
+ * \param[in] frameContext The current frame's context
  * \param[in] controls The list of user controls
  *
  * This function is called for each request queued to the camera. It provides
diff --git a/src/ipa/libipa/algorithm.h b/src/ipa/libipa/algorithm.h
index ee93d260ca3f..d8601f9ccaff 100644
--- a/src/ipa/libipa/algorithm.h
+++ b/src/ipa/libipa/algorithm.h
@@ -47,6 +47,7 @@ public:
 
 	virtual void queueRequest([[maybe_unused]] typename Module::Context &context,
 				  [[maybe_unused]] const uint32_t frame,
+				  [[maybe_unused]] typename Module::FrameContext &frameContext,
 				  [[maybe_unused]] const ControlList &controls)
 	{
 	}
diff --git a/src/ipa/rkisp1/algorithms/awb.cpp b/src/ipa/rkisp1/algorithms/awb.cpp
index aefba6382807..a23c32015454 100644
--- a/src/ipa/rkisp1/algorithms/awb.cpp
+++ b/src/ipa/rkisp1/algorithms/awb.cpp
@@ -128,6 +128,7 @@ void Awb::prepare(IPAContext &context,
  */
 void Awb::queueRequest(IPAContext &context,
 		       [[maybe_unused]] const uint32_t frame,
+		       [[maybe_unused]] IPAFrameContext &frameContext,
 		       const ControlList &controls)
 {
 	auto &awb = context.frameContext.awb;
diff --git a/src/ipa/rkisp1/algorithms/awb.h b/src/ipa/rkisp1/algorithms/awb.h
index 806e11a2ec93..6d4a39467038 100644
--- a/src/ipa/rkisp1/algorithms/awb.h
+++ b/src/ipa/rkisp1/algorithms/awb.h
@@ -24,6 +24,7 @@ public:
 		     IPAFrameContext &frameContext,
 		     rkisp1_params_cfg *params) override;
 	void queueRequest(IPAContext &context, const uint32_t frame,
+			  IPAFrameContext &frameContext,
 			  const ControlList &controls) override;
 	void process(IPAContext &context, const uint32_t frame,
 		     IPAFrameContext &frameCtx,
diff --git a/src/ipa/rkisp1/algorithms/cproc.cpp b/src/ipa/rkisp1/algorithms/cproc.cpp
index c0505c68765b..bc4a07073706 100644
--- a/src/ipa/rkisp1/algorithms/cproc.cpp
+++ b/src/ipa/rkisp1/algorithms/cproc.cpp
@@ -38,6 +38,7 @@ LOG_DEFINE_CATEGORY(RkISP1CProc)
  */
 void ColorProcessing::queueRequest(IPAContext &context,
 				   [[maybe_unused]] const uint32_t frame,
+				   [[maybe_unused]] IPAFrameContext &frameContext,
 				   const ControlList &controls)
 {
 	auto &cproc = context.frameContext.cproc;
diff --git a/src/ipa/rkisp1/algorithms/cproc.h b/src/ipa/rkisp1/algorithms/cproc.h
index 02c3d9c95488..ba6e901ae110 100644
--- a/src/ipa/rkisp1/algorithms/cproc.h
+++ b/src/ipa/rkisp1/algorithms/cproc.h
@@ -22,6 +22,7 @@ public:
 	~ColorProcessing() = default;
 
 	void queueRequest(IPAContext &context, const uint32_t frame,
+			  IPAFrameContext &frameContext,
 			  const ControlList &controls) override;
 	void prepare(IPAContext &context, const uint32_t frame,
 		     IPAFrameContext &frameContext,
diff --git a/src/ipa/rkisp1/algorithms/dpf.cpp b/src/ipa/rkisp1/algorithms/dpf.cpp
index 8286f83facc1..be024fc5fe90 100644
--- a/src/ipa/rkisp1/algorithms/dpf.cpp
+++ b/src/ipa/rkisp1/algorithms/dpf.cpp
@@ -176,6 +176,7 @@ int Dpf::init([[maybe_unused]] IPAContext &context,
  */
 void Dpf::queueRequest(IPAContext &context,
 		       [[maybe_unused]] const uint32_t frame,
+		       [[maybe_unused]] IPAFrameContext &frameContext,
 		       const ControlList &controls)
 {
 	auto &dpf = context.frameContext.dpf;
diff --git a/src/ipa/rkisp1/algorithms/dpf.h b/src/ipa/rkisp1/algorithms/dpf.h
index 656d78dee67c..e232cad4ee87 100644
--- a/src/ipa/rkisp1/algorithms/dpf.h
+++ b/src/ipa/rkisp1/algorithms/dpf.h
@@ -23,6 +23,7 @@ public:
 
 	int init(IPAContext &context, const YamlObject &tuningData) override;
 	void queueRequest(IPAContext &context, const uint32_t frame,
+			  IPAFrameContext &frameContext,
 			  const ControlList &controls) override;
 	void prepare(IPAContext &context, const uint32_t frame,
 		     IPAFrameContext &frameContext,
diff --git a/src/ipa/rkisp1/algorithms/filter.cpp b/src/ipa/rkisp1/algorithms/filter.cpp
index 02562339d008..6aa5476aa25e 100644
--- a/src/ipa/rkisp1/algorithms/filter.cpp
+++ b/src/ipa/rkisp1/algorithms/filter.cpp
@@ -44,6 +44,7 @@ static constexpr uint32_t kFiltModeDefault = 0x000004f2;
  */
 void Filter::queueRequest(IPAContext &context,
 			  [[maybe_unused]] const uint32_t frame,
+			  [[maybe_unused]] IPAFrameContext &frameContext,
 			  const ControlList &controls)
 {
 	auto &filter = context.frameContext.filter;
diff --git a/src/ipa/rkisp1/algorithms/filter.h b/src/ipa/rkisp1/algorithms/filter.h
index ac69657e2f0f..3fd882ea41dc 100644
--- a/src/ipa/rkisp1/algorithms/filter.h
+++ b/src/ipa/rkisp1/algorithms/filter.h
@@ -22,6 +22,7 @@ public:
 	~Filter() = default;
 
 	void queueRequest(IPAContext &context, const uint32_t frame,
+			  IPAFrameContext &frameContext,
 			  const ControlList &controls) override;
 	void prepare(IPAContext &context, const uint32_t frame,
 		     IPAFrameContext &frameContext,
diff --git a/src/ipa/rkisp1/rkisp1.cpp b/src/ipa/rkisp1/rkisp1.cpp
index b2593a584a1a..07210d16b5b5 100644
--- a/src/ipa/rkisp1/rkisp1.cpp
+++ b/src/ipa/rkisp1/rkisp1.cpp
@@ -292,8 +292,11 @@ void IPARkISP1::unmapBuffers(const std::vector<unsigned int> &ids)
 
 void IPARkISP1::queueRequest(const uint32_t frame, const ControlList &controls)
 {
+	/* \todo Obtain the frame context to pass to process from the FCQueue */
+	IPAFrameContext frameContext;
+
 	for (auto const &algo : algorithms())
-		algo->queueRequest(context_, frame, controls);
+		algo->queueRequest(context_, frame, frameContext, controls);
 }
 
 void IPARkISP1::fillParamsBuffer(const uint32_t frame, const uint32_t bufferId)
-- 
Regards,

Laurent Pinchart



More information about the libcamera-devel mailing list