[libcamera-devel] [PATCH v3 10/12] ipa: ipu3: awb: Introduce Black Level Correction

Laurent Pinchart laurent.pinchart at ideasonboard.com
Wed Oct 6 17:31:29 CEST 2021


Hi Jean-Michel,

Thank you for the patch.

On Wed, Oct 06, 2021 at 04:00:40PM +0200, Jean-Michel Hautbois wrote:
> The pixels output by the camera normally include a black level, because
> sensors do not always report a signal level of '0' for black. Pixels at
> or below this level should be considered black and to achieve that, we
> need to substract an offset to all the pixels. This can be taken into
> account by reading the lowest value of a special region on sensors which
> is not exposed to light. This provides a substracting factor to be
> able to adjust the expected black levels in the resulting images.
> 
> For a camera outputting 10-bit pixel values (in the range 0 to 1023) a
> typical black level might be 64. It is a fixed value, obtained by
> capturing a raw frame with minimum exposure and gain fixed to 1.0 while
> covering the sensor (the darker the better). We consider it good enough
> as a very first approximation, until we measure it during a tuning
> process and include it in a configuration file
> 
> Signed-off-by: Jean-Michel Hautbois <jeanmichel.hautbois at ideasonboard.com>
> Reviewed-by: Kieran Bingham <kieran.bingham at ideasonboard.com>
> Reviewed-by: Laurent Pinchart <laurent.pinchart at ideasonboard.com>
> ---
>  src/ipa/ipu3/algorithms/blc.cpp     | 66 +++++++++++++++++++++++++++++
>  src/ipa/ipu3/algorithms/blc.h       | 28 ++++++++++++
>  src/ipa/ipu3/algorithms/meson.build |  1 +
>  src/ipa/ipu3/ipu3.cpp               |  2 +
>  4 files changed, 97 insertions(+)
>  create mode 100644 src/ipa/ipu3/algorithms/blc.cpp
>  create mode 100644 src/ipa/ipu3/algorithms/blc.h
> 
> diff --git a/src/ipa/ipu3/algorithms/blc.cpp b/src/ipa/ipu3/algorithms/blc.cpp
> new file mode 100644
> index 00000000..df56e292
> --- /dev/null
> +++ b/src/ipa/ipu3/algorithms/blc.cpp
> @@ -0,0 +1,66 @@
> +/* SPDX-License-Identifier: LGPL-2.1-or-later */
> +/*
> + * Copyright (C) 2021, Google inc.
> + *
> + * blc.cpp - IPU3 Black Level Correction control
> + */
> +
> +#include "blc.h"
> +
> +#include <string.h>
> +
> +/**
> + * \file blc.h

 * \brief IPU3 Black Level Correction control

> + */
> +
> +namespace libcamera {
> +
> +namespace ipa::ipu3::algorithms {
> +
> +/**
> + * \class BlackLevelCorrection
> + * \brief A class to handle optical black correction

s/optical black correction/black level correction/

> + *
> + * The pixels output by the camera normally include a black level, because
> + * sensors do not always report a signal level of '0' for black. Pixels at or
> + * below this level should be considered black. To achieve that, the ImgU BLC
> + * algorithm subtracts a configurable offset from all pixels.
> + *
> + * The black level can be measured at runtime from an optical dark region of the
> + * camera sensor, or measured during the camera tuning process. The first option
> + * isn't currently supported.
> + */
> +
> +BlackLevelCorrection::BlackLevelCorrection()
> +{
> +}
> +
> +/**
> + * \brief Fill in the parameter structure, and enable optical black correction

s/optical black correction/black level correction/

> + * \param context The shared IPA context
> + * \param params The IPU3 parameters
> + *
> + * Populate the IPU3 parameter structure with the correction values for each
> + * channel and enable the corresponding ImgU block processing.
> + */
> +void BlackLevelCorrection::prepare([[maybe_unused]] IPAContext &context,
> +			      ipu3_uapi_params *params)
> +{
> +	/*
> +	 * The Optical Black Level correction values
> +	 * \todo The correction values should come from sensor specific
> +	 * tuning processes. This is a first rough approximation

s/$/./

> +	 */
> +	params->obgrid_param.gr = 64;
> +	params->obgrid_param.r  = 64;
> +	params->obgrid_param.b  = 64;
> +	params->obgrid_param.gb = 64;
> +
> +	/* Enable the custom optical black correction processing */
> +	params->use.obgrid = 1;
> +	params->use.obgrid_param = 1;
> +}
> +
> +} /* namespace ipa::ipu3::algorithms */
> +
> +} /* namespace libcamera */
> diff --git a/src/ipa/ipu3/algorithms/blc.h b/src/ipa/ipu3/algorithms/blc.h
> new file mode 100644
> index 00000000..4b7cb483
> --- /dev/null
> +++ b/src/ipa/ipu3/algorithms/blc.h
> @@ -0,0 +1,28 @@
> +/* SPDX-License-Identifier: LGPL-2.1-or-later */
> +/*
> + * Copyright (C) 2021, Google inc.
> + *
> + * black_correction.h - IPU3 Black Level Correction control
> + */
> +#ifndef __LIBCAMERA_IPU3_ALGORITHMS_BLC_H__
> +#define __LIBCAMERA_IPU3_ALGORITHMS_BLC_H__
> +
> +#include "algorithm.h"
> +
> +namespace libcamera {
> +
> +namespace ipa::ipu3::algorithms {
> +
> +class BlackLevelCorrection : public Algorithm
> +{
> +public:
> +	BlackLevelCorrection();
> +
> +	void prepare(IPAContext &context, ipu3_uapi_params *params) override;
> +};
> +
> +} /* namespace ipa::ipu3::algorithms */
> +
> +} /* namespace libcamera */
> +
> +#endif /* __LIBCAMERA_IPU3_ALGORITHMS_BLC_H__ */
> diff --git a/src/ipa/ipu3/algorithms/meson.build b/src/ipa/ipu3/algorithms/meson.build
> index deae225b..3ec42f72 100644
> --- a/src/ipa/ipu3/algorithms/meson.build
> +++ b/src/ipa/ipu3/algorithms/meson.build
> @@ -4,5 +4,6 @@ ipu3_ipa_algorithms = files([
>      'agc.cpp',
>      'algorithm.cpp',
>      'awb.cpp',
> +    'blc.cpp',
>      'tone_mapping.cpp',
>  ])
> diff --git a/src/ipa/ipu3/ipu3.cpp b/src/ipa/ipu3/ipu3.cpp
> index 06f53fbe..6d9bbf39 100644
> --- a/src/ipa/ipu3/ipu3.cpp
> +++ b/src/ipa/ipu3/ipu3.cpp
> @@ -33,6 +33,7 @@
>  #include "algorithms/agc.h"
>  #include "algorithms/algorithm.h"
>  #include "algorithms/awb.h"
> +#include "algorithms/blc.h"
>  #include "algorithms/tone_mapping.h"
>  #include "libipa/camera_sensor_helper.h"
>  
> @@ -282,6 +283,7 @@ int IPAIPU3::init(const IPASettings &settings,
>  	/* Construct our Algorithms */
>  	algorithms_.push_back(std::make_unique<algorithms::Agc>());
>  	algorithms_.push_back(std::make_unique<algorithms::Awb>());
> +	algorithms_.push_back(std::make_unique<algorithms::BlackLevelCorrection>());
>  	algorithms_.push_back(std::make_unique<algorithms::ToneMapping>());
>  
>  	return 0;

-- 
Regards,

Laurent Pinchart


More information about the libcamera-devel mailing list