diff --git a/Documentation/Doxyfile.in b/Documentation/Doxyfile.in
index af006724..213adb9b 100644
--- a/Documentation/Doxyfile.in
+++ b/Documentation/Doxyfile.in
@@ -844,7 +844,6 @@ EXCLUDE                = @TOP_SRCDIR@/include/libcamera/span.h \
 			 @TOP_SRCDIR@/src/libcamera/pipeline/ \
 			 @TOP_SRCDIR@/src/libcamera/tracepoints.cpp \
 			 @TOP_BUILDDIR@/include/libcamera/internal/tracepoints.h \
-			 @TOP_BUILDDIR@/include/libcamera/ipa/ \
 			 @TOP_BUILDDIR@/src/libcamera/proxy/
 
 # The EXCLUDE_SYMLINKS tag can be used to select whether or not files or
@@ -861,7 +860,8 @@ EXCLUDE_SYMLINKS       = NO
 # Note that the wildcards are matched against the file with absolute path, so to
 # exclude all test directories for example use the pattern */test/*
 
-EXCLUDE_PATTERNS       =
+EXCLUDE_PATTERNS       = @TOP_BUILDDIR@/include/libcamera/ipa/*_serializer.h \
+			 @TOP_BUILDDIR@/include/libcamera/ipa/*_proxy.h
 
 # The EXCLUDE_SYMBOLS tag can be used to specify one or more symbol names
 # (namespaces, classes, functions, etc.) that should be excluded from the
diff --git a/Documentation/meson.build b/Documentation/meson.build
index c8521574..86f1134b 100644
--- a/Documentation/meson.build
+++ b/Documentation/meson.build
@@ -23,6 +23,7 @@ if doxygen.found() and dot.found()
                   input : [
                       doxyfile,
                       libcamera_internal_headers,
+                      libcamera_ipa_docs,
                       libcamera_ipa_headers,
                       libcamera_public_headers,
                       libcamera_sources,
diff --git a/include/libcamera/internal/camera_sensor.h b/include/libcamera/internal/camera_sensor.h
index 2a5c51a1..cf6c1c1e 100644
--- a/include/libcamera/internal/camera_sensor.h
+++ b/include/libcamera/internal/camera_sensor.h
@@ -14,6 +14,7 @@
 #include <libcamera/class.h>
 #include <libcamera/controls.h>
 #include <libcamera/geometry.h>
+#include <libcamera/ipa/core_ipa_interface.h>
 
 #include "libcamera/internal/formats.h"
 #include "libcamera/internal/log.h"
@@ -24,22 +25,6 @@ namespace libcamera {
 class BayerFormat;
 class MediaEntity;
 
-struct CameraSensorInfo {
-	std::string model;
-
-	uint32_t bitsPerPixel;
-
-	Size activeAreaSize;
-	Rectangle analogCrop;
-	Size outputSize;
-
-	uint64_t pixelRate;
-	uint32_t lineLength;
-
-	uint32_t minFrameLength;
-	uint32_t maxFrameLength;
-};
-
 class CameraSensor : protected Loggable
 {
 public:
@@ -66,7 +51,7 @@ public:
 	V4L2Subdevice *device() { return subdev_.get(); }
 
 	const ControlList &properties() const { return properties_; }
-	int sensorInfo(CameraSensorInfo *info) const;
+	int sensorInfo(IPACameraSensorInfo *info) const;
 
 	void updateControlInfo();
 
diff --git a/include/libcamera/ipa/core.mojom b/include/libcamera/ipa/core.mojom
index 6caaa63e..06ca87c7 100644
--- a/include/libcamera/ipa/core.mojom
+++ b/include/libcamera/ipa/core.mojom
@@ -78,7 +78,7 @@ module libcamera;
 	uint32 height;
 };
 
-[skipHeader] struct CameraSensorInfo {
+struct IPACameraSensorInfo {
 	string model;
 
 	uint32 bitsPerPixel;
diff --git a/include/libcamera/ipa/core_ipa_interface.cpp b/include/libcamera/ipa/core_ipa_interface.cpp
new file mode 100644
index 00000000..19f769ce
--- /dev/null
+++ b/include/libcamera/ipa/core_ipa_interface.cpp
@@ -0,0 +1,190 @@
+/* SPDX-License-Identifier: LGPL-2.1-or-later */
+
+namespace libcamera {
+
+/**
+ * \struct IPACameraSensorInfo
+ * \brief Report the image sensor characteristics
+ *
+ * The structure reports image sensor characteristics used by IPA modules to
+ * tune their algorithms based on the image sensor model currently in use and
+ * its configuration.
+ *
+ * The reported information describes the sensor's intrinsics characteristics,
+ * such as its pixel array size and the sensor model name, as well as
+ * information relative to the currently configured mode, such as the produced
+ * image size and the bit depth of the requested image format.
+ *
+ * Instances of this structure are meant to be assembled by the CameraSensor
+ * class by inspecting the sensor static properties as well as information
+ * relative to the current configuration.
+ */
+
+/**
+ * \var IPACameraSensorInfo::model
+ * \brief The image sensor model name
+ *
+ * The sensor model name is a free-formed string that uniquely identifies the
+ * sensor model.
+ */
+
+/**
+ * \var IPACameraSensorInfo::bitsPerPixel
+ * \brief The number of bits per pixel of the image format produced by the
+ * image sensor
+ */
+
+/**
+ * \var IPACameraSensorInfo::activeAreaSize
+ * \brief The size of the pixel array active area of the sensor
+ */
+
+/**
+ * \var IPACameraSensorInfo::analogCrop
+ * \brief The portion of the pixel array active area which is read-out and
+ * processed
+ *
+ * The analog crop rectangle top-left corner is defined as the displacement
+ * from the top-left corner of the pixel array active area. The rectangle
+ * horizontal and vertical sizes define the portion of the pixel array which
+ * is read-out and provided to the sensor's internal processing pipeline, before
+ * any pixel sub-sampling method, such as pixel binning, skipping and averaging
+ * take place.
+ */
+
+/**
+ * \var IPACameraSensorInfo::outputSize
+ * \brief The size of the images produced by the camera sensor
+ *
+ * The output image size defines the horizontal and vertical sizes of the images
+ * produced by the image sensor. The output image size is defined as the end
+ * result of the sensor's internal image processing pipeline stages, applied on
+ * the pixel array portion defined by the analog crop rectangle. Each image
+ * processing stage that performs pixel sub-sampling techniques, such as pixel
+ * binning or skipping, or perform any additional digital scaling concur in the
+ * definition of the output image size.
+ */
+
+/**
+ * \var IPACameraSensorInfo::pixelRate
+ * \brief The number of pixels produced in a second
+ *
+ * To obtain the read-out time in seconds of a full line:
+ *
+ * \verbatim
+	lineDuration(s) = lineLength(pixels) / pixelRate(pixels per second)
+   \endverbatim
+ */
+
+/**
+ * \var IPACameraSensorInfo::lineLength
+ * \brief Total line length in pixels
+ *
+ * The total line length in pixel clock periods, including blanking.
+ */
+
+/**
+ * \var IPACameraSensorInfo::minFrameLength
+ * \brief The minimum allowable frame length in units of lines
+ *
+ * The sensor frame length comprises of active output lines and blanking lines
+ * in a frame. The minimum frame length value dictates the minimum allowable
+ * frame duration of the sensor mode.
+ *
+ * To obtain the minimum frame duration:
+ *
+ * \verbatim
+	frameDuration(s) = minFrameLength(lines) * lineLength(pixels) / pixelRate(pixels per second)
+   \endverbatim
+ */
+
+/**
+ * \var IPACameraSensorInfo::maxFrameLength
+ * \brief The maximum allowable frame length in units of lines
+ *
+ * The sensor frame length comprises of active output lines and blanking lines
+ * in a frame. The maximum frame length value dictates the maximum allowable
+ * frame duration of the sensor mode.
+ *
+ * To obtain the maximum frame duration:
+ *
+ * \verbatim
+	frameDuration(s) = maxFrameLength(lines) * lineLength(pixels) / pixelRate(pixels per second)
+   \endverbatim
+ */
+
+/**
+ * \struct IPABuffer
+ * \brief Buffer information for the IPA interface
+ *
+ * The IPABuffer structure associates buffer memory with a unique ID. It is
+ * used to map buffers to the IPA with IPAInterface::mapBuffers(), after which
+ * buffers will be identified by their ID in the IPA interface.
+ */
+
+/**
+ * \var IPABuffer::id
+ * \brief The buffer unique ID
+ *
+ * Buffers mapped to the IPA are identified by numerical unique IDs. The IDs
+ * are chosen by the pipeline handler to fulfil the following constraints:
+ *
+ * - IDs shall be positive integers different than zero
+ * - IDs shall be unique among all mapped buffers
+ *
+ * When buffers are unmapped with IPAInterface::unmapBuffers() their IDs are
+ * freed and may be reused for new buffer mappings.
+ */
+
+/**
+ * \var IPABuffer::planes
+ * \brief The buffer planes description
+ *
+ * Stores the dmabuf handle and length for each plane of the buffer.
+ */
+
+/**
+ * \struct IPASettings
+ * \brief IPA interface initialization settings
+ *
+ * The IPASettings structure stores data passed to the IPAInterface::init()
+ * function. The data contains settings that don't depend on a particular camera
+ * or pipeline configuration and are valid for the whole life time of the IPA
+ * interface.
+ */
+
+/**
+ * \var IPASettings::configurationFile
+ * \brief The name of the IPA configuration file
+ *
+ * This field may be an empty string if the IPA doesn't require a configuration
+ * file.
+ */
+
+/**
+ * \var IPASettings::sensorModel
+ * \brief The sensor model name
+ *
+ * Provides the sensor model name to the IPA.
+ */
+
+/**
+ * \struct IPAStream
+ * \brief Stream configuration for the IPA interface
+ *
+ * The IPAStream structure stores stream configuration parameters needed by the
+ * IPAInterface::configure() method. It mirrors the StreamConfiguration class
+ * that is not suitable for this purpose due to not being serializable.
+ */
+
+/**
+ * \var IPAStream::pixelFormat
+ * \brief The stream pixel format
+ */
+
+/**
+ * \var IPAStream::size
+ * \brief The stream size in pixels
+ */
+
+} /* namespace libcamera */
diff --git a/include/libcamera/ipa/ipa_interface.h b/include/libcamera/ipa/ipa_interface.h
index dfe1b40a..4aefaa71 100644
--- a/include/libcamera/ipa/ipa_interface.h
+++ b/include/libcamera/ipa/ipa_interface.h
@@ -18,8 +18,6 @@
 #include <libcamera/geometry.h>
 #include <libcamera/signal.h>
 
