mirror of
https://git.libcamera.org/libcamera/libcamera.git
synced 2025-07-14 16:09:51 +03:00
ipa: raspberrypi: Remove generic "pause" mechanism from Algorithm
No existing Algorithm used the base pause(), resume() functions or the paused_ flag, nor is there a need for a generic pause API. Remove these. The AGC and AWB algorithms now have methods named disableAuto(), enableAuto() which better describe their functionality. Signed-off-by: Nick Hollinghurst <nick.hollinghurst@raspberrypi.com> Reviewed-by: David Plowman <david.plowman@raspberrypi.com> Reviewed-by: Naushir Patuck <naush@raspberrypi.com> Signed-off-by: Laurent Pinchart <laurent.pinchart@ideasonboard.com>
This commit is contained in:
parent
47c53f8084
commit
1bcb7539df
9 changed files with 26 additions and 40 deletions
|
@ -26,6 +26,8 @@ public:
|
||||||
virtual void setMeteringMode(std::string const &meteringModeName) = 0;
|
virtual void setMeteringMode(std::string const &meteringModeName) = 0;
|
||||||
virtual void setExposureMode(std::string const &exposureModeName) = 0;
|
virtual void setExposureMode(std::string const &exposureModeName) = 0;
|
||||||
virtual void setConstraintMode(std::string const &contraintModeName) = 0;
|
virtual void setConstraintMode(std::string const &contraintModeName) = 0;
|
||||||
|
virtual void enableAuto() = 0;
|
||||||
|
virtual void disableAuto() = 0;
|
||||||
};
|
};
|
||||||
|
|
||||||
} /* namespace RPiController */
|
} /* namespace RPiController */
|
||||||
|
|
|
@ -27,14 +27,11 @@ class Algorithm
|
||||||
{
|
{
|
||||||
public:
|
public:
|
||||||
Algorithm(Controller *controller)
|
Algorithm(Controller *controller)
|
||||||
: controller_(controller), paused_(false)
|
: controller_(controller)
|
||||||
{
|
{
|
||||||
}
|
}
|
||||||
virtual ~Algorithm() = default;
|
virtual ~Algorithm() = default;
|
||||||
virtual char const *name() const = 0;
|
virtual char const *name() const = 0;
|
||||||
virtual bool isPaused() const { return paused_; }
|
|
||||||
virtual void pause() { paused_ = true; }
|
|
||||||
virtual void resume() { paused_ = false; }
|
|
||||||
virtual int read(const libcamera::YamlObject ¶ms);
|
virtual int read(const libcamera::YamlObject ¶ms);
|
||||||
virtual void initialise();
|
virtual void initialise();
|
||||||
virtual void switchMode(CameraMode const &cameraMode, Metadata *metadata);
|
virtual void switchMode(CameraMode const &cameraMode, Metadata *metadata);
|
||||||
|
@ -47,7 +44,6 @@ public:
|
||||||
|
|
||||||
private:
|
private:
|
||||||
Controller *controller_;
|
Controller *controller_;
|
||||||
bool paused_;
|
|
||||||
};
|
};
|
||||||
|
|
||||||
/*
|
/*
|
||||||
|
|
|
@ -18,6 +18,8 @@ public:
|
||||||
virtual unsigned int getConvergenceFrames() const = 0;
|
virtual unsigned int getConvergenceFrames() const = 0;
|
||||||
virtual void setMode(std::string const &modeName) = 0;
|
virtual void setMode(std::string const &modeName) = 0;
|
||||||
virtual void setManualGains(double manualR, double manualB) = 0;
|
virtual void setManualGains(double manualR, double manualB) = 0;
|
||||||
|
virtual void enableAuto() = 0;
|
||||||
|
virtual void disableAuto() = 0;
|
||||||
};
|
};
|
||||||
|
|
||||||
} /* namespace RPiController */
|
} /* namespace RPiController */
|
||||||
|
|
|
@ -108,16 +108,14 @@ void Controller::prepare(Metadata *imageMetadata)
|
||||||
{
|
{
|
||||||
assert(switchModeCalled_);
|
assert(switchModeCalled_);
|
||||||
for (auto &algo : algorithms_)
|
for (auto &algo : algorithms_)
|
||||||
if (!algo->isPaused())
|
algo->prepare(imageMetadata);
|
||||||
algo->prepare(imageMetadata);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
void Controller::process(StatisticsPtr stats, Metadata *imageMetadata)
|
void Controller::process(StatisticsPtr stats, Metadata *imageMetadata)
|
||||||
{
|
{
|
||||||
assert(switchModeCalled_);
|
assert(switchModeCalled_);
|
||||||
for (auto &algo : algorithms_)
|
for (auto &algo : algorithms_)
|
||||||
if (!algo->isPaused())
|
algo->process(stats, imageMetadata);
|
||||||
algo->process(stats, imageMetadata);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
Metadata &Controller::getGlobalMetadata()
|
Metadata &Controller::getGlobalMetadata()
|
||||||
|
|
|
@ -270,18 +270,13 @@ int Agc::read(const libcamera::YamlObject ¶ms)
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
bool Agc::isPaused() const
|
void Agc::disableAuto()
|
||||||
{
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
|
|
||||||
void Agc::pause()
|
|
||||||
{
|
{
|
||||||
fixedShutter_ = status_.shutterTime;
|
fixedShutter_ = status_.shutterTime;
|
||||||
fixedAnalogueGain_ = status_.analogueGain;
|
fixedAnalogueGain_ = status_.analogueGain;
|
||||||
}
|
}
|
||||||
|
|
||||||
void Agc::resume()
|
void Agc::enableAuto()
|
||||||
{
|
{
|
||||||
fixedShutter_ = 0s;
|
fixedShutter_ = 0s;
|
||||||
fixedAnalogueGain_ = 0;
|
fixedAnalogueGain_ = 0;
|
||||||
|
@ -317,14 +312,14 @@ void Agc::setMaxShutter(Duration maxShutter)
|
||||||
void Agc::setFixedShutter(Duration fixedShutter)
|
void Agc::setFixedShutter(Duration fixedShutter)
|
||||||
{
|
{
|
||||||
fixedShutter_ = fixedShutter;
|
fixedShutter_ = fixedShutter;
|
||||||
/* Set this in case someone calls Pause() straight after. */
|
/* Set this in case someone calls disableAuto() straight after. */
|
||||||
status_.shutterTime = clipShutter(fixedShutter_);
|
status_.shutterTime = clipShutter(fixedShutter_);
|
||||||
}
|
}
|
||||||
|
|
||||||
void Agc::setFixedAnalogueGain(double fixedAnalogueGain)
|
void Agc::setFixedAnalogueGain(double fixedAnalogueGain)
|
||||||
{
|
{
|
||||||
fixedAnalogueGain_ = fixedAnalogueGain;
|
fixedAnalogueGain_ = fixedAnalogueGain;
|
||||||
/* Set this in case someone calls Pause() straight after. */
|
/* Set this in case someone calls disableAuto() straight after. */
|
||||||
status_.analogueGain = fixedAnalogueGain;
|
status_.analogueGain = fixedAnalogueGain;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -75,10 +75,6 @@ public:
|
||||||
Agc(Controller *controller);
|
Agc(Controller *controller);
|
||||||
char const *name() const override;
|
char const *name() const override;
|
||||||
int read(const libcamera::YamlObject ¶ms) override;
|
int read(const libcamera::YamlObject ¶ms) override;
|
||||||
/* AGC handles "pausing" for itself. */
|
|
||||||
bool isPaused() const override;
|
|
||||||
void pause() override;
|
|
||||||
void resume() override;
|
|
||||||
unsigned int getConvergenceFrames() const override;
|
unsigned int getConvergenceFrames() const override;
|
||||||
void setEv(double ev) override;
|
void setEv(double ev) override;
|
||||||
void setFlickerPeriod(libcamera::utils::Duration flickerPeriod) override;
|
void setFlickerPeriod(libcamera::utils::Duration flickerPeriod) override;
|
||||||
|
@ -88,6 +84,8 @@ public:
|
||||||
void setMeteringMode(std::string const &meteringModeName) override;
|
void setMeteringMode(std::string const &meteringModeName) override;
|
||||||
void setExposureMode(std::string const &exposureModeName) override;
|
void setExposureMode(std::string const &exposureModeName) override;
|
||||||
void setConstraintMode(std::string const &contraintModeName) override;
|
void setConstraintMode(std::string const &contraintModeName) override;
|
||||||
|
void enableAuto() override;
|
||||||
|
void disableAuto() 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;
|
||||||
|
|
|
@ -222,21 +222,16 @@ void Awb::initialise()
|
||||||
asyncResults_ = syncResults_;
|
asyncResults_ = syncResults_;
|
||||||
}
|
}
|
||||||
|
|
||||||
bool Awb::isPaused() const
|
void Awb::disableAuto()
|
||||||
{
|
{
|
||||||
return false;
|
/* Freeze the most recent values, and treat them as manual gains */
|
||||||
}
|
|
||||||
|
|
||||||
void Awb::pause()
|
|
||||||
{
|
|
||||||
/* "Pause" by fixing everything to the most recent values. */
|
|
||||||
manualR_ = syncResults_.gainR = prevSyncResults_.gainR;
|
manualR_ = syncResults_.gainR = prevSyncResults_.gainR;
|
||||||
manualB_ = syncResults_.gainB = prevSyncResults_.gainB;
|
manualB_ = syncResults_.gainB = prevSyncResults_.gainB;
|
||||||
syncResults_.gainG = prevSyncResults_.gainG;
|
syncResults_.gainG = prevSyncResults_.gainG;
|
||||||
syncResults_.temperatureK = prevSyncResults_.temperatureK;
|
syncResults_.temperatureK = prevSyncResults_.temperatureK;
|
||||||
}
|
}
|
||||||
|
|
||||||
void Awb::resume()
|
void Awb::enableAuto()
|
||||||
{
|
{
|
||||||
manualR_ = 0.0;
|
manualR_ = 0.0;
|
||||||
manualB_ = 0.0;
|
manualB_ = 0.0;
|
||||||
|
|
|
@ -93,13 +93,11 @@ public:
|
||||||
char const *name() const override;
|
char const *name() const override;
|
||||||
void initialise() override;
|
void initialise() override;
|
||||||
int read(const libcamera::YamlObject ¶ms) override;
|
int read(const libcamera::YamlObject ¶ms) override;
|
||||||
/* AWB handles "pausing" for itself. */
|
|
||||||
bool isPaused() const override;
|
|
||||||
void pause() override;
|
|
||||||
void resume() override;
|
|
||||||
unsigned int getConvergenceFrames() const override;
|
unsigned int getConvergenceFrames() const override;
|
||||||
void setMode(std::string const &name) override;
|
void setMode(std::string const &name) override;
|
||||||
void setManualGains(double manualR, double manualB) override;
|
void setManualGains(double manualR, double manualB) override;
|
||||||
|
void enableAuto() override;
|
||||||
|
void disableAuto() 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;
|
||||||
|
|
|
@ -706,7 +706,8 @@ void IPARPi::queueRequest(const ControlList &controls)
|
||||||
|
|
||||||
switch (ctrl.first) {
|
switch (ctrl.first) {
|
||||||
case controls::AE_ENABLE: {
|
case controls::AE_ENABLE: {
|
||||||
RPiController::Algorithm *agc = controller_.getAlgorithm("agc");
|
RPiController::AgcAlgorithm *agc = dynamic_cast<RPiController::AgcAlgorithm *>(
|
||||||
|
controller_.getAlgorithm("agc"));
|
||||||
if (!agc) {
|
if (!agc) {
|
||||||
LOG(IPARPI, Warning)
|
LOG(IPARPI, Warning)
|
||||||
<< "Could not set AE_ENABLE - no AGC algorithm";
|
<< "Could not set AE_ENABLE - no AGC algorithm";
|
||||||
|
@ -714,9 +715,9 @@ void IPARPi::queueRequest(const ControlList &controls)
|
||||||
}
|
}
|
||||||
|
|
||||||
if (ctrl.second.get<bool>() == false)
|
if (ctrl.second.get<bool>() == false)
|
||||||
agc->pause();
|
agc->disableAuto();
|
||||||
else
|
else
|
||||||
agc->resume();
|
agc->enableAuto();
|
||||||
|
|
||||||
libcameraMetadata_.set(controls::AeEnable, ctrl.second.get<bool>());
|
libcameraMetadata_.set(controls::AeEnable, ctrl.second.get<bool>());
|
||||||
break;
|
break;
|
||||||
|
@ -835,7 +836,8 @@ void IPARPi::queueRequest(const ControlList &controls)
|
||||||
}
|
}
|
||||||
|
|
||||||
case controls::AWB_ENABLE: {
|
case controls::AWB_ENABLE: {
|
||||||
RPiController::Algorithm *awb = controller_.getAlgorithm("awb");
|
RPiController::AwbAlgorithm *awb = dynamic_cast<RPiController::AwbAlgorithm *>(
|
||||||
|
controller_.getAlgorithm("awb"));
|
||||||
if (!awb) {
|
if (!awb) {
|
||||||
LOG(IPARPI, Warning)
|
LOG(IPARPI, Warning)
|
||||||
<< "Could not set AWB_ENABLE - no AWB algorithm";
|
<< "Could not set AWB_ENABLE - no AWB algorithm";
|
||||||
|
@ -843,9 +845,9 @@ void IPARPi::queueRequest(const ControlList &controls)
|
||||||
}
|
}
|
||||||
|
|
||||||
if (ctrl.second.get<bool>() == false)
|
if (ctrl.second.get<bool>() == false)
|
||||||
awb->pause();
|
awb->disableAuto();
|
||||||
else
|
else
|
||||||
awb->resume();
|
awb->enableAuto();
|
||||||
|
|
||||||
libcameraMetadata_.set(controls::AwbEnable,
|
libcameraMetadata_.set(controls::AwbEnable,
|
||||||
ctrl.second.get<bool>());
|
ctrl.second.get<bool>());
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue