[libcamera-devel] [PATCH v5 06/11] ipa: libipa: Introduce Algorithm class template
Umang Jain
umang.jain at ideasonboard.com
Mon Nov 29 18:23:11 CET 2021
Hi JM,
Patches seems okay,
On 11/25/21 11:12 AM, Jean-Michel Hautbois wrote:
> 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 at ideasonboard.com>
> Signed-off-by: Jean-Michel Hautbois <jeanmichel.hautbois at ideasonboard.com>
> Reviewed-by: Kieran Bingham <kieran.bingham at ideasonboard.com>
>
> ---
> v4: use #pragma once
> ---
> src/ipa/ipu3/algorithms/algorithm.h | 12 ++----
> src/ipa/ipu3/algorithms/awb.cpp | 9 +++++
> src/ipa/ipu3/algorithms/meson.build | 1 -
> .../{ipu3/algorithms => libipa}/algorithm.cpp | 38 ++++++++-----------
> src/ipa/libipa/algorithm.h | 38 +++++++++++++++++++
> src/ipa/libipa/meson.build | 1 +
> 6 files changed, 67 insertions(+), 32 deletions(-)
> rename src/ipa/{ipu3/algorithms => libipa}/algorithm.cpp (75%)
> create mode 100644 src/ipa/libipa/algorithm.h
>
> 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',
> diff --git a/src/ipa/ipu3/algorithms/algorithm.cpp b/src/ipa/libipa/algorithm.cpp
> similarity index 75%
> rename from src/ipa/ipu3/algorithms/algorithm.cpp
> rename to src/ipa/libipa/algorithm.cpp
> index 3e7e3018..398d5372 100644
> --- a/src/ipa/ipu3/algorithms/algorithm.cpp
> +++ b/src/ipa/libipa/algorithm.cpp
> @@ -2,7 +2,7 @@
> /*
> * Copyright (C) 2021, Ideas On Board
> *
> - * algorithm.cpp - IPU3 control algorithm interface
> + * algorithm.cpp - IPA control algorithm interface
> */
>
> #include "algorithm.h"
> @@ -14,11 +14,15 @@
>
> namespace libcamera {
>
> -namespace ipa::ipu3 {
> +namespace ipa {
>
> /**
> * \class Algorithm
> - * \brief The base class for all IPU3 algorithms
> + * \brief The base class for all IPA algorithms
> + * \tparam Context The type of shared IPA context
> + * \tparam Config The type of the IPA configuration data
> + * \tparam Params The type of the ISP specific parameters
> + * \tparam Stats The type of the IPA statistics and ISP results
> *
> * The Algorithm class defines a standard interface for IPA algorithms. By
> * abstracting algorithms, it makes possible the implementation of generic code
> @@ -26,6 +30,7 @@ namespace ipa::ipu3 {
> */
>
> /**
> + * \fn Algorithm::configure()
> * \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
> @@ -39,37 +44,30 @@ namespace ipa::ipu3 {
> *
> * \return 0 if successful, an error code otherwise
> */
> -int Algorithm::configure([[maybe_unused]] IPAContext &context,
> - [[maybe_unused]] const IPAConfigInfo &configInfo)
> -{
> - return 0;
> -}
>
> /**
> + * \fn Algorithm::prepare()
> * \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.
> + * \param[out] params The ISP 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
> + * is processed by the ISP to prepare the ISP 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
> + * configure the ISP 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)
> -{
> -}
>
> /**
> + * \fn Algorithm::process()
> * \brief Process ISP statistics, and run algorithm operations
> * \param[in] context The shared IPA context
> - * \param[in] stats The IPU3 statistics and ISP results
> + * \param[in] stats The IPA 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.
> + * the ISP, to process statistics generated from that frame by the ISP.
> * Algorithms shall use this data to run calculations and update their state
> * accordingly.
> *
> @@ -91,11 +89,7 @@ void Algorithm::prepare([[maybe_unused]] IPAContext &context,
> * 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 ipa */
>
> } /* namespace libcamera */
> diff --git a/src/ipa/libipa/algorithm.h b/src/ipa/libipa/algorithm.h
> new file mode 100644
> index 00000000..766aee5d
> --- /dev/null
> +++ b/src/ipa/libipa/algorithm.h
> @@ -0,0 +1,38 @@
> +/* SPDX-License-Identifier: LGPL-2.1-or-later */
> +/*
> + * Copyright (C) 2021, Ideas On Board
I think Oy is missing here at the end, that;s what I see in other
samples in the code base
Reviewed-by: Umang Jain <umang.jain at ideasonboard.com>
> + *
> + * algorithm.h - ISP control algorithm interface
> + */
> +#pragma once
> +
> +namespace libcamera {
> +
> +namespace ipa {
> +
> +template<typename Context, typename Config, typename Params, typename Stats>
> +class Algorithm
> +{
> +public:
> + virtual ~Algorithm() {}
> +
> + virtual int configure([[maybe_unused]] Context &context,
> + [[maybe_unused]] const Config &configInfo)
> + {
> + return 0;
> + }
> +
> + virtual void prepare([[maybe_unused]] Context &context,
> + [[maybe_unused]] Params *params)
> + {
> + }
> +
> + virtual void process([[maybe_unused]] Context &context,
> + [[maybe_unused]] const Stats *stats)
> + {
> + }
> +};
> +
> +} /* namespace ipa */
> +
> +} /* namespace libcamera */
> diff --git a/src/ipa/libipa/meson.build b/src/ipa/libipa/meson.build
> index 4d073a03..161cc5a1 100644
> --- a/src/ipa/libipa/meson.build
> +++ b/src/ipa/libipa/meson.build
> @@ -1,6 +1,7 @@
> # SPDX-License-Identifier: CC0-1.0
>
> libipa_headers = files([
> + 'algorithm.h',
> 'camera_sensor_helper.h',
> 'histogram.h'
> ])
More information about the libcamera-devel
mailing list