[libcamera-devel] [PATCH 4/6] libcamera: v4l2_device: Add single/multiplane formats
Niklas Söderlund
niklas.soderlund at ragnatech.se
Tue Jan 22 12:39:37 CET 2019
Hej,
On 2019-01-21 22:46:03 +0200, Laurent Pinchart wrote:
> Hi Jacopo,
>
> Thank you for the patch.
>
> On Mon, Jan 21, 2019 at 06:27:03PM +0100, Jacopo Mondi wrote:
> > Add a class hierarchy internal to V4L2Device to handle set/get format
> > operations in the single/multi plane use case.
> >
> > Provide stubs only for get/setFormat methods at the moment.
> > ---
> > src/libcamera/include/v4l2_device.h | 34 +++++++++++++++++
> > src/libcamera/v4l2_device.cpp | 59 +++++++++++++++++++++++++++++
> > 2 files changed, 93 insertions(+)
> >
> > diff --git a/src/libcamera/include/v4l2_device.h b/src/libcamera/include/v4l2_device.h
> > index 0101a4b..81992dc 100644
> > --- a/src/libcamera/include/v4l2_device.h
> > +++ b/src/libcamera/include/v4l2_device.h
> > @@ -7,6 +7,7 @@
> > #ifndef __LIBCAMERA_V4L2_DEVICE_H__
> > #define __LIBCAMERA_V4L2_DEVICE_H__
> >
> > +#include <memory>
> > #include <string>
> >
> > #include <linux/videodev2.h>
> > @@ -54,11 +55,44 @@ public:
> > const char *busName() const { return caps_.bus_info(); }
> >
> > int setControl(unsigned int control, int value);
> > + int getFormat();
>
> Should this be named just format() ?
>
> > + int setFormat();
> >
> > private:
> > + class V4L2Format
> > + {
> > + public:
> > + virtual ~V4L2Format() { }
> > + virtual int setFormat() = 0;
> > + virtual int getFormat() = 0;
> > +
> > + protected:
> > + V4L2Format() { }
> > + V4L2Format(V4L2Format &) = delete;
> > + };
> > +
> > + class V4L2FormatSPlane : public V4L2Format
> > + {
> > + public:
> > + V4L2FormatSPlane() { }
> > + ~V4L2FormatSPlane() { }
> > + int setFormat();
> > + int getFormat();
> > + };
> > +
> > + class V4L2FormatMPlane : public V4L2Format
> > + {
> > + public:
> > + V4L2FormatMPlane() { }
> > + ~V4L2FormatMPlane() { }
> > + int setFormat();
> > + int getFormat();
> > + };
> > +
> > std::string devnode_;
> > int fd_;
> > V4L2Capability caps_;
> > + std::unique_ptr<V4L2Format> format_;
>
> I have a bit of trouble reviewing this patch as I don't understand how
> this is supposed to be used, but it seems overly complicated to me. I
> think a simple
>
> if (single planaer) {
> ...
> } else {
> ...
> }
>
> in getFormat() and setFormat() would be good enough.
>
I tend to agree with this, but it's just my two euro cents.
> > };
> >
> > } /* namespace libcamera */
> > diff --git a/src/libcamera/v4l2_device.cpp b/src/libcamera/v4l2_device.cpp
> > index 7cd89d7..126f6f2 100644
> > --- a/src/libcamera/v4l2_device.cpp
> > +++ b/src/libcamera/v4l2_device.cpp
> > @@ -5,6 +5,8 @@
> > * v4l2_device.cpp - V4L2 Device
> > */
> >
> > +#include <memory>
> > +
> > #include <fcntl.h>
> > #include <string.h>
> > #include <sys/ioctl.h>
> > @@ -13,6 +15,7 @@
> >
> > #include "log.h"
> > #include "media_object.h"
> > +#include "utils.h"
> > #include "v4l2_device.h"
> >
> > /**
> > @@ -182,6 +185,12 @@ int V4L2Device::open()
> > return -EINVAL;
> > }
> >
> > + /* Create single/multi plane format handler. */
> > + if (caps_.isSinglePlane())
> > + format_ = utils::make_unique<V4L2FormatSPlane>();
> > + else
> > + format_ = utils::make_unique<V4L2FormatMPlane>();
> > +
> > return 0;
> > }
> >
> > @@ -262,4 +271,54 @@ int V4L2Device::setControl(unsigned int control, int value)
> > return v4l2_ctrl.value;
> > }
> >
> > +/**
> > + * \brief Retrieve the image format set on the V4L2 device
> > + *
> > + * TODO: define how the image format is encoded
> > + * FIXME: this function is a stub at the moment
> > + *
> > + * \return 0 for success, a negative error code otherwise
> > + */
> > +int V4L2Device::getFormat()
> > +{
> > + return format_->getFormat();
> > +}
Is not V4L2Device::getFormat() a virtual function which should not be
implemented?
> > +
> > +/**
> > + * \brief Program an image format on the V4L2 device
> > + *
> > + * TODO: define how the image format is encoded
> > + * FIXME: this function is a stub at the moment
> > + *
> > + * \return 0 for success, a negative error code otherwise
> > + */
> > +int V4L2Device::setFormat()
> > +{
> > + return format_->setFormat();
> > +}
> > +
> > +/* FIXME: this function is a stub at the moment. */
> > +int V4L2Device::V4L2FormatSPlane::getFormat()
> > +{
> > + return 0;
> > +}
> > +
> > +/* FIXME: this function is a stub at the moment. */
> > +int V4L2Device::V4L2FormatSPlane::setFormat()
> > +{
> > + return 0;
> > +}
> > +
> > +/* FIXME: this function is a stub at the moment. */
> > +int V4L2Device::V4L2FormatMPlane::getFormat()
> > +{
> > + return 0;
> > +}
> > +
> > +/* FIXME: this function is a stub at the moment. */
> > +int V4L2Device::V4L2FormatMPlane::setFormat()
> > +{
> > + return 0;
> > +}
> > +
> > } /* namespace libcamera */
>
> --
> Regards,
>
> Laurent Pinchart
> _______________________________________________
> libcamera-devel mailing list
> libcamera-devel at lists.libcamera.org
> https://lists.libcamera.org/listinfo/libcamera-devel
--
Regards,
Niklas Söderlund
More information about the libcamera-devel
mailing list