[libcamera-devel] [PATCH v4 1/2] ipa: rpi: Implement HDR control

Kieran Bingham kieran.bingham at ideasonboard.com
Tue Jan 9 14:39:13 CET 2024


Quoting David Plowman via libcamera-devel (2024-01-09 10:25:46)
> 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>

https://patchwork.libcamera.org/patch/19057/ had an RB tag from Naush.

Does it still apply here?

Naush - Can you confirm you're happy with this patch please?

--
Kieran


> ---
>  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