summaryrefslogtreecommitdiff
path: root/src/ipa/ipu3
diff options
context:
space:
mode:
authorJean-Michel Hautbois <jeanmichel.hautbois@ideasonboard.com>2021-11-23 14:24:39 +0100
committerJean-Michel Hautbois <jeanmichel.hautbois@ideasonboard.com>2021-11-29 20:41:37 +0100
commitfdf1426694d8934a0f7c910def43e48eb4a8b959 (patch)
tree6678110b06f426f63c13ad2467bb9ec5c8ab4a50 /src/ipa/ipu3
parentb6fa52fc5bdc928daee0fd2fc33208bfdf0477d1 (diff)
ipa: libipa: Introduce Algorithm class template
The algorithms are using the same function names with specialized parameters. Instead of duplicating code, introduce a libipa Algorithm class which implements a base class with template parameters in libipa, and use it in each IPA. As we now won't need an algorithm class for each IPA, move the documentation to libipa, and make it agnostic of the IPA used. While at it, fix the IPU3::Algorithm::Awb documentation. Signed-off-by: Laurent Pinchart <laurent.pinchart@ideasonboard.com> Signed-off-by: Jean-Michel Hautbois <jeanmichel.hautbois@ideasonboard.com> Reviewed-by: Kieran Bingham <kieran.bingham@ideasonboard.com> Reviewed-by: Umang Jain <umang.jain@ideasonboard.com>
Diffstat (limited to 'src/ipa/ipu3')
-rw-r--r--src/ipa/ipu3/algorithms/algorithm.cpp101
-rw-r--r--src/ipa/ipu3/algorithms/algorithm.h12
-rw-r--r--src/ipa/ipu3/algorithms/awb.cpp9
-rw-r--r--src/ipa/ipu3/algorithms/meson.build1
4 files changed, 12 insertions, 111 deletions
diff --git a/src/ipa/ipu3/algorithms/algorithm.cpp b/src/ipa/ipu3/algorithms/algorithm.cpp
deleted file mode 100644
index 3e7e3018..00000000
--- a/src/ipa/ipu3/algorithms/algorithm.cpp
+++ /dev/null
@@ -1,101 +0,0 @@
-/* SPDX-License-Identifier: LGPL-2.1-or-later */
-/*
- * Copyright (C) 2021, Ideas On Board
- *
- * algorithm.cpp - IPU3 control algorithm interface
- */
-
-#include "algorithm.h"
-
-/**
- * \file algorithm.h
- * \brief Algorithm common interface
- */
-
-namespace libcamera {
-
-namespace ipa::ipu3 {
-
-/**
- * \class Algorithm
- * \brief The base class for all IPU3 algorithms
- *
- * The Algorithm class defines a standard interface for IPA algorithms. By
- * abstracting algorithms, it makes possible the implementation of generic code
- * to manage algorithms regardless of their specific type.
- */
-
-/**
- * \brief Configure the Algorithm given an IPAConfigInfo
- * \param[in] context The shared IPA context
- * \param[in] configInfo The IPA configuration data, received from the pipeline
- * handler
- *
- * Algorithms may implement a configure operation to pre-calculate
- * parameters prior to commencing streaming.
- *
- * Configuration state may be stored in the IPASessionConfiguration structure of
- * the IPAContext.
- *
- * \return 0 if successful, an error code otherwise
- */
-int Algorithm::configure([[maybe_unused]] IPAContext &context,
- [[maybe_unused]] const IPAConfigInfo &configInfo)
-{
- return 0;
-}
-
-/**
- * \brief Fill the \a params buffer with ISP processing parameters for a frame
- * \param[in] context The shared IPA context
- * \param[out] params The IPU3 specific parameters.
- *
- * This function is called for every frame when the camera is running before it
- * is processed by the ImgU to prepare the ImgU processing parameters for that
- * frame.
- *
- * Algorithms shall fill in the parameter structure fields appropriately to
- * configure the ImgU processing blocks that they are responsible for. This
- * includes setting fields and flags that enable those processing blocks.
- */
-void Algorithm::prepare([[maybe_unused]] IPAContext &context,
- [[maybe_unused]] ipu3_uapi_params *params)
-{
-}
-
-/**
- * \brief Process ISP statistics, and run algorithm operations
- * \param[in] context The shared IPA context
- * \param[in] stats The IPU3 statistics and ISP results
- *
- * This function is called while camera is running for every frame processed by
- * the ImgU, to process statistics generated from that frame by the ImgU.
- * Algorithms shall use this data to run calculations and update their state
- * accordingly.
- *
- * Processing shall not take an undue amount of time, and any extended or
- * computationally expensive calculations or operations must be handled
- * asynchronously in a separate thread.
- *
- * Algorithms can store state in their respective IPAFrameContext structures,
- * and reference state from the IPAFrameContext of other algorithms.
- *
- * \todo Historical data may be required as part of the processing.
- * Either the previous frame, or the IPAFrameContext state of the frame
- * that generated the statistics for this operation may be required for
- * some advanced algorithms to prevent oscillations or support control
- * loops correctly. Only a single IPAFrameContext is available currently,
- * and so any data stored may represent the results of the previously
- * completed operations.
- *
- * Care shall be taken to ensure the ordering of access to the information
- * such that the algorithms use up to date state as required.
- */
-void Algorithm::process([[maybe_unused]] IPAContext &context,
- [[maybe_unused]] const ipu3_uapi_stats_3a *stats)
-{
-}
-
-} /* namespace ipa::ipu3 */
-
-} /* namespace libcamera */
diff --git a/src/ipa/ipu3/algorithms/algorithm.h b/src/ipa/ipu3/algorithms/algorithm.h
index 16310ab1..d2eecc78 100644
--- a/src/ipa/ipu3/algorithms/algorithm.h
+++ b/src/ipa/ipu3/algorithms/algorithm.h
@@ -9,21 +9,15 @@
#include <libcamera/ipa/ipu3_ipa_interface.h>
+#include <libipa/algorithm.h>
+
#include "ipa_context.h"
namespace libcamera {
namespace ipa::ipu3 {
-class Algorithm
-{
-public:
- virtual ~Algorithm() {}
-
- virtual int configure(IPAContext &context, const IPAConfigInfo &configInfo);
- virtual void prepare(IPAContext &context, ipu3_uapi_params *params);
- virtual void process(IPAContext &context, const ipu3_uapi_stats_3a *stats);
-};
+using Algorithm = libcamera::ipa::Algorithm<IPAContext, IPAConfigInfo, ipu3_uapi_params, ipu3_uapi_stats_3a>;
} /* namespace ipa::ipu3 */
diff --git a/src/ipa/ipu3/algorithms/awb.cpp b/src/ipa/ipu3/algorithms/awb.cpp
index c7bcb20e..1dc27fc9 100644
--- a/src/ipa/ipu3/algorithms/awb.cpp
+++ b/src/ipa/ipu3/algorithms/awb.cpp
@@ -193,6 +193,9 @@ Awb::Awb()
Awb::~Awb() = default;
+/**
+ * \copydoc libcamera::ipa::Algorithm::configure
+ */
int Awb::configure(IPAContext &context,
[[maybe_unused]] const IPAConfigInfo &configInfo)
{
@@ -373,6 +376,9 @@ void Awb::calculateWBGains(const ipu3_uapi_stats_3a *stats)
}
}
+/**
+ * \copydoc libcamera::ipa::Algorithm::process
+ */
void Awb::process(IPAContext &context, const ipu3_uapi_stats_3a *stats)
{
calculateWBGains(stats);
@@ -394,6 +400,9 @@ constexpr uint16_t Awb::threshold(float value)
return value * 8191;
}
+/**
+ * \copydoc libcamera::ipa::Algorithm::prepare
+ */
void Awb::prepare(IPAContext &context, ipu3_uapi_params *params)
{
/*
diff --git a/src/ipa/ipu3/algorithms/meson.build b/src/ipa/ipu3/algorithms/meson.build
index 3ec42f72..4db6ae1d 100644
--- a/src/ipa/ipu3/algorithms/meson.build
+++ b/src/ipa/ipu3/algorithms/meson.build
@@ -2,7 +2,6 @@
ipu3_ipa_algorithms = files([
'agc.cpp',
- 'algorithm.cpp',
'awb.cpp',
'blc.cpp',
'tone_mapping.cpp',