@@ -100,6 +100,7 @@ private:
DebayerParams debayerParams_;
DmaBufAllocator dmaHeap_;
bool ccmEnabled_;
+ bool lscEnabled_;
std::unique_ptr<ipa::soft::IPAProxySoft> ipa_;
std::deque<FrameBuffer *> queuedInputBuffers_;
@@ -18,7 +18,9 @@ interface IPASoftInterface {
libcamera.SharedFD fdParams,
libcamera.IPACameraSensorInfo sensorInfo,
libcamera.ControlInfoMap sensorControls)
- => (int32 ret, libcamera.ControlInfoMap ipaControls, bool ccmEnabled);
+ => (int32 ret,
+ libcamera.ControlInfoMap ipaControls,
+ bool ccmEnabled, bool lscEnabled);
start() => (int32 ret);
stop();
configure(IPAConfigInfo configInfo)
@@ -18,7 +18,7 @@ namespace ipa::soft::algorithms {
LOG_DEFINE_CATEGORY(IPASoftLsc)
-int Lsc::init([[maybe_unused]] IPAContext &context, const YamlObject &tuningData)
+int Lsc::init(IPAContext &context, const YamlObject &tuningData)
{
int ret_r = lscR.readYaml(tuningData["grids"], "ct", "r");
int ret_g = lscG.readYaml(tuningData["grids"], "ct", "g");
@@ -30,6 +30,8 @@ int Lsc::init([[maybe_unused]] IPAContext &context, const YamlObject &tuningData
return -EINVAL;
}
+ context.lscEnabled = true;
+
return 0;
}
@@ -93,6 +93,7 @@ struct IPAContext {
FCQueue<IPAFrameContext> frameContexts;
ControlInfoMap::Map ctrlMap;
bool ccmEnabled = false;
+ bool lscEnabled = false;
};
} /* namespace ipa::soft */
@@ -57,7 +57,8 @@ public:
const IPACameraSensorInfo &sensorInfo,
const ControlInfoMap &sensorControls,
ControlInfoMap *ipaControls,
- bool *ccmEnabled) override;
+ bool *ccmEnabled,
+ bool *lscEnabled) override;
int configure(const IPAConfigInfo &configInfo) override;
int start() override;
@@ -97,7 +98,8 @@ int IPASoftSimple::init(const IPASettings &settings,
const IPACameraSensorInfo &sensorInfo,
const ControlInfoMap &sensorControls,
ControlInfoMap *ipaControls,
- bool *ccmEnabled)
+ bool *ccmEnabled,
+ bool *lscEnabled)
{
camHelper_ = CameraSensorHelperFactoryBase::create(settings.sensorModel);
if (!camHelper_) {
@@ -136,6 +138,7 @@ int IPASoftSimple::init(const IPASettings &settings,
return ret;
*ccmEnabled = context_.ccmEnabled;
+ *lscEnabled = context_.lscEnabled;
params_ = nullptr;
stats_ = nullptr;
@@ -96,6 +96,7 @@ Debayer::~Debayer()
* \param[in] inputCfg The input configuration
* \param[in] outputCfgs The output configurations
* \param[in] ccmEnabled Whether a color correction matrix is applied
+ * \param[in] lscEnabled Whether lens shading correction grid is provided
*
* \return 0 on success, a negative errno on failure
*/
@@ -40,7 +40,8 @@ public:
virtual int configure(const StreamConfiguration &inputCfg,
const std::vector<std::reference_wrapper<const StreamConfiguration>> &outputCfgs,
- bool ccmEnabled) = 0;
+ bool ccmEnabled,
+ bool lscEnabled) = 0;
virtual std::vector<PixelFormat> formats(PixelFormat inputFormat) = 0;
@@ -541,7 +541,8 @@ int DebayerCpu::setDebayerFunctions(PixelFormat inputFormat,
int DebayerCpu::configure(const StreamConfiguration &inputCfg,
const std::vector<std::reference_wrapper<const StreamConfiguration>> &outputCfgs,
- bool ccmEnabled)
+ bool ccmEnabled,
+ [[maybe_unused]] bool lscEnabled)
{
if (getInputConfig(inputCfg.pixelFormat, inputConfig_) != 0)
return -EINVAL;
@@ -36,7 +36,8 @@ public:
int configure(const StreamConfiguration &inputCfg,
const std::vector<std::reference_wrapper<const StreamConfiguration>> &outputCfgs,
- bool ccmEnabled) override;
+ bool ccmEnabled,
+ bool lscEnabled) override;
Size patternSize(PixelFormat inputFormat) override;
std::vector<PixelFormat> formats(PixelFormat input) override;
std::tuple<unsigned int, unsigned int>
@@ -278,7 +278,8 @@ int DebayerEGL::initBayerShaders(PixelFormat inputFormat, PixelFormat outputForm
int DebayerEGL::configure(const StreamConfiguration &inputCfg,
const std::vector<std::reference_wrapper<const StreamConfiguration>> &outputCfgs,
- [[maybe_unused]] bool ccmEnabled)
+ [[maybe_unused]] bool ccmEnabled,
+ bool lscEnabled)
{
if (getInputConfig(inputCfg.pixelFormat, inputConfig_) != 0)
return -EINVAL;
@@ -295,6 +296,8 @@ int DebayerEGL::configure(const StreamConfiguration &inputCfg,
return -EINVAL;
}
+ lscEnabled_ = lscEnabled;
+
inputConfig_.stride = inputCfg.stride;
inputPixelFormat_ = inputCfg.pixelFormat;
width_ = inputCfg.size.width;
@@ -43,7 +43,8 @@ public:
int configure(const StreamConfiguration &inputCfg,
const std::vector<std::reference_wrapper<const StreamConfiguration>> &outputCfgs,
- bool ccmEnabled) override;
+ bool ccmEnabled,
+ bool lscEnabled) override;
Size patternSize(PixelFormat inputFormat) override;
@@ -75,6 +76,7 @@ private:
std::unique_ptr<eGLImage> eglImageBayerIn_;
std::unique_ptr<eGLImage> eglImageBayerOut_;
+ bool lscEnabled_;
/* Shader parameters */
float firstRed_x_;
float firstRed_y_;
@@ -155,7 +155,8 @@ SoftwareIsp::SoftwareIsp(PipelineHandler *pipe, const CameraSensor *sensor,
sensorInfo,
sensor->controls(),
ipaControls,
- &ccmEnabled_);
+ &ccmEnabled_,
+ &lscEnabled_);
if (ret) {
LOG(SoftwareIsp, Error) << "IPA init failed";
debayer_.reset();
@@ -271,7 +272,7 @@ int SoftwareIsp::configure(const StreamConfiguration &inputCfg,
if (ret < 0)
return ret;
- ret = debayer_->configure(inputCfg, outputCfgs, ccmEnabled_);
+ ret = debayer_->configure(inputCfg, outputCfgs, ccmEnabled_, lscEnabled_);
if (ret < 0)
return ret;