@@ -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)
@@ -20,11 +20,17 @@ int Lsc::init(IPAContext &context, const ValueNode &tuningData)
for (unsigned int i = 0; i < kGridSize; i++)
gridPos_.push_back(static_cast<double>(i) / (kGridSize - 1));
- return lscAlgo_.init(tuningData, context.ctrlMap,
- { .keys = { "r", "g", "b" },
- .numHCells = kGridSize,
- .numVCells = kGridSize,
- .sensorSize = context.sensorInfo.activeAreaSize });
+ int ret = lscAlgo_.init(tuningData, context.ctrlMap,
+ { .keys = { "r", "g", "b" },
+ .numHCells = kGridSize,
+ .numVCells = kGridSize,
+ .sensorSize = context.sensorInfo.activeAreaSize });
+ if (ret)
+ return ret;
+
+ context.lscEnabled = true;
+
+ return 0;
}
int Lsc::configure(IPAContext &context,
@@ -93,6 +93,7 @@ struct IPAContext {
FCQueue<IPAFrameContext> frameContexts;
ControlInfoMap::Map ctrlMap;
bool ccmEnabled = false;
+ bool lscEnabled = false;
ipa::lsc::ActiveState lsc;
};
@@ -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;
@@ -104,6 +104,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;
@@ -641,7 +641,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;
@@ -37,7 +37,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>
@@ -286,7 +286,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;
@@ -303,6 +304,8 @@ int DebayerEGL::configure(const StreamConfiguration &inputCfg,
return -EINVAL;
}
+ lscEnabled_ = lscEnabled;
+
inputConfig_.stride = inputCfg.stride;
inputPixelFormat_ = inputCfg.pixelFormat;
width_ = inputCfg.size.width;
@@ -44,7 +44,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;
@@ -77,6 +78,7 @@ private:
std::unique_ptr<eGLImage> eglImageBayerIn_;
std::unique_ptr<eGLImage> eglImageBayerOut_;
+ bool lscEnabled_;
/* Shader parameters */
float firstRed_x_;
float firstRed_y_;
@@ -163,7 +163,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();
@@ -292,7 +293,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;