[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