[v16,5/6] libcamera: software_isp: Pass LSC availability to debayering
diff mbox series

Message ID 20261022094048.20277-6-mzamazal@redhat.com
State New
Headers show
Series
  • LSC for SoftISP simple pipeline
Related show

Commit Message

Milan Zamazal Oct. 22, 2026, 9:40 a.m. UTC
The lens shading algorithm may or may not be enabled in the tuning file.
Debayering configuration needs this information to arrange things
accordingly, e.g. to set up shader parameters.

Let's add a corresponding flag that is set in the LSC algorithm (if
present) and passed to Debayer::configure.  This is similar to what we
already do with CCM availability.

The flag is ignored by CPU ISP, where LSC is not going to be implemented
for now.

Signed-off-by: Milan Zamazal <mzamazal@redhat.com>
Reviewed-by: Bryan O'Donoghue <bod.linux@nxsw.ie>
Reviewed-by: Barnabás Pőcze <barnabas.pocze@ideasonboard.com>
---
 include/libcamera/internal/software_isp/software_isp.h | 1 +
 include/libcamera/ipa/softisp.mojom                    | 4 +++-
 src/ipa/softisp/algorithms/lsc.cpp                     | 8 +++++++-
 src/ipa/softisp/ipa_context.h                          | 1 +
 src/ipa/softisp/softisp.cpp                            | 7 +++++--
 src/libcamera/software_isp/debayer.cpp                 | 1 +
 src/libcamera/software_isp/debayer.h                   | 3 ++-
 src/libcamera/software_isp/debayer_cpu.cpp             | 3 ++-
 src/libcamera/software_isp/debayer_cpu.h               | 3 ++-
 src/libcamera/software_isp/debayer_egl.cpp             | 5 ++++-
 src/libcamera/software_isp/debayer_egl.h               | 4 +++-
 src/libcamera/software_isp/software_isp.cpp            | 5 +++--
 12 files changed, 34 insertions(+), 11 deletions(-)

Patch
diff mbox series

diff --git a/include/libcamera/internal/software_isp/software_isp.h b/include/libcamera/internal/software_isp/software_isp.h
index b8b24bb1b..b64910637 100644
--- a/include/libcamera/internal/software_isp/software_isp.h
+++ b/include/libcamera/internal/software_isp/software_isp.h
@@ -101,6 +101,7 @@  private:
 	DebayerParams debayerParams_;
 	DmaBufAllocator dmaHeap_;
 	bool ccmEnabled_;
+	bool lscEnabled_;
 
 	std::unique_ptr<ipa::softisp::IPAProxySoftIsp> ipa_;
 	std::deque<FrameBuffer *> queuedInputBuffers_;
diff --git a/include/libcamera/ipa/softisp.mojom b/include/libcamera/ipa/softisp.mojom
index 209af1fde..e42742ed7 100644
--- a/include/libcamera/ipa/softisp.mojom
+++ b/include/libcamera/ipa/softisp.mojom
@@ -18,7 +18,9 @@  interface IPASoftIspInterface {
 	     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)
diff --git a/src/ipa/softisp/algorithms/lsc.cpp b/src/ipa/softisp/algorithms/lsc.cpp
index 8316c7e9b..308939f19 100644
--- a/src/ipa/softisp/algorithms/lsc.cpp
+++ b/src/ipa/softisp/algorithms/lsc.cpp
@@ -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,
+	int ret = lscAlgo_.init(tuningData, context.ctrlMap,
 			     { .keys = { "r", "g", "b" },
 			       .numHSamples = kGridSize,
 			       .numVSamples = kGridSize,
 			       .sensorSize = context.sensorInfo.activeArea.size() });
+	if (ret)
+		return ret;
+
+	context.lscEnabled = true;
+
+	return 0;
 }
 
 int Lsc::configure(IPAContext &context,
diff --git a/src/ipa/softisp/ipa_context.h b/src/ipa/softisp/ipa_context.h
index 00326e6c7..1c5db17e3 100644
--- a/src/ipa/softisp/ipa_context.h
+++ b/src/ipa/softisp/ipa_context.h
@@ -90,6 +90,7 @@  struct IPAContext {
 	FCQueue<IPAFrameContext> frameContexts;
 	ControlInfoMap::Map ctrlMap;
 	bool ccmEnabled = false;
+	bool lscEnabled = false;
 	ipa::lsc::ActiveState lsc;
 };
 
diff --git a/src/ipa/softisp/softisp.cpp b/src/ipa/softisp/softisp.cpp
index 420fee745..00249a300 100644
--- a/src/ipa/softisp/softisp.cpp
+++ b/src/ipa/softisp/softisp.cpp
@@ -58,7 +58,8 @@  public:
 		 const IPACameraSensorInfo &sensorInfo,
 		 const ControlInfoMap &sensorControls,
 		 ControlInfoMap *ipaControls,
-		 bool *ccmEnabled) override;
+		 bool *ccmEnabled,
+		 bool *lscEnabled) override;
 	int configure(const IPAConfigInfo &configInfo,
 		      ControlInfoMap *ipaControls) override;
 
