Message ID | 20220224113347.80001-3-jeanmichel.hautbois@ideasonboard.com |
---|---|
State | Accepted |
Headers | show |
Series |
|
Related | show |
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@ideasonboard.com> > Tested-by: Peter Griffin <peter.griffin@linaro.org> Reviewed-by: Laurent Pinchart <laurent.pinchart@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; > }
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; }