ipa: rpi: Handle controls for mono variant sensors

Do not advertise colour related controls (i.e. [A]WB, colour saturation)
in the ControlInfoMap of available controls returned out to the
application.

Silently ignore these controls in the control handler in case applications
don't use the advertised ControlInfoMap to validate controls.

As a drive-by fix, don't advertise controls::ColourCorrectionMatrix in
the ControlInfoMap as it is not handled by the IPA.

Signed-off-by: Naushir Patuck <naush@raspberrypi.com>
Reviewed-by: David Plowman <david.plowman@raspberrypi.com>
Reviewed-by: Laurent Pinchart <laurent.pinchart@ideasonboard.com>
Signed-off-by: Laurent Pinchart <laurent.pinchart@ideasonboard.com>
This commit is contained in:
Naushir Patuck 2023-06-05 09:26:05 +01:00 committed by Laurent Pinchart
parent 54340ef70f
commit a0271e72a8
4 changed files with 45 additions and 6 deletions

View file

@ -21,6 +21,7 @@ struct SensorConfig {
struct InitParams { struct InitParams {
bool lensPresent; bool lensPresent;
libcamera.IPACameraSensorInfo sensorInfo;
}; };
struct InitResult { struct InitResult {

View file

@ -12,6 +12,7 @@
#include <libcamera/base/log.h> #include <libcamera/base/log.h>
#include <libcamera/base/span.h> #include <libcamera/base/span.h>
#include <libcamera/control_ids.h> #include <libcamera/control_ids.h>
#include <libcamera/property_ids.h>
#include "controller/af_algorithm.h" #include "controller/af_algorithm.h"
#include "controller/af_status.h" #include "controller/af_status.h"
@ -60,19 +61,22 @@ const ControlInfoMap::Map ipaControls{
{ &controls::AeConstraintMode, ControlInfo(controls::AeConstraintModeValues) }, { &controls::AeConstraintMode, ControlInfo(controls::AeConstraintModeValues) },
{ &controls::AeExposureMode, ControlInfo(controls::AeExposureModeValues) }, { &controls::AeExposureMode, ControlInfo(controls::AeExposureModeValues) },
{ &controls::ExposureValue, ControlInfo(-8.0f, 8.0f, 0.0f) }, { &controls::ExposureValue, ControlInfo(-8.0f, 8.0f, 0.0f) },
{ &controls::AwbEnable, ControlInfo(false, true) },
{ &controls::ColourGains, ControlInfo(0.0f, 32.0f) },
{ &controls::AwbMode, ControlInfo(controls::AwbModeValues) },
{ &controls::Brightness, ControlInfo(-1.0f, 1.0f, 0.0f) }, { &controls::Brightness, ControlInfo(-1.0f, 1.0f, 0.0f) },
{ &controls::Contrast, ControlInfo(0.0f, 32.0f, 1.0f) }, { &controls::Contrast, ControlInfo(0.0f, 32.0f, 1.0f) },
{ &controls::Saturation, ControlInfo(0.0f, 32.0f, 1.0f) },
{ &controls::Sharpness, ControlInfo(0.0f, 16.0f, 1.0f) }, { &controls::Sharpness, ControlInfo(0.0f, 16.0f, 1.0f) },
{ &controls::ColourCorrectionMatrix, ControlInfo(-16.0f, 16.0f) },
{ &controls::ScalerCrop, ControlInfo(Rectangle{}, Rectangle(65535, 65535, 65535, 65535), Rectangle{}) }, { &controls::ScalerCrop, ControlInfo(Rectangle{}, Rectangle(65535, 65535, 65535, 65535), Rectangle{}) },
{ &controls::FrameDurationLimits, ControlInfo(INT64_C(33333), INT64_C(120000)) }, { &controls::FrameDurationLimits, ControlInfo(INT64_C(33333), INT64_C(120000)) },
{ &controls::draft::NoiseReductionMode, ControlInfo(controls::draft::NoiseReductionModeValues) } { &controls::draft::NoiseReductionMode, ControlInfo(controls::draft::NoiseReductionModeValues) }
}; };
/* IPA controls handled conditionally, if the sensor is not mono */
const ControlInfoMap::Map ipaColourControls{
{ &controls::AwbEnable, ControlInfo(false, true) },
{ &controls::AwbMode, ControlInfo(controls::AwbModeValues) },
{ &controls::ColourGains, ControlInfo(0.0f, 32.0f) },
{ &controls::Saturation, ControlInfo(0.0f, 32.0f, 1.0f) },
};
/* IPA controls handled conditionally, if the lens has a focus control */ /* IPA controls handled conditionally, if the lens has a focus control */
const ControlInfoMap::Map ipaAfControls{ const ControlInfoMap::Map ipaAfControls{
{ &controls::AfMode, ControlInfo(controls::AfModeValues) }, { &controls::AfMode, ControlInfo(controls::AfModeValues) },
@ -146,6 +150,11 @@ int32_t IpaBase::init(const IPASettings &settings, const InitParams &params, Ini
ControlInfoMap::Map ctrlMap = ipaControls; ControlInfoMap::Map ctrlMap = ipaControls;
if (lensPresent_) if (lensPresent_)
ctrlMap.merge(ControlInfoMap::Map(ipaAfControls)); ctrlMap.merge(ControlInfoMap::Map(ipaAfControls));
monoSensor_ = params.sensorInfo.cfaPattern == properties::draft::ColorFilterArrangementEnum::MONO;
if (!monoSensor_)
ctrlMap.merge(ControlInfoMap::Map(ipaColourControls));
result->controlInfo = ControlInfoMap(std::move(ctrlMap), controls::controls); result->controlInfo = ControlInfoMap(std::move(ctrlMap), controls::controls);
return platformInit(params, result); return platformInit(params, result);
@ -220,6 +229,10 @@ int32_t IpaBase::configure(const IPACameraSensorInfo &sensorInfo, const ConfigPa
ControlInfo(static_cast<int32_t>(mode_.minShutter.get<std::micro>()), ControlInfo(static_cast<int32_t>(mode_.minShutter.get<std::micro>()),
static_cast<int32_t>(mode_.maxShutter.get<std::micro>())); static_cast<int32_t>(mode_.maxShutter.get<std::micro>()));
/* Declare colour processing related controls for non-mono sensors. */
if (!monoSensor_)
ctrlMap.merge(ControlInfoMap::Map(ipaColourControls));
/* Declare Autofocus controls, only if we have a controllable lens */ /* Declare Autofocus controls, only if we have a controllable lens */
if (lensPresent_) if (lensPresent_)
ctrlMap.merge(ControlInfoMap::Map(ipaAfControls)); ctrlMap.merge(ControlInfoMap::Map(ipaAfControls));
@ -780,6 +793,10 @@ void IpaBase::applyControls(const ControlList &controls)
} }
case controls::AWB_ENABLE: { case controls::AWB_ENABLE: {
/* Silently ignore this control for a mono sensor. */
if (monoSensor_)
break;
RPiController::AwbAlgorithm *awb = dynamic_cast<RPiController::AwbAlgorithm *>( RPiController::AwbAlgorithm *awb = dynamic_cast<RPiController::AwbAlgorithm *>(
controller_.getAlgorithm("awb")); controller_.getAlgorithm("awb"));
if (!awb) { if (!awb) {
@ -799,6 +816,10 @@ void IpaBase::applyControls(const ControlList &controls)
} }
case controls::AWB_MODE: { case controls::AWB_MODE: {
/* Silently ignore this control for a mono sensor. */
if (monoSensor_)
break;
RPiController::AwbAlgorithm *awb = dynamic_cast<RPiController::AwbAlgorithm *>( RPiController::AwbAlgorithm *awb = dynamic_cast<RPiController::AwbAlgorithm *>(
controller_.getAlgorithm("awb")); controller_.getAlgorithm("awb"));
if (!awb) { if (!awb) {
@ -819,6 +840,10 @@ void IpaBase::applyControls(const ControlList &controls)
} }
case controls::COLOUR_GAINS: { case controls::COLOUR_GAINS: {
/* Silently ignore this control for a mono sensor. */
if (monoSensor_)
break;
auto gains = ctrl.second.get<Span<const float>>(); auto gains = ctrl.second.get<Span<const float>>();
RPiController::AwbAlgorithm *awb = dynamic_cast<RPiController::AwbAlgorithm *>( RPiController::AwbAlgorithm *awb = dynamic_cast<RPiController::AwbAlgorithm *>(
controller_.getAlgorithm("awb")); controller_.getAlgorithm("awb"));
@ -867,6 +892,10 @@ void IpaBase::applyControls(const ControlList &controls)
} }
case controls::SATURATION: { case controls::SATURATION: {
/* Silently ignore this control for a mono sensor. */
if (monoSensor_)
break;
RPiController::CcmAlgorithm *ccm = dynamic_cast<RPiController::CcmAlgorithm *>( RPiController::CcmAlgorithm *ccm = dynamic_cast<RPiController::CcmAlgorithm *>(
controller_.getAlgorithm("ccm")); controller_.getAlgorithm("ccm"));
if (!ccm) { if (!ccm) {

View file

@ -87,6 +87,7 @@ private:
std::map<unsigned int, MappedFrameBuffer> buffers_; std::map<unsigned int, MappedFrameBuffer> buffers_;
bool lensPresent_; bool lensPresent_;
bool monoSensor_;
ControlList libcameraMetadata_; ControlList libcameraMetadata_;
std::array<RPiController::Metadata, numMetadataContexts> rpiMetadata_; std::array<RPiController::Metadata, numMetadataContexts> rpiMetadata_;

View file

@ -1130,6 +1130,8 @@ int CameraData::loadPipelineConfiguration()
int CameraData::loadIPA(ipa::RPi::InitResult *result) int CameraData::loadIPA(ipa::RPi::InitResult *result)
{ {
int ret;
ipa_ = IPAManager::createIPA<ipa::RPi::IPAProxyRPi>(pipe(), 1, 1); ipa_ = IPAManager::createIPA<ipa::RPi::IPAProxyRPi>(pipe(), 1, 1);
if (!ipa_) if (!ipa_)
@ -1153,8 +1155,14 @@ int CameraData::loadIPA(ipa::RPi::InitResult *result)
IPASettings settings(configurationFile, sensor_->model()); IPASettings settings(configurationFile, sensor_->model());
ipa::RPi::InitParams params; ipa::RPi::InitParams params;
ret = sensor_->sensorInfo(&params.sensorInfo);
if (ret) {
LOG(RPI, Error) << "Failed to retrieve camera sensor info";
return ret;
}
params.lensPresent = !!sensor_->focusLens(); params.lensPresent = !!sensor_->focusLens();
int ret = platformInitIpa(params); ret = platformInitIpa(params);
if (ret) if (ret)
return ret; return ret;