@@ -97,7 +98,8 @@  int IPASoftIsp::init(const IPASettings &settings,
 		     const IPACameraSensorInfo &sensorInfo,
 		     const ControlInfoMap &sensorControls,
 		     ControlInfoMap *ipaControls,
-		     bool *ccmEnabled)
+		     bool *ccmEnabled,
+		     bool *lscEnabled)
 {
 	context_.camHelper = CameraSensorHelperFactoryBase::create(settings.sensorModel);
 	if (!context_.camHelper) {
@@ -137,6 +139,7 @@  int IPASoftIsp::init(const IPASettings &settings,
 		return ret;
 
 	*ccmEnabled = context_.ccmEnabled;
+	*lscEnabled = context_.lscEnabled;
 
 	params_ = nullptr;
 	stats_ = nullptr;
diff --git a/src/libcamera/software_isp/debayer.cpp b/src/libcamera/software_isp/debayer.cpp
index 6ebf7ed1a..8295b8fc2 100644
--- a/src/libcamera/software_isp/debayer.cpp
+++ b/src/libcamera/software_isp/debayer.cpp
@@ -107,6 +107,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
  */
diff --git a/src/libcamera/software_isp/debayer.h b/src/libcamera/software_isp/debayer.h
index 556852260..e30a05279 100644
--- a/src/libcamera/software_isp/debayer.h
+++ b/src/libcamera/software_isp/debayer.h
@@ -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;
 
diff --git a/src/libcamera/software_isp/debayer_cpu.cpp b/src/libcamera/software_isp/debayer_cpu.cpp
index ce8b3c647..91867baa6 100644
--- a/src/libcamera/software_isp/debayer_cpu.cpp
+++ b/src/libcamera/software_isp/debayer_cpu.cpp
@@ -624,7 +624,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) {
 		LOG(Debayer, Error)
diff --git a/src/libcamera/software_isp/debayer_cpu.h b/src/libcamera/software_isp/debayer_cpu.h
index 2c88c9e1a..ae570893b 100644
--- a/src/libcamera/software_isp/debayer_cpu.h
+++ b/src/libcamera/software_isp/debayer_cpu.h
@@ -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>
diff --git a/src/libcamera/software_isp/debayer_egl.cpp b/src/libcamera/software_isp/debayer_egl.cpp
index 23dee13e7..bae63e076 100644
--- a/src/libcamera/software_isp/debayer_egl.cpp
+++ b/src/libcamera/software_isp/debayer_egl.cpp
@@ -273,7 +273,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) {
 		LOG(Debayer, Error)
@@ -293,6 +294,8 @@  int DebayerEGL::configure(const StreamConfiguration &inputCfg,
 		return -EINVAL;
 	}
 
+	lscEnabled_ = lscEnabled;
+
 	inputConfig_.stride = inputCfg.stride;
 	inputPixelFormat_ = inputCfg.pixelFormat;
 	width_ = inputCfg.size.width;
diff --git a/src/libcamera/software_isp/debayer_egl.h b/src/libcamera/software_isp/debayer_egl.h
index 30e51a477..a64dc925a 100644
--- a/src/libcamera/software_isp/debayer_egl.h
+++ b/src/libcamera/software_isp/debayer_egl.h
@@ -45,7 +45,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;
 
@@ -82,6 +83,7 @@  private:
 	unsigned int inputBufferCount_;
 	unsigned int outputBufferCount_;
 
+	bool lscEnabled_;
 	/* Shader parameters */
 	float firstRed_x_;
 	float firstRed_y_;
diff --git a/src/libcamera/software_isp/software_isp.cpp b/src/libcamera/software_isp/software_isp.cpp
index a40976055..627625b4f 100644
--- a/src/libcamera/software_isp/software_isp.cpp
+++ b/src/libcamera/software_isp/software_isp.cpp
@@ -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();
@@ -293,7 +294,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;