[libcamera-devel,PATCH/RFC,10/11] libcamera: pipeline: Replace explicit DRM FourCCs with libcamera formats

Message ID 20200522145459.16836-12-laurent.pinchart@ideasonboard.com
State Superseded
Headers show
Series
  • Introduce formats:: namespace for libcamera pixel formats
Related show

Commit Message

Laurent Pinchart May 22, 2020, 2:54 p.m. UTC
Use the new pixel format constants to replace usage of macros from
drm_fourcc.h.

The IPU3 pipeline handler still uses DRM FourCCs for IPU3-specific
formats that are not defined in the libcamera public API.

Signed-off-by: Laurent Pinchart <laurent.pinchart@ideasonboard.com>
---
 src/libcamera/pipeline/ipu3/ipu3.cpp          |  8 +++++---
 .../pipeline/raspberrypi/raspberrypi.cpp      | 10 +++++-----
 src/libcamera/pipeline/rkisp1/rkisp1.cpp      | 19 ++++++++++---------
 src/libcamera/pipeline/vimc/vimc.cpp          | 11 ++++++-----
 4 files changed, 26 insertions(+), 22 deletions(-)

Comments

Kieran Bingham May 28, 2020, 10:16 a.m. UTC | #1
Hi Laurent,

On 22/05/2020 15:54, Laurent Pinchart wrote:
> Use the new pixel format constants to replace usage of macros from
> drm_fourcc.h.
> 
> The IPU3 pipeline handler still uses DRM FourCCs for IPU3-specific
> formats that are not defined in the libcamera public API.

If the header is (mostly)automatically generated from the drm_fourcc,
would it then be available? (I.e. ... should we define it? or leave it)

Otherwise, would it make sense to add a comment to that usage to state
/why/ we use the DRM format directly for any casual reader who suddenly
sees a DRM_FORMAT_ out of the blue (and which differs from the rest of
the code base)

Either-way,

Reviewed-by: Kieran Bingham <kieran.bingham@ideasonboard.com>

