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:
parent
32677e1220
commit
8738d539f4
3 changed files with 23 additions and 9 deletions
|
@ -24,6 +24,7 @@
|
|||
|
||||
#include "ipu3_agc.h"
|
||||
#include "ipu3_awb.h"
|
||||
#include "libipa/camera_sensor_helper.h"
|
||||
|
||||
static constexpr uint32_t kMaxCellWidthPerSet = 160;
|
||||
static constexpr uint32_t kMaxCellHeightPerSet = 56;
|
||||
|
@ -37,10 +38,7 @@ namespace ipa::ipu3 {
|
|||
class IPAIPU3 : public IPAIPU3Interface
|
||||
{
|
||||
public:
|
||||
int init([[maybe_unused]] const IPASettings &settings) override
|
||||
{
|
||||
return 0;
|
||||
}
|
||||
int init(const IPASettings &settings) override;
|
||||
int start() override;
|
||||
void stop() override {}
|
||||
|
||||
|
@ -79,6 +77,8 @@ private:
|
|||
std::unique_ptr<IPU3Awb> awbAlgo_;
|
||||
/* Interface to the AEC/AGC algorithm */
|
||||
std::unique_ptr<IPU3Agc> agcAlgo_;
|
||||
/* Interface to the Camera Helper */
|
||||
std::unique_ptr<CameraSensorHelper> camHelper_;
|
||||
|
||||
/* Local parameter storage */
|
||||
struct ipu3_uapi_params params_;
|
||||
|
@ -86,6 +86,17 @@ private:
|
|||
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()
|
||||
{
|
||||
setControls(0);
|
||||
|
@ -281,7 +292,10 @@ void IPAIPU3::parseStatistics(unsigned int frame,
|
|||
{
|
||||
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);
|
||||
|
||||
if (agcAlgo_->updateControls())
|
||||
|
|
|
@ -145,7 +145,7 @@ void IPU3Agc::filterExposure()
|
|||
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;
|
||||
|
||||
|
@ -193,7 +193,7 @@ void IPU3Agc::lockExposureGain(uint32_t &exposure, uint32_t &gain)
|
|||
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);
|
||||
lockExposureGain(exposure, gain);
|
||||
|
|
|
@ -33,7 +33,7 @@ public:
|
|||
~IPU3Agc() = default;
|
||||
|
||||
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 updateControls() { return updateControls_; }
|
||||
/* \todo Use a metadata exchange between IPAs */
|
||||
|
@ -42,7 +42,7 @@ public:
|
|||
private:
|
||||
void processBrightness(const ipu3_uapi_stats_3a *stats);
|
||||
void filterExposure();
|
||||
void lockExposureGain(uint32_t &exposure, uint32_t &gain);
|
||||
void lockExposureGain(uint32_t &exposure, double &gain);
|
||||
|
||||
struct ipu3_uapi_grid_config aeGrid_;
|
||||
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue