[libcamera-devel] [PATCH 08/17] libcamera: v4l2_subdevice: Replace FormatEnum with V4L2SubdeviceFormats
Laurent Pinchart
laurent.pinchart at ideasonboard.com
Sun Jun 9 14:51:22 CEST 2019
Hi Niklas,
Thank you for the patch.
On Mon, May 27, 2019 at 02:15:34AM +0200, Niklas Söderlund wrote:
> Replace all usage of FormatEnum with V4L2SubdeviceFormats and completely
> remove FormatEnum which is no longer needed.
>
> Signed-off-by: Niklas Söderlund <niklas.soderlund at ragnatech.se>
> ---
> src/libcamera/camera_sensor.cpp | 12 +++++-------
> src/libcamera/formats.cpp | 11 -----------
> src/libcamera/include/formats.h | 2 --
> src/libcamera/include/v4l2_subdevice.h | 2 +-
> src/libcamera/v4l2_subdevice.cpp | 6 +++---
> test/v4l2_subdevice/list_formats.cpp | 10 +++++-----
> 6 files changed, 14 insertions(+), 29 deletions(-)
>
> diff --git a/src/libcamera/camera_sensor.cpp b/src/libcamera/camera_sensor.cpp
> index 2b9d8fa593c13177..e46bc28c7ac4a8e1 100644
> --- a/src/libcamera/camera_sensor.cpp
> +++ b/src/libcamera/camera_sensor.cpp
> @@ -90,27 +90,25 @@ int CameraSensor::init()
> return ret;
>
> /* Enumerate and cache media bus codes and sizes. */
> - const FormatEnum formats = subdev_->formats(0);
> + const V4L2SubdeviceFormats formats = subdev_->formats(0);
> if (formats.empty()) {
> LOG(CameraSensor, Error) << "No image format found";
> return -EINVAL;
> }
>
> - std::transform(formats.begin(), formats.end(),
> - std::back_inserter(mbusCodes_),
> - [](decltype(*formats.begin()) f) { return f.first; });
> + mbusCodes_ = formats.codes();
>
> /*
> * Extract the supported sizes from the first format as we only support
> * sensors that offer the same frame sizes for all media bus codes.
> * Verify this assumption and reject the sensor if it isn't true.
> */
> - const std::vector<SizeRange> &sizes = formats.begin()->second;
> + const std::vector<SizeRange> &sizes = formats.sizes(mbusCodes_[0]);
> std::transform(sizes.begin(), sizes.end(), std::back_inserter(sizes_),
> [](const SizeRange &range) { return range.max; });
>
> - for (auto it = ++formats.begin(); it != formats.end(); ++it) {
> - if (it->second != sizes) {
> + for (unsigned int code : mbusCodes_) {
> + if (formats.sizes(code) != sizes) {
> LOG(CameraSensor, Error)
> << "Frame sizes differ between media bus codes";
> return -EINVAL;
> diff --git a/src/libcamera/formats.cpp b/src/libcamera/formats.cpp
> index f5841b38cea5686c..7b2097413c3b7378 100644
> --- a/src/libcamera/formats.cpp
> +++ b/src/libcamera/formats.cpp
> @@ -14,17 +14,6 @@
>
> namespace libcamera {
>
> -/**
> - * \typedef FormatEnum
> - * \brief Type definition for the map of image formats and sizes
> - *
> - * Type definition used to enumerate the supported pixel formats and image
> - * frame sizes. The type associates in a map a pixel format (for memory
> - * formats) or a media bus code (for bus formats), to a vector of image
> - * resolutions represented by SizeRange items.
> - */
> -
> -
> /**
> * \class DeviceFormats
> * \brief Base class for V4L2Device and V4L2SubDevice Formats
> diff --git a/src/libcamera/include/formats.h b/src/libcamera/include/formats.h
> index 372f6e6d71b236dd..2e849e70c4a88aeb 100644
> --- a/src/libcamera/include/formats.h
> +++ b/src/libcamera/include/formats.h
> @@ -15,8 +15,6 @@
>
> namespace libcamera {
>
> -typedef std::map<unsigned int, std::vector<SizeRange>> FormatEnum;
> -
> class DeviceFormats
> {
> public:
> diff --git a/src/libcamera/include/v4l2_subdevice.h b/src/libcamera/include/v4l2_subdevice.h
> index c6fdf417b43c0423..a6d691ea540a4e5e 100644
> --- a/src/libcamera/include/v4l2_subdevice.h
> +++ b/src/libcamera/include/v4l2_subdevice.h
> @@ -45,7 +45,7 @@ public:
> int setCrop(unsigned int pad, Rectangle *rect);
> int setCompose(unsigned int pad, Rectangle *rect);
>
> - FormatEnum formats(unsigned int pad);
> + V4L2SubdeviceFormats formats(unsigned int pad);
>
> int getFormat(unsigned int pad, V4L2SubdeviceFormat *format);
> int setFormat(unsigned int pad, V4L2SubdeviceFormat *format);
> diff --git a/src/libcamera/v4l2_subdevice.cpp b/src/libcamera/v4l2_subdevice.cpp
> index 8720013600ddb95f..fe393c66729e8511 100644
> --- a/src/libcamera/v4l2_subdevice.cpp
> +++ b/src/libcamera/v4l2_subdevice.cpp
> @@ -200,9 +200,9 @@ int V4L2Subdevice::setCompose(unsigned int pad, Rectangle *rect)
> * \return A map of image formats associated with a list of image sizes, or
> * an empty map on error or if the pad does not exist
> */
> -FormatEnum V4L2Subdevice::formats(unsigned int pad)
> +V4L2SubdeviceFormats V4L2Subdevice::formats(unsigned int pad)
> {
> - FormatEnum formatMap = {};
> + std::map<unsigned int, std::vector<SizeRange>> formatMap = {};
>
> if (pad >= entity_->pads().size()) {
> LOG(V4L2Subdev, Error) << "Invalid pad: " << pad;
> @@ -212,7 +212,7 @@ FormatEnum V4L2Subdevice::formats(unsigned int pad)
> for (unsigned int code : enumPadCodes(pad))
> formatMap[code] = enumPadSizes(pad, code);
>
> - return formatMap;
> + return V4L2SubdeviceFormats(formatMap);
Apart from the V4L2SubdeviceFormats constructor that requires building a
map first this patch looks good to me.
Reviewed-by: Laurent Pinchart <laurent.pinchart at ideasonboard.com>
> }
>
> /**
> diff --git a/test/v4l2_subdevice/list_formats.cpp b/test/v4l2_subdevice/list_formats.cpp
> index 3f0edafcdcd72d6b..1c044a969961d172 100644
> --- a/test/v4l2_subdevice/list_formats.cpp
> +++ b/test/v4l2_subdevice/list_formats.cpp
> @@ -47,7 +47,7 @@ void ListFormatsTest::printFormats(unsigned int pad,
> int ListFormatsTest::run()
> {
> /* List all formats available on existing "Scaler" pads. */
> - std::map<unsigned int, std::vector<SizeRange>> formats;
> + V4L2SubdeviceFormats formats;
>
> formats = scaler_->formats(0);
> if (formats.empty()) {
> @@ -55,8 +55,8 @@ int ListFormatsTest::run()
> << scaler_->entity()->name() << endl;
> return TestFail;
> }
> - for (auto it = formats.begin(); it != formats.end(); ++it)
> - printFormats(0, it->first, it->second);
> + for (unsigned int code : formats.codes())
> + printFormats(0, code, formats.sizes(code));
>
> formats = scaler_->formats(1);
> if (formats.empty()) {
> @@ -64,8 +64,8 @@ int ListFormatsTest::run()
> << scaler_->entity()->name() << endl;
> return TestFail;
> }
> - for (auto it = formats.begin(); it != formats.end(); ++it)
> - printFormats(1, it->first, it->second);
> + for (unsigned int code : formats.codes())
> + printFormats(1, code, formats.sizes(code));
>
> /* List format on a non-existing pad, format vector shall be empty. */
> formats = scaler_->formats(2);
--
Regards,
Laurent Pinchart
More information about the libcamera-devel
mailing list