> 
> Signed-off-by: Laurent Pinchart <laurent.pinchart@ideasonboard.com>
> ---
>  src/libcamera/pipeline/ipu3/ipu3.cpp          |  8 +++++---
>  .../pipeline/raspberrypi/raspberrypi.cpp      | 10 +++++-----
>  src/libcamera/pipeline/rkisp1/rkisp1.cpp      | 19 ++++++++++---------
>  src/libcamera/pipeline/vimc/vimc.cpp          | 11 ++++++-----
>  4 files changed, 26 insertions(+), 22 deletions(-)
> 
> diff --git a/src/libcamera/pipeline/ipu3/ipu3.cpp b/src/libcamera/pipeline/ipu3/ipu3.cpp
> index b805fea71c2d..f23f338d4eb7 100644
> --- a/src/libcamera/pipeline/ipu3/ipu3.cpp
> +++ b/src/libcamera/pipeline/ipu3/ipu3.cpp
> @@ -11,9 +11,11 @@
>  #include <queue>
>  #include <vector>
>  
> +#include <linux/drm_fourcc.h>
>  #include <linux/media-bus-format.h>
>  
>  #include <libcamera/camera.h>
> +#include <libcamera/formats.h>
>  #include <libcamera/request.h>
>  #include <libcamera/stream.h>
>  
> @@ -261,7 +263,7 @@ IPU3CameraConfiguration::IPU3CameraConfiguration(Camera *camera,
>  void IPU3CameraConfiguration::adjustStream(StreamConfiguration &cfg, bool scale)
>  {
>  	/* The only pixel format the driver supports is NV12. */
> -	cfg.pixelFormat = PixelFormat(DRM_FORMAT_NV12);
> +	cfg.pixelFormat = formats::NV12;
>  
>  	if (scale) {
>  		/*
> @@ -430,7 +432,7 @@ CameraConfiguration *PipelineHandlerIPU3::generateConfiguration(Camera *camera,
>  		StreamConfiguration cfg = {};
>  		IPU3Stream *stream = nullptr;
>  
> -		cfg.pixelFormat = PixelFormat(DRM_FORMAT_NV12);
> +		cfg.pixelFormat = formats::NV12;
>  
>  		switch (role) {
>  		case StreamRole::StillCapture:
> @@ -1193,7 +1195,7 @@ int ImgUDevice::configureOutput(ImgUOutput *output,
>  		return 0;
>  
>  	*outputFormat = {};
> -	outputFormat->fourcc = dev->toV4L2PixelFormat(PixelFormat(DRM_FORMAT_NV12));
> +	outputFormat->fourcc = dev->toV4L2PixelFormat(formats::NV12);
>  	outputFormat->size = cfg.size;
>  	outputFormat->planesCount = 2;
>  
> diff --git a/src/libcamera/pipeline/raspberrypi/raspberrypi.cpp b/src/libcamera/pipeline/raspberrypi/raspberrypi.cpp
> index e16a9c7f10d3..d3d11f87ecb5 100644
> --- a/src/libcamera/pipeline/raspberrypi/raspberrypi.cpp
> +++ b/src/libcamera/pipeline/raspberrypi/raspberrypi.cpp
> @@ -13,12 +13,12 @@
>  
>  #include <libcamera/camera.h>
>  #include <libcamera/control_ids.h>
> +#include <libcamera/formats.h>
>  #include <libcamera/ipa/raspberrypi.h>
>  #include <libcamera/logging.h>
>  #include <libcamera/request.h>
>  #include <libcamera/stream.h>
>  
> -#include <linux/drm_fourcc.h>
>  #include <linux/videodev2.h>
>  
>  #include "libcamera/internal/camera_sensor.h"
> @@ -490,7 +490,7 @@ CameraConfiguration::Status RPiCameraConfiguration::validate()
>  
>  		if (fmts.find(V4L2PixelFormat::fromPixelFormat(cfgPixFmt, false)) == fmts.end()) {
>  			/* If we cannot find a native format, use a default one. */
> -			cfgPixFmt = PixelFormat(DRM_FORMAT_NV12);
> +			cfgPixFmt = formats::NV12;
>  			status = Adjusted;
>  		}
>  	}
> @@ -537,20 +537,20 @@ CameraConfiguration *PipelineHandlerRPi::generateConfiguration(Camera *camera,
>  			break;
>  
>  		case StreamRole::StillCapture:
> -			cfg.pixelFormat = PixelFormat(DRM_FORMAT_NV12);
> +			cfg.pixelFormat = formats::NV12;
>  			/* Return the largest sensor resolution. */
>  			cfg.size = data->sensor_->resolution();
>  			cfg.bufferCount = 1;
>  			break;
>  
>  		case StreamRole::VideoRecording:
> -			cfg.pixelFormat = PixelFormat(DRM_FORMAT_NV12);
> +			cfg.pixelFormat = formats::NV12;
>  			cfg.size = { 1920, 1080 };
>  			cfg.bufferCount = 4;
>  			break;
>  
>  		case StreamRole::Viewfinder:
> -			cfg.pixelFormat = PixelFormat(DRM_FORMAT_ARGB8888);
> +			cfg.pixelFormat = formats::ARGB8888;
>  			cfg.size = { 800, 600 };
>  			cfg.bufferCount = 4;
>  			break;
> diff --git a/src/libcamera/pipeline/rkisp1/rkisp1.cpp b/src/libcamera/pipeline/rkisp1/rkisp1.cpp
> index d807fc2cf535..401e777fbbf7 100644
> --- a/src/libcamera/pipeline/rkisp1/rkisp1.cpp
> +++ b/src/libcamera/pipeline/rkisp1/rkisp1.cpp
> @@ -16,6 +16,7 @@
>  #include <libcamera/buffer.h>
>  #include <libcamera/camera.h>
>  #include <libcamera/control_ids.h>
> +#include <libcamera/formats.h>
>  #include <libcamera/ipa/rkisp1.h>
>  #include <libcamera/request.h>
>  #include <libcamera/stream.h>
> @@ -459,13 +460,13 @@ RkISP1CameraConfiguration::RkISP1CameraConfiguration(Camera *camera,
>  CameraConfiguration::Status RkISP1CameraConfiguration::validate()
>  {
>  	static const std::array<PixelFormat, 8> formats{
> -		PixelFormat(DRM_FORMAT_YUYV),
> -		PixelFormat(DRM_FORMAT_YVYU),
> -		PixelFormat(DRM_FORMAT_VYUY),
> -		PixelFormat(DRM_FORMAT_NV16),
> -		PixelFormat(DRM_FORMAT_NV61),
> -		PixelFormat(DRM_FORMAT_NV21),
> -		PixelFormat(DRM_FORMAT_NV12),
> +		formats::YUYV,
> +		formats::YVYU,
> +		formats::VYUY,
> +		formats::NV16,
> +		formats::NV61,
> +		formats::NV21,
> +		formats::NV12,
>  		/* \todo Add support for 8-bit greyscale to DRM formats */
>  	};
>  
> @@ -487,7 +488,7 @@ CameraConfiguration::Status RkISP1CameraConfiguration::validate()
>  	if (std::find(formats.begin(), formats.end(), cfg.pixelFormat) ==
>  	    formats.end()) {
>  		LOG(RkISP1, Debug) << "Adjusting format to NV12";
> -		cfg.pixelFormat = PixelFormat(DRM_FORMAT_NV12),
> +		cfg.pixelFormat = formats::NV12,
>  		status = Adjusted;
>  	}
>  
> @@ -566,7 +567,7 @@ CameraConfiguration *PipelineHandlerRkISP1::generateConfiguration(Camera *camera
>  		return config;
>  
>  	StreamConfiguration cfg{};
> -	cfg.pixelFormat = PixelFormat(DRM_FORMAT_NV12);
> +	cfg.pixelFormat = formats::NV12;
>  	cfg.size = data->sensor_->resolution();
>  
>  	config->addConfiguration(cfg);
> diff --git a/src/libcamera/pipeline/vimc/vimc.cpp b/src/libcamera/pipeline/vimc/vimc.cpp
> index ca36348a5eb6..ce6db27ce576 100644
> --- a/src/libcamera/pipeline/vimc/vimc.cpp
> +++ b/src/libcamera/pipeline/vimc/vimc.cpp
> @@ -17,6 +17,7 @@
>  #include <libcamera/camera.h>
>  #include <libcamera/control_ids.h>
>  #include <libcamera/controls.h>
> +#include <libcamera/formats.h>
>  #include <libcamera/ipa/ipa_interface.h>
>  #include <libcamera/ipa/ipa_module_info.h>
>  #include <libcamera/request.h>
> @@ -108,9 +109,9 @@ private:
>  namespace {
>  
>  static const std::array<PixelFormat, 3> pixelformats{
> -	PixelFormat(DRM_FORMAT_RGB888),
> -	PixelFormat(DRM_FORMAT_BGR888),
> -	PixelFormat(DRM_FORMAT_BGRA8888),
> +	formats::RGB888,
> +	formats::BGR888,
> +	formats::BGRA8888,
>  };
>  
>  } /* namespace */
> @@ -139,7 +140,7 @@ CameraConfiguration::Status VimcCameraConfiguration::validate()
>  	if (std::find(pixelformats.begin(), pixelformats.end(), cfg.pixelFormat) ==
>  	    pixelformats.end()) {
>  		LOG(VIMC, Debug) << "Adjusting format to RGB24";
> -		cfg.pixelFormat = PixelFormat(DRM_FORMAT_BGR888);
> +		cfg.pixelFormat = formats::BGR888;
>  		status = Adjusted;
>  	}
>  
> @@ -188,7 +189,7 @@ CameraConfiguration *PipelineHandlerVimc::generateConfiguration(Camera *camera,
>  
>  	StreamConfiguration cfg(formats);
>  
> -	cfg.pixelFormat = PixelFormat(DRM_FORMAT_BGR888);
> +	cfg.pixelFormat = formats::BGR888;
>  	cfg.size = { 1920, 1080 };
>  	cfg.bufferCount = 4;
>  
>
Laurent Pinchart May 28, 2020, 11:26 a.m. UTC | #2
Hi Kieran,

On Thu, May 28, 2020 at 11:16:39AM +0100, Kieran Bingham wrote:
> On 22/05/2020 15:54, Laurent Pinchart wrote:
> > Use the new pixel format constants to replace usage of macros from
> > drm_fourcc.h.
> > 
> > The IPU3 pipeline handler still uses DRM FourCCs for IPU3-specific
> > formats that are not defined in the libcamera public API.
> 
> If the header is (mostly)automatically generated from the drm_fourcc,
> would it then be available? (I.e. ... should we define it? or leave it)
> 
> Otherwise, would it make sense to add a comment to that usage to state
> /why/ we use the DRM format directly for any casual reader who suddenly
> sees a DRM_FORMAT_ out of the blue (and which differs from the rest of
> the code base)

I've actually decided to reconsider this, as applications may be
interested in capturing raw images with the IPU3, even if the format is
non-standard. We thus need to define IPU3-specific formats, like we do
for the other Bayer formats. I'll change that in the next version.

> Either-way,
> 
> Reviewed-by: Kieran Bingham <kieran.bingham@ideasonboard.com>
> 
> > Signed-off-by: Laurent Pinchart <laurent.pinchart@ideasonboard.com>
> > ---
> >  src/libcamera/pipeline/ipu3/ipu3.cpp          |  8 +++++---
> >  .../pipeline/raspberrypi/raspberrypi.cpp      | 10 +++++-----
> >  src/libcamera/pipeline/rkisp1/rkisp1.cpp      | 19 ++++++++++---------
> >  src/libcamera/pipeline/vimc/vimc.cpp          | 11 ++++++-----
> >  4 files changed, 26 insertions(+), 22 deletions(-)
> > 
> > diff --git a/src/libcamera/pipeline/ipu3/ipu3.cpp b/src/libcamera/pipeline/ipu3/ipu3.cpp
> > index b805fea71c2d..f23f338d4eb7 100644
> > --- a/src/libcamera/pipeline/ipu3/ipu3.cpp
> > +++ b/src/libcamera/pipeline/ipu3/ipu3.cpp
> > @@ -11,9 +11,11 @@
> >  #include <queue>
> >  #include <vector>
> >  
> > +#include <linux/drm_fourcc.h>
> >  #include <linux/media-bus-format.h>
> >  
> >  #include <libcamera/camera.h>
> > +#include <libcamera/formats.h>
> >  #include <libcamera/request.h>
> >  #include <libcamera/stream.h>
> >  
> > @@ -261,7 +263,7 @@ IPU3CameraConfiguration::IPU3CameraConfiguration(Camera *camera,
> >  void IPU3CameraConfiguration::adjustStream(StreamConfiguration &cfg, bool scale)
> >  {
> >  	/* The only pixel format the driver supports is NV12. */
> > -	cfg.pixelFormat = PixelFormat(DRM_FORMAT_NV12);
> > +	cfg.pixelFormat = formats::NV12;
> >  
> >  	if (scale) {
> >  		/*
> > @@ -430,7 +432,7 @@ CameraConfiguration *PipelineHandlerIPU3::generateConfiguration(Camera *camera,
> >  		StreamConfiguration cfg = {};
> >  		IPU3Stream *stream = nullptr;
> >  
> > -		cfg.pixelFormat = PixelFormat(DRM_FORMAT_NV12);
> > +		cfg.pixelFormat = formats::NV12;
> >  
> >  		switch (role) {
> >  		case StreamRole::StillCapture:
> > @@ -1193,7 +1195,7 @@ int ImgUDevice::configureOutput(ImgUOutput *output,
> >  		return 0;
> >  
> >  	*outputFormat = {};
> > -	outputFormat->fourcc = dev->toV4L2PixelFormat(PixelFormat(DRM_FORMAT_NV12));
> > +	outputFormat->fourcc = dev->toV4L2PixelFormat(formats::NV12);
> >  	outputFormat->size = cfg.size;
> >  	outputFormat->planesCount = 2;
> >  
> > diff --git a/src/libcamera/pipeline/raspberrypi/raspberrypi.cpp b/src/libcamera/pipeline/raspberrypi/raspberrypi.cpp
> > index e16a9c7f10d3..d3d11f87ecb5 100644
> > --- a/src/libcamera/pipeline/raspberrypi/raspberrypi.cpp
> > +++ b/src/libcamera/pipeline/raspberrypi/raspberrypi.cpp
> > @@ -13,12 +13,12 @@
> >  
> >  #include <libcamera/camera.h>
> >  #include <libcamera/control_ids.h>
> > +#include <libcamera/formats.h>
> >  #include <libcamera/ipa/raspberrypi.h>
> >  #include <libcamera/logging.h>
> >  #include <libcamera/request.h>
> >  #include <libcamera/stream.h>
> >  
> > -#include <linux/drm_fourcc.h>
> >  #include <linux/videodev2.h>
> >  
> >  #include "libcamera/internal/camera_sensor.h"
> > @@ -490,7 +490,7 @@ CameraConfiguration::Status RPiCameraConfiguration::validate()
> >  
> >  		if (fmts.find(V4L2PixelFormat::fromPixelFormat(cfgPixFmt, false)) == fmts.end()) {
> >  			/* If we cannot find a native format, use a default one. */
> > -			cfgPixFmt = PixelFormat(DRM_FORMAT_NV12);
> > +			cfgPixFmt = formats::NV12;
> >  			status = Adjusted;
> >  		}
> >  	}
> > @@ -537,20 +537,20 @@ CameraConfiguration *PipelineHandlerRPi::generateConfiguration(Camera *camera,
> >  			break;
> >  
> >  		case StreamRole::StillCapture:
> > -			cfg.pixelFormat = PixelFormat(DRM_FORMAT_NV12);
> > +			cfg.pixelFormat = formats::NV12;
> >  			/* Return the largest sensor resolution. */
> >  			cfg.size = data->sensor_->resolution();
> >  			cfg.bufferCount = 1;
> >  			break;
> >  
> >  		case StreamRole::VideoRecording:
> > -			cfg.pixelFormat = PixelFormat(DRM_FORMAT_NV12);
> > +			cfg.pixelFormat = formats::NV12;
> >  			cfg.size = { 1920, 1080 };
> >  			cfg.bufferCount = 4;
> >  			break;
> >  
> >  		case StreamRole::Viewfinder:
> > -			cfg.pixelFormat = PixelFormat(DRM_FORMAT_ARGB8888);
> > +			cfg.pixelFormat = formats::ARGB8888;
> >  			cfg.size = { 800, 600 };
> >  			cfg.bufferCount = 4;
> >  			break;
> > diff --git a/src/libcamera/pipeline/rkisp1/rkisp1.cpp b/src/libcamera/pipeline/rkisp1/rkisp1.cpp
> > index d807fc2cf535..401e777fbbf7 100644
> > --- a/src/libcamera/pipeline/rkisp1/rkisp1.cpp
> > +++ b/src/libcamera/pipeline/rkisp1/rkisp1.cpp
> > @@ -16,6 +16,7 @@
> >  #include <libcamera/buffer.h>
> >  #include <libcamera/camera.h>
> >  #include <libcamera/control_ids.h>
> > +#include <libcamera/formats.h>
> >  #include <libcamera/ipa/rkisp1.h>
> >  #include <libcamera/request.h>
> >  #include <libcamera/stream.h>
> > @@ -459,13 +460,13 @@ RkISP1CameraConfiguration::RkISP1CameraConfiguration(Camera *camera,
> >  CameraConfiguration::Status RkISP1CameraConfiguration::validate()
> >  {
> >  	static const std::array<PixelFormat, 8> formats{
> > -		PixelFormat(DRM_FORMAT_YUYV),
> > -		PixelFormat(DRM_FORMAT_YVYU),
> > -		PixelFormat(DRM_FORMAT_VYUY),
> > -		PixelFormat(DRM_FORMAT_NV16),
> > -		PixelFormat(DRM_FORMAT_NV61),
> > -		PixelFormat(DRM_FORMAT_NV21),
> > -		PixelFormat(DRM_FORMAT_NV12),
> > +		formats::YUYV,
> > +		formats::YVYU,
> > +		formats::VYUY,
> > +		formats::NV16,
> > +		formats::NV61,
> > +		formats::NV21,
> > +		formats::NV12,
> >  		/* \todo Add support for 8-bit greyscale to DRM formats */
> >  	};
> >  
> > @@ -487,7 +488,7 @@ CameraConfiguration::Status RkISP1CameraConfiguration::validate()
> >  	if (std::find(formats.begin(), formats.end(), cfg.pixelFormat) ==
> >  	    formats.end()) {
> >  		LOG(RkISP1, Debug) << "Adjusting format to NV12";
> > -		cfg.pixelFormat = PixelFormat(DRM_FORMAT_NV12),
> > +		cfg.pixelFormat = formats::NV12,
> >  		status = Adjusted;
> >  	}
> >  
> > @@ -566,7 +567,7 @@ CameraConfiguration *PipelineHandlerRkISP1::generateConfiguration(Camera *camera
> >  		return config;
> >  
> >  	StreamConfiguration cfg{};
> > -	cfg.pixelFormat = PixelFormat(DRM_FORMAT_NV12);
> > +	cfg.pixelFormat = formats::NV12;
> >  	cfg.size = data->sensor_->resolution();
> >  
> >  	config->addConfiguration(cfg);
> > diff --git a/src/libcamera/pipeline/vimc/vimc.cpp b/src/libcamera/pipeline/vimc/vimc.cpp
> > index ca36348a5eb6..ce6db27ce576 100644
> > --- a/src/libcamera/pipeline/vimc/vimc.cpp
> > +++ b/src/libcamera/pipeline/vimc/vimc.cpp
> > @@ -17,6 +17,7 @@
> >  #include <libcamera/camera.h>
> >  #include <libcamera/control_ids.h>
> >  #include <libcamera/controls.h>
> > +#include <libcamera/formats.h>
> >  #include <libcamera/ipa/ipa_interface.h>
> >  #include <libcamera/ipa/ipa_module_info.h>
> >  #include <libcamera/request.h>
> > @@ -108,9 +109,9 @@ private:
> >  namespace {
> >  
> >  static const std::array<PixelFormat, 3> pixelformats{
> > -	PixelFormat(DRM_FORMAT_RGB888),
> > -	PixelFormat(DRM_FORMAT_BGR888),
> > -	PixelFormat(DRM_FORMAT_BGRA8888),
> > +	formats::RGB888,
> > +	formats::BGR888,
> > +	formats::BGRA8888,
> >  };
> >  
> >  } /* namespace */
> > @@ -139,7 +140,7 @@ CameraConfiguration::Status VimcCameraConfiguration::validate()
> >  	if (std::find(pixelformats.begin(), pixelformats.end(), cfg.pixelFormat) ==
> >  	    pixelformats.end()) {
> >  		LOG(VIMC, Debug) << "Adjusting format to RGB24";
> > -		cfg.pixelFormat = PixelFormat(DRM_FORMAT_BGR888);
> > +		cfg.pixelFormat = formats::BGR888;
> >  		status = Adjusted;
> >  	}
> >  
> > @@ -188,7 +189,7 @@ CameraConfiguration *PipelineHandlerVimc::generateConfiguration(Camera *camera,
> >  
> >  	StreamConfiguration cfg(formats);
> >  
> > -	cfg.pixelFormat = PixelFormat(DRM_FORMAT_BGR888);
> > +	cfg.pixelFormat = formats::BGR888;
> >  	cfg.size = { 1920, 1080 };
> >  	cfg.bufferCount = 4;
> >

Patch

diff --git a/src/libcamera/pipeline/ipu3/ipu3.cpp b/src/libcamera/pipeline/ipu3/ipu3.cpp
index b805fea71c2d..f23f338d4eb7 100644
--- a/src/libcamera/pipeline/ipu3/ipu3.cpp
+++ b/src/libcamera/pipeline/ipu3/ipu3.cpp
@@ -11,9 +11,11 @@ 
 #include <queue>
 #include <vector>
 
+#include <linux/drm_fourcc.h>
 #include <linux/media-bus-format.h>
 
 #include <libcamera/camera.h>
+#include <libcamera/formats.h>
 #include <libcamera/request.h>
 #include <libcamera/stream.h>
 
@@ -261,7 +263,7 @@  IPU3CameraConfiguration::IPU3CameraConfiguration(Camera *camera,
 void IPU3CameraConfiguration::adjustStream(StreamConfiguration &cfg, bool scale)
 {
 	/* The only pixel format the driver supports is NV12. */
-	cfg.pixelFormat = PixelFormat(DRM_FORMAT_NV12);
+	cfg.pixelFormat = formats::NV12;
 
 	if (scale) {
 		/*
@@ -430,7 +432,7 @@  CameraConfiguration *PipelineHandlerIPU3::generateConfiguration(Camera *camera,
 		StreamConfiguration cfg = {};
 		IPU3Stream *stream = nullptr;
 
-		cfg.pixelFormat = PixelFormat(DRM_FORMAT_NV12);
+		cfg.pixelFormat = formats::NV12;
 
 		switch (role) {
 		case StreamRole::StillCapture:
@@ -1193,7 +1195,7 @@  int ImgUDevice::configureOutput(ImgUOutput *output,
 		return 0;
 
 	*outputFormat = {};
-	outputFormat->fourcc = dev->toV4L2PixelFormat(PixelFormat(DRM_FORMAT_NV12));
+	outputFormat->fourcc = dev->toV4L2PixelFormat(formats::NV12);
 	outputFormat->size = cfg.size;
 	outputFormat->planesCount = 2;
 
diff --git a/src/libcamera/pipeline/raspberrypi/raspberrypi.cpp b/src/libcamera/pipeline/raspberrypi/raspberrypi.cpp
index e16a9c7f10d3..d3d11f87ecb5 100644
--- a/src/libcamera/pipeline/raspberrypi/raspberrypi.cpp
+++ b/src/libcamera/pipeline/raspberrypi/raspberrypi.cpp
@@ -13,12 +13,12 @@ 
 
 #include <libcamera/camera.h>
 #include <libcamera/control_ids.h>
+#include <libcamera/formats.h>
 #include <libcamera/ipa/raspberrypi.h>
 #include <libcamera/logging.h>
 #include <libcamera/request.h>
 #include <libcamera/stream.h>
 
-#include <linux/drm_fourcc.h>
 #include <linux/videodev2.h>
 
 #include "libcamera/internal/camera_sensor.h"
@@ -490,7 +490,7 @@  CameraConfiguration::Status RPiCameraConfiguration::validate()
 
 		if (fmts.find(V4L2PixelFormat::fromPixelFormat(cfgPixFmt, false)) == fmts.end()) {
 			/* If we cannot find a native format, use a default one. */
-			cfgPixFmt = PixelFormat(DRM_FORMAT_NV12);
+			cfgPixFmt = formats::NV12;
 			status = Adjusted;
 		}
 	}
@@ -537,20 +537,20 @@  CameraConfiguration *PipelineHandlerRPi::generateConfiguration(Camera *camera,
 			break;
 
 		case StreamRole::StillCapture:
-			cfg.pixelFormat = PixelFormat(DRM_FORMAT_NV12);
+			cfg.pixelFormat = formats::NV12;
 			/* Return the largest sensor resolution. */
 			cfg.size = data->sensor_->resolution();
 			cfg.bufferCount = 1;
 			break;
 
 		case StreamRole::VideoRecording:
-			cfg.pixelFormat = PixelFormat(DRM_FORMAT_NV12);
+			cfg.pixelFormat = formats::NV12;
 			cfg.size = { 1920, 1080 };
 			cfg.bufferCount = 4;
 			break;
 
 		case StreamRole::Viewfinder:
-			cfg.pixelFormat = PixelFormat(DRM_FORMAT_ARGB8888);
+			cfg.pixelFormat = formats::ARGB8888;
 			cfg.size = { 800, 600 };
 			cfg.bufferCount = 4;
 			break;
diff --git a/src/libcamera/pipeline/rkisp1/rkisp1.cpp b/src/libcamera/pipeline/rkisp1/rkisp1.cpp
index d807fc2cf535..401e777fbbf7 100644
--- a/src/libcamera/pipeline/rkisp1/rkisp1.cpp
+++ b/src/libcamera/pipeline/rkisp1/rkisp1.cpp
@@ -16,6 +16,7 @@ 
 #include <libcamera/buffer.h>
 #include <libcamera/camera.h>
 #include <libcamera/control_ids.h>
+#include <libcamera/formats.h>
 #include <libcamera/ipa/rkisp1.h>
 #include <libcamera/request.h>
 #include <libcamera/stream.h>
@@ -459,13 +460,13 @@  RkISP1CameraConfiguration::RkISP1CameraConfiguration(Camera *camera,
 CameraConfiguration::Status RkISP1CameraConfiguration::validate()
 {
 	static const std::array<PixelFormat, 8> formats{
-		PixelFormat(DRM_FORMAT_YUYV),
-		PixelFormat(DRM_FORMAT_YVYU),
-		PixelFormat(DRM_FORMAT_VYUY),
-		PixelFormat(DRM_FORMAT_NV16),
-		PixelFormat(DRM_FORMAT_NV61),
-		PixelFormat(DRM_FORMAT_NV21),
-		PixelFormat(DRM_FORMAT_NV12),
+		formats::YUYV,
+		formats::YVYU,
+		formats::VYUY,
+		formats::NV16,
+		formats::NV61,
+		formats::NV21,
+		formats::NV12,
 		/* \todo Add support for 8-bit greyscale to DRM formats */
 	};
 
@@ -487,7 +488,7 @@  CameraConfiguration::Status RkISP1CameraConfiguration::validate()
 	if (std::find(formats.begin(), formats.end(), cfg.pixelFormat) ==
 	    formats.end()) {
 		LOG(RkISP1, Debug) << "Adjusting format to NV12";
-		cfg.pixelFormat = PixelFormat(DRM_FORMAT_NV12),
+		cfg.pixelFormat = formats::NV12,
 		status = Adjusted;
 	}
 
@@ -566,7 +567,7 @@  CameraConfiguration *PipelineHandlerRkISP1::generateConfiguration(Camera *camera
 		return config;
 
 	StreamConfiguration cfg{};
-	cfg.pixelFormat = PixelFormat(DRM_FORMAT_NV12);
+	cfg.pixelFormat = formats::NV12;
 	cfg.size = data->sensor_->resolution();
 
 	config->addConfiguration(cfg);
diff --git a/src/libcamera/pipeline/vimc/vimc.cpp b/src/libcamera/pipeline/vimc/vimc.cpp
index ca36348a5eb6..ce6db27ce576 100644
--- a/src/libcamera/pipeline/vimc/vimc.cpp
+++ b/src/libcamera/pipeline/vimc/vimc.cpp
@@ -17,6 +17,7 @@ 
 #include <libcamera/camera.h>
 #include <libcamera/control_ids.h>
 #include <libcamera/controls.h>
+#include <libcamera/formats.h>
 #include <libcamera/ipa/ipa_interface.h>
 #include <libcamera/ipa/ipa_module_info.h>
 #include <libcamera/request.h>
@@ -108,9 +109,9 @@  private:
 namespace {
 
 static const std::array<PixelFormat, 3> pixelformats{
-	PixelFormat(DRM_FORMAT_RGB888),
-	PixelFormat(DRM_FORMAT_BGR888),
-	PixelFormat(DRM_FORMAT_BGRA8888),
+	formats::RGB888,
+	formats::BGR888,
+	formats::BGRA8888,
 };
 
 } /* namespace */
@@ -139,7 +140,7 @@  CameraConfiguration::Status VimcCameraConfiguration::validate()
 	if (std::find(pixelformats.begin(), pixelformats.end(), cfg.pixelFormat) ==
 	    pixelformats.end()) {
 		LOG(VIMC, Debug) << "Adjusting format to RGB24";
-		cfg.pixelFormat = PixelFormat(DRM_FORMAT_BGR888);
+		cfg.pixelFormat = formats::BGR888;
 		status = Adjusted;
 	}
 
@@ -188,7 +189,7 @@  CameraConfiguration *PipelineHandlerVimc::generateConfiguration(Camera *camera,
 
 	StreamConfiguration cfg(formats);
 
-	cfg.pixelFormat = PixelFormat(DRM_FORMAT_BGR888);
+	cfg.pixelFormat = formats::BGR888;
 	cfg.size = { 1920, 1080 };
 	cfg.bufferCount = 4;