[libcamera-devel,v3,1/6] libcamera: formats: Merge V4L2 single and multi formats
diff mbox series

Message ID 20220729160014.101503-2-jacopo@jmondi.org
State Accepted
Headers show
Series
  • libcamera: Map multiple V4L2 formats to a single libcamera::format
Related show

Commit Message

Jacopo Mondi July 29, 2022, 4 p.m. UTC
To each libcamera PixelFormat two lists of V4L2 formats are associated,
the 'single' and 'multi' format variants.

The two versions list plane contiguous and non-contiguous format
variants, and an optional argument to V4L2PixelFormat::fromPixelFormat()
was used to select which one to pick.

In order to prepare to remove V4L2PixelFormat::fromPixelFormat(), and
considering that no caller in the codebase uses the non-contiguous
format variant, merge the two formats vectors in a single one and
default the selection to the first available one, which is functionally
equivalent to what is currently implemented.

Signed-off-by: Jacopo Mondi <jacopo@jmondi.org>
---
 include/libcamera/internal/formats.h          |   5 +-
 include/libcamera/internal/v4l2_pixelformat.h |   3 +-
 src/libcamera/formats.cpp                     | 310 ++++--------------
 src/libcamera/v4l2_pixelformat.cpp            |  15 +-
 4 files changed, 80 insertions(+), 253 deletions(-)

Comments

Laurent Pinchart July 29, 2022, 5:05 p.m. UTC | #1
Hi Jacopo,

Thank you for the patch.

On Fri, Jul 29, 2022 at 06:00:09PM +0200, Jacopo Mondi via libcamera-devel wrote:
> To each libcamera PixelFormat two lists of V4L2 formats are associated,
> the 'single' and 'multi' format variants.

It's not two lists, but two V4L2 pixel formats.

> The two versions list plane contiguous and non-contiguous format
> variants, and an optional argument to V4L2PixelFormat::fromPixelFormat()
> was used to select which one to pick.
> 
> In order to prepare to remove V4L2PixelFormat::fromPixelFormat(), and
> considering that no caller in the codebase uses the non-contiguous
> format variant, merge the two formats vectors in a single one and
> default the selection to the first available one, which is functionally
> equivalent to what is currently implemented.
> 
> Signed-off-by: Jacopo Mondi <jacopo@jmondi.org>
> ---
>  include/libcamera/internal/formats.h          |   5 +-
>  include/libcamera/internal/v4l2_pixelformat.h |   3 +-
>  src/libcamera/formats.cpp                     | 310 ++++--------------
>  src/libcamera/v4l2_pixelformat.cpp            |  15 +-
>  4 files changed, 80 insertions(+), 253 deletions(-)
> 
> diff --git a/include/libcamera/internal/formats.h b/include/libcamera/internal/formats.h
> index ee599765be47..5b16c0a8c071 100644
> --- a/include/libcamera/internal/formats.h
> +++ b/include/libcamera/internal/formats.h
> @@ -53,10 +53,7 @@ public:
>  	/* \todo Add support for non-contiguous memory planes */
>  	const char *name;
>  	PixelFormat format;
> -	struct {
> -		V4L2PixelFormat single;
> -		V4L2PixelFormat multi;
> -	} v4l2Formats;
> +	std::vector<V4L2PixelFormat> v4l2Formats;
>  	unsigned int bitsPerPixel;
>  	enum ColourEncoding colourEncoding;
>  	bool packed;
> diff --git a/include/libcamera/internal/v4l2_pixelformat.h b/include/libcamera/internal/v4l2_pixelformat.h
> index 7bd3ea79428f..ed94baf92795 100644
> --- a/include/libcamera/internal/v4l2_pixelformat.h
> +++ b/include/libcamera/internal/v4l2_pixelformat.h
> @@ -44,8 +44,7 @@ public:
>  	const char *description() const;
>  
>  	PixelFormat toPixelFormat() const;
> -	static V4L2PixelFormat fromPixelFormat(const PixelFormat &pixelFormat,
> -					       bool multiplanar = false);
> +	static V4L2PixelFormat fromPixelFormat(const PixelFormat &pixelFormat);
>  
>  private:
>  	uint32_t fourcc_;
> diff --git a/src/libcamera/formats.cpp b/src/libcamera/formats.cpp
> index 283ecb3d89d8..3c536722f375 100644
> --- a/src/libcamera/formats.cpp
> +++ b/src/libcamera/formats.cpp
> @@ -42,12 +42,9 @@ LOG_DEFINE_CATEGORY(Formats)
>   * \var PixelFormatInfo::v4l2Formats
>   * \brief The V4L2 pixel formats corresponding to the PixelFormat
>   *
> - * Multiple V4L2 formats may exist for one PixelFormat when the format uses
> - * multiple planes, as V4L2 defines separate 4CCs for contiguous and separate
> - * planes formats. The two entries in the array store the contiguous and
> - * non-contiguous V4L2 formats respectively. If the PixelFormat isn't a
> - * multiplanar format, or if no corresponding non-contiguous V4L2 format
> - * exists, the second entry is invalid.
> + * Multiple V4L2 formats may exist for one PixelForma, as V4L2 defines

s/PixelForma/PixelFormat.

> + * separate 4CCs for contiguous and non-contiguous versions of the same image
> + * format.
>   *
>   * \var PixelFormatInfo::bitsPerPixel
>   * \brief The average number of bits per pixel
> @@ -156,10 +153,7 @@ const std::map<PixelFormat, PixelFormatInfo> pixelFormatInfo{
>  	{ formats::RGB565, {
>  		.name = "RGB565",
>  		.format = formats::RGB565,
> -		.v4l2Formats = {
> -			.single = V4L2PixelFormat(V4L2_PIX_FMT_RGB565),
> -			.multi = V4L2PixelFormat(),
> -		},
> +		.v4l2Formats = { V4L2PixelFormat(V4L2_PIX_FMT_RGB565), },
>  		.bitsPerPixel = 16,
>  		.colourEncoding = PixelFormatInfo::ColourEncodingRGB,
>  		.packed = false,
> @@ -169,10 +163,7 @@ const std::map<PixelFormat, PixelFormatInfo> pixelFormatInfo{
>  	{ formats::RGB565_BE, {
>  		.name = "RGB565_BE",
>  		.format = formats::RGB565_BE,
> -		.v4l2Formats = {
> -			.single = V4L2PixelFormat(V4L2_PIX_FMT_RGB565X),
> -			.multi = V4L2PixelFormat(),
> -		},
> +		.v4l2Formats = { V4L2PixelFormat(V4L2_PIX_FMT_RGB565X), },
>  		.bitsPerPixel = 16,
>  		.colourEncoding = PixelFormatInfo::ColourEncodingRGB,
>  		.packed = false,
> @@ -182,10 +173,7 @@ const std::map<PixelFormat, PixelFormatInfo> pixelFormatInfo{
>  	{ formats::BGR888, {
>  		.name = "BGR888",
>  		.format = formats::BGR888,
> -		.v4l2Formats = {
> -			.single = V4L2PixelFormat(V4L2_PIX_FMT_RGB24),
> -			.multi = V4L2PixelFormat(),
> -		},
> +		.v4l2Formats = { V4L2PixelFormat(V4L2_PIX_FMT_RGB24), },
>  		.bitsPerPixel = 24,
>  		.colourEncoding = PixelFormatInfo::ColourEncodingRGB,
>  		.packed = false,
> @@ -195,10 +183,7 @@ const std::map<PixelFormat, PixelFormatInfo> pixelFormatInfo{
>  	{ formats::RGB888, {
>  		.name = "RGB888",
>  		.format = formats::RGB888,
> -		.v4l2Formats = {
> -			.single = V4L2PixelFormat(V4L2_PIX_FMT_BGR24),
> -			.multi = V4L2PixelFormat(),
> -		},
> +		.v4l2Formats = { V4L2PixelFormat(V4L2_PIX_FMT_BGR24), },
>  		.bitsPerPixel = 24,
>  		.colourEncoding = PixelFormatInfo::ColourEncodingRGB,
>  		.packed = false,
> @@ -208,10 +193,7 @@ const std::map<PixelFormat, PixelFormatInfo> pixelFormatInfo{
>  	{ formats::XRGB8888, {
>  		.name = "XRGB8888",
>  		.format = formats::XRGB8888,
> -		.v4l2Formats = {
> -			.single = V4L2PixelFormat(V4L2_PIX_FMT_XBGR32),
> -			.multi = V4L2PixelFormat(),
> -		},
> +		.v4l2Formats = { V4L2PixelFormat(V4L2_PIX_FMT_XBGR32), },
>  		.bitsPerPixel = 32,
>  		.colourEncoding = PixelFormatInfo::ColourEncodingRGB,
>  		.packed = false,
> @@ -221,10 +203,7 @@ const std::map<PixelFormat, PixelFormatInfo> pixelFormatInfo{
>  	{ formats::XBGR8888, {
>  		.name = "XBGR8888",
>  		.format = formats::XBGR8888,
> -		.v4l2Formats = {
> -			.single = V4L2PixelFormat(V4L2_PIX_FMT_RGBX32),
> -			.multi = V4L2PixelFormat(),
> -		},
> +		.v4l2Formats = { V4L2PixelFormat(V4L2_PIX_FMT_RGBX32), },
>  		.bitsPerPixel = 32,
>  		.colourEncoding = PixelFormatInfo::ColourEncodingRGB,
>  		.packed = false,
> @@ -234,10 +213,7 @@ const std::map<PixelFormat, PixelFormatInfo> pixelFormatInfo{
>  	{ formats::RGBX8888, {
>  		.name = "RGBX8888",
>  		.format = formats::RGBX8888,
> -		.v4l2Formats = {
> -			.single = V4L2PixelFormat(V4L2_PIX_FMT_BGRX32),
> -			.multi = V4L2PixelFormat(),
> -		},
> +		.v4l2Formats = { V4L2PixelFormat(V4L2_PIX_FMT_BGRX32), },
>  		.bitsPerPixel = 32,
>  		.colourEncoding = PixelFormatInfo::ColourEncodingRGB,
>  		.packed = false,
> @@ -247,10 +223,7 @@ const std::map<PixelFormat, PixelFormatInfo> pixelFormatInfo{
>  	{ formats::BGRX8888, {
>  		.name = "BGRX8888",
>  		.format = formats::BGRX8888,
> -		.v4l2Formats = {
> -			.single = V4L2PixelFormat(V4L2_PIX_FMT_XRGB32),
> -			.multi = V4L2PixelFormat(),
> -		},
> +		.v4l2Formats = { V4L2PixelFormat(V4L2_PIX_FMT_XRGB32), },
>  		.bitsPerPixel = 32,
>  		.colourEncoding = PixelFormatInfo::ColourEncodingRGB,
>  		.packed = false,
> @@ -260,10 +233,7 @@ const std::map<PixelFormat, PixelFormatInfo> pixelFormatInfo{
>  	{ formats::ABGR8888, {
>  		.name = "ABGR8888",
>  		.format = formats::ABGR8888,
> -		.v4l2Formats = {
> -			.single = V4L2PixelFormat(V4L2_PIX_FMT_RGBA32),
> -			.multi = V4L2PixelFormat(),
> -		},
> +		.v4l2Formats = { V4L2PixelFormat(V4L2_PIX_FMT_RGBA32), },
>  		.bitsPerPixel = 32,
>  		.colourEncoding = PixelFormatInfo::ColourEncodingRGB,
>  		.packed = false,
> @@ -273,10 +243,7 @@ const std::map<PixelFormat, PixelFormatInfo> pixelFormatInfo{
>  	{ formats::ARGB8888, {
>  		.name = "ARGB8888",
>  		.format = formats::ARGB8888,
> -		.v4l2Formats = {
> -			.single = V4L2PixelFormat(V4L2_PIX_FMT_ABGR32),
> -			.multi = V4L2PixelFormat(),
> -		},
> +		.v4l2Formats = { V4L2PixelFormat(V4L2_PIX_FMT_ABGR32), },
>  		.bitsPerPixel = 32,
>  		.colourEncoding = PixelFormatInfo::ColourEncodingRGB,
>  		.packed = false,
> @@ -286,10 +253,7 @@ const std::map<PixelFormat, PixelFormatInfo> pixelFormatInfo{
>  	{ formats::BGRA8888, {
>  		.name = "BGRA8888",
>  		.format = formats::BGRA8888,
> -		.v4l2Formats = {
> -			.single = V4L2PixelFormat(V4L2_PIX_FMT_ARGB32),
> -			.multi = V4L2PixelFormat(),
> -		},
> +		.v4l2Formats = { V4L2PixelFormat(V4L2_PIX_FMT_ARGB32), },
>  		.bitsPerPixel = 32,
>  		.colourEncoding = PixelFormatInfo::ColourEncodingRGB,
>  		.packed = false,
> @@ -299,10 +263,7 @@ const std::map<PixelFormat, PixelFormatInfo> pixelFormatInfo{
>  	{ formats::RGBA8888, {
>  		.name = "RGBA8888",
>  		.format = formats::RGBA8888,
> -		.v4l2Formats = {
> -			.single = V4L2PixelFormat(V4L2_PIX_FMT_BGRA32),
> -			.multi = V4L2PixelFormat(),
> -		},
> +		.v4l2Formats = { V4L2PixelFormat(V4L2_PIX_FMT_BGRA32), },
>  		.bitsPerPixel = 32,
>  		.colourEncoding = PixelFormatInfo::ColourEncodingRGB,
>  		.packed = false,
> @@ -314,10 +275,7 @@ const std::map<PixelFormat, PixelFormatInfo> pixelFormatInfo{
>  	{ formats::YUYV, {
>  		.name = "YUYV",
>  		.format = formats::YUYV,
> -		.v4l2Formats = {
> -			.single = V4L2PixelFormat(V4L2_PIX_FMT_YUYV),
> -			.multi = V4L2PixelFormat(),
> -		},
> +		.v4l2Formats = { V4L2PixelFormat(V4L2_PIX_FMT_YUYV), },
>  		.bitsPerPixel = 16,
>  		.colourEncoding = PixelFormatInfo::ColourEncodingYUV,
>  		.packed = false,
> @@ -327,10 +285,7 @@ const std::map<PixelFormat, PixelFormatInfo> pixelFormatInfo{
>  	{ formats::YVYU, {
>  		.name = "YVYU",
>  		.format = formats::YVYU,
> -		.v4l2Formats = {
> -			.single = V4L2PixelFormat(V4L2_PIX_FMT_YVYU),
> -			.multi = V4L2PixelFormat(),
> -		},
> +		.v4l2Formats = { V4L2PixelFormat(V4L2_PIX_FMT_YVYU), },
>  		.bitsPerPixel = 16,
>  		.colourEncoding = PixelFormatInfo::ColourEncodingYUV,
>  		.packed = false,
> @@ -340,10 +295,7 @@ const std::map<PixelFormat, PixelFormatInfo> pixelFormatInfo{
>  	{ formats::UYVY, {
>  		.name = "UYVY",
>  		.format = formats::UYVY,
> -		.v4l2Formats = {
> -			.single = V4L2PixelFormat(V4L2_PIX_FMT_UYVY),
> -			.multi = V4L2PixelFormat(),
> -		},
> +		.v4l2Formats = { V4L2PixelFormat(V4L2_PIX_FMT_UYVY), },
>  		.bitsPerPixel = 16,
>  		.colourEncoding = PixelFormatInfo::ColourEncodingYUV,
>  		.packed = false,
> @@ -353,10 +305,7 @@ const std::map<PixelFormat, PixelFormatInfo> pixelFormatInfo{
>  	{ formats::VYUY, {
>  		.name = "VYUY",
>  		.format = formats::VYUY,
> -		.v4l2Formats = {
> -			.single = V4L2PixelFormat(V4L2_PIX_FMT_VYUY),
> -			.multi = V4L2PixelFormat(),
> -		},
> +		.v4l2Formats = { V4L2PixelFormat(V4L2_PIX_FMT_VYUY), },
>  		.bitsPerPixel = 16,
>  		.colourEncoding = PixelFormatInfo::ColourEncodingYUV,
>  		.packed = false,
> @@ -369,8 +318,8 @@ const std::map<PixelFormat, PixelFormatInfo> pixelFormatInfo{
>  		.name = "NV12",
>  		.format = formats::NV12,
>  		.v4l2Formats = {
> -			.single = V4L2PixelFormat(V4L2_PIX_FMT_NV12),
> -			.multi = V4L2PixelFormat(V4L2_PIX_FMT_NV12M),
> +			V4L2PixelFormat(V4L2_PIX_FMT_NV12),
> +			V4L2PixelFormat(V4L2_PIX_FMT_NV12M),
>  		},
>  		.bitsPerPixel = 12,
>  		.colourEncoding = PixelFormatInfo::ColourEncodingYUV,
> @@ -382,8 +331,8 @@ const std::map<PixelFormat, PixelFormatInfo> pixelFormatInfo{
>  		.name = "NV21",
>  		.format = formats::NV21,
>  		.v4l2Formats = {
> -			.single = V4L2PixelFormat(V4L2_PIX_FMT_NV21),
> -			.multi = V4L2PixelFormat(V4L2_PIX_FMT_NV21M),
> +			V4L2PixelFormat(V4L2_PIX_FMT_NV21),
> +			V4L2PixelFormat(V4L2_PIX_FMT_NV21M),
>  		},
>  		.bitsPerPixel = 12,
>  		.colourEncoding = PixelFormatInfo::ColourEncodingYUV,
> @@ -395,8 +344,8 @@ const std::map<PixelFormat, PixelFormatInfo> pixelFormatInfo{
>  		.name = "NV16",
>  		.format = formats::NV16,
>  		.v4l2Formats = {
> -			.single = V4L2PixelFormat(V4L2_PIX_FMT_NV16),
> -			.multi = V4L2PixelFormat(V4L2_PIX_FMT_NV16M),
> +			V4L2PixelFormat(V4L2_PIX_FMT_NV16),
> +			V4L2PixelFormat(V4L2_PIX_FMT_NV16M),
>  		},
>  		.bitsPerPixel = 16,
>  		.colourEncoding = PixelFormatInfo::ColourEncodingYUV,
> @@ -408,8 +357,8 @@ const std::map<PixelFormat, PixelFormatInfo> pixelFormatInfo{
>  		.name = "NV61",
>  		.format = formats::NV61,
>  		.v4l2Formats = {
> -			.single = V4L2PixelFormat(V4L2_PIX_FMT_NV61),
> -			.multi = V4L2PixelFormat(V4L2_PIX_FMT_NV61M),
> +			V4L2PixelFormat(V4L2_PIX_FMT_NV61),
> +			V4L2PixelFormat(V4L2_PIX_FMT_NV61M),
>  		},
>  		.bitsPerPixel = 16,
>  		.colourEncoding = PixelFormatInfo::ColourEncodingYUV,
> @@ -420,10 +369,7 @@ const std::map<PixelFormat, PixelFormatInfo> pixelFormatInfo{
>  	{ formats::NV24, {
>  		.name = "NV24",
>  		.format = formats::NV24,
> -		.v4l2Formats = {
> -			.single = V4L2PixelFormat(V4L2_PIX_FMT_NV24),
> -			.multi = V4L2PixelFormat(),
> -		},
> +		.v4l2Formats = { V4L2PixelFormat(V4L2_PIX_FMT_NV24), },
>  		.bitsPerPixel = 24,
>  		.colourEncoding = PixelFormatInfo::ColourEncodingYUV,
>  		.packed = false,
> @@ -433,10 +379,7 @@ const std::map<PixelFormat, PixelFormatInfo> pixelFormatInfo{
>  	{ formats::NV42, {
>  		.name = "NV42",
>  		.format = formats::NV42,
> -		.v4l2Formats = {
> -			.single = V4L2PixelFormat(V4L2_PIX_FMT_NV42),
> -			.multi = V4L2PixelFormat(),
> -		},
> +		.v4l2Formats = { V4L2PixelFormat(V4L2_PIX_FMT_NV42), },
>  		.bitsPerPixel = 24,
>  		.colourEncoding = PixelFormatInfo::ColourEncodingYUV,
>  		.packed = false,
> @@ -447,8 +390,8 @@ const std::map<PixelFormat, PixelFormatInfo> pixelFormatInfo{
>  		.name = "YUV420",
>  		.format = formats::YUV420,
>  		.v4l2Formats = {
> -			.single = V4L2PixelFormat(V4L2_PIX_FMT_YUV420),
> -			.multi = V4L2PixelFormat(V4L2_PIX_FMT_YUV420M),
> +			V4L2PixelFormat(V4L2_PIX_FMT_YUV420),
> +			V4L2PixelFormat(V4L2_PIX_FMT_YUV420M),
>  		},
>  		.bitsPerPixel = 12,
>  		.colourEncoding = PixelFormatInfo::ColourEncodingYUV,
> @@ -460,8 +403,8 @@ const std::map<PixelFormat, PixelFormatInfo> pixelFormatInfo{
>  		.name = "YVU420",
>  		.format = formats::YVU420,
>  		.v4l2Formats = {
> -			.single = V4L2PixelFormat(V4L2_PIX_FMT_YVU420),
> -			.multi = V4L2PixelFormat(V4L2_PIX_FMT_YVU420M),
> +			V4L2PixelFormat(V4L2_PIX_FMT_YVU420),
> +			V4L2PixelFormat(V4L2_PIX_FMT_YVU420M),
>  		},
>  		.bitsPerPixel = 12,
>  		.colourEncoding = PixelFormatInfo::ColourEncodingYUV,
> @@ -473,8 +416,8 @@ const std::map<PixelFormat, PixelFormatInfo> pixelFormatInfo{
>  		.name = "YUV422",
>  		.format = formats::YUV422,
>  		.v4l2Formats = {
> -			.single = V4L2PixelFormat(V4L2_PIX_FMT_YUV422P),
> -			.multi = V4L2PixelFormat(V4L2_PIX_FMT_YUV422M),
> +			V4L2PixelFormat(V4L2_PIX_FMT_YUV422P),
> +			V4L2PixelFormat(V4L2_PIX_FMT_YUV422M),
>  		},
>  		.bitsPerPixel = 16,
>  		.colourEncoding = PixelFormatInfo::ColourEncodingYUV,
> @@ -485,10 +428,7 @@ const std::map<PixelFormat, PixelFormatInfo> pixelFormatInfo{
>  	{ formats::YVU422, {
>  		.name = "YVU422",
>  		.format = formats::YVU422,
> -		.v4l2Formats = {
> -			.single = V4L2PixelFormat(),
> -			.multi = V4L2PixelFormat(V4L2_PIX_FMT_YVU422M),
> -		},
> +		.v4l2Formats = { V4L2PixelFormat(V4L2_PIX_FMT_YVU422M), },
>  		.bitsPerPixel = 16,
>  		.colourEncoding = PixelFormatInfo::ColourEncodingYUV,
>  		.packed = false,
> @@ -498,10 +438,7 @@ const std::map<PixelFormat, PixelFormatInfo> pixelFormatInfo{
>  	{ formats::YUV444, {
>  		.name = "YUV444",
>  		.format = formats::YUV444,
> -		.v4l2Formats = {
> -			.single = V4L2PixelFormat(),
> -			.multi = V4L2PixelFormat(V4L2_PIX_FMT_YUV444M),
> -		},
> +		.v4l2Formats = { V4L2PixelFormat(V4L2_PIX_FMT_YUV444M), },
>  		.bitsPerPixel = 24,
>  		.colourEncoding = PixelFormatInfo::ColourEncodingYUV,
>  		.packed = false,
> @@ -511,10 +448,7 @@ const std::map<PixelFormat, PixelFormatInfo> pixelFormatInfo{
>  	{ formats::YVU444, {
>  		.name = "YVU444",
>  		.format = formats::YVU444,
> -		.v4l2Formats = {
> -			.single = V4L2PixelFormat(),
> -			.multi = V4L2PixelFormat(V4L2_PIX_FMT_YVU444M),
> -		},
> +		.v4l2Formats = { V4L2PixelFormat(V4L2_PIX_FMT_YVU444M), },
>  		.bitsPerPixel = 24,
>  		.colourEncoding = PixelFormatInfo::ColourEncodingYUV,
>  		.packed = false,
> @@ -526,10 +460,7 @@ const std::map<PixelFormat, PixelFormatInfo> pixelFormatInfo{
>  	{ formats::R8, {
>  		.name = "R8",
>  		.format = formats::R8,
> -		.v4l2Formats = {
> -			.single = V4L2PixelFormat(V4L2_PIX_FMT_GREY),
> -			.multi = V4L2PixelFormat(),
> -		},
> +		.v4l2Formats = { V4L2PixelFormat(V4L2_PIX_FMT_GREY), },
>  		.bitsPerPixel = 8,
>  		.colourEncoding = PixelFormatInfo::ColourEncodingYUV,
>  		.packed = false,
> @@ -539,10 +470,7 @@ const std::map<PixelFormat, PixelFormatInfo> pixelFormatInfo{
>  	{ formats::R10, {
>  		.name = "R10",
>  		.format = formats::R10,
> -		.v4l2Formats = {
> -			.single = V4L2PixelFormat(V4L2_PIX_FMT_Y10),
> -			.multi = V4L2PixelFormat(),
> -		},
> +		.v4l2Formats = { V4L2PixelFormat(V4L2_PIX_FMT_Y10), },
>  		.bitsPerPixel = 10,
>  		.colourEncoding = PixelFormatInfo::ColourEncodingYUV,
>  		.packed = false,
> @@ -552,10 +480,7 @@ const std::map<PixelFormat, PixelFormatInfo> pixelFormatInfo{
>  	{ formats::R12, {
>  		.name = "R12",
>  		.format = formats::R12,
> -		.v4l2Formats = {
> -			.single = V4L2PixelFormat(V4L2_PIX_FMT_Y12),
> -			.multi = V4L2PixelFormat(),
> -		},
> +		.v4l2Formats = { V4L2PixelFormat(V4L2_PIX_FMT_Y12), },
>  		.bitsPerPixel = 12,
>  		.colourEncoding = PixelFormatInfo::ColourEncodingYUV,
>  		.packed = false,
> @@ -565,10 +490,7 @@ const std::map<PixelFormat, PixelFormatInfo> pixelFormatInfo{
>  	{ formats::R10_CSI2P, {
>  		.name = "R10_CSI2P",
>  		.format = formats::R10,
> -		.v4l2Formats = {
> -			.single = V4L2PixelFormat(V4L2_PIX_FMT_Y10P),
> -			.multi = V4L2PixelFormat(),
> -		},
> +		.v4l2Formats = { V4L2PixelFormat(V4L2_PIX_FMT_Y10P), },
>  		.bitsPerPixel = 10,
>  		.colourEncoding = PixelFormatInfo::ColourEncodingYUV,
>  		.packed = true,
> @@ -580,10 +502,7 @@ const std::map<PixelFormat, PixelFormatInfo> pixelFormatInfo{
>  	{ formats::SBGGR8, {
>  		.name = "SBGGR8",
>  		.format = formats::SBGGR8,
> -		.v4l2Formats = {
> -			.single = V4L2PixelFormat(V4L2_PIX_FMT_SBGGR8),
> -			.multi = V4L2PixelFormat(),
> -		},
> +		.v4l2Formats = { V4L2PixelFormat(V4L2_PIX_FMT_SBGGR8), },
>  		.bitsPerPixel = 8,
>  		.colourEncoding = PixelFormatInfo::ColourEncodingRAW,
>  		.packed = false,
> @@ -593,10 +512,7 @@ const std::map<PixelFormat, PixelFormatInfo> pixelFormatInfo{
>  	{ formats::SGBRG8, {
>  		.name = "SGBRG8",
>  		.format = formats::SGBRG8,
> -		.v4l2Formats = {
> -			.single = V4L2PixelFormat(V4L2_PIX_FMT_SGBRG8),
> -			.multi = V4L2PixelFormat(),
> -		},
> +		.v4l2Formats = { V4L2PixelFormat(V4L2_PIX_FMT_SGBRG8), },
>  		.bitsPerPixel = 8,
>  		.colourEncoding = PixelFormatInfo::ColourEncodingRAW,
>  		.packed = false,
> @@ -606,10 +522,7 @@ const std::map<PixelFormat, PixelFormatInfo> pixelFormatInfo{
>  	{ formats::SGRBG8, {
>  		.name = "SGRBG8",
>  		.format = formats::SGRBG8,
> -		.v4l2Formats = {
> -			.single = V4L2PixelFormat(V4L2_PIX_FMT_SGRBG8),
> -			.multi = V4L2PixelFormat(),
> -		},
> +		.v4l2Formats = { V4L2PixelFormat(V4L2_PIX_FMT_SGRBG8), },
>  		.bitsPerPixel = 8,
>  		.colourEncoding = PixelFormatInfo::ColourEncodingRAW,
>  		.packed = false,
> @@ -619,10 +532,7 @@ const std::map<PixelFormat, PixelFormatInfo> pixelFormatInfo{
>  	{ formats::SRGGB8, {
>  		.name = "SRGGB8",
>  		.format = formats::SRGGB8,
> -		.v4l2Formats = {
> -			.single = V4L2PixelFormat(V4L2_PIX_FMT_SRGGB8),
> -			.multi = V4L2PixelFormat(),
> -		},
> +		.v4l2Formats = { V4L2PixelFormat(V4L2_PIX_FMT_SRGGB8), },
>  		.bitsPerPixel = 8,
>  		.colourEncoding = PixelFormatInfo::ColourEncodingRAW,
>  		.packed = false,
> @@ -632,10 +542,7 @@ const std::map<PixelFormat, PixelFormatInfo> pixelFormatInfo{
>  	{ formats::SBGGR10, {
>  		.name = "SBGGR10",
>  		.format = formats::SBGGR10,
> -		.v4l2Formats = {
> -			.single = V4L2PixelFormat(V4L2_PIX_FMT_SBGGR10),
> -			.multi = V4L2PixelFormat(),
> -		},
> +		.v4l2Formats = { V4L2PixelFormat(V4L2_PIX_FMT_SBGGR10), },
>  		.bitsPerPixel = 10,
>  		.colourEncoding = PixelFormatInfo::ColourEncodingRAW,
>  		.packed = false,
> @@ -645,10 +552,7 @@ const std::map<PixelFormat, PixelFormatInfo> pixelFormatInfo{
>  	{ formats::SGBRG10, {
>  		.name = "SGBRG10",
>  		.format = formats::SGBRG10,
> -		.v4l2Formats = {
> -			.single = V4L2PixelFormat(V4L2_PIX_FMT_SGBRG10),
> -			.multi = V4L2PixelFormat(),
> -		},
> +		.v4l2Formats = { V4L2PixelFormat(V4L2_PIX_FMT_SGBRG10), },
>  		.bitsPerPixel = 10,
>  		.colourEncoding = PixelFormatInfo::ColourEncodingRAW,
>  		.packed = false,
> @@ -658,10 +562,7 @@ const std::map<PixelFormat, PixelFormatInfo> pixelFormatInfo{
>  	{ formats::SGRBG10, {
>  		.name = "SGRBG10",
>  		.format = formats::SGRBG10,
> -		.v4l2Formats = {
> -			.single = V4L2PixelFormat(V4L2_PIX_FMT_SGRBG10),
> -			.multi = V4L2PixelFormat(),
> -		},
> +		.v4l2Formats = { V4L2PixelFormat(V4L2_PIX_FMT_SGRBG10), },
>  		.bitsPerPixel = 10,
>  		.colourEncoding = PixelFormatInfo::ColourEncodingRAW,
>  		.packed = false,
> @@ -671,10 +572,7 @@ const std::map<PixelFormat, PixelFormatInfo> pixelFormatInfo{
>  	{ formats::SRGGB10, {
>  		.name = "SRGGB10",
>  		.format = formats::SRGGB10,
> -		.v4l2Formats = {
> -			.single = V4L2PixelFormat(V4L2_PIX_FMT_SRGGB10),
> -			.multi = V4L2PixelFormat(),
> -		},
> +		.v4l2Formats = { V4L2PixelFormat(V4L2_PIX_FMT_SRGGB10), },
>  		.bitsPerPixel = 10,
>  		.colourEncoding = PixelFormatInfo::ColourEncodingRAW,
>  		.packed = false,
> @@ -684,10 +582,7 @@ const std::map<PixelFormat, PixelFormatInfo> pixelFormatInfo{
>  	{ formats::SBGGR10_CSI2P, {
>  		.name = "SBGGR10_CSI2P",
>  		.format = formats::SBGGR10_CSI2P,
> -		.v4l2Formats = {
> -			.single = V4L2PixelFormat(V4L2_PIX_FMT_SBGGR10P),
> -			.multi = V4L2PixelFormat(),
> -		},
> +		.v4l2Formats = { V4L2PixelFormat(V4L2_PIX_FMT_SBGGR10P), },
>  		.bitsPerPixel = 10,
>  		.colourEncoding = PixelFormatInfo::ColourEncodingRAW,
>  		.packed = true,
> @@ -697,10 +592,7 @@ const std::map<PixelFormat, PixelFormatInfo> pixelFormatInfo{
>  	{ formats::SGBRG10_CSI2P, {
>  		.name = "SGBRG10_CSI2P",
>  		.format = formats::SGBRG10_CSI2P,
> -		.v4l2Formats = {
> -			.single = V4L2PixelFormat(V4L2_PIX_FMT_SGBRG10P),
> -			.multi = V4L2PixelFormat(),
> -		},
> +		.v4l2Formats = { V4L2PixelFormat(V4L2_PIX_FMT_SGBRG10P), },
>  		.bitsPerPixel = 10,
>  		.colourEncoding = PixelFormatInfo::ColourEncodingRAW,
>  		.packed = true,
> @@ -710,10 +602,7 @@ const std::map<PixelFormat, PixelFormatInfo> pixelFormatInfo{
>  	{ formats::SGRBG10_CSI2P, {
>  		.name = "SGRBG10_CSI2P",
>  		.format = formats::SGRBG10_CSI2P,
> -		.v4l2Formats = {
> -			.single = V4L2PixelFormat(V4L2_PIX_FMT_SGRBG10P),
> -			.multi = V4L2PixelFormat(),
> -		},
> +		.v4l2Formats = { V4L2PixelFormat(V4L2_PIX_FMT_SGRBG10P), },
>  		.bitsPerPixel = 10,
>  		.colourEncoding = PixelFormatInfo::ColourEncodingRAW,
>  		.packed = true,
> @@ -723,10 +612,7 @@ const std::map<PixelFormat, PixelFormatInfo> pixelFormatInfo{
>  	{ formats::SRGGB10_CSI2P, {
>  		.name = "SRGGB10_CSI2P",
>  		.format = formats::SRGGB10_CSI2P,
> -		.v4l2Formats = {
> -			.single = V4L2PixelFormat(V4L2_PIX_FMT_SRGGB10P),
> -			.multi = V4L2PixelFormat(),
> -		},
> +		.v4l2Formats = { V4L2PixelFormat(V4L2_PIX_FMT_SRGGB10P), },
>  		.bitsPerPixel = 10,
>  		.colourEncoding = PixelFormatInfo::ColourEncodingRAW,
>  		.packed = true,
> @@ -736,10 +622,7 @@ const std::map<PixelFormat, PixelFormatInfo> pixelFormatInfo{
>  	{ formats::SBGGR12, {
>  		.name = "SBGGR12",
>  		.format = formats::SBGGR12,
> -		.v4l2Formats = {
> -			.single = V4L2PixelFormat(V4L2_PIX_FMT_SBGGR12),
> -			.multi = V4L2PixelFormat(),
> -		},
> +		.v4l2Formats = { V4L2PixelFormat(V4L2_PIX_FMT_SBGGR12), },
>  		.bitsPerPixel = 12,
>  		.colourEncoding = PixelFormatInfo::ColourEncodingRAW,
>  		.packed = false,
> @@ -749,10 +632,7 @@ const std::map<PixelFormat, PixelFormatInfo> pixelFormatInfo{
>  	{ formats::SGBRG12, {
>  		.name = "SGBRG12",
>  		.format = formats::SGBRG12,
> -		.v4l2Formats = {
> -			.single = V4L2PixelFormat(V4L2_PIX_FMT_SGBRG12),
> -			.multi = V4L2PixelFormat(),
> -		},
> +		.v4l2Formats = { V4L2PixelFormat(V4L2_PIX_FMT_SGBRG12), },
>  		.bitsPerPixel = 12,
>  		.colourEncoding = PixelFormatInfo::ColourEncodingRAW,
>  		.packed = false,
> @@ -762,10 +642,7 @@ const std::map<PixelFormat, PixelFormatInfo> pixelFormatInfo{
>  	{ formats::SGRBG12, {
>  		.name = "SGRBG12",
>  		.format = formats::SGRBG12,
> -		.v4l2Formats = {
> -			.single = V4L2PixelFormat(V4L2_PIX_FMT_SGRBG12),
> -			.multi = V4L2PixelFormat(),
> -		},
> +		.v4l2Formats = { V4L2PixelFormat(V4L2_PIX_FMT_SGRBG12), },
>  		.bitsPerPixel = 12,
>  		.colourEncoding = PixelFormatInfo::ColourEncodingRAW,
>  		.packed = false,
> @@ -775,10 +652,7 @@ const std::map<PixelFormat, PixelFormatInfo> pixelFormatInfo{
>  	{ formats::SRGGB12, {
>  		.name = "SRGGB12",
>  		.format = formats::SRGGB12,
> -		.v4l2Formats = {
> -			.single = V4L2PixelFormat(V4L2_PIX_FMT_SRGGB12),
> -			.multi = V4L2PixelFormat(),
> -		},
> +		.v4l2Formats = { V4L2PixelFormat(V4L2_PIX_FMT_SRGGB12), },
>  		.bitsPerPixel = 12,
>  		.colourEncoding = PixelFormatInfo::ColourEncodingRAW,
>  		.packed = false,
> @@ -788,10 +662,7 @@ const std::map<PixelFormat, PixelFormatInfo> pixelFormatInfo{
>  	{ formats::SBGGR12_CSI2P, {
>  		.name = "SBGGR12_CSI2P",
>  		.format = formats::SBGGR12_CSI2P,
> -		.v4l2Formats = {
> -			.single = V4L2PixelFormat(V4L2_PIX_FMT_SBGGR12P),
> -			.multi = V4L2PixelFormat(),
> -		},
> +		.v4l2Formats = { V4L2PixelFormat(V4L2_PIX_FMT_SBGGR12P), },
>  		.bitsPerPixel = 12,
>  		.colourEncoding = PixelFormatInfo::ColourEncodingRAW,
>  		.packed = true,
> @@ -801,10 +672,7 @@ const std::map<PixelFormat, PixelFormatInfo> pixelFormatInfo{
>  	{ formats::SGBRG12_CSI2P, {
>  		.name = "SGBRG12_CSI2P",
>  		.format = formats::SGBRG12_CSI2P,
> -		.v4l2Formats = {
> -			.single = V4L2PixelFormat(V4L2_PIX_FMT_SGBRG12P),
> -			.multi = V4L2PixelFormat(),
> -		},
> +		.v4l2Formats = { V4L2PixelFormat(V4L2_PIX_FMT_SGBRG12P), },
>  		.bitsPerPixel = 12,
>  		.colourEncoding = PixelFormatInfo::ColourEncodingRAW,
>  		.packed = true,
> @@ -814,10 +682,7 @@ const std::map<PixelFormat, PixelFormatInfo> pixelFormatInfo{
>  	{ formats::SGRBG12_CSI2P, {
>  		.name = "SGRBG12_CSI2P",
>  		.format = formats::SGRBG12_CSI2P,
> -		.v4l2Formats = {
> -			.single = V4L2PixelFormat(V4L2_PIX_FMT_SGRBG12P),
> -			.multi = V4L2PixelFormat(),
> -		},
> +		.v4l2Formats = { V4L2PixelFormat(V4L2_PIX_FMT_SGRBG12P), },
>  		.bitsPerPixel = 12,
>  		.colourEncoding = PixelFormatInfo::ColourEncodingRAW,
>  		.packed = true,
> @@ -827,10 +692,7 @@ const std::map<PixelFormat, PixelFormatInfo> pixelFormatInfo{
>  	{ formats::SRGGB12_CSI2P, {
>  		.name = "SRGGB12_CSI2P",
>  		.format = formats::SRGGB12_CSI2P,
> -		.v4l2Formats = {
> -			.single = V4L2PixelFormat(V4L2_PIX_FMT_SRGGB12P),
> -			.multi = V4L2PixelFormat(),
> -		},
> +		.v4l2Formats = { V4L2PixelFormat(V4L2_PIX_FMT_SRGGB12P), },
>  		.bitsPerPixel = 12,
>  		.colourEncoding = PixelFormatInfo::ColourEncodingRAW,
>  		.packed = true,
> @@ -840,10 +702,7 @@ const std::map<PixelFormat, PixelFormatInfo> pixelFormatInfo{
>  	{ formats::SBGGR16, {
>  		.name = "SBGGR16",
>  		.format = formats::SBGGR16,
> -		.v4l2Formats = {
> -			.single = V4L2PixelFormat(V4L2_PIX_FMT_SBGGR16),
> -			.multi = V4L2PixelFormat(),
> -		},
> +		.v4l2Formats = { V4L2PixelFormat(V4L2_PIX_FMT_SBGGR16), },
>  		.bitsPerPixel = 16,
>  		.colourEncoding = PixelFormatInfo::ColourEncodingRAW,
>  		.packed = false,
> @@ -853,10 +712,7 @@ const std::map<PixelFormat, PixelFormatInfo> pixelFormatInfo{
>  	{ formats::SGBRG16, {
>  		.name = "SGBRG16",
>  		.format = formats::SGBRG16,
> -		.v4l2Formats = {
> -			.single = V4L2PixelFormat(V4L2_PIX_FMT_SGBRG16),
> -			.multi = V4L2PixelFormat(),
> -		},
> +		.v4l2Formats = { V4L2PixelFormat(V4L2_PIX_FMT_SGBRG16), },
>  		.bitsPerPixel = 16,
>  		.colourEncoding = PixelFormatInfo::ColourEncodingRAW,
>  		.packed = false,
> @@ -866,10 +722,7 @@ const std::map<PixelFormat, PixelFormatInfo> pixelFormatInfo{
>  	{ formats::SGRBG16, {
>  		.name = "SGRBG16",
>  		.format = formats::SGRBG16,
> -		.v4l2Formats = {
> -			.single = V4L2PixelFormat(V4L2_PIX_FMT_SGRBG16),
> -			.multi = V4L2PixelFormat(),
> -		},
> +		.v4l2Formats = { V4L2PixelFormat(V4L2_PIX_FMT_SGRBG16), },
>  		.bitsPerPixel = 16,
>  		.colourEncoding = PixelFormatInfo::ColourEncodingRAW,
>  		.packed = false,
> @@ -879,10 +732,7 @@ const std::map<PixelFormat, PixelFormatInfo> pixelFormatInfo{
>  	{ formats::SRGGB16, {
>  		.name = "SRGGB16",
>  		.format = formats::SRGGB16,
> -		.v4l2Formats = {
> -			.single = V4L2PixelFormat(V4L2_PIX_FMT_SRGGB16),
> -			.multi = V4L2PixelFormat(),
> -		},
> +		.v4l2Formats = { V4L2PixelFormat(V4L2_PIX_FMT_SRGGB16), },
>  		.bitsPerPixel = 16,
>  		.colourEncoding = PixelFormatInfo::ColourEncodingRAW,
>  		.packed = false,
> @@ -892,10 +742,7 @@ const std::map<PixelFormat, PixelFormatInfo> pixelFormatInfo{
>  	{ formats::SBGGR10_IPU3, {
>  		.name = "SBGGR10_IPU3",
>  		.format = formats::SBGGR10_IPU3,
> -		.v4l2Formats = {
> -			.single = V4L2PixelFormat(V4L2_PIX_FMT_IPU3_SBGGR10),
> -			.multi = V4L2PixelFormat(),
> -		},
> +		.v4l2Formats = { V4L2PixelFormat(V4L2_PIX_FMT_IPU3_SBGGR10), },
>  		.bitsPerPixel = 10,
>  		.colourEncoding = PixelFormatInfo::ColourEncodingRAW,
>  		.packed = true,
> @@ -906,10 +753,7 @@ const std::map<PixelFormat, PixelFormatInfo> pixelFormatInfo{
>  	{ formats::SGBRG10_IPU3, {
>  		.name = "SGBRG10_IPU3",
>  		.format = formats::SGBRG10_IPU3,
> -		.v4l2Formats = {
> -			.single = V4L2PixelFormat(V4L2_PIX_FMT_IPU3_SGBRG10),
> -			.multi = V4L2PixelFormat(),
> -		},
> +		.v4l2Formats = { V4L2PixelFormat(V4L2_PIX_FMT_IPU3_SGBRG10), },
>  		.bitsPerPixel = 10,
>  		.colourEncoding = PixelFormatInfo::ColourEncodingRAW,
>  		.packed = true,
> @@ -919,10 +763,7 @@ const std::map<PixelFormat, PixelFormatInfo> pixelFormatInfo{
>  	{ formats::SGRBG10_IPU3, {
>  		.name = "SGRBG10_IPU3",
>  		.format = formats::SGRBG10_IPU3,
> -		.v4l2Formats = {
> -			.single = V4L2PixelFormat(V4L2_PIX_FMT_IPU3_SGRBG10),
> -			.multi = V4L2PixelFormat(),
> -		},
> +		.v4l2Formats = { V4L2PixelFormat(V4L2_PIX_FMT_IPU3_SGRBG10), },
>  		.bitsPerPixel = 10,
>  		.colourEncoding = PixelFormatInfo::ColourEncodingRAW,
>  		.packed = true,
> @@ -932,10 +773,7 @@ const std::map<PixelFormat, PixelFormatInfo> pixelFormatInfo{
>  	{ formats::SRGGB10_IPU3, {
>  		.name = "SRGGB10_IPU3",
>  		.format = formats::SRGGB10_IPU3,
> -		.v4l2Formats = {
> -			.single = V4L2PixelFormat(V4L2_PIX_FMT_IPU3_SRGGB10),
> -			.multi = V4L2PixelFormat(),
> -		},
> +		.v4l2Formats = { V4L2PixelFormat(V4L2_PIX_FMT_IPU3_SRGGB10), },
>  		.bitsPerPixel = 10,
>  		.colourEncoding = PixelFormatInfo::ColourEncodingRAW,
>  		.packed = true,
> @@ -947,10 +785,7 @@ const std::map<PixelFormat, PixelFormatInfo> pixelFormatInfo{
>  	{ formats::MJPEG, {
>  		.name = "MJPEG",
>  		.format = formats::MJPEG,
> -		.v4l2Formats = {
> -			.single = V4L2PixelFormat(V4L2_PIX_FMT_MJPEG),
> -			.multi = V4L2PixelFormat(),
> -		},
> +		.v4l2Formats = { V4L2PixelFormat(V4L2_PIX_FMT_MJPEG), },
>  		.bitsPerPixel = 0,
>  		.colourEncoding = PixelFormatInfo::ColourEncodingYUV,
>  		.packed = false,
> @@ -996,8 +831,7 @@ const PixelFormatInfo &PixelFormatInfo::info(const V4L2PixelFormat &format)
>  {
>  	const auto &info = std::find_if(pixelFormatInfo.begin(), pixelFormatInfo.end(),
>  					[format](auto pair) {
> -						return pair.second.v4l2Formats.single == format ||
> -						       pair.second.v4l2Formats.multi == format;
> +						return pair.second.v4l2Formats[0] == format;

This should consider all the values in the vector. You do that in a
subsequent patch in the series, if it's not too much trouble, I'd move
it to this one.

>  					});
>  	if (info == pixelFormatInfo.end())
>  		return pixelFormatInfoInvalid;
> diff --git a/src/libcamera/v4l2_pixelformat.cpp b/src/libcamera/v4l2_pixelformat.cpp
> index bdcdc3be4e0c..91a882baa75b 100644
> --- a/src/libcamera/v4l2_pixelformat.cpp
> +++ b/src/libcamera/v4l2_pixelformat.cpp
> @@ -304,24 +304,21 @@ PixelFormat V4L2PixelFormat::toPixelFormat() const
>  /**
>   * \brief Convert \a pixelFormat to its corresponding V4L2PixelFormat
>   * \param[in] pixelFormat The PixelFormat to convert
> - * \param[in] multiplanar V4L2 Multiplanar API support flag
>   *
> - * Multiple V4L2 formats may exist for one PixelFormat when the format uses
> - * multiple planes, as V4L2 defines separate 4CCs for contiguous and separate
> - * planes formats. Set the \a multiplanar parameter to false to select a format
> - * with contiguous planes, or to true to select a format with non-contiguous
> - * planes.
> + * Multiple V4L2 formats may exist for one PixelFormat as V4L2 defines separate
> + * 4CCs for contiguous and non-contiguous versions of the same image format.
> + *
> + * Return the contiguous planes format version by default.

That's not true for formats::YVU422, formats::YUV444 and formats::YVU444
as they have no contiguous variants. We can leave it as-is as the
function is later removed, but it's easy to be accurate here:

 * Multiple V4L2 formats may exist for one PixelFormat as V4L2 defines separate
 * 4CCs for contiguous and non-contiguous versions of the same image format.
 * When that is the case, this function returns the contiguous planes format.

Reviewed-by: Laurent Pinchart <laurent.pinchart@ideasonboard.com>

>   *
>   * \return The V4L2PixelFormat corresponding to \a pixelFormat
>   */
> -V4L2PixelFormat V4L2PixelFormat::fromPixelFormat(const PixelFormat &pixelFormat,
> -						 bool multiplanar)
> +V4L2PixelFormat V4L2PixelFormat::fromPixelFormat(const PixelFormat &pixelFormat)
>  {
>  	const PixelFormatInfo &info = PixelFormatInfo::info(pixelFormat);
>  	if (!info.isValid())
>  		return V4L2PixelFormat();
>  
> -	return multiplanar ? info.v4l2Formats.multi : info.v4l2Formats.single;
> +	return info.v4l2Formats[0];
>  }
>  
>  /**

Patch
diff mbox series

diff --git a/include/libcamera/internal/formats.h b/include/libcamera/internal/formats.h
index ee599765be47..5b16c0a8c071 100644
--- a/include/libcamera/internal/formats.h
+++ b/include/libcamera/internal/formats.h
@@ -53,10 +53,7 @@  public:
 	/* \todo Add support for non-contiguous memory planes */
 	const char *name;
 	PixelFormat format;
-	struct {
-		V4L2PixelFormat single;
-		V4L2PixelFormat multi;
-	} v4l2Formats;
+	std::vector<V4L2PixelFormat> v4l2Formats;
 	unsigned int bitsPerPixel;
 	enum ColourEncoding colourEncoding;
 	bool packed;
diff --git a/include/libcamera/internal/v4l2_pixelformat.h b/include/libcamera/internal/v4l2_pixelformat.h
index 7bd3ea79428f..ed94baf92795 100644
--- a/include/libcamera/internal/v4l2_pixelformat.h
+++ b/include/libcamera/internal/v4l2_pixelformat.h
@@ -44,8 +44,7 @@  public:
 	const char *description() const;
 
 	PixelFormat toPixelFormat() const;
-	static V4L2PixelFormat fromPixelFormat(const PixelFormat &pixelFormat,
-					       bool multiplanar = false);
+	static V4L2PixelFormat fromPixelFormat(const PixelFormat &pixelFormat);
 
 private:
 	uint32_t fourcc_;
diff --git a/src/libcamera/formats.cpp b/src/libcamera/formats.cpp
index 283ecb3d89d8..3c536722f375 100644
--- a/src/libcamera/formats.cpp
+++ b/src/libcamera/formats.cpp
@@ -42,12 +42,9 @@  LOG_DEFINE_CATEGORY(Formats)
  * \var PixelFormatInfo::v4l2Formats
  * \brief The V4L2 pixel formats corresponding to the PixelFormat
  *
- * Multiple V4L2 formats may exist for one PixelFormat when the format uses
- * multiple planes, as V4L2 defines separate 4CCs for contiguous and separate
- * planes formats. The two entries in the array store the contiguous and
- * non-contiguous V4L2 formats respectively. If the PixelFormat isn't a
- * multiplanar format, or if no corresponding non-contiguous V4L2 format
- * exists, the second entry is invalid.
+ * Multiple V4L2 formats may exist for one PixelForma, as V4L2 defines
+ * separate 4CCs for contiguous and non-contiguous versions of the same image
+ * format.
  *
  * \var PixelFormatInfo::bitsPerPixel
  * \brief The average number of bits per pixel
@@ -156,10 +153,7 @@  const std::map<PixelFormat, PixelFormatInfo> pixelFormatInfo{
 	{ formats::RGB565, {
 		.name = "RGB565",
 		.format = formats::RGB565,
-		.v4l2Formats = {
-			.single = V4L2PixelFormat(V4L2_PIX_FMT_RGB565),
-			.multi = V4L2PixelFormat(),
-		},
+		.v4l2Formats = { V4L2PixelFormat(V4L2_PIX_FMT_RGB565), },
 		.bitsPerPixel = 16,
 		.colourEncoding = PixelFormatInfo::ColourEncodingRGB,
 		.packed = false,
@@ -169,10 +163,7 @@  const std::map<PixelFormat, PixelFormatInfo> pixelFormatInfo{
 	{ formats::RGB565_BE, {
 		.name = "RGB565_BE",
 		.format = formats::RGB565_BE,
-		.v4l2Formats = {
-			.single = V4L2PixelFormat(V4L2_PIX_FMT_RGB565X),
-			.multi = V4L2PixelFormat(),
-		},
+		.v4l2Formats = { V4L2PixelFormat(V4L2_PIX_FMT_RGB565X), },
 		.bitsPerPixel = 16,
 		.colourEncoding = PixelFormatInfo::ColourEncodingRGB,
 		.packed = false,
@@ -182,10 +173,7 @@  const std::map<PixelFormat, PixelFormatInfo> pixelFormatInfo{
 	{ formats::BGR888, {
 		.name = "BGR888",
 		.format = formats::BGR888,
-		.v4l2Formats = {
-			.single = V4L2PixelFormat(V4L2_PIX_FMT_RGB24),
-			.multi = V4L2PixelFormat(),
-		},
+		.v4l2Formats = { V4L2PixelFormat(V4L2_PIX_FMT_RGB24), },
 		.bitsPerPixel = 24,
 		.colourEncoding = PixelFormatInfo::ColourEncodingRGB,
 		.packed = false,
@@ -195,10 +183,7 @@  const std::map<PixelFormat, PixelFormatInfo> pixelFormatInfo{
 	{ formats::RGB888, {
 		.name = "RGB888",
 		.format = formats::RGB888,
-		.v4l2Formats = {
-			.single = V4L2PixelFormat(V4L2_PIX_FMT_BGR24),
-			.multi = V4L2PixelFormat(),
-		},
+		.v4l2Formats = { V4L2PixelFormat(V4L2_PIX_FMT_BGR24), },
 		.bitsPerPixel = 24,
 		.colourEncoding = PixelFormatInfo::ColourEncodingRGB,
 		.packed = false,
@@ -208,10 +193,7 @@  const std::map<PixelFormat, PixelFormatInfo> pixelFormatInfo{
 	{ formats::XRGB8888, {
 		.name = "XRGB8888",
 		.format = formats::XRGB8888,
-		.v4l2Formats = {
-			.single = V4L2PixelFormat(V4L2_PIX_FMT_XBGR32),
-			.multi = V4L2PixelFormat(),
-		},
+		.v4l2Formats = { V4L2PixelFormat(V4L2_PIX_FMT_XBGR32), },
 		.bitsPerPixel = 32,
 		.colourEncoding = PixelFormatInfo::ColourEncodingRGB,
 		.packed = false,
@@ -221,10 +203,7 @@  const std::map<PixelFormat, PixelFormatInfo> pixelFormatInfo{
 	{ formats::XBGR8888, {
 		.name = "XBGR8888",
 		.format = formats::XBGR8888,
-		.v4l2Formats = {
-			.single = V4L2PixelFormat(V4L2_PIX_FMT_RGBX32),
-			.multi = V4L2PixelFormat(),
-		},
+		.v4l2Formats = { V4L2PixelFormat(V4L2_PIX_FMT_RGBX32), },
 		.bitsPerPixel = 32,
 		.colourEncoding = PixelFormatInfo::ColourEncodingRGB,
 		.packed = false,
@@ -234,10 +213,7 @@  const std::map<PixelFormat, PixelFormatInfo> pixelFormatInfo{
 	{ formats::RGBX8888, {
 		.name = "RGBX8888",
 		.format = formats::RGBX8888,
-		.v4l2Formats = {
-			.single = V4L2PixelFormat(V4L2_PIX_FMT_BGRX32),
-			.multi = V4L2PixelFormat(),
-		},
+		.v4l2Formats = { V4L2PixelFormat(V4L2_PIX_FMT_BGRX32), },
 		.bitsPerPixel = 32,
 		.colourEncoding = PixelFormatInfo::ColourEncodingRGB,
 		.packed = false,
@@ -247,10 +223,7 @@  const std::map<PixelFormat, PixelFormatInfo> pixelFormatInfo{
 	{ formats::BGRX8888, {
 		.name = "BGRX8888",
 		.format = formats::BGRX8888,
-		.v4l2Formats = {
-			.single = V4L2PixelFormat(V4L2_PIX_FMT_XRGB32),
-			.multi = V4L2PixelFormat(),
-		},
+		.v4l2Formats = { V4L2PixelFormat(V4L2_PIX_FMT_XRGB32), },
 		.bitsPerPixel = 32,
 		.colourEncoding = PixelFormatInfo::ColourEncodingRGB,
 		.packed = false,
@@ -260,10 +233,7 @@  const std::map<PixelFormat, PixelFormatInfo> pixelFormatInfo{
 	{ formats::ABGR8888, {
 		.name = "ABGR8888",
 		.format = formats::ABGR8888,
-		.v4l2Formats = {
-			.single = V4L2PixelFormat(V4L2_PIX_FMT_RGBA32),
-			.multi = V4L2PixelFormat(),
-		},
+		.v4l2Formats = { V4L2PixelFormat(V4L2_PIX_FMT_RGBA32), },
 		.bitsPerPixel = 32,
 		.colourEncoding = PixelFormatInfo::ColourEncodingRGB,
 		.packed = false,
@@ -273,10 +243,7 @@  const std::map<PixelFormat, PixelFormatInfo> pixelFormatInfo{
 	{ formats::ARGB8888, {
 		.name = "ARGB8888",
 		.format = formats::ARGB8888,
-		.v4l2Formats = {
-			.single = V4L2PixelFormat(V4L2_PIX_FMT_ABGR32),
-			.multi = V4L2PixelFormat(),
-		},
+		.v4l2Formats = { V4L2PixelFormat(V4L2_PIX_FMT_ABGR32), },
 		.bitsPerPixel = 32,
 		.colourEncoding = PixelFormatInfo::ColourEncodingRGB,
 		.packed = false,
@@ -286,10 +253,7 @@  const std::map<PixelFormat, PixelFormatInfo> pixelFormatInfo{
 	{ formats::BGRA8888, {
 		.name = "BGRA8888",
 		.format = formats::BGRA8888,
-		.v4l2Formats = {
-			.single = V4L2PixelFormat(V4L2_PIX_FMT_ARGB32),
-			.multi = V4L2PixelFormat(),
-		},
+		.v4l2Formats = { V4L2PixelFormat(V4L2_PIX_FMT_ARGB32), },
 		.bitsPerPixel = 32,
 		.colourEncoding = PixelFormatInfo::ColourEncodingRGB,
 		.packed = false,
@@ -299,10 +263,7 @@  const std::map<PixelFormat, PixelFormatInfo> pixelFormatInfo{
 	{ formats::RGBA8888, {
 		.name = "RGBA8888",
 		.format = formats::RGBA8888,
-		.v4l2Formats = {
-			.single = V4L2PixelFormat(V4L2_PIX_FMT_BGRA32),
-			.multi = V4L2PixelFormat(),
-		},
+		.v4l2Formats = { V4L2PixelFormat(V4L2_PIX_FMT_BGRA32), },
 		.bitsPerPixel = 32,
 		.colourEncoding = PixelFormatInfo::ColourEncodingRGB,
 		.packed = false,
@@ -314,10 +275,7 @@  const std::map<PixelFormat, PixelFormatInfo> pixelFormatInfo{
 	{ formats::YUYV, {
 		.name = "YUYV",
 		.format = formats::YUYV,
-		.v4l2Formats = {
-			.single = V4L2PixelFormat(V4L2_PIX_FMT_YUYV),
-			.multi = V4L2PixelFormat(),
-		},
+		.v4l2Formats = { V4L2PixelFormat(V4L2_PIX_FMT_YUYV), },
 		.bitsPerPixel = 16,
 		.colourEncoding = PixelFormatInfo::ColourEncodingYUV,
 		.packed = false,
@@ -327,10 +285,7 @@  const std::map<PixelFormat, PixelFormatInfo> pixelFormatInfo{
 	{ formats::YVYU, {
 		.name = "YVYU",
 		.format = formats::YVYU,
-		.v4l2Formats = {
-			.single = V4L2PixelFormat(V4L2_PIX_FMT_YVYU),
-			.multi = V4L2PixelFormat(),
-		},
+		.v4l2Formats = { V4L2PixelFormat(V4L2_PIX_FMT_YVYU), },
 		.bitsPerPixel = 16,
 		.colourEncoding = PixelFormatInfo::ColourEncodingYUV,
 		.packed = false,
@@ -340,10 +295,7 @@  const std::map<PixelFormat, PixelFormatInfo> pixelFormatInfo{
 	{ formats::UYVY, {
 		.name = "UYVY",
 		.format = formats::UYVY,
-		.v4l2Formats = {
-			.single = V4L2PixelFormat(V4L2_PIX_FMT_UYVY),
-			.multi = V4L2PixelFormat(),
-		},
+		.v4l2Formats = { V4L2PixelFormat(V4L2_PIX_FMT_UYVY), },
 		.bitsPerPixel = 16,
 		.colourEncoding = PixelFormatInfo::ColourEncodingYUV,
 		.packed = false,
@@ -353,10 +305,7 @@  const std::map<PixelFormat, PixelFormatInfo> pixelFormatInfo{
 	{ formats::VYUY, {
 		.name = "VYUY",
 		.format = formats::VYUY,
-		.v4l2Formats = {
-			.single = V4L2PixelFormat(V4L2_PIX_FMT_VYUY),
-			.multi = V4L2PixelFormat(),
-		},
+		.v4l2Formats = { V4L2PixelFormat(V4L2_PIX_FMT_VYUY), },
 		.bitsPerPixel = 16,
 		.colourEncoding = PixelFormatInfo::ColourEncodingYUV,
 		.packed = false,
@@ -369,8 +318,8 @@  const std::map<PixelFormat, PixelFormatInfo> pixelFormatInfo{
 		.name = "NV12",
 		.format = formats::NV12,
 		.v4l2Formats = {
-			.single = V4L2PixelFormat(V4L2_PIX_FMT_NV12),
-			.multi = V4L2PixelFormat(V4L2_PIX_FMT_NV12M),
+			V4L2PixelFormat(V4L2_PIX_FMT_NV12),
+			V4L2PixelFormat(V4L2_PIX_FMT_NV12M),
 		},
 		.bitsPerPixel = 12,
 		.colourEncoding = PixelFormatInfo::ColourEncodingYUV,
@@ -382,8 +331,8 @@  const std::map<PixelFormat, PixelFormatInfo> pixelFormatInfo{
 		.name = "NV21",
 		.format = formats::NV21,
 		.v4l2Formats = {
-			.single = V4L2PixelFormat(V4L2_PIX_FMT_NV21),
-			.multi = V4L2PixelFormat(V4L2_PIX_FMT_NV21M),
+			V4L2PixelFormat(V4L2_PIX_FMT_NV21),
+			V4L2PixelFormat(V4L2_PIX_FMT_NV21M),
 		},
 		.bitsPerPixel = 12,
 		.colourEncoding = PixelFormatInfo::ColourEncodingYUV,
@@ -395,8 +344,8 @@  const std::map<PixelFormat, PixelFormatInfo> pixelFormatInfo{
 		.name = "NV16",
 		.format = formats::NV16,
 		.v4l2Formats = {
-			.single = V4L2PixelFormat(V4L2_PIX_FMT_NV16),
-			.multi = V4L2PixelFormat(V4L2_PIX_FMT_NV16M),
+			V4L2PixelFormat(V4L2_PIX_FMT_NV16),
+			V4L2PixelFormat(V4L2_PIX_FMT_NV16M),
 		},
 		.bitsPerPixel = 16,
 		.colourEncoding = PixelFormatInfo::ColourEncodingYUV,
@@ -408,8 +357,8 @@  const std::map<PixelFormat, PixelFormatInfo> pixelFormatInfo{
 		.name = "NV61",
 		.format = formats::NV61,
 		.v4l2Formats = {
-			.single = V4L2PixelFormat(V4L2_PIX_FMT_NV61),
-			.multi = V4L2PixelFormat(V4L2_PIX_FMT_NV61M),
+			V4L2PixelFormat(V4L2_PIX_FMT_NV61),
+			V4L2PixelFormat(V4L2_PIX_FMT_NV61M),
 		},
 		.bitsPerPixel = 16,
 		.colourEncoding = PixelFormatInfo::ColourEncodingYUV,
@@ -420,10 +369,7 @@  const std::map<PixelFormat, PixelFormatInfo> pixelFormatInfo{
 	{ formats::NV24, {
 		.name = "NV24",
 		.format = formats::NV24,
-		.v4l2Formats = {
-			.single = V4L2PixelFormat(V4L2_PIX_FMT_NV24),
-			.multi = V4L2PixelFormat(),
-		},
+		.v4l2Formats = { V4L2PixelFormat(V4L2_PIX_FMT_NV24), },
 		.bitsPerPixel = 24,
 		.colourEncoding = PixelFormatInfo::ColourEncodingYUV,
 		.packed = false,
@@ -433,10 +379,7 @@  const std::map<PixelFormat, PixelFormatInfo> pixelFormatInfo{
 	{ formats::NV42, {
 		.name = "NV42",
 		.format = formats::NV42,
-		.v4l2Formats = {
-			.single = V4L2PixelFormat(V4L2_PIX_FMT_NV42),
-			.multi = V4L2PixelFormat(),
-		},
+		.v4l2Formats = { V4L2PixelFormat(V4L2_PIX_FMT_NV42), },
 		.bitsPerPixel = 24,
 		.colourEncoding = PixelFormatInfo::ColourEncodingYUV,
 		.packed = false,
@@ -447,8 +390,8 @@  const std::map<PixelFormat, PixelFormatInfo> pixelFormatInfo{
 		.name = "YUV420",
 		.format = formats::YUV420,
 		.v4l2Formats = {
-			.single = V4L2PixelFormat(V4L2_PIX_FMT_YUV420),
-			.multi = V4L2PixelFormat(V4L2_PIX_FMT_YUV420M),
+			V4L2PixelFormat(V4L2_PIX_FMT_YUV420),
+			V4L2PixelFormat(V4L2_PIX_FMT_YUV420M),
 		},
 		.bitsPerPixel = 12,
 		.colourEncoding = PixelFormatInfo::ColourEncodingYUV,
@@ -460,8 +403,8 @@  const std::map<PixelFormat, PixelFormatInfo> pixelFormatInfo{
 		.name = "YVU420",
 		.format = formats::YVU420,
 		.v4l2Formats = {
-			.single = V4L2PixelFormat(V4L2_PIX_FMT_YVU420),
-			.multi = V4L2PixelFormat(V4L2_PIX_FMT_YVU420M),
+			V4L2PixelFormat(V4L2_PIX_FMT_YVU420),
+			V4L2PixelFormat(V4L2_PIX_FMT_YVU420M),
 		},
 		.bitsPerPixel = 12,
 		.colourEncoding = PixelFormatInfo::ColourEncodingYUV,
@@ -473,8 +416,8 @@  const std::map<PixelFormat, PixelFormatInfo> pixelFormatInfo{
 		.name = "YUV422",
 		.format = formats::YUV422,
 		.v4l2Formats = {
-			.single = V4L2PixelFormat(V4L2_PIX_FMT_YUV422P),
-			.multi = V4L2PixelFormat(V4L2_PIX_FMT_YUV422M),
+			V4L2PixelFormat(V4L2_PIX_FMT_YUV422P),
+			V4L2PixelFormat(V4L2_PIX_FMT_YUV422M),
 		},
 		.bitsPerPixel = 16,
 		.colourEncoding = PixelFormatInfo::ColourEncodingYUV,
@@ -485,10 +428,7 @@  const std::map<PixelFormat, PixelFormatInfo> pixelFormatInfo{
 	{ formats::YVU422, {
 		.name = "YVU422",
 		.format = formats::YVU422,
-		.v4l2Formats = {
-			.single = V4L2PixelFormat(),
-			.multi = V4L2PixelFormat(V4L2_PIX_FMT_YVU422M),
-		},
+		.v4l2Formats = { V4L2PixelFormat(V4L2_PIX_FMT_YVU422M), },
 		.bitsPerPixel = 16,
 		.colourEncoding = PixelFormatInfo::ColourEncodingYUV,
 		.packed = false,
@@ -498,10 +438,7 @@  const std::map<PixelFormat, PixelFormatInfo> pixelFormatInfo{
 	{ formats::YUV444, {
 		.name = "YUV444",
 		.format = formats::YUV444,
-		.v4l2Formats = {
-			.single = V4L2PixelFormat(),
-			.multi = V4L2PixelFormat(V4L2_PIX_FMT_YUV444M),
-		},
+		.v4l2Formats = { V4L2PixelFormat(V4L2_PIX_FMT_YUV444M), },
 		.bitsPerPixel = 24,
 		.colourEncoding = PixelFormatInfo::ColourEncodingYUV,
 		.packed = false,
@@ -511,10 +448,7 @@  const std::map<PixelFormat, PixelFormatInfo> pixelFormatInfo{
 	{ formats::YVU444, {
 		.name = "YVU444",
 		.format = formats::YVU444,
-		.v4l2Formats = {
-			.single = V4L2PixelFormat(),
-			.multi = V4L2PixelFormat(V4L2_PIX_FMT_YVU444M),
-		},
+		.v4l2Formats = { V4L2PixelFormat(V4L2_PIX_FMT_YVU444M), },
 		.bitsPerPixel = 24,
 		.colourEncoding = PixelFormatInfo::ColourEncodingYUV,
 		.packed = false,
@@ -526,10 +460,7 @@  const std::map<PixelFormat, PixelFormatInfo> pixelFormatInfo{
 	{ formats::R8, {
 		.name = "R8",
 		.format = formats::R8,
-		.v4l2Formats = {
-			.single = V4L2PixelFormat(V4L2_PIX_FMT_GREY),
-			.multi = V4L2PixelFormat(),
-		},
+		.v4l2Formats = { V4L2PixelFormat(V4L2_PIX_FMT_GREY), },
 		.bitsPerPixel = 8,
 		.colourEncoding = PixelFormatInfo::ColourEncodingYUV,
 		.packed = false,
@@ -539,10 +470,7 @@  const std::map<PixelFormat, PixelFormatInfo> pixelFormatInfo{
 	{ formats::R10, {
 		.name = "R10",
 		.format = formats::R10,
-		.v4l2Formats = {
-			.single = V4L2PixelFormat(V4L2_PIX_FMT_Y10),
-			.multi = V4L2PixelFormat(),
-		},
+		.v4l2Formats = { V4L2PixelFormat(V4L2_PIX_FMT_Y10), },
 		.bitsPerPixel = 10,
 		.colourEncoding = PixelFormatInfo::ColourEncodingYUV,
 		.packed = false,
@@ -552,10 +480,7 @@  const std::map<PixelFormat, PixelFormatInfo> pixelFormatInfo{
 	{ formats::R12, {
 		.name = "R12",
 		.format = formats::R12,
-		.v4l2Formats = {
-			.single = V4L2PixelFormat(V4L2_PIX_FMT_Y12),
-			.multi = V4L2PixelFormat(),
-		},
+		.v4l2Formats = { V4L2PixelFormat(V4L2_PIX_FMT_Y12), },
 		.bitsPerPixel = 12,
 		.colourEncoding = PixelFormatInfo::ColourEncodingYUV,
 		.packed = false,
@@ -565,10 +490,7 @@  const std::map<PixelFormat, PixelFormatInfo> pixelFormatInfo{
 	{ formats::R10_CSI2P, {
 		.name = "R10_CSI2P",
 		.format = formats::R10,
-		.v4l2Formats = {
-			.single = V4L2PixelFormat(V4L2_PIX_FMT_Y10P),
-			.multi = V4L2PixelFormat(),
-		},
+		.v4l2Formats = { V4L2PixelFormat(V4L2_PIX_FMT_Y10P), },
 		.bitsPerPixel = 10,
 		.colourEncoding = PixelFormatInfo::ColourEncodingYUV,
 		.packed = true,
@@ -580,10 +502,7 @@  const std::map<PixelFormat, PixelFormatInfo> pixelFormatInfo{
 	{ formats::SBGGR8, {
 		.name = "SBGGR8",
 		.format = formats::SBGGR8,
-		.v4l2Formats = {
-			.single = V4L2PixelFormat(V4L2_PIX_FMT_SBGGR8),
-			.multi = V4L2PixelFormat(),
-		},
+		.v4l2Formats = { V4L2PixelFormat(V4L2_PIX_FMT_SBGGR8), },
 		.bitsPerPixel = 8,
 		.colourEncoding = PixelFormatInfo::ColourEncodingRAW,
 		.packed = false,
@@ -593,10 +512,7 @@  const std::map<PixelFormat, PixelFormatInfo> pixelFormatInfo{
 	{ formats::SGBRG8, {
 		.name = "SGBRG8",
 		.format = formats::SGBRG8,
-		.v4l2Formats = {
-			.single = V4L2PixelFormat(V4L2_PIX_FMT_SGBRG8),
-			.multi = V4L2PixelFormat(),
-		},
+		.v4l2Formats = { V4L2PixelFormat(V4L2_PIX_FMT_SGBRG8), },
 		.bitsPerPixel = 8,
 		.colourEncoding = PixelFormatInfo::ColourEncodingRAW,
 		.packed = false,
@@ -606,10 +522,7 @@  const std::map<PixelFormat, PixelFormatInfo> pixelFormatInfo{
 	{ formats::SGRBG8, {
 		.name = "SGRBG8",
 		.format = formats::SGRBG8,
-		.v4l2Formats = {
-			.single = V4L2PixelFormat(V4L2_PIX_FMT_SGRBG8),
-			.multi = V4L2PixelFormat(),
-		},
+		.v4l2Formats = { V4L2PixelFormat(V4L2_PIX_FMT_SGRBG8), },
 		.bitsPerPixel = 8,
 		.colourEncoding = PixelFormatInfo::ColourEncodingRAW,
 		.packed = false,
@@ -619,10 +532,7 @@  const std::map<PixelFormat, PixelFormatInfo> pixelFormatInfo{
 	{ formats::SRGGB8, {
 		.name = "SRGGB8",
 		.format = formats::SRGGB8,
-		.v4l2Formats = {
-			.single = V4L2PixelFormat(V4L2_PIX_FMT_SRGGB8),
-			.multi = V4L2PixelFormat(),
-		},
+		.v4l2Formats = { V4L2PixelFormat(V4L2_PIX_FMT_SRGGB8), },
 		.bitsPerPixel = 8,
 		.colourEncoding = PixelFormatInfo::ColourEncodingRAW,
 		.packed = false,
@@ -632,10 +542,7 @@  const std::map<PixelFormat, PixelFormatInfo> pixelFormatInfo{
 	{ formats::SBGGR10, {
 		.name = "SBGGR10",
 		.format = formats::SBGGR10,
-		.v4l2Formats = {
-			.single = V4L2PixelFormat(V4L2_PIX_FMT_SBGGR10),
-			.multi = V4L2PixelFormat(),
-		},
+		.v4l2Formats = { V4L2PixelFormat(V4L2_PIX_FMT_SBGGR10), },
 		.bitsPerPixel = 10,
 		.colourEncoding = PixelFormatInfo::ColourEncodingRAW,
 		.packed = false,
@@ -645,10 +552,7 @@  const std::map<PixelFormat, PixelFormatInfo> pixelFormatInfo{
 	{ formats::SGBRG10, {
 		.name = "SGBRG10",
 		.format = formats::SGBRG10,
-		.v4l2Formats = {
-			.single = V4L2PixelFormat(V4L2_PIX_FMT_SGBRG10),
-			.multi = V4L2PixelFormat(),
-		},
+		.v4l2Formats = { V4L2PixelFormat(V4L2_PIX_FMT_SGBRG10), },
 		.bitsPerPixel = 10,
 		.colourEncoding = PixelFormatInfo::ColourEncodingRAW,
 		.packed = false,
@@ -658,10 +562,7 @@  const std::map<PixelFormat, PixelFormatInfo> pixelFormatInfo{
 	{ formats::SGRBG10, {
 		.name = "SGRBG10",
 		.format = formats::SGRBG10,
-		.v4l2Formats = {
-			.single = V4L2PixelFormat(V4L2_PIX_FMT_SGRBG10),
-			.multi = V4L2PixelFormat(),
-		},
+		.v4l2Formats = { V4L2PixelFormat(V4L2_PIX_FMT_SGRBG10), },
 		.bitsPerPixel = 10,
 		.colourEncoding = PixelFormatInfo::ColourEncodingRAW,
 		.packed = false,
@@ -671,10 +572,7 @@  const std::map<PixelFormat, PixelFormatInfo> pixelFormatInfo{
 	{ formats::SRGGB10, {
 		.name = "SRGGB10",
 		.format = formats::SRGGB10,
-		.v4l2Formats = {
-			.single = V4L2PixelFormat(V4L2_PIX_FMT_SRGGB10),
-			.multi = V4L2PixelFormat(),
-		},
+		.v4l2Formats = { V4L2PixelFormat(V4L2_PIX_FMT_SRGGB10), },
 		.bitsPerPixel = 10,
 		.colourEncoding = PixelFormatInfo::ColourEncodingRAW,
 		.packed = false,
@@ -684,10 +582,7 @@  const std::map<PixelFormat, PixelFormatInfo> pixelFormatInfo{
 	{ formats::SBGGR10_CSI2P, {
 		.name = "SBGGR10_CSI2P",
 		.format = formats::SBGGR10_CSI2P,
-		.v4l2Formats = {
-			.single = V4L2PixelFormat(V4L2_PIX_FMT_SBGGR10P),
-			.multi = V4L2PixelFormat(),
-		},
+		.v4l2Formats = { V4L2PixelFormat(V4L2_PIX_FMT_SBGGR10P), },
 		.bitsPerPixel = 10,
 		.colourEncoding = PixelFormatInfo::ColourEncodingRAW,
 		.packed = true,
@@ -697,10 +592,7 @@  const std::map<PixelFormat, PixelFormatInfo> pixelFormatInfo{
 	{ formats::SGBRG10_CSI2P, {
 		.name = "SGBRG10_CSI2P",
 		.format = formats::SGBRG10_CSI2P,
-		.v4l2Formats = {
-			.single = V4L2PixelFormat(V4L2_PIX_FMT_SGBRG10P),
-			.multi = V4L2PixelFormat(),
-		},
+		.v4l2Formats = { V4L2PixelFormat(V4L2_PIX_FMT_SGBRG10P), },
 		.bitsPerPixel = 10,
 		.colourEncoding = PixelFormatInfo::ColourEncodingRAW,
 		.packed = true,
@@ -710,10 +602,7 @@  const std::map<PixelFormat, PixelFormatInfo> pixelFormatInfo{
 	{ formats::SGRBG10_CSI2P, {
 		.name = "SGRBG10_CSI2P",
 		.format = formats::SGRBG10_CSI2P,
-		.v4l2Formats = {
-			.single = V4L2PixelFormat(V4L2_PIX_FMT_SGRBG10P),
-			.multi = V4L2PixelFormat(),
-		},
+		.v4l2Formats = { V4L2PixelFormat(V4L2_PIX_FMT_SGRBG10P), },
 		.bitsPerPixel = 10,
 		.colourEncoding = PixelFormatInfo::ColourEncodingRAW,
 		.packed = true,
@@ -723,10 +612,7 @@  const std::map<PixelFormat, PixelFormatInfo> pixelFormatInfo{
 	{ formats::SRGGB10_CSI2P, {
 		.name = "SRGGB10_CSI2P",
 		.format = formats::SRGGB10_CSI2P,
-		.v4l2Formats = {
-			.single = V4L2PixelFormat(V4L2_PIX_FMT_SRGGB10P),
-			.multi = V4L2PixelFormat(),
-		},
+		.v4l2Formats = { V4L2PixelFormat(V4L2_PIX_FMT_SRGGB10P), },
 		.bitsPerPixel = 10,
 		.colourEncoding = PixelFormatInfo::ColourEncodingRAW,
 		.packed = true,
@@ -736,10 +622,7 @@  const std::map<PixelFormat, PixelFormatInfo> pixelFormatInfo{
 	{ formats::SBGGR12, {
 		.name = "SBGGR12",
 		.format = formats::SBGGR12,
-		.v4l2Formats = {
-			.single = V4L2PixelFormat(V4L2_PIX_FMT_SBGGR12),
-			.multi = V4L2PixelFormat(),
-		},
+		.v4l2Formats = { V4L2PixelFormat(V4L2_PIX_FMT_SBGGR12), },
 		.bitsPerPixel = 12,
 		.colourEncoding = PixelFormatInfo::ColourEncodingRAW,
 		.packed = false,
@@ -749,10 +632,7 @@  const std::map<PixelFormat, PixelFormatInfo> pixelFormatInfo{
 	{ formats::SGBRG12, {
 		.name = "SGBRG12",
 		.format = formats::SGBRG12,
-		.v4l2Formats = {
-			.single = V4L2PixelFormat(V4L2_PIX_FMT_SGBRG12),
-			.multi = V4L2PixelFormat(),
-		},
+		.v4l2Formats = { V4L2PixelFormat(V4L2_PIX_FMT_SGBRG12), },
 		.bitsPerPixel = 12,
 		.colourEncoding = PixelFormatInfo::ColourEncodingRAW,
 		.packed = false,
@@ -762,10 +642,7 @@  const std::map<PixelFormat, PixelFormatInfo> pixelFormatInfo{
 	{ formats::SGRBG12, {
 		.name = "SGRBG12",
 		.format = formats::SGRBG12,
-		.v4l2Formats = {
-			.single = V4L2PixelFormat(V4L2_PIX_FMT_SGRBG12),
-			.multi = V4L2PixelFormat(),
-		},
+		.v4l2Formats = { V4L2PixelFormat(V4L2_PIX_FMT_SGRBG12), },
 		.bitsPerPixel = 12,
 		.colourEncoding = PixelFormatInfo::ColourEncodingRAW,
 		.packed = false,
@@ -775,10 +652,7 @@  const std::map<PixelFormat, PixelFormatInfo> pixelFormatInfo{
 	{ formats::SRGGB12, {
 		.name = "SRGGB12",
 		.format = formats::SRGGB12,
-		.v4l2Formats = {
-			.single = V4L2PixelFormat(V4L2_PIX_FMT_SRGGB12),
-			.multi = V4L2PixelFormat(),
-		},
+		.v4l2Formats = { V4L2PixelFormat(V4L2_PIX_FMT_SRGGB12), },
 		.bitsPerPixel = 12,
 		.colourEncoding = PixelFormatInfo::ColourEncodingRAW,
 		.packed = false,
@@ -788,10 +662,7 @@  const std::map<PixelFormat, PixelFormatInfo> pixelFormatInfo{
 	{ formats::SBGGR12_CSI2P, {
 		.name = "SBGGR12_CSI2P",
 		.format = formats::SBGGR12_CSI2P,
-		.v4l2Formats = {
-			.single = V4L2PixelFormat(V4L2_PIX_FMT_SBGGR12P),
-			.multi = V4L2PixelFormat(),
-		},
+		.v4l2Formats = { V4L2PixelFormat(V4L2_PIX_FMT_SBGGR12P), },
 		.bitsPerPixel = 12,
 		.colourEncoding = PixelFormatInfo::ColourEncodingRAW,
 		.packed = true,
@@ -801,10 +672,7 @@  const std::map<PixelFormat, PixelFormatInfo> pixelFormatInfo{
 	{ formats::SGBRG12_CSI2P, {
 		.name = "SGBRG12_CSI2P",
 		.format = formats::SGBRG12_CSI2P,
-		.v4l2Formats = {
-			.single = V4L2PixelFormat(V4L2_PIX_FMT_SGBRG12P),
-			.multi = V4L2PixelFormat(),
-		},
+		.v4l2Formats = { V4L2PixelFormat(V4L2_PIX_FMT_SGBRG12P), },
 		.bitsPerPixel = 12,
 		.colourEncoding = PixelFormatInfo::ColourEncodingRAW,
 		.packed = true,
@@ -814,10 +682,7 @@  const std::map<PixelFormat, PixelFormatInfo> pixelFormatInfo{
 	{ formats::SGRBG12_CSI2P, {
 		.name = "SGRBG12_CSI2P",
 		.format = formats::SGRBG12_CSI2P,
-		.v4l2Formats = {
-			.single = V4L2PixelFormat(V4L2_PIX_FMT_SGRBG12P),
-			.multi = V4L2PixelFormat(),
-		},
+		.v4l2Formats = { V4L2PixelFormat(V4L2_PIX_FMT_SGRBG12P), },
 		.bitsPerPixel = 12,
 		.colourEncoding = PixelFormatInfo::ColourEncodingRAW,
 		.packed = true,
@@ -827,10 +692,7 @@  const std::map<PixelFormat, PixelFormatInfo> pixelFormatInfo{
 	{ formats::SRGGB12_CSI2P, {
 		.name = "SRGGB12_CSI2P",
 		.format = formats::SRGGB12_CSI2P,
-		.v4l2Formats = {
-			.single = V4L2PixelFormat(V4L2_PIX_FMT_SRGGB12P),
-			.multi = V4L2PixelFormat(),
-		},
+		.v4l2Formats = { V4L2PixelFormat(V4L2_PIX_FMT_SRGGB12P), },
 		.bitsPerPixel = 12,
 		.colourEncoding = PixelFormatInfo::ColourEncodingRAW,
 		.packed = true,
@@ -840,10 +702,7 @@  const std::map<PixelFormat, PixelFormatInfo> pixelFormatInfo{
 	{ formats::SBGGR16, {
 		.name = "SBGGR16",
 		.format = formats::SBGGR16,
-		.v4l2Formats = {
-			.single = V4L2PixelFormat(V4L2_PIX_FMT_SBGGR16),
-			.multi = V4L2PixelFormat(),
-		},
+		.v4l2Formats = { V4L2PixelFormat(V4L2_PIX_FMT_SBGGR16), },
 		.bitsPerPixel = 16,
 		.colourEncoding = PixelFormatInfo::ColourEncodingRAW,
 		.packed = false,
@@ -853,10 +712,7 @@  const std::map<PixelFormat, PixelFormatInfo> pixelFormatInfo{
 	{ formats::SGBRG16, {
 		.name = "SGBRG16",
 		.format = formats::SGBRG16,
-		.v4l2Formats = {
-			.single = V4L2PixelFormat(V4L2_PIX_FMT_SGBRG16),
-			.multi = V4L2PixelFormat(),
-		},
+		.v4l2Formats = { V4L2PixelFormat(V4L2_PIX_FMT_SGBRG16), },
 		.bitsPerPixel = 16,
 		.colourEncoding = PixelFormatInfo::ColourEncodingRAW,
 		.packed = false,
@@ -866,10 +722,7 @@  const std::map<PixelFormat, PixelFormatInfo> pixelFormatInfo{
 	{ formats::SGRBG16, {
 		.name = "SGRBG16",
 		.format = formats::SGRBG16,
-		.v4l2Formats = {
-			.single = V4L2PixelFormat(V4L2_PIX_FMT_SGRBG16),
-			.multi = V4L2PixelFormat(),
-		},
+		.v4l2Formats = { V4L2PixelFormat(V4L2_PIX_FMT_SGRBG16), },
 		.bitsPerPixel = 16,
 		.colourEncoding = PixelFormatInfo::ColourEncodingRAW,
 		.packed = false,
@@ -879,10 +732,7 @@  const std::map<PixelFormat, PixelFormatInfo> pixelFormatInfo{
 	{ formats::SRGGB16, {
 		.name = "SRGGB16",
 		.format = formats::SRGGB16,
-		.v4l2Formats = {
-			.single = V4L2PixelFormat(V4L2_PIX_FMT_SRGGB16),
-			.multi = V4L2PixelFormat(),
-		},
+		.v4l2Formats = { V4L2PixelFormat(V4L2_PIX_FMT_SRGGB16), },
 		.bitsPerPixel = 16,
 		.colourEncoding = PixelFormatInfo::ColourEncodingRAW,
 		.packed = false,
@@ -892,10 +742,7 @@  const std::map<PixelFormat, PixelFormatInfo> pixelFormatInfo{
 	{ formats::SBGGR10_IPU3, {
 		.name = "SBGGR10_IPU3",
 		.format = formats::SBGGR10_IPU3,
-		.v4l2Formats = {
-			.single = V4L2PixelFormat(V4L2_PIX_FMT_IPU3_SBGGR10),
-			.multi = V4L2PixelFormat(),
-		},
+		.v4l2Formats = { V4L2PixelFormat(V4L2_PIX_FMT_IPU3_SBGGR10), },
 		.bitsPerPixel = 10,
 		.colourEncoding = PixelFormatInfo::ColourEncodingRAW,
 		.packed = true,
@@ -906,10 +753,7 @@  const std::map<PixelFormat, PixelFormatInfo> pixelFormatInfo{
 	{ formats::SGBRG10_IPU3, {
 		.name = "SGBRG10_IPU3",
 		.format = formats::SGBRG10_IPU3,
-		.v4l2Formats = {
-			.single = V4L2PixelFormat(V4L2_PIX_FMT_IPU3_SGBRG10),
-			.multi = V4L2PixelFormat(),
-		},
+		.v4l2Formats = { V4L2PixelFormat(V4L2_PIX_FMT_IPU3_SGBRG10), },
 		.bitsPerPixel = 10,
 		.colourEncoding = PixelFormatInfo::ColourEncodingRAW,
 		.packed = true,
@@ -919,10 +763,7 @@  const std::map<PixelFormat, PixelFormatInfo> pixelFormatInfo{
 	{ formats::SGRBG10_IPU3, {
 		.name = "SGRBG10_IPU3",
 		.format = formats::SGRBG10_IPU3,
-		.v4l2Formats = {
-			.single = V4L2PixelFormat(V4L2_PIX_FMT_IPU3_SGRBG10),
-			.multi = V4L2PixelFormat(),
-		},
+		.v4l2Formats = { V4L2PixelFormat(V4L2_PIX_FMT_IPU3_SGRBG10), },
 		.bitsPerPixel = 10,
 		.colourEncoding = PixelFormatInfo::ColourEncodingRAW,
 		.packed = true,
@@ -932,10 +773,7 @@  const std::map<PixelFormat, PixelFormatInfo> pixelFormatInfo{
 	{ formats::SRGGB10_IPU3, {
 		.name = "SRGGB10_IPU3",
 		.format = formats::SRGGB10_IPU3,
-		.v4l2Formats = {
-			.single = V4L2PixelFormat(V4L2_PIX_FMT_IPU3_SRGGB10),
-			.multi = V4L2PixelFormat(),
-		},
+		.v4l2Formats = { V4L2PixelFormat(V4L2_PIX_FMT_IPU3_SRGGB10), },
 		.bitsPerPixel = 10,
 		.colourEncoding = PixelFormatInfo::ColourEncodingRAW,
 		.packed = true,
@@ -947,10 +785,7 @@  const std::map<PixelFormat, PixelFormatInfo> pixelFormatInfo{
 	{ formats::MJPEG, {
 		.name = "MJPEG",
 		.format = formats::MJPEG,
-		.v4l2Formats = {
-			.single = V4L2PixelFormat(V4L2_PIX_FMT_MJPEG),
-			.multi = V4L2PixelFormat(),
-		},
+		.v4l2Formats = { V4L2PixelFormat(V4L2_PIX_FMT_MJPEG), },
 		.bitsPerPixel = 0,
 		.colourEncoding = PixelFormatInfo::ColourEncodingYUV,
 		.packed = false,
@@ -996,8 +831,7 @@  const PixelFormatInfo &PixelFormatInfo::info(const V4L2PixelFormat &format)
 {
 	const auto &info = std::find_if(pixelFormatInfo.begin(), pixelFormatInfo.end(),
 					[format](auto pair) {
-						return pair.second.v4l2Formats.single == format ||
-						       pair.second.v4l2Formats.multi == format;
+						return pair.second.v4l2Formats[0] == format;
 					});
 	if (info == pixelFormatInfo.end())
 		return pixelFormatInfoInvalid;
diff --git a/src/libcamera/v4l2_pixelformat.cpp b/src/libcamera/v4l2_pixelformat.cpp
index bdcdc3be4e0c..91a882baa75b 100644
--- a/src/libcamera/v4l2_pixelformat.cpp
+++ b/src/libcamera/v4l2_pixelformat.cpp
@@ -304,24 +304,21 @@  PixelFormat V4L2PixelFormat::toPixelFormat() const
 /**
  * \brief Convert \a pixelFormat to its corresponding V4L2PixelFormat
  * \param[in] pixelFormat The PixelFormat to convert
- * \param[in] multiplanar V4L2 Multiplanar API support flag
  *
- * Multiple V4L2 formats may exist for one PixelFormat when the format uses
- * multiple planes, as V4L2 defines separate 4CCs for contiguous and separate
- * planes formats. Set the \a multiplanar parameter to false to select a format
- * with contiguous planes, or to true to select a format with non-contiguous
- * planes.
+ * Multiple V4L2 formats may exist for one PixelFormat as V4L2 defines separate
+ * 4CCs for contiguous and non-contiguous versions of the same image format.
+ *
+ * Return the contiguous planes format version by default.
  *
  * \return The V4L2PixelFormat corresponding to \a pixelFormat
  */
-V4L2PixelFormat V4L2PixelFormat::fromPixelFormat(const PixelFormat &pixelFormat,
-						 bool multiplanar)
+V4L2PixelFormat V4L2PixelFormat::fromPixelFormat(const PixelFormat &pixelFormat)
 {
 	const PixelFormatInfo &info = PixelFormatInfo::info(pixelFormat);
 	if (!info.isValid())
 		return V4L2PixelFormat();
 
-	return multiplanar ? info.v4l2Formats.multi : info.v4l2Formats.single;
+	return info.v4l2Formats[0];
 }
 
 /**