ipa: ipu3: Initialize CameraSensorHelper at IPU3 init stage

In order for the CameraSensorHelper to be instantiated, we need to find
its factory using the camera sensor model name stored in
IPASettings::sensorModel. As we don't need to do it at each configure
call (the sensor is not changing in-between), implement the init call in
IPAIPU3 to do that.

Signed-off-by: Jean-Michel Hautbois <jeanmichel.hautbois@ideasonboard.com>
Reviewed-by: Umang Jain <umang.jain@ideasonboard.com>
Reviewed-by: Jacopo Mondi <jacopo@jmondi.org>
Reviewed-by: Kieran Bingham <kieran.bingham@ideasonboard.com>
This commit is contained in:
Jean-Michel Hautbois 2021-06-10 12:09:13 +02:00
parent 32677e1220
commit 8738d539f4
3 changed files with 23 additions and 9 deletions

View file

@ -24,6 +24,7 @@
#include "ipu3_agc.h" #include "ipu3_agc.h"
#include "ipu3_awb.h" #include "ipu3_awb.h"
#include "libipa/camera_sensor_helper.h"
static constexpr uint32_t kMaxCellWidthPerSet = 160; static constexpr uint32_t kMaxCellWidthPerSet = 160;
static constexpr uint32_t kMaxCellHeightPerSet = 56; static constexpr uint32_t kMaxCellHeightPerSet = 56;
@ -37,10 +38,7 @@ namespace ipa::ipu3 {
class IPAIPU3 : public IPAIPU3Interface class IPAIPU3 : public IPAIPU3Interface
{ {
public: public:
int init([[maybe_unused]] const IPASettings &settings) override int init(const IPASettings &settings) override;
{
return 0;
}
int start() override; int start() override;
void stop() override {} void stop() override {}
@ -79,6 +77,8 @@ private:
std::unique_ptr<IPU3Awb> awbAlgo_; std::unique_ptr<IPU3Awb> awbAlgo_;
/* Interface to the AEC/AGC algorithm */ /* Interface to the AEC/AGC algorithm */
std::unique_ptr<IPU3Agc> agcAlgo_; std::unique_ptr<IPU3Agc> agcAlgo_;
/* Interface to the Camera Helper */
std::unique_ptr<CameraSensorHelper> camHelper_;
/* Local parameter storage */ /* Local parameter storage */
struct ipu3_uapi_params params_; struct ipu3_uapi_params params_;
@ -86,6 +86,17 @@ private:
struct ipu3_uapi_grid_config bdsGrid_; struct ipu3_uapi_grid_config bdsGrid_;
}; };
int IPAIPU3::init(const IPASettings &settings)
{
camHelper_ = CameraSensorHelperFactory::create(settings.sensorModel);
if (camHelper_ == nullptr) {
LOG(IPAIPU3, Error) << "Failed to create camera sensor helper for " << settings.sensorModel;
return -ENODEV;
}
return 0;
}
int IPAIPU3::start() int IPAIPU3::start()
{ {
setControls(0); setControls(0);
@ -281,7 +292,10 @@ void IPAIPU3::parseStatistics(unsigned int frame,
{ {
ControlList ctrls(controls::controls); ControlList ctrls(controls::controls);
agcAlgo_->process(stats, exposure_, gain_); double gain = camHelper_->gain(gain_);
agcAlgo_->process(stats, exposure_, gain);
gain_ = camHelper_->gainCode(gain);
awbAlgo_->calculateWBGains(stats); awbAlgo_->calculateWBGains(stats);
if (agcAlgo_->updateControls()) if (agcAlgo_->updateControls())

View file

@ -145,7 +145,7 @@ void IPU3Agc::filterExposure()
LOG(IPU3Agc, Debug) << "After filtering, total_exposure " << prevExposure_; LOG(IPU3Agc, Debug) << "After filtering, total_exposure " << prevExposure_;
} }
void IPU3Agc::lockExposureGain(uint32_t &exposure, uint32_t &gain) void IPU3Agc::lockExposureGain(uint32_t &exposure, double &gain)
{ {
updateControls_ = false; updateControls_ = false;
@ -193,7 +193,7 @@ void IPU3Agc::lockExposureGain(uint32_t &exposure, uint32_t &gain)
lastFrame_ = frameCount_; lastFrame_ = frameCount_;
} }
void IPU3Agc::process(const ipu3_uapi_stats_3a *stats, uint32_t &exposure, uint32_t &gain) void IPU3Agc::process(const ipu3_uapi_stats_3a *stats, uint32_t &exposure, double &gain)
{ {
processBrightness(stats); processBrightness(stats);
lockExposureGain(exposure, gain); lockExposureGain(exposure, gain);

View file

@ -33,7 +33,7 @@ public:
~IPU3Agc() = default; ~IPU3Agc() = default;
void initialise(struct ipu3_uapi_grid_config &bdsGrid, const IPACameraSensorInfo &sensorInfo); void initialise(struct ipu3_uapi_grid_config &bdsGrid, const IPACameraSensorInfo &sensorInfo);
void process(const ipu3_uapi_stats_3a *stats, uint32_t &exposure, uint32_t &gain); void process(const ipu3_uapi_stats_3a *stats, uint32_t &exposure, double &gain);
bool converged() { return converged_; } bool converged() { return converged_; }
bool updateControls() { return updateControls_; } bool updateControls() { return updateControls_; }
/* \todo Use a metadata exchange between IPAs */ /* \todo Use a metadata exchange between IPAs */
@ -42,7 +42,7 @@ public:
private: private:
void processBrightness(const ipu3_uapi_stats_3a *stats); void processBrightness(const ipu3_uapi_stats_3a *stats);
void filterExposure(); void filterExposure();
void lockExposureGain(uint32_t &exposure, uint32_t &gain); void lockExposureGain(uint32_t &exposure, double &gain);
struct ipu3_uapi_grid_config aeGrid_; struct ipu3_uapi_grid_config aeGrid_;