[v4,03/11] libcamera: formats: Add a helper to check for a raw pixel format
diff mbox series

Message ID 20250407085639.16180-4-mzamazal@redhat.com
State New
Headers show
Series
  • Enable raw streams with software ISP
Related show

Commit Message

Milan Zamazal April 7, 2025, 8:56 a.m. UTC
There are several places with the same pattern to check whether a given
pixel format is a raw format:

  return libcamera::PixelFormatInfo::info(pixFmt).colourEncoding ==
         libcamera::PixelFormatInfo::ColourEncodingRAW;

Let's move the corresponding isFormatRaw helper from mali-c55.cpp to
formats.cpp and use it where applicable.  This also avoids a need to
introduce the same helper (or the same pattern) in the followup patches.

Signed-off-by: Milan Zamazal <mzamazal@redhat.com>
---
 include/libcamera/internal/formats.h         |  2 ++
 src/libcamera/formats.cpp                    | 11 +++++++++++
 src/libcamera/pipeline/imx8-isi/imx8-isi.cpp |  4 ++--
 src/libcamera/pipeline/mali-c55/mali-c55.cpp | 10 ----------
 src/libcamera/pipeline/rkisp1/rkisp1.cpp     |  7 ++-----
 5 files changed, 17 insertions(+), 17 deletions(-)

Comments

Barnabás Pőcze May 9, 2025, 10:59 a.m. UTC | #1
Hi

2025. 04. 07. 10:56 keltezéssel, Milan Zamazal írta:
> There are several places with the same pattern to check whether a given
> pixel format is a raw format:
> 
>    return libcamera::PixelFormatInfo::info(pixFmt).colourEncoding ==
>           libcamera::PixelFormatInfo::ColourEncodingRAW;
> 
> Let's move the corresponding isFormatRaw helper from mali-c55.cpp to
> formats.cpp and use it where applicable.  This also avoids a need to
> introduce the same helper (or the same pattern) in the followup patches.

As far as I can see, there are a lot of other places where this check is "open coded",
I believe either all of them or none of them should be replaced. For example,
`IPARkISP1::configure()`, `ISICameraConfiguration::validate()`,
`IPU3CameraConfiguration::validate()`, etc.

And there is also `PipelineHandlerBase::isRaw()` in the rpi pipeline.

I am wondering if adding `PixelFormatInfo::isRaw()` could be useful as well.


Regards,
Barnabás Pőcze


