ipa: rkisp1: blc: Report sensor black levels in metadata

Add sensor black levels to the metadata of the rkisp1 pipeline.

Additionally enable raw support for this algorithm and add it to
uncalibrated.yaml, so that black levels get reported when capturing
tuning images. This is a bit of a hack, because no actual black level
correction is taking place in raw mode, but it is the easiest way to get
blacklevel reported for raw streams.

Signed-off-by: Stefan Klug <stefan.klug@ideasonboard.com>
Reviewed-by: Paul Elder <paul.elder@ideasonboard.com>
Reviewed-by: Kieran Bingham <kieran.bingham@ideasonboard.com>
Reviewed-by: Laurent Pinchart <laurent.pinchart@ideasonboard.com>
This commit is contained in:
Stefan Klug 2024-07-03 15:49:52 +02:00
parent 50c28e1351
commit afa8cbca9e
3 changed files with 33 additions and 1 deletions

View file

@ -9,6 +9,8 @@
#include <libcamera/base/log.h>
#include <libcamera/control_ids.h>
#include "libcamera/internal/yaml_parser.h"
/**
@ -38,6 +40,13 @@ LOG_DEFINE_CATEGORY(RkISP1Blc)
BlackLevelCorrection::BlackLevelCorrection()
: tuningParameters_(false)
{
/*
* This is a bit of a hack. In raw mode no black level correction
* happens. This flag is used to ensure the metadata gets populated with
* the black level which is needed to capture proper raw images for
* tuning.
*/
supportsRaw_ = true;
}
/**
@ -107,6 +116,9 @@ void BlackLevelCorrection::prepare([[maybe_unused]] IPAContext &context,
[[maybe_unused]] IPAFrameContext &frameContext,
rkisp1_params_cfg *params)
{
if (context.configuration.raw)
return;
if (frame > 0)
return;
@ -125,6 +137,22 @@ void BlackLevelCorrection::prepare([[maybe_unused]] IPAContext &context,
params->module_cfg_update |= RKISP1_CIF_ISP_MODULE_BLS;
}
/**
* \copydoc libcamera::ipa::Algorithm::process
*/
void BlackLevelCorrection::process([[maybe_unused]] IPAContext &context,
[[maybe_unused]] const uint32_t frame,
[[maybe_unused]] IPAFrameContext &frameContext,
[[maybe_unused]] const rkisp1_stat_buffer *stats,
ControlList &metadata)
{
metadata.set(controls::SensorBlackLevels,
{ static_cast<int32_t>(blackLevelRed_),
static_cast<int32_t>(blackLevelGreenR_),
static_cast<int32_t>(blackLevelGreenB_),
static_cast<int32_t>(blackLevelBlue_) });
}
REGISTER_IPA_ALGORITHM(BlackLevelCorrection, "BlackLevelCorrection")
} /* namespace ipa::rkisp1::algorithms */

View file

@ -23,7 +23,10 @@ public:
void prepare(IPAContext &context, const uint32_t frame,
IPAFrameContext &frameContext,
rkisp1_params_cfg *params) override;
void process(IPAContext &context, const uint32_t frame,
IPAFrameContext &frameContext,
const rkisp1_stat_buffer *stats,
ControlList &metadata) override;
private:
bool tuningParameters_;
int16_t blackLevelRed_;