[libcamera-devel] [PATCH v4 1/2] ipa: rpi: Implement HDR control
Naushir Patuck
naush at raspberrypi.com
Tue Jan 9 14:47:04 CET 2024
Hi David,
Thanks for the update.
On Tue, 9 Jan 2024 at 10:25, David Plowman via libcamera-devel
<libcamera-devel at lists.libcamera.org> wrote:
>
> Sufficient plumbing is added so that the HDR mode control can be used
> to engage HDR modes on platforms that support them. On the vc4
> platform, this allows multi-channel AGC to run, though there is no
> image merging.
>
> Signed-off-by: David Plowman <david.plowman at raspberrypi.com>
Reviewed-by: Naushir Patuck <naush at raspberrypi.com>
> ---
> src/ipa/rpi/common/ipa_base.cpp | 49 +++++++++++++++++++++++++++++++++
> 1 file changed, 49 insertions(+)
>
> diff --git a/src/ipa/rpi/common/ipa_base.cpp b/src/ipa/rpi/common/ipa_base.cpp
> index 6ec91575..632b8d2f 100644
> --- a/src/ipa/rpi/common/ipa_base.cpp
> +++ b/src/ipa/rpi/common/ipa_base.cpp
> @@ -24,6 +24,8 @@
> #include "controller/ccm_status.h"
> #include "controller/contrast_algorithm.h"
> #include "controller/denoise_algorithm.h"
> +#include "controller/hdr_algorithm.h"
> +#include "controller/hdr_status.h"
> #include "controller/lux_status.h"
> #include "controller/sharpen_algorithm.h"
> #include "controller/statistics.h"
> @@ -67,6 +69,7 @@ const ControlInfoMap::Map ipaControls{
> { &controls::AeFlickerPeriod, ControlInfo(100, 1000000) },
> { &controls::Brightness, ControlInfo(-1.0f, 1.0f, 0.0f) },
> { &controls::Contrast, ControlInfo(0.0f, 32.0f, 1.0f) },
> + { &controls::HdrMode, ControlInfo(controls::HdrModeValues) },
> { &controls::Sharpness, ControlInfo(0.0f, 16.0f, 1.0f) },
> { &controls::ScalerCrop, ControlInfo(Rectangle{}, Rectangle(65535, 65535, 65535, 65535), Rectangle{}) },
> { &controls::FrameDurationLimits, ControlInfo(INT64_C(33333), INT64_C(120000)) },
> @@ -688,9 +691,17 @@ static const std::map<int32_t, RPiController::AfAlgorithm::AfPause> AfPauseTable
> { controls::AfPauseResume, RPiController::AfAlgorithm::AfPauseResume },
> };
>
> +static const std::map<int32_t, std::string> HdrModeTable = {
> + { controls::HdrModeOff, "Off" },
> + { controls::HdrModeMultiExposure, "MultiExposure" },
> + { controls::HdrModeSingleExposure, "SingleExposure" },
> +};
> +
> void IpaBase::applyControls(const ControlList &controls)
> {
> + using RPiController::AgcAlgorithm;
> using RPiController::AfAlgorithm;
> + using RPiController::HdrAlgorithm;
>
> /* Clear the return metadata buffer. */
> libcameraMetadata_.clear();
> @@ -1162,6 +1173,34 @@ void IpaBase::applyControls(const ControlList &controls)
> break;
> }
>
> + case controls::HDR_MODE: {
> + HdrAlgorithm *hdr = dynamic_cast<HdrAlgorithm *>(controller_.getAlgorithm("hdr"));
> + if (!hdr) {
> + LOG(IPARPI, Warning) << "No HDR algorithm available";
> + break;
> + }
> +
> + auto mode = HdrModeTable.find(ctrl.second.get<int32_t>());
> + if (mode == HdrModeTable.end()) {
> + LOG(IPARPI, Warning) << "Unrecognised HDR mode";
> + break;
> + }
> +
> + AgcAlgorithm *agc = dynamic_cast<AgcAlgorithm *>(controller_.getAlgorithm("agc"));
> + if (!agc) {
> + LOG(IPARPI, Warning) << "HDR requires an AGC algorithm";
> + break;
> + }
> +
> + if (hdr->setMode(mode->second) == 0)
> + agc->setActiveChannels(hdr->getChannels());
> + else
> + LOG(IPARPI, Warning)
> + << "HDR mode " << mode->second << " not supported";
> +
> + break;
> + }
> +
> default:
> LOG(IPARPI, Warning)
> << "Ctrl " << controls::controls.at(ctrl.first)->name()
> @@ -1309,6 +1348,16 @@ void IpaBase::reportMetadata(unsigned int ipaContext)
> libcameraMetadata_.set(controls::AfPauseState, p);
> }
>
> + const HdrStatus *hdrStatus = rpiMetadata.getLocked<HdrStatus>("hdr.status");
> + if (hdrStatus) {
> + if (hdrStatus->channel == "short")
> + libcameraMetadata_.set(controls::HdrChannel, controls::HdrChannelShort);
> + else if (hdrStatus->channel == "long")
> + libcameraMetadata_.set(controls::HdrChannel, controls::HdrChannelLong);
> + else
> + libcameraMetadata_.set(controls::HdrChannel, controls::HdrChannelNone);
> + }
> +
> metadataReady.emit(libcameraMetadata_);
> }
>
> --
> 2.30.2
>
More information about the libcamera-devel
mailing list