[PATCH v3 2/2] ipa: rkisp1: Add Lux algorithm module

Laurent Pinchart laurent.pinchart at ideasonboard.com
Fri Dec 20 11:20:33 CET 2024


Hi Paul,

Thank you for the patch.

On Wed, Dec 18, 2024 at 04:46:01PM +0900, Paul Elder wrote:
> Add a lux algorithm module to rkisp1 IPA for estimating the lux level of
> an image. This is reported in metadata, as well as saved in the frame
> context so that other algorithms (mainly AGC) can use its value. It does
> not set any controls.
> 
> Signed-off-by: Paul Elder <paul.elder at ideasonboard.com>
> Reviewed-by: Kieran Bingham <kieran.bingham at ideasonboard.com>
> 
> ---
> Changes in v3:
> - remove unnecessary includes
> - replace ipa::Lux::bitSize() with ipa::Lux::Lux()
> - move frameContext.agc.lux to frameContext.lux.lux
> 
> Changes in v2:
> - fix bitrot
> - fixes corresponding to changes in the previous patch
> ---
>  src/ipa/rkisp1/algorithms/lux.cpp     | 80 +++++++++++++++++++++++++++
>  src/ipa/rkisp1/algorithms/lux.h       | 36 ++++++++++++
>  src/ipa/rkisp1/algorithms/meson.build |  1 +
>  src/ipa/rkisp1/ipa_context.h          |  4 ++
>  4 files changed, 121 insertions(+)
>  create mode 100644 src/ipa/rkisp1/algorithms/lux.cpp
>  create mode 100644 src/ipa/rkisp1/algorithms/lux.h
> 
> diff --git a/src/ipa/rkisp1/algorithms/lux.cpp b/src/ipa/rkisp1/algorithms/lux.cpp
> new file mode 100644
> index 000000000000..a1e3f36b75cb
> --- /dev/null
> +++ b/src/ipa/rkisp1/algorithms/lux.cpp
> @@ -0,0 +1,80 @@
> +/* SPDX-License-Identifier: LGPL-2.1-or-later */
> +/*
> + * Copyright (C) 2024, Ideas On Board
> + *
> + * lux.cpp - RkISP1 Lux control
> + */
> +
> +#include "lux.h"
> +
> +#include <libcamera/base/log.h>
> +
> +#include <libcamera/control_ids.h>
> +
> +#include "libipa/histogram.h"
> +#include "libipa/lux.h"
> +
> +/**
> + * \file lux.h
> + */
> +
> +namespace libcamera {
> +
> +namespace ipa::rkisp1::algorithms {
> +
> +/**
> + * \class Lux
> + * \brief RkISP1 Lux control
> + *
> + * The Lux algorithm is responsible for estimating the lux level of the image.
> + * It doesn't take or generate any controls, but it provides a lux level for
> + * other algorithms (such as AGC) to use.
> + */
> +
> +/**
> + * \brief Construct an rkisp1 Lux algo module
> + *
> + * The Lux helper is initialized to 65535 as that is the max bin count on the
> + * rkisp1.
> + */
> +Lux::Lux()
> +	: lux_(65535)
> +{
> +}
> +
> +/**
> + * \copydoc libcamera::ipa::Algorithm::init
> + */
> +int Lux::init([[maybe_unused]] IPAContext &context, const YamlObject &tuningData)
> +{
> +	return lux_.parseTuningData(tuningData);
> +}
> +
> +/**
> + * \copydoc libcamera::ipa::Algorithm::process
> + */
> +void Lux::process(IPAContext &context,
> +		  [[maybe_unused]] const uint32_t frame,
> +		  IPAFrameContext &frameContext,
> +		  const rkisp1_stat_buffer *stats,
> +		  ControlList &metadata)
> +{
> +	utils::Duration exposureTime = context.configuration.sensor.lineDuration
> +				       * frameContext.sensor.exposure;

Align * with =.

Reviewed-by: Laurent Pinchart <laurent.pinchart at ideasonboard.com>

> +	double gain = frameContext.sensor.gain;
> +
> +	/* \todo Deduplicate the histogram calculation from AGC */
> +	const rkisp1_cif_isp_stat *params = &stats->params;
> +	Histogram yHist({ params->hist.hist_bins, context.hw->numHistogramBins },
> +			[](uint32_t x) { return x >> 4; });
> +
> +	double lux = lux_.estimateLux(exposureTime, gain, 1.0, yHist);
> +	frameContext.lux.lux = lux;
> +	metadata.set(controls::Lux, lux);
> +}
> +
> +REGISTER_IPA_ALGORITHM(Lux, "Lux")
> +
> +} /* namespace ipa::rkisp1::algorithms */
> +
> +} /* namespace libcamera */
> diff --git a/src/ipa/rkisp1/algorithms/lux.h b/src/ipa/rkisp1/algorithms/lux.h
> new file mode 100644
> index 000000000000..8a90de55b8ff
> --- /dev/null
> +++ b/src/ipa/rkisp1/algorithms/lux.h
> @@ -0,0 +1,36 @@
> +/* SPDX-License-Identifier: LGPL-2.1-or-later */
> +/*
> + * Copyright (C) 2024, Ideas On Board
> + *
> + * lux.h - RkISP1 Lux control
> + */
> +
> +#pragma once
> +
> +#include <sys/types.h>
> +
> +#include "libipa/lux.h"
> +
> +#include "algorithm.h"
> +
> +namespace libcamera {
> +
> +namespace ipa::rkisp1::algorithms {
> +
> +class Lux : public Algorithm
> +{
> +public:
> +	Lux();
> +
> +	int init(IPAContext &context, const YamlObject &tuningData) override;
> +	void process(IPAContext &context, const uint32_t frame,
> +		     IPAFrameContext &frameContext,
> +		     const rkisp1_stat_buffer *stats,
> +		     ControlList &metadata) override;
> +
> +private:
> +	ipa::Lux lux_;
> +};
> +
> +} /* namespace ipa::rkisp1::algorithms */
> +} /* namespace libcamera */
> diff --git a/src/ipa/rkisp1/algorithms/meson.build b/src/ipa/rkisp1/algorithms/meson.build
> index 1734a6675f78..c66b0b70b82f 100644
> --- a/src/ipa/rkisp1/algorithms/meson.build
> +++ b/src/ipa/rkisp1/algorithms/meson.build
> @@ -12,4 +12,5 @@ rkisp1_ipa_algorithms = files([
>      'goc.cpp',
>      'gsl.cpp',
>      'lsc.cpp',
> +    'lux.cpp',
>  ])
> diff --git a/src/ipa/rkisp1/ipa_context.h b/src/ipa/rkisp1/ipa_context.h
> index deb8c196f1b8..65ba45151611 100644
> --- a/src/ipa/rkisp1/ipa_context.h
> +++ b/src/ipa/rkisp1/ipa_context.h
> @@ -168,6 +168,10 @@ struct IPAFrameContext : public FrameContext {
>  	struct {
>  		Matrix<float, 3, 3> ccm;
>  	} ccm;
> +
> +	struct {
> +		double lux;
> +	} lux;
>  };
>  
>  struct IPAContext {

-- 
Regards,

Laurent Pinchart


More information about the libcamera-devel mailing list