mirror of
https://git.libcamera.org/libcamera/libcamera.git
synced 2025-07-16 17:05:08 +03:00
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:
parent
c204a67bae
commit
b9923747ad
3 changed files with 25 additions and 0 deletions
|
@ -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 {
|
||||||
|
|
|
@ -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
|
||||||
|
|
|
@ -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);
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue