[PATCH v3 3/4] libcamera: converter: Add DW100 converter class
Laurent Pinchart
laurent.pinchart at ideasonboard.com
Wed Jun 26 09:41:03 CEST 2024
On Tue, Jun 25, 2024 at 09:56:52PM +0100, Kieran Bingham wrote:
> 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
See the reply I just sent for 2/4 :-)
> ... 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>
--
Regards,
Laurent Pinchart
More information about the libcamera-devel
mailing list