pipeline: ipa: raspberrypi: Validate lens controls

Pass the available lens controls to the IPA through the configure() function.
Validate that the V4L2_CID_FOCUS_ABSOLUTE does exist. If it doesn't, log a
warning message, and do not advertise focus related controls from the IPA.

Signed-off-by: Naushir Patuck <naush@raspberrypi.com>
Reviewed-by: Nick Hollinghurst <nick.hollinghurst@raspberrypi.com>
Reviewed-by: David Plowman <david.plowman@raspberrypi.com>
Signed-off-by: Kieran Bingham <kieran.bingham@ideasonboard.com>
This commit is contained in:
Naushir Patuck 2023-01-23 15:49:24 +00:00 committed by Kieran Bingham
parent c204a67bae
commit b9923747ad
3 changed files with 25 additions and 0 deletions

View file

@ -38,6 +38,7 @@ struct IPAConfig {
libcamera.SharedFD lsTableHandle; libcamera.SharedFD lsTableHandle;
libcamera.ControlInfoMap sensorControls; libcamera.ControlInfoMap sensorControls;
libcamera.ControlInfoMap ispControls; libcamera.ControlInfoMap ispControls;
libcamera.ControlInfoMap lensControls;
}; };
struct IPAConfigResult { struct IPAConfigResult {

View file

@ -131,6 +131,7 @@ private:
void setMode(const IPACameraSensorInfo &sensorInfo); void setMode(const IPACameraSensorInfo &sensorInfo);
bool validateSensorControls(); bool validateSensorControls();
bool validateIspControls(); bool validateIspControls();
bool validateLensControls();
void queueRequest(const ControlList &controls); void queueRequest(const ControlList &controls);
void returnEmbeddedBuffer(unsigned int bufferId); void returnEmbeddedBuffer(unsigned int bufferId);
void prepareISP(const ISPConfig &data); void prepareISP(const ISPConfig &data);
@ -155,6 +156,7 @@ private:
ControlInfoMap sensorCtrls_; ControlInfoMap sensorCtrls_;
ControlInfoMap ispCtrls_; ControlInfoMap ispCtrls_;
ControlInfoMap lensCtrls_;
bool lensPresent_; bool lensPresent_;
ControlList libcameraMetadata_; ControlList libcameraMetadata_;
@ -394,6 +396,15 @@ int IPARPi::configure(const IPACameraSensorInfo &sensorInfo, const IPAConfig &ip
return -1; return -1;
} }
if (lensPresent_) {
lensCtrls_ = ipaConfig.lensControls;
if (!validateLensControls()) {
LOG(IPARPI, Warning) << "Lens validation failed, "
<< "no lens control will be available.";
lensPresent_ = false;
}
}
maxSensorGainCode_ = sensorCtrls_.at(V4L2_CID_ANALOGUE_GAIN).max().get<int32_t>(); maxSensorGainCode_ = sensorCtrls_.at(V4L2_CID_ANALOGUE_GAIN).max().get<int32_t>();
/* Setup a metadata ControlList to output metadata. */ /* Setup a metadata ControlList to output metadata. */
@ -648,6 +659,16 @@ bool IPARPi::validateIspControls()
return true; return true;
} }
bool IPARPi::validateLensControls()
{
if (lensCtrls_.find(V4L2_CID_FOCUS_ABSOLUTE) == lensCtrls_.end()) {
LOG(IPARPI, Error) << "Unable to find Lens control V4L2_CID_FOCUS_ABSOLUTE";
return false;
}
return true;
}
/* /*
* Converting between enums (used in the libcamera API) and the names that * Converting between enums (used in the libcamera API) and the names that
* we use to identify different modes. Unfortunately, the conversion tables * we use to identify different modes. Unfortunately, the conversion tables

View file

@ -1522,8 +1522,11 @@ int RPiCameraData::configureIPA(const CameraConfiguration *config, ipa::RPi::IPA
std::map<unsigned int, ControlInfoMap> entityControls; std::map<unsigned int, ControlInfoMap> entityControls;
ipa::RPi::IPAConfig ipaConfig; ipa::RPi::IPAConfig ipaConfig;
/* \todo Move passing of ispControls and lensControls to ipa::init() */
ipaConfig.sensorControls = sensor_->controls(); ipaConfig.sensorControls = sensor_->controls();
ipaConfig.ispControls = isp_[Isp::Input].dev()->controls(); ipaConfig.ispControls = isp_[Isp::Input].dev()->controls();
if (sensor_->focusLens())
ipaConfig.lensControls = sensor_->focusLens()->controls();
/* Always send the user transform to the IPA. */ /* Always send the user transform to the IPA. */
ipaConfig.transform = static_cast<unsigned int>(config->transform); ipaConfig.transform = static_cast<unsigned int>(config->transform);