mirror of
https://git.libcamera.org/libcamera/libcamera.git
synced 2025-07-14 16:09:51 +03:00
ipa: rkisp1: Introduce Black Level Correction
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>
This commit is contained in:
parent
f84e5e01a4
commit
13c1e48e8e
4 changed files with 90 additions and 0 deletions
57
src/ipa/rkisp1/algorithms/blc.cpp
Normal file
57
src/ipa/rkisp1/algorithms/blc.cpp
Normal file
|
@ -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 */
|
30
src/ipa/rkisp1/algorithms/blc.h
Normal file
30
src/ipa/rkisp1/algorithms/blc.h
Normal file
|
@ -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 */
|
|
@ -2,4 +2,5 @@
|
|||
|
||||
rkisp1_ipa_algorithms = files([
|
||||
'agc.cpp',
|
||||
'blc.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"
|
||||
|
@ -120,6 +121,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;
|
||||
}
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue