[libcamera-devel] [PATCH v3 3/6] libcamera: imx8-isi: Automatically select media bus code

Jacopo Mondi jacopo.mondi at ideasonboard.com
Thu Apr 27 16:47:37 CEST 2023


The ISICameraConfiguration::validate() function selects which media
bus format to configure the sensor with based on the pixel format
of the first configured stream using the media bus code associated to it
in the formatsMap_ map.

In order to remove the PixelFormamt-to-mbus-code association in
formatsMap_ provide a wrapper function for the newly introduced
getRawMediaBusFormat() and getYuvMediaBusFormat() that automatically
selects what media bus format to use based on the first stream pixel
format.

Signed-off-by: Jacopo Mondi <jacopo.mondi at ideasonboard.com>
Reviewed-by: Paul Elder <paul.elder at ideasonboard.com>
Reviewed-by: Daniel Scally <dan.scally at ideasonboard.com>
Tested-by: Daniel Scally <dan.scally at ideasonboard.com>
Reviewed-by: Laurent Pinchart <laurent.pinchart at ideasonboard.com>
---
 src/libcamera/pipeline/imx8-isi/imx8-isi.cpp | 16 +++++++++++++---
 1 file changed, 13 insertions(+), 3 deletions(-)

diff --git a/src/libcamera/pipeline/imx8-isi/imx8-isi.cpp b/src/libcamera/pipeline/imx8-isi/imx8-isi.cpp
index 148f108d630f..ee3dc4ad4d3e 100644
--- a/src/libcamera/pipeline/imx8-isi/imx8-isi.cpp
+++ b/src/libcamera/pipeline/imx8-isi/imx8-isi.cpp
@@ -61,6 +61,7 @@ public:
 
 	unsigned int getRawMediaBusFormat(PixelFormat *pixelFormat) const;
 	unsigned int getYuvMediaBusFormat(const PixelFormat &pixelFormat) const;
+	unsigned int getMediaBusFormat(PixelFormat *pixelFormat) const;
 
 	std::unique_ptr<CameraSensor> sensor_;
 	std::unique_ptr<V4L2Subdevice> csis_;
@@ -318,6 +319,15 @@ unsigned int ISICameraData::getYuvMediaBusFormat(const PixelFormat &pixelFormat)
 	return supportedCodes[0];
 }
 
+unsigned int ISICameraData::getMediaBusFormat(PixelFormat *pixelFormat) const
+{
+	if (PixelFormatInfo::info(*pixelFormat).colourEncoding ==
+	    PixelFormatInfo::ColourEncodingRAW)
+		return getRawMediaBusFormat(pixelFormat);
+
+	return getYuvMediaBusFormat(*pixelFormat);
+}
+
 /* -----------------------------------------------------------------------------
  * Camera Configuration
  */
@@ -631,16 +641,16 @@ CameraConfiguration::Status ISICameraConfiguration::validate()
 	 * image quality in exchange of a usually slower frame rate.
 	 * Usage of the STILL_CAPTURE role could be consider for this.
 	 */
-	const PipeFormat &pipeFmt = formatsMap_.at(config_[0].pixelFormat);
-
 	Size maxSize;
 	for (const auto &cfg : config_) {
 		if (cfg.size > maxSize)
 			maxSize = cfg.size;
 	}
 
+	PixelFormat pixelFormat = config_[0].pixelFormat;
+
 	V4L2SubdeviceFormat sensorFormat{};
-	sensorFormat.mbus_code = pipeFmt.sensorCode;
+	sensorFormat.mbus_code = data_->getMediaBusFormat(&pixelFormat);
 	sensorFormat.size = maxSize;
 
 	LOG(ISI, Debug) << "Computed sensor configuration: " << sensorFormat;
-- 
2.40.0



More information about the libcamera-devel mailing list