ipa: ipu3: Introduce a modular tone mapping algorithm
Introduce a new algorithm to manage the tone mapping handling of the IPU3. The initial algorithm is chosen to configure the gamma contrast curve which moves the implementation out of AWB for simplicity. As it is initialised with a default gamma value of 1.1, there is no need to use the default table at initialisation anymore. This demonstrates the way to use process() call when the EventStatReady comes in. The function calculates the LUT in the context of a frame, and when prepare() is called, the parameters are filled with the updated values. AGC is modified to take the new process interface into account. Signed-off-by: Kieran Bingham <kieran.bingham@ideasonboard.com> Signed-off-by: Jean-Michel Hautbois <jeanmichel.hautbois@ideasonboard.com> Reviewed-by: Kieran Bingham <kieran.bingham@ideasonboard.com> Reviewed-by: Laurent Pinchart <laurent.pinchart@ideasonboard.com>
This commit is contained in:
parent
96dfda8e4b
commit
fcf56b9716
9 changed files with 116 additions and 48 deletions
60
src/ipa/ipu3/algorithms/tone_mapping.cpp
Normal file
60
src/ipa/ipu3/algorithms/tone_mapping.cpp
Normal file
|
@ -0,0 +1,60 @@
|
|||
/* SPDX-License-Identifier: LGPL-2.1-or-later */
|
||||
/*
|
||||
* Copyright (C) 2021, Google inc.
|
||||
*
|
||||
* tone_mapping.cpp - IPU3 ToneMapping and Gamma control
|
||||
*/
|
||||
|
||||
#include "tone_mapping.h"
|
||||
|
||||
#include <cmath>
|
||||
#include <string.h>
|
||||
|
||||
namespace libcamera {
|
||||
|
||||
namespace ipa::ipu3::algorithms {
|
||||
|
||||
ToneMapping::ToneMapping()
|
||||
: gamma_(1.0)
|
||||
{
|
||||
}
|
||||
|
||||
void ToneMapping::prepare([[maybe_unused]] IPAContext &context,
|
||||
ipu3_uapi_params *params)
|
||||
{
|
||||
/* Copy the calculated LUT into the parameters buffer. */
|
||||
memcpy(params->acc_param.gamma.gc_lut.lut,
|
||||
context.frameContext.toneMapping.gammaCorrection.lut,
|
||||
IPU3_UAPI_GAMMA_CORR_LUT_ENTRIES *
|
||||
sizeof(params->acc_param.gamma.gc_lut.lut[0]));
|
||||
|
||||
/* Enable the custom gamma table. */
|
||||
params->use.acc_gamma = 1;
|
||||
params->acc_param.gamma.gc_ctrl.enable = 1;
|
||||
}
|
||||
|
||||
void ToneMapping::process([[maybe_unused]] IPAContext &context,
|
||||
[[maybe_unused]] const ipu3_uapi_stats_3a *stats)
|
||||
{
|
||||
/*
|
||||
* Hardcode gamma to 1.1 as a default for now.
|
||||
*
|
||||
* \todo Expose gamma control setting through the libcamera control API
|
||||
*/
|
||||
gamma_ = 1.1;
|
||||
|
||||
struct ipu3_uapi_gamma_corr_lut &lut =
|
||||
context.frameContext.toneMapping.gammaCorrection;
|
||||
|
||||
for (uint32_t i = 0; i < std::size(lut.lut); i++) {
|
||||
double j = static_cast<double>(i) / (std::size(lut.lut) - 1);
|
||||
double gamma = std::pow(j, 1.0 / gamma_);
|
||||
|
||||
/* The output value is expressed on 13 bits. */
|
||||
lut.lut[i] = gamma * 8191;
|
||||
}
|
||||
}
|
||||
|
||||
} /* namespace ipa::ipu3::algorithms */
|
||||
|
||||
} /* namespace libcamera */
|
Loading…
Add table
Add a link
Reference in a new issue