ipa: rpi: awb: Make it possible to set the colour temperature directly
ColourTemperature is now exported as a writable control so that applications can set it directly. The AWB algorithm class now requires a method to be provided to perform this operation. The method should clamp the passed value to the calibrated range known to the algorithm. The default range is set very wide to cover all conceivable future AWB calibrations. It will always be clamped before use. Signed-off-by: David Plowman <david.plowman@raspberrypi.com> Reviewed-by: Naushir Patuck <naush@raspberrypi.com> Reviewed-by: Kieran Bingham <kieran.bingham@ideasonboard.com> Signed-off-by: Stefan Klug <stefan.klug@ideasonboard.com> Tested-by: Stefan Klug <stefan.klug@ideasonboard.com>
This commit is contained in:
parent
6efbe35de5
commit
e378309251
4 changed files with 40 additions and 0 deletions
|
@ -81,6 +81,7 @@ const ControlInfoMap::Map ipaColourControls{
|
|||
{ &controls::AwbEnable, ControlInfo(false, true) },
|
||||
{ &controls::AwbMode, ControlInfo(controls::AwbModeValues) },
|
||||
{ &controls::ColourGains, ControlInfo(0.0f, 32.0f) },
|
||||
{ &controls::ColourTemperature, ControlInfo(100, 100000) },
|
||||
{ &controls::Saturation, ControlInfo(0.0f, 32.0f, 1.0f) },
|
||||
};
|
||||
|
||||
|
@ -1011,6 +1012,25 @@ void IpaBase::applyControls(const ControlList &controls)
|
|||
break;
|
||||
}
|
||||
|
||||
case controls::COLOUR_TEMPERATURE: {
|
||||
/* Silently ignore this control for a mono sensor. */
|
||||
if (monoSensor_)
|
||||
break;
|
||||
|
||||
auto temperatureK = ctrl.second.get<int32_t>();
|
||||
RPiController::AwbAlgorithm *awb = dynamic_cast<RPiController::AwbAlgorithm *>(
|
||||
controller_.getAlgorithm("awb"));
|
||||
if (!awb) {
|
||||
LOG(IPARPI, Warning)
|
||||
<< "Could not set COLOUR_TEMPERATURE - no AWB algorithm";
|
||||
break;
|
||||
}
|
||||
|
||||
awb->setColourTemperature(temperatureK);
|
||||
/* This metadata will get reported back automatically. */
|
||||
break;
|
||||
}
|
||||
|
||||
case controls::BRIGHTNESS: {
|
||||
RPiController::ContrastAlgorithm *contrast = dynamic_cast<RPiController::ContrastAlgorithm *>(
|
||||
controller_.getAlgorithm("contrast"));
|
||||
|
|
|
@ -19,6 +19,7 @@ public:
|
|||
virtual void initialValues(double &gainR, double &gainB) = 0;
|
||||
virtual void setMode(std::string const &modeName) = 0;
|
||||
virtual void setManualGains(double manualR, double manualB) = 0;
|
||||
virtual void setColourTemperature(double temperatureK) = 0;
|
||||
virtual void enableAuto() = 0;
|
||||
virtual void disableAuto() = 0;
|
||||
};
|
||||
|
|
|
@ -293,6 +293,24 @@ void Awb::setManualGains(double manualR, double manualB)
|
|||
}
|
||||
}
|
||||
|
||||
void Awb::setColourTemperature(double temperatureK)
|
||||
{
|
||||
if (!config_.bayes) {
|
||||
LOG(RPiAwb, Warning) << "AWB uncalibrated - cannot set colour temperature";
|
||||
return;
|
||||
}
|
||||
|
||||
temperatureK = config_.ctR.domain().clamp(temperatureK);
|
||||
manualR_ = 1 / config_.ctR.eval(temperatureK);
|
||||
manualB_ = 1 / config_.ctB.eval(temperatureK);
|
||||
|
||||
syncResults_.temperatureK = temperatureK;
|
||||
syncResults_.gainR = manualR_;
|
||||
syncResults_.gainG = 1.0;
|
||||
syncResults_.gainB = manualB_;
|
||||
prevSyncResults_ = syncResults_;
|
||||
}
|
||||
|
||||
void Awb::switchMode([[maybe_unused]] CameraMode const &cameraMode,
|
||||
Metadata *metadata)
|
||||
{
|
||||
|
|
|
@ -105,6 +105,7 @@ public:
|
|||
void initialValues(double &gainR, double &gainB) override;
|
||||
void setMode(std::string const &name) override;
|
||||
void setManualGains(double manualR, double manualB) override;
|
||||
void setColourTemperature(double temperatureK) override;
|
||||
void enableAuto() override;
|
||||
void disableAuto() override;
|
||||
void switchMode(CameraMode const &cameraMode, Metadata *metadata) override;
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue