diff options
Diffstat (limited to 'src/ipa/ipu3/algorithms')
-rw-r--r-- | src/ipa/ipu3/algorithms/meson.build | 1 | ||||
-rw-r--r-- | src/ipa/ipu3/algorithms/tone_mapping.cpp | 60 | ||||
-rw-r--r-- | src/ipa/ipu3/algorithms/tone_mapping.h | 32 |
3 files changed, 93 insertions, 0 deletions
diff --git a/src/ipa/ipu3/algorithms/meson.build b/src/ipa/ipu3/algorithms/meson.build index dc538b79..71eedfa4 100644 --- a/src/ipa/ipu3/algorithms/meson.build +++ b/src/ipa/ipu3/algorithms/meson.build @@ -2,4 +2,5 @@ ipu3_ipa_algorithms = files([ 'algorithm.cpp', + 'tone_mapping.cpp', ]) diff --git a/src/ipa/ipu3/algorithms/tone_mapping.cpp b/src/ipa/ipu3/algorithms/tone_mapping.cpp new file mode 100644 index 00000000..3af96261 --- /dev/null +++ b/src/ipa/ipu3/algorithms/tone_mapping.cpp @@ -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 */ diff --git a/src/ipa/ipu3/algorithms/tone_mapping.h b/src/ipa/ipu3/algorithms/tone_mapping.h new file mode 100644 index 00000000..1dae4f9a --- /dev/null +++ b/src/ipa/ipu3/algorithms/tone_mapping.h @@ -0,0 +1,32 @@ +/* SPDX-License-Identifier: LGPL-2.1-or-later */ +/* + * Copyright (C) 2021, Google inc. + * + * tone_mapping.h - IPU3 ToneMapping and Gamma control + */ +#ifndef __LIBCAMERA_IPU3_ALGORITHMS_TONE_MAPPING_H__ +#define __LIBCAMERA_IPU3_ALGORITHMS_TONE_MAPPING_H__ + +#include "algorithm.h" + +namespace libcamera { + +namespace ipa::ipu3::algorithms { + +class ToneMapping : public Algorithm +{ +public: + ToneMapping(); + + void prepare(IPAContext &context, ipu3_uapi_params *params) override; + void process(IPAContext &context, const ipu3_uapi_stats_3a *stats) override; + +private: + double gamma_; +}; + +} /* namespace ipa::ipu3::algorithms */ + +} /* namespace libcamera */ + +#endif /* __LIBCAMERA_IPU3_ALGORITHMS_TONE_MAPPING_H__ */ |