libcamera: Make converter/softISP configure()'s outputCfgs argument really const
diff mbox series

Message ID 20260325105618.8601-1-johannes.goede@oss.qualcomm.com
State New
Headers show
Series
  • libcamera: Make converter/softISP configure()'s outputCfgs argument really const
Related show

Commit Message

Hans de Goede March 25, 2026, 10:56 a.m. UTC
The intent of the outputCfgs argument to the configure() function of
converter classes and the softISP is to allow the passed in stream-configs
to not be changed.

But only the vector is const, the reference inside the vector are not
const, which allows modifying the stream-configs as can be seen inside
DebayerEGL::configure() which was using a non const reference outputCfg
helper variable.

Fix this by making the references inside the vector const.

Signed-off-by: Hans de Goede <johannes.goede@oss.qualcomm.com>
---
 include/libcamera/internal/converter.h                    | 2 +-
 include/libcamera/internal/converter/converter_dw100.h    | 2 +-
 include/libcamera/internal/converter/converter_v4l2_m2m.h | 2 +-
 include/libcamera/internal/software_isp/software_isp.h    | 2 +-
 src/libcamera/converter/converter_dw100.cpp               | 2 +-
 src/libcamera/converter/converter_v4l2_m2m.cpp            | 2 +-
 src/libcamera/pipeline/rkisp1/rkisp1.cpp                  | 2 +-
 src/libcamera/pipeline/simple/simple.cpp                  | 2 +-
 src/libcamera/software_isp/debayer.h                      | 2 +-
 src/libcamera/software_isp/debayer_cpu.cpp                | 2 +-
 src/libcamera/software_isp/debayer_cpu.h                  | 2 +-
 src/libcamera/software_isp/debayer_egl.cpp                | 4 ++--
 src/libcamera/software_isp/debayer_egl.h                  | 2 +-
 src/libcamera/software_isp/software_isp.cpp               | 2 +-
 14 files changed, 15 insertions(+), 15 deletions(-)

Patch
diff mbox series

diff --git a/include/libcamera/internal/converter.h b/include/libcamera/internal/converter.h
index 4b811686f..08e80a22f 100644
--- a/include/libcamera/internal/converter.h
+++ b/include/libcamera/internal/converter.h
@@ -71,7 +71,7 @@  public:
 				   Alignment align = Alignment::Down) = 0;
 
 	virtual int configure(const StreamConfiguration &inputCfg,
-			      const std::vector<std::reference_wrapper<StreamConfiguration>> &outputCfgs) = 0;
+			      const std::vector<std::reference_wrapper<const StreamConfiguration>> &outputCfgs) = 0;
 	virtual bool isConfigured(const Stream *stream) const = 0;
 	virtual int exportBuffers(const Stream *stream, unsigned int count,
 				  std::vector<std::unique_ptr<FrameBuffer>> *buffers) = 0;
diff --git a/include/libcamera/internal/converter/converter_dw100.h b/include/libcamera/internal/converter/converter_dw100.h
index d70c8fe76..0a41b180a 100644
--- a/include/libcamera/internal/converter/converter_dw100.h
+++ b/include/libcamera/internal/converter/converter_dw100.h
@@ -34,7 +34,7 @@  public:
 	int init(const YamlObject &params);
 
 	int configure(const StreamConfiguration &inputCfg,
-		      const std::vector<std::reference_wrapper<StreamConfiguration>>
+		      const std::vector<std::reference_wrapper<const StreamConfiguration>>
 			      &outputCfg);
 	bool isConfigured(const Stream *stream) const;
 