-#include "libcamera/internal/camera_sensor.h"
-
 namespace libcamera {
 
 /*
diff --git a/include/libcamera/ipa/meson.build b/include/libcamera/ipa/meson.build
index 40c4e737..69bc855e 100644
--- a/include/libcamera/ipa/meson.build
+++ b/include/libcamera/ipa/meson.build
@@ -6,6 +6,10 @@ libcamera_ipa_headers = files([
     'ipa_module_info.h',
 ])
 
+libcamera_ipa_docs = files([
+    'core_ipa_interface.cpp',
+])
+
 install_headers(libcamera_ipa_headers,
                 subdir: libcamera_include_dir / 'ipa')
 
diff --git a/include/libcamera/ipa/raspberrypi.mojom b/include/libcamera/ipa/raspberrypi.mojom
index 42321bee..0a21f453 100644
--- a/include/libcamera/ipa/raspberrypi.mojom
+++ b/include/libcamera/ipa/raspberrypi.mojom
@@ -63,7 +63,7 @@ interface IPARPiInterface {
 	 * The \a ipaConfig and \a controls parameters carry data passed by the
 	 * pipeline handler to the IPA and back.
 	 */
-	configure(libcamera.CameraSensorInfo sensorInfo,
+	configure(libcamera.IPACameraSensorInfo sensorInfo,
 		  map<uint32, libcamera.IPAStream> streamConfig,
 		  map<uint32, libcamera.ControlInfoMap> entityControls,
 		  IPAConfig ipaConfig)
diff --git a/include/libcamera/ipa/rkisp1.mojom b/include/libcamera/ipa/rkisp1.mojom
index cca871a0..66a4607c 100644
--- a/include/libcamera/ipa/rkisp1.mojom
+++ b/include/libcamera/ipa/rkisp1.mojom
@@ -29,7 +29,7 @@ interface IPARkISP1Interface {
 	start() => (int32 ret);
 	stop();
 
-	configure(libcamera.CameraSensorInfo sensorInfo,
+	configure(libcamera.IPACameraSensorInfo sensorInfo,
 		  map<uint32, libcamera.IPAStream> streamConfig,
 		  map<uint32, libcamera.ControlInfoMap> entityControls)
 		=> (int32 ret);
diff --git a/src/ipa/ipu3/ipu3_agc.cpp b/src/ipa/ipu3/ipu3_agc.cpp
index ca54d89a..3adcadf4 100644
--- a/src/ipa/ipu3/ipu3_agc.cpp
+++ b/src/ipa/ipu3/ipu3_agc.cpp
@@ -39,7 +39,7 @@ static constexpr uint32_t kMaxGain = kMaxISO / 100;
 static constexpr uint32_t kMinExposure = 1;
 static constexpr uint32_t kMaxExposure = 1976;
 
-/* \todo those should be get from CameraSensorInfo ! */
+/* \todo those should be get from IPACameraSensorInfo ! */
 /* line duration in microseconds */
 static constexpr double kLineDuration = 16.8;
 static constexpr double kMaxExposureTime = kMaxExposure * kLineDuration;
diff --git a/src/ipa/raspberrypi/raspberrypi.cpp b/src/ipa/raspberrypi/raspberrypi.cpp
index 52d91db2..e5bb8159 100644
--- a/src/ipa/raspberrypi/raspberrypi.cpp
+++ b/src/ipa/raspberrypi/raspberrypi.cpp
@@ -25,7 +25,6 @@
 #include <libcamera/span.h>
 
 #include "libcamera/internal/buffer.h"
-#include "libcamera/internal/camera_sensor.h"
 #include "libcamera/internal/log.h"
 
 #include <linux/bcm2835-isp.h>
@@ -90,7 +89,7 @@ public:
 	void start(const ControlList &controls, ipa::RPi::StartConfig *startConfig) override;
 	void stop() override {}
 
-	int configure(const CameraSensorInfo &sensorInfo,
+	int configure(const IPACameraSensorInfo &sensorInfo,
 		      const std::map<unsigned int, IPAStream> &streamConfig,
 		      const std::map<unsigned int, ControlInfoMap> &entityControls,
 		      const ipa::RPi::IPAConfig &data,
@@ -102,7 +101,7 @@ public:
 	void signalIspPrepare(const ipa::RPi::ISPConfig &data) override;
 
 private:
-	void setMode(const CameraSensorInfo &sensorInfo);
+	void setMode(const IPACameraSensorInfo &sensorInfo);
 	bool validateSensorControls();
 	bool validateIspControls();
 	void queueRequest(const ControlList &controls);
@@ -279,7 +278,7 @@ void IPARPi::start(const ControlList &controls, ipa::RPi::StartConfig *startConf
 	lastRunTimestamp_ = 0;
 }
 
-void IPARPi::setMode(const CameraSensorInfo &sensorInfo)
+void IPARPi::setMode(const IPACameraSensorInfo &sensorInfo)
 {
 	mode_.bitdepth = sensorInfo.bitsPerPixel;
 	mode_.width = sensorInfo.outputSize.width;
@@ -324,7 +323,7 @@ void IPARPi::setMode(const CameraSensorInfo &sensorInfo)
 	mode_.max_frame_length = sensorInfo.maxFrameLength;
 }
 
-int IPARPi::configure(const CameraSensorInfo &sensorInfo,
+int IPARPi::configure(const IPACameraSensorInfo &sensorInfo,
 		      [[maybe_unused]] const std::map<unsigned int, IPAStream> &streamConfig,
 		      const std::map<unsigned int, ControlInfoMap> &entityControls,
 		      const ipa::RPi::IPAConfig &ipaConfig,
diff --git a/src/ipa/rkisp1/rkisp1.cpp b/src/ipa/rkisp1/rkisp1.cpp
index 6d45673c..b47ea324 100644
--- a/src/ipa/rkisp1/rkisp1.cpp
+++ b/src/ipa/rkisp1/rkisp1.cpp
@@ -37,7 +37,7 @@ public:
 	int start() override;
 	void stop() override {}
 
-	int configure(const CameraSensorInfo &info,
+	int configure(const IPACameraSensorInfo &info,
 		      const std::map<uint32_t, IPAStream> &streamConfig,
 		      const std::map<uint32_t, ControlInfoMap> &entityControls) override;
 	void mapBuffers(const std::vector<IPABuffer> &buffers) override;
@@ -90,12 +90,12 @@ int IPARkISP1::start()
 }
 
 /**
- * \todo The RkISP1 pipeline currently provides an empty CameraSensorInfo
+ * \todo The RkISP1 pipeline currently provides an empty IPACameraSensorInfo
  * if the connected sensor does not provide enough information to properly
  * assemble one. Make sure the reported sensor information are relevant
  * before accessing them.
  */
-int IPARkISP1::configure([[maybe_unused]] const CameraSensorInfo &info,
+int IPARkISP1::configure([[maybe_unused]] const IPACameraSensorInfo &info,
 			 [[maybe_unused]] const std::map<uint32_t, IPAStream> &streamConfig,
 			 const std::map<uint32_t, ControlInfoMap> &entityControls)
 {
diff --git a/src/libcamera/camera_sensor.cpp b/src/libcamera/camera_sensor.cpp
index eb84d9eb..0fb8a258 100644
--- a/src/libcamera/camera_sensor.cpp
+++ b/src/libcamera/camera_sensor.cpp
@@ -33,117 +33,6 @@ namespace libcamera {
 
 LOG_DEFINE_CATEGORY(CameraSensor)
 
-/**
- * \struct CameraSensorInfo
- * \brief Report the image sensor characteristics
- *
- * The structure reports image sensor characteristics used by IPA modules to
- * tune their algorithms based on the image sensor model currently in use and
- * its configuration.
- *
- * The reported information describes the sensor's intrinsics characteristics,
- * such as its pixel array size and the sensor model name, as well as
- * information relative to the currently configured mode, such as the produced
- * image size and the bit depth of the requested image format.
- *
- * Instances of this structure are meant to be assembled by the CameraSensor
- * class by inspecting the sensor static properties as well as information
- * relative to the current configuration.
- */
-
-/**
- * \var CameraSensorInfo::model
- * \brief The image sensor model name
- *
- * The sensor model name is a free-formed string that uniquely identifies the
- * sensor model.
- */
-
-/**
- * \var CameraSensorInfo::bitsPerPixel
- * \brief The number of bits per pixel of the image format produced by the
- * image sensor
- */
-
-/**
- * \var CameraSensorInfo::activeAreaSize
- * \brief The size of the pixel array active area of the sensor
- */
-
-/**
- * \var CameraSensorInfo::analogCrop
- * \brief The portion of the pixel array active area which is read-out and
- * processed
- *
- * The analog crop rectangle top-left corner is defined as the displacement
- * from the top-left corner of the pixel array active area. The rectangle
- * horizontal and vertical sizes define the portion of the pixel array which
- * is read-out and provided to the sensor's internal processing pipeline, before
- * any pixel sub-sampling method, such as pixel binning, skipping and averaging
- * take place.
- */
-
-/**
- * \var CameraSensorInfo::outputSize
- * \brief The size of the images produced by the camera sensor
- *
- * The output image size defines the horizontal and vertical sizes of the images
- * produced by the image sensor. The output image size is defined as the end
- * result of the sensor's internal image processing pipeline stages, applied on
- * the pixel array portion defined by the analog crop rectangle. Each image
- * processing stage that performs pixel sub-sampling techniques, such as pixel
- * binning or skipping, or perform any additional digital scaling concur in the
- * definition of the output image size.
- */
-
-/**
- * \var CameraSensorInfo::pixelRate
- * \brief The number of pixels produced in a second
- *
- * To obtain the read-out time in seconds of a full line:
- *
- * \verbatim
-	lineDuration(s) = lineLength(pixels) / pixelRate(pixels per second)
-   \endverbatim
- */
-
-/**
- * \var CameraSensorInfo::lineLength
- * \brief Total line length in pixels
- *
- * The total line length in pixel clock periods, including blanking.
- */
-
-/**
- * \var CameraSensorInfo::minFrameLength
- * \brief The minimum allowable frame length in units of lines
- *
- * The sensor frame length comprises of active output lines and blanking lines
- * in a frame. The minimum frame length value dictates the minimum allowable
- * frame duration of the sensor mode.
- *
- * To obtain the minimum frame duration:
- *
- * \verbatim
-	frameDuration(s) = minFrameLength(lines) * lineLength(pixels) / pixelRate(pixels per second)
-   \endverbatim
- */
-
-/**
- * \var CameraSensorInfo::maxFrameLength
- * \brief The maximum allowable frame length in units of lines
- *
- * The sensor frame length comprises of active output lines and blanking lines
- * in a frame. The maximum frame length value dictates the maximum allowable
- * frame duration of the sensor mode.
- *
- * To obtain the maximum frame duration:
- *
- * \verbatim
-	frameDuration(s) = maxFrameLength(lines) * lineLength(pixels) / pixelRate(pixels per second)
-   \endverbatim
- */
-
 /**
  * \class CameraSensor
  * \brief A camera sensor based on V4L2 subdevices
@@ -316,7 +205,7 @@ int CameraSensor::validateSensorDriver()
 	 *
 	 * Failures in reading any of the targets are not deemed to be fatal,
 	 * but some properties and features, like constructing a
-	 * CameraSensorInfo for the IPA module, won't be supported.
+	 * IPACameraSensorInfo for the IPA module, won't be supported.
 	 *
 	 * \todo Make support for selection targets mandatory as soon as all
 	 * test platforms have been updated.
@@ -785,7 +674,7 @@ int CameraSensor::setControls(ControlList *ctrls)
  *
  * \return 0 on success, a negative error code otherwise
  */
-int CameraSensor::sensorInfo(CameraSensorInfo *info) const
+int CameraSensor::sensorInfo(IPACameraSensorInfo *info) const
 {
 	if (!bayerFormat_)
 		return -EINVAL;
@@ -812,7 +701,7 @@ int CameraSensor::sensorInfo(CameraSensorInfo *info) const
 	}
 
 	/*
-	 * CameraSensorInfo::analogCrop::x and CameraSensorInfo::analogCrop::y
+	 * IPACameraSensorInfo::analogCrop::x and IPACameraSensorInfo::analogCrop::y
 	 * are defined relatively to the active pixel area, while V4L2's
 	 * TGT_CROP target is defined in respect to the full pixel array.
 	 *
diff --git a/src/libcamera/pipeline/ipu3/ipu3.cpp b/src/libcamera/pipeline/ipu3/ipu3.cpp
index ade8ffbd..98c6160f 100644
--- a/src/libcamera/pipeline/ipu3/ipu3.cpp
+++ b/src/libcamera/pipeline/ipu3/ipu3.cpp
@@ -544,7 +544,7 @@ int PipelineHandlerIPU3::configure(Camera *camera, CameraConfiguration *c)
 	if (ret)
 		return ret;
 
-	CameraSensorInfo sensorInfo;
+	IPACameraSensorInfo sensorInfo;
 	cio2->sensor()->sensorInfo(&sensorInfo);
 	data->cropRegion_ = sensorInfo.analogCrop;
 
@@ -883,7 +883,7 @@ int PipelineHandlerIPU3::initControls(IPU3CameraData *data)
 	if (ret)
 		return ret;
 
-	CameraSensorInfo sensorInfo{};
+	IPACameraSensorInfo sensorInfo{};
 	ret = sensor->sensorInfo(&sensorInfo);
 	if (ret)
 		return ret;
diff --git a/src/libcamera/pipeline/raspberrypi/raspberrypi.cpp b/src/libcamera/pipeline/raspberrypi/raspberrypi.cpp
index 6fbdba04..f2a94dc0 100644
--- a/src/libcamera/pipeline/raspberrypi/raspberrypi.cpp
+++ b/src/libcamera/pipeline/raspberrypi/raspberrypi.cpp
@@ -211,7 +211,7 @@ public:
 	BayerFormat::Order nativeBayerOrder_;
 
 	/* For handling digital zoom. */
-	CameraSensorInfo sensorInfo_;
+	IPACameraSensorInfo sensorInfo_;
 	Rectangle ispCrop_; /* crop in ISP (camera mode) pixels */
 	Rectangle scalerCrop_; /* crop in sensor native pixels */
 	bool updateScalerCrop_;
@@ -1275,7 +1275,7 @@ int RPiCameraData::configureIPA(const CameraConfiguration *config)
 		ipaConfig.lsTableHandle = lsTable_;
 	}
 
-	/* We store the CameraSensorInfo for digital zoom calculations. */
+	/* We store the IPACameraSensorInfo for digital zoom calculations. */
 	int ret = sensor_->sensorInfo(&sensorInfo_);
 	if (ret) {
 		LOG(RPI, Error) << "Failed to retrieve camera sensor info";
diff --git a/src/libcamera/pipeline/rkisp1/rkisp1.cpp b/src/libcamera/pipeline/rkisp1/rkisp1.cpp
index adebe8b5..6699839c 100644
--- a/src/libcamera/pipeline/rkisp1/rkisp1.cpp
+++ b/src/libcamera/pipeline/rkisp1/rkisp1.cpp
@@ -648,7 +648,7 @@ int PipelineHandlerRkISP1::configure(Camera *camera, CameraConfiguration *c)
 		return ret;
 
 	/* Inform IPA of stream configuration and sensor controls. */
-	CameraSensorInfo sensorInfo = {};
+	IPACameraSensorInfo sensorInfo = {};
 	ret = data->sensor_->sensorInfo(&sensorInfo);
 	if (ret) {
 		/* \todo Turn this into a hard failure. */
