[PATCH v3 3/4] libcamera: converter: Add DW100 converter class

Kieran Bingham kieran.bingham at ideasonboard.com
Tue Jun 25 22:56:52 CEST 2024


Quoting Umang Jain (2024-06-25 07:23:26)
> DW100 Dewarp engine is present on i.MX8MP SoC. This patch
> provides a converter class (inherited from V4L2M2MConverter).
> 
> The DW100 converter will be used for scaling capabilites hence, has
> a helper to set scaler crop rectangles. Plumbing in the RkISP1
> pipeline-handler is done in the subsequent patch.
> 
> The ConverterDW100 class can be extended later (as additional
> developement) to support the dewarping by setting a dewarp vertex map.
> 
> Signed-off-by: Umang Jain <umang.jain at ideasonboard.com>
> ---
>  .../internal/converter/converter_dw100.h      | 26 +++++++++
>  .../libcamera/internal/converter/meson.build  |  1 +
>  src/libcamera/converter/converter_dw100.cpp   | 56 +++++++++++++++++++
>  src/libcamera/converter/meson.build           |  1 +
>  4 files changed, 84 insertions(+)
>  create mode 100644 include/libcamera/internal/converter/converter_dw100.h
>  create mode 100644 src/libcamera/converter/converter_dw100.cpp
> 
> diff --git a/include/libcamera/internal/converter/converter_dw100.h b/include/libcamera/internal/converter/converter_dw100.h
> new file mode 100644
> index 00000000..ae6d0732
> --- /dev/null
> +++ b/include/libcamera/internal/converter/converter_dw100.h
> @@ -0,0 +1,26 @@
> +/* SPDX-License-Identifier: GPL-2.0-or-later */
> +/*
> + * Copyright (C) 2024, Ideas On Board Oy
> + *
> + *i.MX8MP Dewarp Engine integration

s/*i.MX8MP/* i.MX8MP/

> + */
> +
> +#pragma once
> +
> +#include "libcamera/internal/converter/converter_v4l2_m2m.h"
> +
> +namespace libcamera {
> +
> +class MediaDevice;
> +class Rectangle;
> +class Stream;
> +
> +class ConverterDW100 : public V4L2M2MConverter
> +{
> +public:
> +       ConverterDW100(std::shared_ptr<MediaDevice> media);
> +
> +       int setScalerCrop(const Stream *stream, Rectangle rect);
> +};
> +
> +} /* namespace libcamera */
> diff --git a/include/libcamera/internal/converter/meson.build b/include/libcamera/internal/converter/meson.build
> index 891e79e7..85007a4b 100644
> --- a/include/libcamera/internal/converter/meson.build
> +++ b/include/libcamera/internal/converter/meson.build
> @@ -1,5 +1,6 @@
>  # SPDX-License-Identifier: CC0-1.0
>  
>  libcamera_internal_headers += files([
> +    'converter_dw100.h',
>      'converter_v4l2_m2m.h',
>  ])
> diff --git a/src/libcamera/converter/converter_dw100.cpp b/src/libcamera/converter/converter_dw100.cpp
> new file mode 100644
> index 00000000..04e6942f
> --- /dev/null
> +++ b/src/libcamera/converter/converter_dw100.cpp
> @@ -0,0 +1,56 @@
> +/* SPDX-License-Identifier: GPL-2.0-or-later */
> +/*
> + * Copyright (C) 2024, Ideas On Board Oy
> + *
> + * i.MX8MP Dewarp Engine integration
> + */
> +
> +#include "libcamera/internal/converter/converter_dw100.h"
> +
> +#include <libcamera/base/log.h>
> +
> +#include <libcamera/geometry.h>
> +
> +#include "libcamera/internal/media_device.h"
> +#include "libcamera/internal/v4l2_videodevice.h"
> +
> +namespace libcamera {
> +
> +LOG_DECLARE_CATEGORY(Converter)
> +
> +/**
> + * \class libcamera::ConverterDW100
> + * \brief The i.MX8MP dewarp converter implements the converter interface based
> + * on V4L2 M2M device.
> +*/
> +
> +/**
> + * \fn ConverterDW100::ConverterDW100
> + * \brief Construct a ConverterDW100 instance
> + * \param[in] media The media device implementing the converter
> + */
> +ConverterDW100::ConverterDW100(std::shared_ptr<MediaDevice> media)
> +       : V4L2M2MConverter(media.get())
> +{
> +}
> +
> +/**
> + * \brief Set the scaler crop rectangle \a rect on \a stream
> + * \param[in] stream Pointer to output stream
> + * \param[inout] rect The selection rectangle to be applied
> + *
> + * \return 0 on success or a negative error code otherwise
> + */
> +int ConverterDW100::setScalerCrop(const Stream *stream, Rectangle rect)
> +{
> +       int ret;
> +
> +       ret = setSelection(stream, V4L2_SEL_TGT_CROP, &rect);
> +       if (ret < 0)
> +               LOG(Converter, Error) << "Failed to set scaler crop on dewarper "
> +                                     << strerror(-ret);
> +

Does calling setSelection modify the rect? Do we need to check that at
all or is it up to the caller to verify?

> +       return ret;
> +}
> +
> +} /* namespace libcamera */
> diff --git a/src/libcamera/converter/meson.build b/src/libcamera/converter/meson.build
> index 2aa72fe4..175581b8 100644
> --- a/src/libcamera/converter/meson.build
> +++ b/src/libcamera/converter/meson.build
> @@ -1,5 +1,6 @@
>  # SPDX-License-Identifier: CC0-1.0
>  
>  libcamera_sources += files([
> +        'converter_dw100.cpp',
>          'converter_v4l2_m2m.cpp'
>  ])
> -- 
> 2.44.0
> 

Oh - wow, that's a small implementation! I guess that's the benefit of
inheriting from M2MConvertor.

That makes me wonder if ScalerCrop should be handled in the
V4L2M2MConvertor generically instead ... but ... as we expect this class
to be expanded for the dewarp, I think it's fine to be specialised here.

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


More information about the libcamera-devel mailing list