[libcamera-devel] [RFC PATCH v2 0/7] libcamera: introduce Software ISP and Software IPA

Pavel Machek pavel at ucw.cz
Tue Dec 12 18:43:46 CET 2023


Hi!

> Here is a draft implementation of Software ISP and Software IPA
> which provide debayering and implementation of image processing
> algorithms for systems without a hardware ISP, or in cases when
> there are no public drivers for the hardware ISP present in the
> system.

After tweaks to support 8-bit it works for me and is quite useful on
PinePhone.

IMO something needs fixing in
SimplePipelineHandler::generateConfiguration, otherwise code will
sigsegv when suitable formats are not available.

Tested-by: Pavel Machek <pavel at ucw.cz>

Best regards,
								Pavel

commit a9966b193ebe4c9624e00a962ba17786a1aeaad5
Author: Pavel Machek <pavel at ucw.cz>
Date:   Tue Dec 5 13:01:54 2023 +0100

    b8: Got 8-bit bayer to work.

diff --git a/include/libcamera/internal/software_isp/swisp_linaro.h b/include/libcamera/internal/software_isp/swisp_linaro.h
index c0df7863..f7fc7682 100644
--- a/include/libcamera/internal/software_isp/swisp_linaro.h
+++ b/include/libcamera/internal/software_isp/swisp_linaro.h
@@ -89,6 +89,11 @@ private:
 		int setDebayerInfo(PixelFormat format);
 		debayerInfo *debayerInfo_;
 
+	  	void debayerRaw(uint8_t *dst, const uint8_t *src, bool is10p);
+	  
+		/* Bayer 8 */
+		void debayerRaw8(uint8_t *dst, const uint8_t *src);
+
 		/* CSI-2 packed 10-bit raw bayer format (all the 4 orders) */
 		void debayerRaw10P(uint8_t *dst, const uint8_t *src);
 		static SizeRange outSizesRaw10P(const Size &inSize);
diff --git a/src/libcamera/pipeline/simple/simple.cpp b/src/libcamera/pipeline/simple/simple.cpp
index b95d7689..4561961e 100644
--- a/src/libcamera/pipeline/simple/simple.cpp
+++ b/src/libcamera/pipeline/simple/simple.cpp
@@ -1137,6 +1137,14 @@ SimplePipelineHandler::generateConfiguration(Camera *camera, Span<const StreamRo
 	 */
 	for ([[maybe_unused]] StreamRole role : roles) {
 		StreamConfiguration cfg{ StreamFormats{ formats } };
+		if (! formats.begin()->first) {
+		  LOG(SimplePipeline, Error)
+			<< "No formats -- first?";
+		  continue;
+		}
+		  LOG(SimplePipeline, Error)
+			<< "Going through roles?";
+
 		cfg.pixelFormat = formats.begin()->first;
 		cfg.size = formats.begin()->second[0].max;
 
diff --git a/src/libcamera/software_isp/swisp_linaro.cpp b/src/libcamera/software_isp/swisp_linaro.cpp
index b7f36db1..0255ce85 100644
--- a/src/libcamera/software_isp/swisp_linaro.cpp
+++ b/src/libcamera/software_isp/swisp_linaro.cpp
@@ -88,7 +88,7 @@ bool SwIspLinaro::isValid() const
  * \todo Split the stats calculations out of this function.
  * \todo Move the AWB algorithm into the IPA module.
  */
-void SwIspLinaro::IspWorker::debayerRaw10P(uint8_t *dst, const uint8_t *src)
+void SwIspLinaro::IspWorker::debayerRaw(uint8_t *dst, const uint8_t *src, bool is10p)
 {
 	/* for brightness values in the 0 to 255 range: */
 	static const unsigned int BRIGHT_LVL = 200U << 8;
@@ -118,9 +118,15 @@ void SwIspLinaro::IspWorker::debayerRaw10P(uint8_t *dst, const uint8_t *src)
 			int phase = 2 * phase_y + phase_x;
 
 			/* x part of the offset in the input buffer: */
-			int x_m1 = x + x / 4;		/* offset for (x-1) */
-			int x_0 = x + 1 + (x + 1) / 4;	/* offset for x */
-			int x_p1 = x + 2 + (x + 2) / 4;	/* offset for (x+1) */
+			int x_m1 = x;		/* offset for (x-1) */
+			int x_0 = x + 1;	/* offset for x */
+			int x_p1 = x + 2;	/* offset for (x+1) */
+
+			if (is10p) {
+				x_m1 += x_m1 / 4;	/* offset for (x-1) */
+				x_0 += x_0 / 4;	/* offset for x */
+				x_p1 += x_p1 / 4;	/* offset for (x+1) */
+			}
 			/* the colour component value to write to the output */
 			unsigned val;
 			/* Y value times 256 */
@@ -267,6 +273,16 @@ void SwIspLinaro::IspWorker::debayerRaw10P(uint8_t *dst, const uint8_t *src)
 		<< " (minDenom = " << minDenom << ")";
 }
 
+void SwIspLinaro::IspWorker::debayerRaw10P(uint8_t *dst, const uint8_t *src)
+{
+	debayerRaw(dst, src, true);
+}
+
+void SwIspLinaro::IspWorker::debayerRaw8(uint8_t *dst, const uint8_t *src)
+{
+	debayerRaw(dst, src, false);
+}
+
 SizeRange SwIspLinaro::IspWorker::outSizesRaw10P(const Size &inSize)
 {
 	if (inSize.width < 2 || inSize.height < 2) {
@@ -286,6 +302,10 @@ unsigned int SwIspLinaro::IspWorker::outStrideRaw10P(const Size &outSize)
 SwIspLinaro::IspWorker::IspWorker(SwIspLinaro *swIsp)
 	: swIsp_(swIsp)
 {
+	debayerInfos_[formats::SBGGR8] = { formats::RGB888,
+						  &SwIspLinaro::IspWorker::debayerRaw8,
+						  &SwIspLinaro::IspWorker::outSizesRaw10P,
+						  &SwIspLinaro::IspWorker::outStrideRaw10P };
 	debayerInfos_[formats::SBGGR10_CSI2P] = { formats::RGB888,
 						  &SwIspLinaro::IspWorker::debayerRaw10P,
 						  &SwIspLinaro::IspWorker::outSizesRaw10P,


-- 
People of Russia, stop Putin before his war on Ukraine escalates.
-------------- next part --------------
A non-text attachment was scrubbed...
Name: signature.asc
Type: application/pgp-signature
Size: 195 bytes
Desc: not available
URL: <https://lists.libcamera.org/pipermail/libcamera-devel/attachments/20231212/fb057669/attachment.sig>


More information about the libcamera-devel mailing list