diff --git a/include/libcamera/internal/converter/converter_v4l2_m2m.h b/include/libcamera/internal/converter/converter_v4l2_m2m.h
index 6d2453bb9..63cea6b08 100644
--- a/include/libcamera/internal/converter/converter_v4l2_m2m.h
+++ b/include/libcamera/internal/converter/converter_v4l2_m2m.h
@@ -54,7 +54,7 @@  public:
 			      const Size &size, Alignment align = Alignment::Down) override;
 
 	int configure(const StreamConfiguration &inputCfg,
-		      const std::vector<std::reference_wrapper<StreamConfiguration>>
+		      const std::vector<std::reference_wrapper<const StreamConfiguration>>
 		      &outputCfg) override;
 	bool isConfigured(const Stream *stream) const override;
 	int exportBuffers(const Stream *stream, unsigned int count,
diff --git a/include/libcamera/internal/software_isp/software_isp.h b/include/libcamera/internal/software_isp/software_isp.h
index ad89c9b3c..585e0d6d9 100644
--- a/include/libcamera/internal/software_isp/software_isp.h
+++ b/include/libcamera/internal/software_isp/software_isp.h
@@ -64,7 +64,7 @@  public:
 	strideAndFrameSize(const PixelFormat &outputFormat, const Size &size);
 
 	int configure(const StreamConfiguration &inputCfg,
-		      const std::vector<std::reference_wrapper<StreamConfiguration>> &outputCfgs,
+		      const std::vector<std::reference_wrapper<const StreamConfiguration>> &outputCfgs,
 		      const ipa::soft::IPAConfigInfo &configInfo);
 
 	int exportBuffers(const Stream *stream, unsigned int count,
diff --git a/src/libcamera/converter/converter_dw100.cpp b/src/libcamera/converter/converter_dw100.cpp
index df5155cfd..7899fe8c2 100644
--- a/src/libcamera/converter/converter_dw100.cpp
+++ b/src/libcamera/converter/converter_dw100.cpp
@@ -142,7 +142,7 @@  int ConverterDW100Module::init(const YamlObject &params)
  * \copydoc libcamera::V4L2M2MConverter::configure
  */
 int ConverterDW100Module::configure(const StreamConfiguration &inputCfg,
-				    const std::vector<std::reference_wrapper<StreamConfiguration>>
+				    const std::vector<std::reference_wrapper<const StreamConfiguration>>
 					    &outputCfgs)
 {
 	int ret;
diff --git a/src/libcamera/converter/converter_v4l2_m2m.cpp b/src/libcamera/converter/converter_v4l2_m2m.cpp
index 4427a37c6..ffba0434e 100644
--- a/src/libcamera/converter/converter_v4l2_m2m.cpp
+++ b/src/libcamera/converter/converter_v4l2_m2m.cpp
@@ -548,7 +548,7 @@  Size V4L2M2MConverter::adjustSizes(const Size &cfgSize,
  * \copydoc libcamera::Converter::configure
  */
 int V4L2M2MConverter::configure(const StreamConfiguration &inputCfg,
-				const std::vector<std::reference_wrapper<StreamConfiguration>> &outputCfgs)
+				const std::vector<std::reference_wrapper<const StreamConfiguration>> &outputCfgs)
 {
 	int ret = 0;
 
diff --git a/src/libcamera/pipeline/rkisp1/rkisp1.cpp b/src/libcamera/pipeline/rkisp1/rkisp1.cpp
index 320a4dc5a..faeeecd96 100644
--- a/src/libcamera/pipeline/rkisp1/rkisp1.cpp
+++ b/src/libcamera/pipeline/rkisp1/rkisp1.cpp
@@ -1037,7 +1037,7 @@  int PipelineHandlerRkISP1::configure(Camera *camera, CameraConfiguration *c)
 	data->properties_.set(properties::ScalerCropMaximum, sensorCrop);
 
 	std::map<unsigned int, IPAStream> streamConfig;
-	std::vector<std::reference_wrapper<StreamConfiguration>> outputCfgs;
+	std::vector<std::reference_wrapper<const StreamConfiguration>> outputCfgs;
 
 	for (const StreamConfiguration &cfg : *config) {
 		if (cfg.stream() == &data->mainPathStream_) {
diff --git a/src/libcamera/pipeline/simple/simple.cpp b/src/libcamera/pipeline/simple/simple.cpp
index 4a0b9f58d..9497ac13b 100644
--- a/src/libcamera/pipeline/simple/simple.cpp
+++ b/src/libcamera/pipeline/simple/simple.cpp
@@ -1562,7 +1562,7 @@  int SimplePipelineHandler::configure(Camera *camera, CameraConfiguration *c)
 	}
 
 	/* Configure the converter if needed. */
-	std::vector<std::reference_wrapper<StreamConfiguration>> outputCfgs;
+	std::vector<std::reference_wrapper<const StreamConfiguration>> outputCfgs;
 	data->useConversion_ = config->needConversion();
 
 	data->rawStream_ = nullptr;
diff --git a/src/libcamera/software_isp/debayer.h b/src/libcamera/software_isp/debayer.h
index ce9350b7b..ea1ec6dcf 100644
--- a/src/libcamera/software_isp/debayer.h
+++ b/src/libcamera/software_isp/debayer.h
@@ -39,7 +39,7 @@  public:
 	virtual ~Debayer() = 0;
 
 	virtual int configure(const StreamConfiguration &inputCfg,
-			      const std::vector<std::reference_wrapper<StreamConfiguration>> &outputCfgs,
+			      const std::vector<std::reference_wrapper<const StreamConfiguration>> &outputCfgs,
 			      bool ccmEnabled) = 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 1de70b3b7..dd0fff871 100644
--- a/src/libcamera/software_isp/debayer_cpu.cpp
+++ b/src/libcamera/software_isp/debayer_cpu.cpp
@@ -540,7 +540,7 @@  int DebayerCpu::setDebayerFunctions(PixelFormat inputFormat,
 }
 
 int DebayerCpu::configure(const StreamConfiguration &inputCfg,
-			  const std::vector<std::reference_wrapper<StreamConfiguration>> &outputCfgs,
+			  const std::vector<std::reference_wrapper<const StreamConfiguration>> &outputCfgs,
 			  bool ccmEnabled)
 {
 	if (getInputConfig(inputCfg.pixelFormat, inputConfig_) != 0)
diff --git a/src/libcamera/software_isp/debayer_cpu.h b/src/libcamera/software_isp/debayer_cpu.h
index a96998e92..c6f263e1b 100644
--- a/src/libcamera/software_isp/debayer_cpu.h
+++ b/src/libcamera/software_isp/debayer_cpu.h
@@ -35,7 +35,7 @@  public:
 	~DebayerCpu();
 
 	int configure(const StreamConfiguration &inputCfg,
-		      const std::vector<std::reference_wrapper<StreamConfiguration>> &outputCfgs,
+		      const std::vector<std::reference_wrapper<const StreamConfiguration>> &outputCfgs,
 		      bool ccmEnabled);
 	Size patternSize(PixelFormat inputFormat);
 	std::vector<PixelFormat> formats(PixelFormat input);
diff --git a/src/libcamera/software_isp/debayer_egl.cpp b/src/libcamera/software_isp/debayer_egl.cpp
index 9a0606b5a..547b3c3bd 100644
--- a/src/libcamera/software_isp/debayer_egl.cpp
+++ b/src/libcamera/software_isp/debayer_egl.cpp
@@ -277,7 +277,7 @@  int DebayerEGL::initBayerShaders(PixelFormat inputFormat, PixelFormat outputForm
 }
 
 int DebayerEGL::configure(const StreamConfiguration &inputCfg,
-			  const std::vector<std::reference_wrapper<StreamConfiguration>> &outputCfgs,
+			  const std::vector<std::reference_wrapper<const StreamConfiguration>> &outputCfgs,
 			  [[maybe_unused]] bool ccmEnabled)
 {
 	if (getInputConfig(inputCfg.pixelFormat, inputConfig_) != 0)
@@ -307,7 +307,7 @@  int DebayerEGL::configure(const StreamConfiguration &inputCfg,
 		return -EINVAL;
 	}
 
-	StreamConfiguration &outputCfg = outputCfgs[0];
+	const StreamConfiguration &outputCfg = outputCfgs[0];
 	SizeRange outSizeRange = sizes(inputCfg.pixelFormat, inputCfg.size);
 	std::tie(outputConfig_.stride, outputConfig_.frameSize) =
 		strideAndFrameSize(outputCfg.pixelFormat, outputCfg.size);
diff --git a/src/libcamera/software_isp/debayer_egl.h b/src/libcamera/software_isp/debayer_egl.h
index 3abff1ad2..6bbe487a3 100644
--- a/src/libcamera/software_isp/debayer_egl.h
+++ b/src/libcamera/software_isp/debayer_egl.h
@@ -42,7 +42,7 @@  public:
 	~DebayerEGL();
 
 	int configure(const StreamConfiguration &inputCfg,
-		      const std::vector<std::reference_wrapper<StreamConfiguration>> &outputCfgs,
+		      const std::vector<std::reference_wrapper<const StreamConfiguration>> &outputCfgs,
 		      bool ccmEnabled);
 
 	Size patternSize(PixelFormat inputFormat);
diff --git a/src/libcamera/software_isp/software_isp.cpp b/src/libcamera/software_isp/software_isp.cpp
index 4cf5639d9..60228369f 100644
--- a/src/libcamera/software_isp/software_isp.cpp
+++ b/src/libcamera/software_isp/software_isp.cpp
@@ -262,7 +262,7 @@  SoftwareIsp::strideAndFrameSize(const PixelFormat &outputFormat, const Size &siz
  * \return 0 on success, a negative errno on failure
  */
 int SoftwareIsp::configure(const StreamConfiguration &inputCfg,
-			   const std::vector<std::reference_wrapper<StreamConfiguration>> &outputCfgs,
+			   const std::vector<std::reference_wrapper<const StreamConfiguration>> &outputCfgs,
 			   const ipa::soft::IPAConfigInfo &configInfo)
 {
 	ASSERT(ipa_ && debayer_);