ipa: rpi: agc: Make AGC controls affect all channels
We need to be able to do things like enable/disable AGC for all the channels, so most of the AGC controls are updated to be applied to all channels. There are a couple of exceptions, such as setting explicit shutter/gain values, which apply only to channel 0. Signed-off-by: David Plowman <david.plowman@raspberrypi.com> Signed-off-by: Naushir Patuck <naush@raspberrypi.com> Reviewed-by: Naushir Patuck <naush@raspberrypi.com> Signed-off-by: Kieran Bingham <kieran.bingham@ideasonboard.com>
This commit is contained in:
parent
78a2d00c79
commit
02eea043f2
4 changed files with 42 additions and 47 deletions
|
@ -702,9 +702,9 @@ void IpaBase::applyControls(const ControlList &controls)
|
||||||
}
|
}
|
||||||
|
|
||||||
if (ctrl.second.get<bool>() == false)
|
if (ctrl.second.get<bool>() == false)
|
||||||
agc->disableAuto(0);
|
agc->disableAuto();
|
||||||
else
|
else
|
||||||
agc->enableAuto(0);
|
agc->enableAuto();
|
||||||
|
|
||||||
libcameraMetadata_.set(controls::AeEnable, ctrl.second.get<bool>());
|
libcameraMetadata_.set(controls::AeEnable, ctrl.second.get<bool>());
|
||||||
break;
|
break;
|
||||||
|
@ -773,7 +773,7 @@ void IpaBase::applyControls(const ControlList &controls)
|
||||||
|
|
||||||
int32_t idx = ctrl.second.get<int32_t>();
|
int32_t idx = ctrl.second.get<int32_t>();
|
||||||
if (ConstraintModeTable.count(idx)) {
|
if (ConstraintModeTable.count(idx)) {
|
||||||
agc->setConstraintMode(0, ConstraintModeTable.at(idx));
|
agc->setConstraintMode(ConstraintModeTable.at(idx));
|
||||||
libcameraMetadata_.set(controls::AeConstraintMode, idx);
|
libcameraMetadata_.set(controls::AeConstraintMode, idx);
|
||||||
} else {
|
} else {
|
||||||
LOG(IPARPI, Error) << "Constraint mode " << idx
|
LOG(IPARPI, Error) << "Constraint mode " << idx
|
||||||
|
@ -793,7 +793,7 @@ void IpaBase::applyControls(const ControlList &controls)
|
||||||
|
|
||||||
int32_t idx = ctrl.second.get<int32_t>();
|
int32_t idx = ctrl.second.get<int32_t>();
|
||||||
if (ExposureModeTable.count(idx)) {
|
if (ExposureModeTable.count(idx)) {
|
||||||
agc->setExposureMode(0, ExposureModeTable.at(idx));
|
agc->setExposureMode(ExposureModeTable.at(idx));
|
||||||
libcameraMetadata_.set(controls::AeExposureMode, idx);
|
libcameraMetadata_.set(controls::AeExposureMode, idx);
|
||||||
} else {
|
} else {
|
||||||
LOG(IPARPI, Error) << "Exposure mode " << idx
|
LOG(IPARPI, Error) << "Exposure mode " << idx
|
||||||
|
@ -836,12 +836,12 @@ void IpaBase::applyControls(const ControlList &controls)
|
||||||
|
|
||||||
switch (mode) {
|
switch (mode) {
|
||||||
case controls::FlickerOff:
|
case controls::FlickerOff:
|
||||||
agc->setFlickerPeriod(0, 0us);
|
agc->setFlickerPeriod(0us);
|
||||||
|
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case controls::FlickerManual:
|
case controls::FlickerManual:
|
||||||
agc->setFlickerPeriod(0, flickerState_.manualPeriod);
|
agc->setFlickerPeriod(flickerState_.manualPeriod);
|
||||||
|
|
||||||
break;
|
break;
|
||||||
|
|
||||||
|
@ -875,7 +875,7 @@ void IpaBase::applyControls(const ControlList &controls)
|
||||||
* first, and the period updated after, or vice versa.
|
* first, and the period updated after, or vice versa.
|
||||||
*/
|
*/
|
||||||
if (flickerState_.mode == controls::FlickerManual)
|
if (flickerState_.mode == controls::FlickerManual)
|
||||||
agc->setFlickerPeriod(0, flickerState_.manualPeriod);
|
agc->setFlickerPeriod(flickerState_.manualPeriod);
|
||||||
|
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|
|
@ -22,17 +22,16 @@ public:
|
||||||
virtual unsigned int getConvergenceFrames() const = 0;
|
virtual unsigned int getConvergenceFrames() const = 0;
|
||||||
virtual std::vector<double> const &getWeights() const = 0;
|
virtual std::vector<double> const &getWeights() const = 0;
|
||||||
virtual void setEv(unsigned int channel, double ev) = 0;
|
virtual void setEv(unsigned int channel, double ev) = 0;
|
||||||
virtual void setFlickerPeriod(unsigned int channel,
|
virtual void setFlickerPeriod(libcamera::utils::Duration flickerPeriod) = 0;
|
||||||
libcamera::utils::Duration flickerPeriod) = 0;
|
|
||||||
virtual void setFixedShutter(unsigned int channel,
|
virtual void setFixedShutter(unsigned int channel,
|
||||||
libcamera::utils::Duration fixedShutter) = 0;
|
libcamera::utils::Duration fixedShutter) = 0;
|
||||||
virtual void setMaxShutter(libcamera::utils::Duration maxShutter) = 0;
|
virtual void setMaxShutter(libcamera::utils::Duration maxShutter) = 0;
|
||||||
virtual void setFixedAnalogueGain(unsigned int channel, double fixedAnalogueGain) = 0;
|
virtual void setFixedAnalogueGain(unsigned int channel, double fixedAnalogueGain) = 0;
|
||||||
virtual void setMeteringMode(std::string const &meteringModeName) = 0;
|
virtual void setMeteringMode(std::string const &meteringModeName) = 0;
|
||||||
virtual void setExposureMode(unsigned int channel, std::string const &exposureModeName) = 0;
|
virtual void setExposureMode(std::string const &exposureModeName) = 0;
|
||||||
virtual void setConstraintMode(unsigned int channel, std::string const &contraintModeName) = 0;
|
virtual void setConstraintMode(std::string const &contraintModeName) = 0;
|
||||||
virtual void enableAuto(unsigned int channel) = 0;
|
virtual void enableAuto() = 0;
|
||||||
virtual void disableAuto(unsigned int channel) = 0;
|
virtual void disableAuto() = 0;
|
||||||
virtual void setActiveChannels(const std::vector<unsigned int> &activeChannels) = 0;
|
virtual void setActiveChannels(const std::vector<unsigned int> &activeChannels) = 0;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
|
@ -74,22 +74,22 @@ int Agc::checkChannel(unsigned int channelIndex) const
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
void Agc::disableAuto(unsigned int channelIndex)
|
void Agc::disableAuto()
|
||||||
{
|
{
|
||||||
if (checkChannel(channelIndex))
|
LOG(RPiAgc, Debug) << "disableAuto";
|
||||||
return;
|
|
||||||
|
|
||||||
LOG(RPiAgc, Debug) << "disableAuto for channel " << channelIndex;
|
/* All channels are enabled/disabled together. */
|
||||||
channelData_[channelIndex].channel.disableAuto();
|
for (auto &data : channelData_)
|
||||||
|
data.channel.disableAuto();
|
||||||
}
|
}
|
||||||
|
|
||||||
void Agc::enableAuto(unsigned int channelIndex)
|
void Agc::enableAuto()
|
||||||
{
|
{
|
||||||
if (checkChannel(channelIndex))
|
LOG(RPiAgc, Debug) << "enableAuto";
|
||||||
return;
|
|
||||||
|
|
||||||
LOG(RPiAgc, Debug) << "enableAuto for channel " << channelIndex;
|
/* All channels are enabled/disabled together. */
|
||||||
channelData_[channelIndex].channel.enableAuto();
|
for (auto &data : channelData_)
|
||||||
|
data.channel.enableAuto();
|
||||||
}
|
}
|
||||||
|
|
||||||
unsigned int Agc::getConvergenceFrames() const
|
unsigned int Agc::getConvergenceFrames() const
|
||||||
|
@ -118,14 +118,13 @@ void Agc::setEv(unsigned int channelIndex, double ev)
|
||||||
channelData_[channelIndex].channel.setEv(ev);
|
channelData_[channelIndex].channel.setEv(ev);
|
||||||
}
|
}
|
||||||
|
|
||||||
void Agc::setFlickerPeriod(unsigned int channelIndex, Duration flickerPeriod)
|
void Agc::setFlickerPeriod(Duration flickerPeriod)
|
||||||
{
|
{
|
||||||
if (checkChannel(channelIndex))
|
LOG(RPiAgc, Debug) << "setFlickerPeriod " << flickerPeriod;
|
||||||
return;
|
|
||||||
|
|
||||||
LOG(RPiAgc, Debug) << "setFlickerPeriod " << flickerPeriod
|
/* Flicker period will be the same across all channels. */
|
||||||
<< " for channel " << channelIndex;
|
for (auto &data : channelData_)
|
||||||
channelData_[channelIndex].channel.setFlickerPeriod(flickerPeriod);
|
data.channel.setFlickerPeriod(flickerPeriod);
|
||||||
}
|
}
|
||||||
|
|
||||||
void Agc::setMaxShutter(Duration maxShutter)
|
void Agc::setMaxShutter(Duration maxShutter)
|
||||||
|
@ -162,22 +161,22 @@ void Agc::setMeteringMode(std::string const &meteringModeName)
|
||||||
data.channel.setMeteringMode(meteringModeName);
|
data.channel.setMeteringMode(meteringModeName);
|
||||||
}
|
}
|
||||||
|
|
||||||
void Agc::setExposureMode(unsigned int channelIndex, std::string const &exposureModeName)
|
void Agc::setExposureMode(std::string const &exposureModeName)
|
||||||
{
|
{
|
||||||
if (checkChannel(channelIndex))
|
LOG(RPiAgc, Debug) << "setExposureMode " << exposureModeName;
|
||||||
return;
|
|
||||||
|
|
||||||
LOG(RPiAgc, Debug) << "setExposureMode " << exposureModeName
|
/* Exposure mode will be the same across all channels. */
|
||||||
<< " for channel " << channelIndex;
|
for (auto &data : channelData_)
|
||||||
channelData_[channelIndex].channel.setExposureMode(exposureModeName);
|
data.channel.setExposureMode(exposureModeName);
|
||||||
}
|
}
|
||||||
|
|
||||||
void Agc::setConstraintMode(unsigned int channelIndex, std::string const &constraintModeName)
|
void Agc::setConstraintMode(std::string const &constraintModeName)
|
||||||
{
|
{
|
||||||
if (checkChannel(channelIndex))
|
LOG(RPiAgc, Debug) << "setConstraintMode " << constraintModeName;
|
||||||
return;
|
|
||||||
|
|
||||||
channelData_[channelIndex].channel.setConstraintMode(constraintModeName);
|
/* Constraint mode will be the same across all channels. */
|
||||||
|
for (auto &data : channelData_)
|
||||||
|
data.channel.setConstraintMode(constraintModeName);
|
||||||
}
|
}
|
||||||
|
|
||||||
template<typename T>
|
template<typename T>
|
||||||
|
|
|
@ -31,20 +31,17 @@ public:
|
||||||
unsigned int getConvergenceFrames() const override;
|
unsigned int getConvergenceFrames() const override;
|
||||||
std::vector<double> const &getWeights() const override;
|
std::vector<double> const &getWeights() const override;
|
||||||
void setEv(unsigned int channel, double ev) override;
|
void setEv(unsigned int channel, double ev) override;
|
||||||
void setFlickerPeriod(unsigned int channelIndex,
|
void setFlickerPeriod(libcamera::utils::Duration flickerPeriod) override;
|
||||||
libcamera::utils::Duration flickerPeriod) override;
|
|
||||||
void setMaxShutter(libcamera::utils::Duration maxShutter) override;
|
void setMaxShutter(libcamera::utils::Duration maxShutter) override;
|
||||||
void setFixedShutter(unsigned int channelIndex,
|
void setFixedShutter(unsigned int channelIndex,
|
||||||
libcamera::utils::Duration fixedShutter) override;
|
libcamera::utils::Duration fixedShutter) override;
|
||||||
void setFixedAnalogueGain(unsigned int channelIndex,
|
void setFixedAnalogueGain(unsigned int channelIndex,
|
||||||
double fixedAnalogueGain) override;
|
double fixedAnalogueGain) override;
|
||||||
void setMeteringMode(std::string const &meteringModeName) override;
|
void setMeteringMode(std::string const &meteringModeName) override;
|
||||||
void setExposureMode(unsigned int channelIndex,
|
void setExposureMode(std::string const &exposureModeName) override;
|
||||||
std::string const &exposureModeName) override;
|
void setConstraintMode(std::string const &contraintModeName) override;
|
||||||
void setConstraintMode(unsigned int channelIndex,
|
void enableAuto() override;
|
||||||
std::string const &contraintModeName) override;
|
void disableAuto() override;
|
||||||
void enableAuto(unsigned int channelIndex) override;
|
|
||||||
void disableAuto(unsigned int channelIndex) override;
|
|
||||||
void switchMode(CameraMode const &cameraMode, Metadata *metadata) override;
|
void switchMode(CameraMode const &cameraMode, Metadata *metadata) override;
|
||||||
void prepare(Metadata *imageMetadata) override;
|
void prepare(Metadata *imageMetadata) override;
|
||||||
void process(StatisticsPtr &stats, Metadata *imageMetadata) override;
|
void process(StatisticsPtr &stats, Metadata *imageMetadata) override;
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue