[libcamera-devel] [PATCH v3 4/6] libcamera: v4l2_pixelformat: Return the list of V4L2 formats

Laurent Pinchart laurent.pinchart at ideasonboard.com
Fri Jul 29 19:41:04 CEST 2022


Hi Jacopo,

Thank you for the patch.

On Fri, Jul 29, 2022 at 06:00:12PM +0200, Jacopo Mondi via libcamera-devel wrote:
> Multiple V4L2 formats can be associated with a single PixelFormat.
> Now that users of V4L2PixelFormat::fromPixelFormat() have been converted
> to use V4L2VideoDevice::toV4L2PixelFormat(), return the full list of
> V4L2 formats in order to prepare to match them against the ones
> supported by the video device.
> 
> The V4L2 compatibility layer, not having any video device to interact
> with, are converted to use the first returned format by default.

s/are converted/is converted/
s/by default/unconditionally/

> Signed-off-by: Jacopo Mondi <jacopo at jmondi.org>
> ---
>  include/libcamera/internal/v4l2_pixelformat.h |  4 +++-
>  src/libcamera/v4l2_pixelformat.cpp            | 14 +++++++-------
>  src/libcamera/v4l2_videodevice.cpp            |  2 +-
>  src/v4l2/v4l2_camera_proxy.cpp                |  6 +++---
>  4 files changed, 14 insertions(+), 12 deletions(-)
> 
> diff --git a/include/libcamera/internal/v4l2_pixelformat.h b/include/libcamera/internal/v4l2_pixelformat.h
> index ed94baf92795..a8aec29552e4 100644
> --- a/include/libcamera/internal/v4l2_pixelformat.h
> +++ b/include/libcamera/internal/v4l2_pixelformat.h
> @@ -11,6 +11,7 @@
>  #include <ostream>
>  #include <stdint.h>
>  #include <string>
> +#include <vector>
>  
>  #include <linux/videodev2.h>
>  
> @@ -44,7 +45,8 @@ public:
>  	const char *description() const;
>  
>  	PixelFormat toPixelFormat() const;
> -	static V4L2PixelFormat fromPixelFormat(const PixelFormat &pixelFormat);
> +	static const std::vector<V4L2PixelFormat> &
> +		fromPixelFormat(const PixelFormat &pixelFormat);

I think we usually wrap lines as

	static const std::vector<V4L2PixelFormat> &
	fromPixelFormat(const PixelFormat &pixelFormat);

The function name isn't great anymore, as static from*() functions are
expected to act as constructors and return an instance of the class. I
can't think of a much better name right now though.

>  
>  private:
>  	uint32_t fourcc_;
> diff --git a/src/libcamera/v4l2_pixelformat.cpp b/src/libcamera/v4l2_pixelformat.cpp
> index 91a882baa75b..bca97d1e3b4f 100644
> --- a/src/libcamera/v4l2_pixelformat.cpp
> +++ b/src/libcamera/v4l2_pixelformat.cpp
> @@ -302,23 +302,23 @@ PixelFormat V4L2PixelFormat::toPixelFormat() const
>  }
>  
>  /**
> - * \brief Convert \a pixelFormat to its corresponding V4L2PixelFormat
> + * \brief Retrieve the list of V4L2PixelFormat associated with \a pixelFormat
>   * \param[in] pixelFormat The PixelFormat to convert
>   *
>   * 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
> + * \return The list of V4L2PixelFormat corresponding to \a pixelFormat
>   */
> -V4L2PixelFormat V4L2PixelFormat::fromPixelFormat(const PixelFormat &pixelFormat)
> +const std::vector<V4L2PixelFormat> &V4L2PixelFormat::fromPixelFormat(const PixelFormat &pixelFormat)

You could wrap this line too.

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

>  {
> +	static const std::vector<V4L2PixelFormat> empty;
> +
>  	const PixelFormatInfo &info = PixelFormatInfo::info(pixelFormat);
>  	if (!info.isValid())
> -		return V4L2PixelFormat();
> +		return empty;
>  
> -	return info.v4l2Formats[0];
> +	return info.v4l2Formats;
>  }
>  
>  /**
> diff --git a/src/libcamera/v4l2_videodevice.cpp b/src/libcamera/v4l2_videodevice.cpp
> index f41afa06f460..2ca22f485d45 100644
> --- a/src/libcamera/v4l2_videodevice.cpp
> +++ b/src/libcamera/v4l2_videodevice.cpp
> @@ -2000,7 +2000,7 @@ V4L2VideoDevice::fromEntityName(const MediaDevice *media,
>   */
>  V4L2PixelFormat V4L2VideoDevice::toV4L2PixelFormat(const PixelFormat &pixelFormat) const
>  {
> -	return V4L2PixelFormat::fromPixelFormat(pixelFormat);
> +	return V4L2PixelFormat::fromPixelFormat(pixelFormat)[0];
>  }
>  
>  /**
> diff --git a/src/v4l2/v4l2_camera_proxy.cpp b/src/v4l2/v4l2_camera_proxy.cpp
> index 26a227da6db2..55ff62cdb430 100644
> --- a/src/v4l2/v4l2_camera_proxy.cpp
> +++ b/src/v4l2/v4l2_camera_proxy.cpp
> @@ -182,7 +182,7 @@ void V4L2CameraProxy::setFmtFromConfig(const StreamConfiguration &streamConfig)
>  
>  	v4l2PixFormat_.width        = size.width;
>  	v4l2PixFormat_.height       = size.height;
> -	v4l2PixFormat_.pixelformat  = V4L2PixelFormat::fromPixelFormat(streamConfig.pixelFormat);
> +	v4l2PixFormat_.pixelformat  = V4L2PixelFormat::fromPixelFormat(streamConfig.pixelFormat)[0];
>  	v4l2PixFormat_.field        = V4L2_FIELD_NONE;
>  	v4l2PixFormat_.bytesperline = streamConfig.stride;
>  	v4l2PixFormat_.sizeimage    = streamConfig.frameSize;
> @@ -290,7 +290,7 @@ int V4L2CameraProxy::vidioc_enum_fmt(V4L2CameraFile *file, struct v4l2_fmtdesc *
>  		return -EINVAL;
>  
>  	PixelFormat format = streamConfig_.formats().pixelformats()[arg->index];
> -	V4L2PixelFormat v4l2Format = V4L2PixelFormat::fromPixelFormat(format);
> +	V4L2PixelFormat v4l2Format = V4L2PixelFormat::fromPixelFormat(format)[0];
>  
>  	arg->flags = format == formats::MJPEG ? V4L2_FMT_FLAG_COMPRESSED : 0;
>  	utils::strlcpy(reinterpret_cast<char *>(arg->description),
> @@ -333,7 +333,7 @@ int V4L2CameraProxy::tryFormat(struct v4l2_format *arg)
>  
>  	arg->fmt.pix.width        = config.size.width;
>  	arg->fmt.pix.height       = config.size.height;
> -	arg->fmt.pix.pixelformat  = V4L2PixelFormat::fromPixelFormat(config.pixelFormat);
> +	arg->fmt.pix.pixelformat  = V4L2PixelFormat::fromPixelFormat(config.pixelFormat)[0];
>  	arg->fmt.pix.field        = V4L2_FIELD_NONE;
>  	arg->fmt.pix.bytesperline = config.stride;
>  	arg->fmt.pix.sizeimage    = config.frameSize;

-- 
Regards,

Laurent Pinchart


More information about the libcamera-devel mailing list