[libcamera-devel] [PATCH v3 2/5] ipa: rkisp1: Introduce Black Level Correction

Laurent Pinchart laurent.pinchart at ideasonboard.com
Sun Mar 27 22:24:03 CEST 2022


Hi Jean-Michel,

Thank you for the patch.

On Thu, Feb 24, 2022 at 12:33:44PM +0100, Jean-Michel Hautbois wrote:
> In order to have the proper pixel levels, apply a fixed black level
> correction, based on the imx219 tuning file in RPi. The value is 4096 on
> 16 bits, and the pipeline for RkISP1 is on 12 bits, scale it.
> 
> Signed-off-by: Jean-Michel Hautbois <jeanmichel.hautbois at ideasonboard.com>
> Tested-by: Peter Griffin <peter.griffin at linaro.org>

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

> ---
> v3: - return early when it is not the first frame anymore
>     - add a todo to remember it may need a bit of rework later
>     - Change the date of the copyright
> ---
>  src/ipa/rkisp1/algorithms/blc.cpp     | 57 +++++++++++++++++++++++++++
>  src/ipa/rkisp1/algorithms/blc.h       | 30 ++++++++++++++
>  src/ipa/rkisp1/algorithms/meson.build |  1 +
>  src/ipa/rkisp1/rkisp1.cpp             |  2 +
>  4 files changed, 90 insertions(+)
>  create mode 100644 src/ipa/rkisp1/algorithms/blc.cpp
>  create mode 100644 src/ipa/rkisp1/algorithms/blc.h
> 
> diff --git a/src/ipa/rkisp1/algorithms/blc.cpp b/src/ipa/rkisp1/algorithms/blc.cpp
> new file mode 100644
> index 00000000..0c5948ff
> --- /dev/null
> +++ b/src/ipa/rkisp1/algorithms/blc.cpp
> @@ -0,0 +1,57 @@
> +/* SPDX-License-Identifier: LGPL-2.1-or-later */
> +/*
> + * Copyright (C) 2021-2022, Ideas On Board
> + *
> + * blc.cpp - RkISP1 Black Level Correction control
> + */
> +
> +#include "blc.h"
> +
> +/**
> + * \file blc.h
> + */
> +
> +namespace libcamera {
> +
> +namespace ipa::rkisp1::algorithms {
> +
> +/**
> + * \class BlackLevelCorrection
> + * \brief RkISP1 Black Level Correction control
> + *
> + * 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 RkISP 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.
> + */
> +
> +/**
> + * \copydoc libcamera::ipa::Algorithm::prepare
> + */
> +void BlackLevelCorrection::prepare(IPAContext &context,
> +				   rkisp1_params_cfg *params)
> +{
> +	if (context.frameContext.frameCount > 0)
> +		return;
> +	/*
> +	 * Substract fixed values taken from imx219 tuning file.
> +	 * \todo Use a configuration file for it ?
> +	 */
> +	params->others.bls_config.enable_auto = 0;
> +	params->others.bls_config.fixed_val.r = 256;
> +	params->others.bls_config.fixed_val.gr = 256;
> +	params->others.bls_config.fixed_val.gb = 256;
> +	params->others.bls_config.fixed_val.b = 256;
> +
> +	params->module_en_update |= RKISP1_CIF_ISP_MODULE_BLS;
> +	params->module_ens |= RKISP1_CIF_ISP_MODULE_BLS;
> +	params->module_cfg_update |= RKISP1_CIF_ISP_MODULE_BLS;
> +}
> +
> +} /* namespace ipa::rkisp1::algorithms */
> +
> +} /* namespace libcamera */
> diff --git a/src/ipa/rkisp1/algorithms/blc.h b/src/ipa/rkisp1/algorithms/blc.h
> new file mode 100644
> index 00000000..69874d8f
> --- /dev/null
> +++ b/src/ipa/rkisp1/algorithms/blc.h
> @@ -0,0 +1,30 @@
> +/* SPDX-License-Identifier: LGPL-2.1-or-later */
> +/*
> + * Copyright (C) 2021-2022, Ideas On Board
> + *
> + * blc.h - RkISP1 Black Level Correction control
> + */
> +
> +#pragma once
> +
> +#include <linux/rkisp1-config.h>
> +
> +#include "algorithm.h"
> +
> +namespace libcamera {
> +
> +struct IPACameraSensorInfo;
> +
> +namespace ipa::rkisp1::algorithms {
> +
> +class BlackLevelCorrection : public Algorithm
> +{
> +public:
> +	BlackLevelCorrection() = default;
> +	~BlackLevelCorrection() = default;
> +
> +	void prepare(IPAContext &context, rkisp1_params_cfg *params) override;
> +};
> +
> +} /* namespace ipa::rkisp1::algorithms */
> +} /* namespace libcamera */
> diff --git a/src/ipa/rkisp1/algorithms/meson.build b/src/ipa/rkisp1/algorithms/meson.build
> index a19c1a4f..27c97731 100644
> --- a/src/ipa/rkisp1/algorithms/meson.build
> +++ b/src/ipa/rkisp1/algorithms/meson.build
> @@ -2,4 +2,5 @@
>  
>  rkisp1_ipa_algorithms = files([
>      'agc.cpp',
> +    'blc.cpp',
>  ])
> diff --git a/src/ipa/rkisp1/rkisp1.cpp b/src/ipa/rkisp1/rkisp1.cpp
> index f119b3f3..bb3deb93 100644
> --- a/src/ipa/rkisp1/rkisp1.cpp
> +++ b/src/ipa/rkisp1/rkisp1.cpp
> @@ -27,6 +27,7 @@
>  
>  #include "algorithms/agc.h"
>  #include "algorithms/algorithm.h"
> +#include "algorithms/blc.h"
>  #include "libipa/camera_sensor_helper.h"
>  
>  #include "ipa_context.h"
> @@ -126,6 +127,7 @@ int IPARkISP1::init(const IPASettings &settings, unsigned int hwRevision)
>  
>  	/* Construct our Algorithms */
>  	algorithms_.push_back(std::make_unique<algorithms::Agc>());
> +	algorithms_.push_back(std::make_unique<algorithms::BlackLevelCorrection>());
>  
>  	return 0;
>  }

-- 
Regards,

Laurent Pinchart


More information about the libcamera-devel mailing list