mirror of
https://git.libcamera.org/libcamera/libcamera.git
synced 2025-07-16 08:55:06 +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.ControlInfoMap sensorControls;
|
||||
libcamera.ControlInfoMap ispControls;
|
||||
libcamera.ControlInfoMap lensControls;
|
||||
};
|
||||
|
||||
struct IPAConfigResult {
|
||||
|
|
|
@ -131,6 +131,7 @@ private:
|
|||
void setMode(const IPACameraSensorInfo &sensorInfo);
|
||||
bool validateSensorControls();
|
||||
bool validateIspControls();
|
||||
bool validateLensControls();
|
||||
void queueRequest(const ControlList &controls);
|
||||
void returnEmbeddedBuffer(unsigned int bufferId);
|
||||
void prepareISP(const ISPConfig &data);
|
||||
|
@ -155,6 +156,7 @@ private:
|
|||
|
||||
ControlInfoMap sensorCtrls_;
|
||||
ControlInfoMap ispCtrls_;
|
||||
ControlInfoMap lensCtrls_;
|
||||
bool lensPresent_;
|
||||
ControlList libcameraMetadata_;
|
||||
|
||||
|
@ -394,6 +396,15 @@ int IPARPi::configure(const IPACameraSensorInfo &sensorInfo, const IPAConfig &ip
|
|||
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>();
|
||||
|
||||
/* Setup a metadata ControlList to output metadata. */
|
||||
|
@ -648,6 +659,16 @@ bool IPARPi::validateIspControls()
|
|||
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
|
||||
* 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;
|
||||
ipa::RPi::IPAConfig ipaConfig;
|
||||
|
||||
/* \todo Move passing of ispControls and lensControls to ipa::init() */
|
||||
ipaConfig.sensorControls = sensor_->controls();
|
||||
ipaConfig.ispControls = isp_[Isp::Input].dev()->controls();
|
||||
if (sensor_->focusLens())
|
||||
ipaConfig.lensControls = sensor_->focusLens()->controls();
|
||||
|
||||
/* Always send the user transform to the IPA. */
|
||||
ipaConfig.transform = static_cast<unsigned int>(config->transform);
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue