ipa: rkisp1: Add support of ColorProcessing control

Add ColorProcessing algorithm that is in charge to manage brightness,
contrast and saturation controls.  These controls are currently based on
user controls.

Signed-off-by: Florian Sylvestre <fsylvestre@baylibre.com>
Reviewed-by: Laurent Pinchart <laurent.pinchart@ideasonboard.com>
Signed-off-by: Laurent Pinchart <laurent.pinchart@ideasonboard.com>
This commit is contained in:
Florian Sylvestre 2022-07-27 10:38:19 +02:00 committed by Laurent Pinchart
parent 7a80e01b4a
commit 5b07fa2003
7 changed files with 165 additions and 0 deletions

View file

@ -0,0 +1,97 @@
/* SPDX-License-Identifier: LGPL-2.1-or-later */
/*
* Copyright (C) 2021-2022, Ideas On Board
*
* cproc.cpp - RkISP1 Color Processing control
*/
#include "cproc.h"
#include <algorithm>
#include <cmath>
#include <libcamera/base/log.h>
#include <libcamera/control_ids.h>
/**
* \file cproc.h
*/
namespace libcamera {
namespace ipa::rkisp1::algorithms {
/**
* \class ColorProcessing
* \brief RkISP1 Color Processing control
*
* The ColorProcessing algorithm is responsible for applying brightness,
* contrast and saturation corrections. The values are directly provided
* through requests by the corresponding controls.
*/
LOG_DEFINE_CATEGORY(RkISP1CProc)
/**
* \copydoc libcamera::ipa::Algorithm::queueRequest
*/
void ColorProcessing::queueRequest(IPAContext &context,
[[maybe_unused]] const uint32_t frame,
const ControlList &controls)
{
auto &cproc = context.frameContext.cproc;
const auto &brightness = controls.get(controls::Brightness);
if (brightness) {
cproc.brightness = std::clamp<int>(std::lround(*brightness * 128), -128, 127);
cproc.updateParams = true;
LOG(RkISP1CProc, Debug) << "Set brightness to " << *brightness;
}
const auto &contrast = controls.get(controls::Contrast);
if (contrast) {
cproc.contrast = std::clamp<int>(std::lround(*contrast * 128), 0, 255);
cproc.updateParams = true;
LOG(RkISP1CProc, Debug) << "Set contrast to " << *contrast;
}
const auto saturation = controls.get(controls::Saturation);
if (saturation) {
cproc.saturation = std::clamp<int>(std::lround(*saturation * 128), 0, 255);
cproc.updateParams = true;
LOG(RkISP1CProc, Debug) << "Set saturation to " << *saturation;
}
}
/**
* \copydoc libcamera::ipa::Algorithm::prepare
*/
void ColorProcessing::prepare(IPAContext &context,
rkisp1_params_cfg *params)
{
auto &cproc = context.frameContext.cproc;
/* Check if the algorithm configuration has been updated. */
if (!cproc.updateParams)
return;
cproc.updateParams = false;
params->others.cproc_config.brightness = cproc.brightness;
params->others.cproc_config.contrast = cproc.contrast;
params->others.cproc_config.sat = cproc.saturation;
params->module_en_update |= RKISP1_CIF_ISP_MODULE_CPROC;
params->module_ens |= RKISP1_CIF_ISP_MODULE_CPROC;
params->module_cfg_update |= RKISP1_CIF_ISP_MODULE_CPROC;
}
REGISTER_IPA_ALGORITHM(ColorProcessing, "ColorProcessing")
} /* namespace ipa::rkisp1::algorithms */
} /* namespace libcamera */

View file

@ -0,0 +1,30 @@
/* SPDX-License-Identifier: LGPL-2.1-or-later */
/*
* Copyright (C) 2021-2022, Ideas On Board
*
* cproc.h - RkISP1 Color Processing control
*/
#pragma once
#include <sys/types.h>
#include "algorithm.h"
namespace libcamera {
namespace ipa::rkisp1::algorithms {
class ColorProcessing : public Algorithm
{
public:
ColorProcessing() = default;
~ColorProcessing() = default;
void queueRequest(IPAContext &context, const uint32_t frame,
const ControlList &controls) override;
void prepare(IPAContext &context, rkisp1_params_cfg *params) override;
};
} /* namespace ipa::rkisp1::algorithms */
} /* namespace libcamera */

View file

@ -4,6 +4,7 @@ rkisp1_ipa_algorithms = files([
'agc.cpp', 'agc.cpp',
'awb.cpp', 'awb.cpp',
'blc.cpp', 'blc.cpp',
'cproc.cpp',
'dpcc.cpp', 'dpcc.cpp',
'filter.cpp', 'filter.cpp',
'gsl.cpp', 'gsl.cpp',

View file

@ -10,6 +10,7 @@ algorithms:
Gr: 256 Gr: 256
Gb: 256 Gb: 256
B: 256 B: 256
- ColorProcessing:
- GammaSensorLinearization: - GammaSensorLinearization:
x-intervals: [ 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2 ] x-intervals: [ 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2 ]
y: y:

View file

@ -136,6 +136,23 @@ namespace libcamera::ipa::rkisp1 {
* \brief Estimated color temperature * \brief Estimated color temperature
*/ */
/**
* \var IPAFrameContext::cproc
* \brief Context for the Color Processing algorithm
*
* \struct IPAFrameContext::cproc.brightness
* \brief Brightness level
*
* \var IPAFrameContext::cproc.contrast
* \brief Contrast level
*
* \var IPAFrameContext::cproc.saturation
* \brief Saturation level
*
* \var IPAFrameContext::cproc.updateParams
* \brief Indicates if ISP parameters need to be updated
*/
/** /**
* \var IPAFrameContext::filter * \var IPAFrameContext::filter
* \brief Context for the Filter algorithm * \brief Context for the Filter algorithm

View file

@ -57,6 +57,13 @@ struct IPAFrameContext {
double temperatureK; double temperatureK;
} awb; } awb;
struct {
int8_t brightness;
uint8_t contrast;
uint8_t saturation;
bool updateParams;
} cproc;
struct { struct {
uint8_t denoise; uint8_t denoise;
uint8_t sharpness; uint8_t sharpness;

View file

@ -972,6 +972,18 @@ int PipelineHandlerRkISP1::createCamera(MediaEntity *sensor)
std::forward_as_tuple(&controls::Sharpness), std::forward_as_tuple(&controls::Sharpness),
std::forward_as_tuple(0.0f, 10.0f, 1.0f)); std::forward_as_tuple(0.0f, 10.0f, 1.0f));
ctrls.emplace(std::piecewise_construct,
std::forward_as_tuple(&controls::Brightness),
std::forward_as_tuple(-1.0f, 0.993f));
ctrls.emplace(std::piecewise_construct,
std::forward_as_tuple(&controls::Contrast),
std::forward_as_tuple(0.0f, 1.993f));
ctrls.emplace(std::piecewise_construct,
std::forward_as_tuple(&controls::Saturation),
std::forward_as_tuple(0.0f, 1.993f));
ctrls.emplace(std::piecewise_construct, ctrls.emplace(std::piecewise_construct,
std::forward_as_tuple(&controls::draft::NoiseReductionMode), std::forward_as_tuple(&controls::draft::NoiseReductionMode),
std::forward_as_tuple(controls::draft::NoiseReductionModeValues)); std::forward_as_tuple(controls::draft::NoiseReductionModeValues));