> 
> Signed-off-by: Milan Zamazal <mzamazal@redhat.com>
> ---
>   include/libcamera/internal/formats.h         |  2 ++
>   src/libcamera/formats.cpp                    | 11 +++++++++++
>   src/libcamera/pipeline/imx8-isi/imx8-isi.cpp |  4 ++--
>   src/libcamera/pipeline/mali-c55/mali-c55.cpp | 10 ----------
>   src/libcamera/pipeline/rkisp1/rkisp1.cpp     |  7 ++-----
>   5 files changed, 17 insertions(+), 17 deletions(-)
> 
> diff --git a/include/libcamera/internal/formats.h b/include/libcamera/internal/formats.h
> index 6a3e9c16..bc4417d0 100644
> --- a/include/libcamera/internal/formats.h
> +++ b/include/libcamera/internal/formats.h
> @@ -62,4 +62,6 @@ public:
>   	std::array<Plane, 3> planes;
>   };
>   
> +bool isFormatRaw(const libcamera::PixelFormat &pixFmt);
> +
>   } /* namespace libcamera */
> diff --git a/src/libcamera/formats.cpp b/src/libcamera/formats.cpp
> index bfcdfc08..c6e0a262 100644
> --- a/src/libcamera/formats.cpp
> +++ b/src/libcamera/formats.cpp
> @@ -1215,4 +1215,15 @@ unsigned int PixelFormatInfo::numPlanes() const
>   	return count;
>   }
>   
> +/**
> + * \brief Return whether the given pixel format is a raw format
> + * \param[in] pixFmt The pixel format to examine
> + * \return True iff the given format is a raw format
> + */
> +bool isFormatRaw(const libcamera::PixelFormat &pixFmt)
> +{
> +	return libcamera::PixelFormatInfo::info(pixFmt).colourEncoding ==
> +	       libcamera::PixelFormatInfo::ColourEncodingRAW;
> +}
> +
>   } /* namespace libcamera */
> diff --git a/src/libcamera/pipeline/imx8-isi/imx8-isi.cpp b/src/libcamera/pipeline/imx8-isi/imx8-isi.cpp
> index 4e66b336..9ff11a41 100644
> --- a/src/libcamera/pipeline/imx8-isi/imx8-isi.cpp
> +++ b/src/libcamera/pipeline/imx8-isi/imx8-isi.cpp
> @@ -24,6 +24,7 @@
>   #include "libcamera/internal/camera.h"
>   #include "libcamera/internal/camera_sensor.h"
>   #include "libcamera/internal/device_enumerator.h"
> +#include "libcamera/internal/formats.h"
>   #include "libcamera/internal/media_device.h"
>   #include "libcamera/internal/pipeline_handler.h"
>   #include "libcamera/internal/v4l2_subdevice.h"
> @@ -312,8 +313,7 @@ unsigned int ISICameraData::getYuvMediaBusFormat(const PixelFormat &pixelFormat)
>   
>   unsigned int ISICameraData::getMediaBusFormat(PixelFormat *pixelFormat) const
>   {
> -	if (PixelFormatInfo::info(*pixelFormat).colourEncoding ==
> -	    PixelFormatInfo::ColourEncodingRAW)
> +	if (isFormatRaw(*pixelFormat))
>   		return getRawMediaBusFormat(pixelFormat);
>   
>   	return getYuvMediaBusFormat(*pixelFormat);
> diff --git a/src/libcamera/pipeline/mali-c55/mali-c55.cpp b/src/libcamera/pipeline/mali-c55/mali-c55.cpp
> index a05e11fc..3721fb30 100644
> --- a/src/libcamera/pipeline/mali-c55/mali-c55.cpp
> +++ b/src/libcamera/pipeline/mali-c55/mali-c55.cpp
> @@ -42,16 +42,6 @@
>   #include "libcamera/internal/v4l2_subdevice.h"
>   #include "libcamera/internal/v4l2_videodevice.h"
>   
> -namespace {
> -
> -bool isFormatRaw(const libcamera::PixelFormat &pixFmt)
> -{
> -	return libcamera::PixelFormatInfo::info(pixFmt).colourEncoding ==
> -	       libcamera::PixelFormatInfo::ColourEncodingRAW;
> -}
> -
> -} /* namespace */
> -
>   namespace libcamera {
>   
>   LOG_DEFINE_CATEGORY(MaliC55)
> diff --git a/src/libcamera/pipeline/rkisp1/rkisp1.cpp b/src/libcamera/pipeline/rkisp1/rkisp1.cpp
> index 52633fe3..a5b613bb 100644
> --- a/src/libcamera/pipeline/rkisp1/rkisp1.cpp
> +++ b/src/libcamera/pipeline/rkisp1/rkisp1.cpp
> @@ -536,8 +536,7 @@ CameraConfiguration::Status RkISP1CameraConfiguration::validate()
>   	 */
>   	if (config_.size() > 1) {
>   		for (const auto &cfg : config_) {
> -			if (PixelFormatInfo::info(cfg.pixelFormat).colourEncoding ==
> -			    PixelFormatInfo::ColourEncodingRAW) {
> +			if (isFormatRaw(cfg.pixelFormat)) {
>   				config_.resize(1);
>   				status = Adjusted;
>   				break;
> @@ -551,9 +550,7 @@ CameraConfiguration::Status RkISP1CameraConfiguration::validate()
>   		 * Platforms with dewarper support, such as i.MX8MP, support
>   		 * only a single stream. We can inspect config_[0] only here.
>   		 */
> -		bool isRaw = PixelFormatInfo::info(config_[0].pixelFormat).colourEncoding ==
> -			     PixelFormatInfo::ColourEncodingRAW;
> -		if (!isRaw)
> +		if (!isFormatRaw(config_[0].pixelFormat))
>   			useDewarper = true;
>   	}
>
Milan Zamazal May 13, 2025, 8:10 a.m. UTC | #2
Hi Barnabás,

thank you for review.

Barnabás Pőcze <barnabas.pocze@ideasonboard.com> writes:

> Hi
>
> 2025. 04. 07. 10:56 keltezéssel, Milan Zamazal írta:
>> There are several places with the same pattern to check whether a given
>> pixel format is a raw format:
>>    return libcamera::PixelFormatInfo::info(pixFmt).colourEncoding ==
>>           libcamera::PixelFormatInfo::ColourEncodingRAW;
>> Let's move the corresponding isFormatRaw helper from mali-c55.cpp to
>> formats.cpp and use it where applicable.  This also avoids a need to
>> introduce the same helper (or the same pattern) in the followup patches.
>
> As far as I can see, there are a lot of other places where this check is "open coded",
> I believe either all of them or none of them should be replaced. For example,
> `IPARkISP1::configure()`, `ISICameraConfiguration::validate()`,
> `IPU3CameraConfiguration::validate()`, etc.
>
> And there is also `PipelineHandlerBase::isRaw()` in the rpi pipeline.

IIRC I tried to replace only the given pattern and not simpler
constructs like when the info is already retrieved, to not complicate
the patches more than necessary.  But the rest can certainly be also
replaced, I can do it in v5 if there are no objections.

> I am wondering if adding `PixelFormatInfo::isRaw()` could be useful as well.

I think so, with the broader replacement.

> Regards,
> Barnabás Pőcze
>
>
>> Signed-off-by: Milan Zamazal <mzamazal@redhat.com>
>> ---
>>   include/libcamera/internal/formats.h         |  2 ++
>>   src/libcamera/formats.cpp                    | 11 +++++++++++
>>   src/libcamera/pipeline/imx8-isi/imx8-isi.cpp |  4 ++--
>>   src/libcamera/pipeline/mali-c55/mali-c55.cpp | 10 ----------
>>   src/libcamera/pipeline/rkisp1/rkisp1.cpp     |  7 ++-----
>>   5 files changed, 17 insertions(+), 17 deletions(-)
>> diff --git a/include/libcamera/internal/formats.h b/include/libcamera/internal/formats.h
>> index 6a3e9c16..bc4417d0 100644
>> --- a/include/libcamera/internal/formats.h
>> +++ b/include/libcamera/internal/formats.h
>> @@ -62,4 +62,6 @@ public:
>>   	std::array<Plane, 3> planes;
>>   };
>>   +bool isFormatRaw(const libcamera::PixelFormat &pixFmt);
>> +
>>   } /* namespace libcamera */
>> diff --git a/src/libcamera/formats.cpp b/src/libcamera/formats.cpp
>> index bfcdfc08..c6e0a262 100644
>> --- a/src/libcamera/formats.cpp
>> +++ b/src/libcamera/formats.cpp
>> @@ -1215,4 +1215,15 @@ unsigned int PixelFormatInfo::numPlanes() const
>>   	return count;
>>   }
>>   +/**
>> + * \brief Return whether the given pixel format is a raw format
>> + * \param[in] pixFmt The pixel format to examine
>> + * \return True iff the given format is a raw format
>> + */
>> +bool isFormatRaw(const libcamera::PixelFormat &pixFmt)
>> +{
>> +	return libcamera::PixelFormatInfo::info(pixFmt).colourEncoding ==
>> +	       libcamera::PixelFormatInfo::ColourEncodingRAW;
>> +}
>> +
>>   } /* namespace libcamera */
>> diff --git a/src/libcamera/pipeline/imx8-isi/imx8-isi.cpp b/src/libcamera/pipeline/imx8-isi/imx8-isi.cpp
>> index 4e66b336..9ff11a41 100644
>> --- a/src/libcamera/pipeline/imx8-isi/imx8-isi.cpp
>> +++ b/src/libcamera/pipeline/imx8-isi/imx8-isi.cpp
>> @@ -24,6 +24,7 @@
>>   #include "libcamera/internal/camera.h"
>>   #include "libcamera/internal/camera_sensor.h"
>>   #include "libcamera/internal/device_enumerator.h"
>> +#include "libcamera/internal/formats.h"
>>   #include "libcamera/internal/media_device.h"
>>   #include "libcamera/internal/pipeline_handler.h"
>>   #include "libcamera/internal/v4l2_subdevice.h"
>> @@ -312,8 +313,7 @@ unsigned int ISICameraData::getYuvMediaBusFormat(const PixelFormat &pixelFormat)
>>     unsigned int ISICameraData::getMediaBusFormat(PixelFormat *pixelFormat) const
>>   {
>> -	if (PixelFormatInfo::info(*pixelFormat).colourEncoding ==
>> -	    PixelFormatInfo::ColourEncodingRAW)
>> +	if (isFormatRaw(*pixelFormat))
>>   		return getRawMediaBusFormat(pixelFormat);
>>     	return getYuvMediaBusFormat(*pixelFormat);
>> diff --git a/src/libcamera/pipeline/mali-c55/mali-c55.cpp b/src/libcamera/pipeline/mali-c55/mali-c55.cpp
>> index a05e11fc..3721fb30 100644
>> --- a/src/libcamera/pipeline/mali-c55/mali-c55.cpp
>> +++ b/src/libcamera/pipeline/mali-c55/mali-c55.cpp
>> @@ -42,16 +42,6 @@
>>   #include "libcamera/internal/v4l2_subdevice.h"
>>   #include "libcamera/internal/v4l2_videodevice.h"
>>   -namespace {
>> -
>> -bool isFormatRaw(const libcamera::PixelFormat &pixFmt)
>> -{
>> -	return libcamera::PixelFormatInfo::info(pixFmt).colourEncoding ==
>> -	       libcamera::PixelFormatInfo::ColourEncodingRAW;
>> -}
>> -
>> -} /* namespace */
>> -
>>   namespace libcamera {
>>     LOG_DEFINE_CATEGORY(MaliC55)
>> diff --git a/src/libcamera/pipeline/rkisp1/rkisp1.cpp b/src/libcamera/pipeline/rkisp1/rkisp1.cpp
>> index 52633fe3..a5b613bb 100644
>> --- a/src/libcamera/pipeline/rkisp1/rkisp1.cpp
>> +++ b/src/libcamera/pipeline/rkisp1/rkisp1.cpp
>> @@ -536,8 +536,7 @@ CameraConfiguration::Status RkISP1CameraConfiguration::validate()
>>   	 */
>>   	if (config_.size() > 1) {
>>   		for (const auto &cfg : config_) {
>> -			if (PixelFormatInfo::info(cfg.pixelFormat).colourEncoding ==
>> -			    PixelFormatInfo::ColourEncodingRAW) {
>> +			if (isFormatRaw(cfg.pixelFormat)) {
>>   				config_.resize(1);
>>   				status = Adjusted;
>>   				break;
>> @@ -551,9 +550,7 @@ CameraConfiguration::Status RkISP1CameraConfiguration::validate()
>>   		 * Platforms with dewarper support, such as i.MX8MP, support
>>   		 * only a single stream. We can inspect config_[0] only here.
>>   		 */
>> -		bool isRaw = PixelFormatInfo::info(config_[0].pixelFormat).colourEncoding ==
>> -			     PixelFormatInfo::ColourEncodingRAW;
>> -		if (!isRaw)
>> +		if (!isFormatRaw(config_[0].pixelFormat))
>>   			useDewarper = true;
>>   	}
>>
Kieran Bingham May 13, 2025, 11:07 a.m. UTC | #3
Quoting Milan Zamazal (2025-05-13 09:10:08)
> Hi Barnabás,
> 
> thank you for review.
> 
> Barnabás Pőcze <barnabas.pocze@ideasonboard.com> writes:
> 
> > Hi
> >
> > 2025. 04. 07. 10:56 keltezéssel, Milan Zamazal írta:
> >> There are several places with the same pattern to check whether a given
> >> pixel format is a raw format:
> >>    return libcamera::PixelFormatInfo::info(pixFmt).colourEncoding ==
> >>           libcamera::PixelFormatInfo::ColourEncodingRAW;
> >> Let's move the corresponding isFormatRaw helper from mali-c55.cpp to
> >> formats.cpp and use it where applicable.  This also avoids a need to
> >> introduce the same helper (or the same pattern) in the followup patches.
> >
> > As far as I can see, there are a lot of other places where this check is "open coded",
> > I believe either all of them or none of them should be replaced. For example,
> > `IPARkISP1::configure()`, `ISICameraConfiguration::validate()`,
> > `IPU3CameraConfiguration::validate()`, etc.
> >
> > And there is also `PipelineHandlerBase::isRaw()` in the rpi pipeline.
> 
> IIRC I tried to replace only the given pattern and not simpler
> constructs like when the info is already retrieved, to not complicate
> the patches more than necessary.  But the rest can certainly be also
> replaced, I can do it in v5 if there are no objections.
> 
> > I am wondering if adding `PixelFormatInfo::isRaw()` could be useful as well.
> 
> I think so, with the broader replacement.

I'm sure I recall this used to be a global helper - and somehow/ for
some reason it got moved to being handled by pipeline handlers
specfically. I think the intention was that pipeline handlers would know
which formats are raw or not ... but I can't find anything specific in
the history yet..

Even if that was the case, maybe that needs to be revisited if in the
end every pipeline handler ends up implementing it in exactly the same
way...

--
Kieran


> 
> > Regards,
> > Barnabás Pőcze
> >
> >
> >>   +/**
> >> + * \brief Return whether the given pixel format is a raw format
> >> + * \param[in] pixFmt The pixel format to examine
> >> + * \return True iff the given format is a raw format
> >> + */
> >> +bool isFormatRaw(const libcamera::PixelFormat &pixFmt)
> >> +{
> >> +    return libcamera::PixelFormatInfo::info(pixFmt).colourEncoding ==
> >> +           libcamera::PixelFormatInfo::ColourEncodingRAW;
> >> +}
> >> +

Patch
diff mbox series

diff --git a/include/libcamera/internal/formats.h b/include/libcamera/internal/formats.h
index 6a3e9c16..bc4417d0 100644
--- a/include/libcamera/internal/formats.h
+++ b/include/libcamera/internal/formats.h
@@ -62,4 +62,6 @@  public:
 	std::array<Plane, 3> planes;
 };
 
+bool isFormatRaw(const libcamera::PixelFormat &pixFmt);
+
 } /* namespace libcamera */
diff --git a/src/libcamera/formats.cpp b/src/libcamera/formats.cpp
index bfcdfc08..c6e0a262 100644
--- a/src/libcamera/formats.cpp
+++ b/src/libcamera/formats.cpp
@@ -1215,4 +1215,15 @@  unsigned int PixelFormatInfo::numPlanes() const
 	return count;
 }
 
+/**
+ * \brief Return whether the given pixel format is a raw format
+ * \param[in] pixFmt The pixel format to examine
+ * \return True iff the given format is a raw format
+ */
+bool isFormatRaw(const libcamera::PixelFormat &pixFmt)
+{
+	return libcamera::PixelFormatInfo::info(pixFmt).colourEncoding ==
+	       libcamera::PixelFormatInfo::ColourEncodingRAW;
+}
+
 } /* namespace libcamera */
diff --git a/src/libcamera/pipeline/imx8-isi/imx8-isi.cpp b/src/libcamera/pipeline/imx8-isi/imx8-isi.cpp
index 4e66b336..9ff11a41 100644
--- a/src/libcamera/pipeline/imx8-isi/imx8-isi.cpp
+++ b/src/libcamera/pipeline/imx8-isi/imx8-isi.cpp
@@ -24,6 +24,7 @@ 
 #include "libcamera/internal/camera.h"
 #include "libcamera/internal/camera_sensor.h"
 #include "libcamera/internal/device_enumerator.h"
+#include "libcamera/internal/formats.h"
 #include "libcamera/internal/media_device.h"
 #include "libcamera/internal/pipeline_handler.h"
 #include "libcamera/internal/v4l2_subdevice.h"
@@ -312,8 +313,7 @@  unsigned int ISICameraData::getYuvMediaBusFormat(const PixelFormat &pixelFormat)
 
 unsigned int ISICameraData::getMediaBusFormat(PixelFormat *pixelFormat) const
 {
-	if (PixelFormatInfo::info(*pixelFormat).colourEncoding ==
-	    PixelFormatInfo::ColourEncodingRAW)
+	if (isFormatRaw(*pixelFormat))
 		return getRawMediaBusFormat(pixelFormat);
 
 	return getYuvMediaBusFormat(*pixelFormat);
diff --git a/src/libcamera/pipeline/mali-c55/mali-c55.cpp b/src/libcamera/pipeline/mali-c55/mali-c55.cpp
index a05e11fc..3721fb30 100644
--- a/src/libcamera/pipeline/mali-c55/mali-c55.cpp
+++ b/src/libcamera/pipeline/mali-c55/mali-c55.cpp
@@ -42,16 +42,6 @@ 
 #include "libcamera/internal/v4l2_subdevice.h"
 #include "libcamera/internal/v4l2_videodevice.h"
 
-namespace {
-
-bool isFormatRaw(const libcamera::PixelFormat &pixFmt)
-{
-	return libcamera::PixelFormatInfo::info(pixFmt).colourEncoding ==
-	       libcamera::PixelFormatInfo::ColourEncodingRAW;
-}
-
-} /* namespace */
-
 namespace libcamera {
 
 LOG_DEFINE_CATEGORY(MaliC55)
diff --git a/src/libcamera/pipeline/rkisp1/rkisp1.cpp b/src/libcamera/pipeline/rkisp1/rkisp1.cpp
index 52633fe3..a5b613bb 100644
--- a/src/libcamera/pipeline/rkisp1/rkisp1.cpp
+++ b/src/libcamera/pipeline/rkisp1/rkisp1.cpp
@@ -536,8 +536,7 @@  CameraConfiguration::Status RkISP1CameraConfiguration::validate()
 	 */
 	if (config_.size() > 1) {
 		for (const auto &cfg : config_) {
-			if (PixelFormatInfo::info(cfg.pixelFormat).colourEncoding ==
-			    PixelFormatInfo::ColourEncodingRAW) {
+			if (isFormatRaw(cfg.pixelFormat)) {
 				config_.resize(1);
 				status = Adjusted;
 				break;
@@ -551,9 +550,7 @@  CameraConfiguration::Status RkISP1CameraConfiguration::validate()
 		 * Platforms with dewarper support, such as i.MX8MP, support
 		 * only a single stream. We can inspect config_[0] only here.
 		 */
-		bool isRaw = PixelFormatInfo::info(config_[0].pixelFormat).colourEncoding ==
-			     PixelFormatInfo::ColourEncodingRAW;
-		if (!isRaw)
+		if (!isFormatRaw(config_[0].pixelFormat))
 			useDewarper = true;
 	}