[libcamera-devel] [PATCH 05/15] v4l2: v4l2_camera_proxy: Implement VIDIOC_ENUMINPUT, VIDIOC_G/S_INPUT
Laurent Pinchart
laurent.pinchart at ideasonboard.com
Wed Jun 17 17:36:19 CEST 2020
Hi Jacopo,
On Wed, Jun 17, 2020 at 03:15:35PM +0200, Jacopo Mondi wrote:
> On Tue, Jun 16, 2020 at 10:12:34PM +0900, Paul Elder wrote:
> > Implement VIDIOC_ENUMINPUT, VIDIOC_G_INPUT, and VIDIOC_S_INPUT. Only the
> > zeroth input device is supported, and the info returned by enuminput is
> > hardcoded and basic. This is sufficient to pass v4l2-compliance.
>
> I don't think we'll have much other usages for this IOCTLs apart from
> this one :)
Well... :-) In the future I could imagine S_INPUT being used to select
between different cameras handled by the same pipeline handler instance,
when they're mutually exclusive.
> > Signed-off-by: Paul Elder <paul.elder at ideasonboard.com>
> > ---
> > src/v4l2/v4l2_camera_proxy.cpp | 54 ++++++++++++++++++++++++++++++++++
> > src/v4l2/v4l2_camera_proxy.h | 3 ++
> > 2 files changed, 57 insertions(+)
> >
> > diff --git a/src/v4l2/v4l2_camera_proxy.cpp b/src/v4l2/v4l2_camera_proxy.cpp
> > index f268f7a..6c0dacc 100644
> > --- a/src/v4l2/v4l2_camera_proxy.cpp
> > +++ b/src/v4l2/v4l2_camera_proxy.cpp
> > @@ -397,6 +397,51 @@ int V4L2CameraProxy::vidioc_s_priority(int fd, enum v4l2_priority *arg)
> > return 0;
> > }
> >
> > +int V4L2CameraProxy::vidioc_enuminput(int fd, struct v4l2_input *arg)
> > +{
> > + LOG(V4L2Compat, Debug) << "Servicing vidioc_enuminput fd = " << fd;
> > +
> > + if (arg == nullptr)
> > + return -EFAULT;
>
> This repeated patter makes me think we should probably centralize this
> check as suggested by Laurent on a previous patch
>
> > +
> > + if (arg->index != 0)
> > + return -EINVAL;
> > +
> > + memset(arg, 0, sizeof(*arg));
> > +
> > + utils::strlcpy(reinterpret_cast<char *>(arg->name),
> > + reinterpret_cast<char *>(capabilities_.card),
> > + sizeof(arg->name));
> > + arg->type = V4L2_INPUT_TYPE_CAMERA;
> > +
> > + return 0;
> > +}
> > +
> > +int V4L2CameraProxy::vidioc_g_input(int fd, int *arg)
> > +{
> > + LOG(V4L2Compat, Debug) << "Servicing vidioc_g_input fd = " << fd;
> > +
> > + if (arg == nullptr)
> > + return -EFAULT;
> > +
> > + *arg = 0;
> > +
> > + return 0;
> > +}
> > +
> > +int V4L2CameraProxy::vidioc_s_input(int fd, int *arg)
> > +{
> > + LOG(V4L2Compat, Debug) << "Servicing vidioc_s_input fd = " << fd;
> > +
> > + if (arg == nullptr)
> > + return -EFAULT;
> > +
> > + if (*arg != 0)
> > + return -EINVAL;
> > +
> > + return 0;
> > +}
> > +
> > int V4L2CameraProxy::freeBuffers()
> > {
> > LOG(V4L2Compat, Debug) << "Freeing libcamera bufs";
> > @@ -649,6 +694,15 @@ int V4L2CameraProxy::ioctl(int fd, unsigned long request, void *arg)
> > case VIDIOC_S_PRIORITY:
> > ret = vidioc_s_priority(fd, static_cast<enum v4l2_priority *>(arg));
> > break;
> > + case VIDIOC_ENUMINPUT:
> > + ret = vidioc_enuminput(fd, static_cast<struct v4l2_input *>(arg));
> > + break;
> > + case VIDIOC_G_INPUT:
> > + ret = vidioc_g_input(fd, static_cast<int *>(arg));
> > + break;
> > + case VIDIOC_S_INPUT:
> > + ret = vidioc_s_input(fd, static_cast<int *>(arg));
> > + break;
> > case VIDIOC_REQBUFS:
> > ret = vidioc_reqbufs(fd, static_cast<struct v4l2_requestbuffers *>(arg));
> > break;
> > diff --git a/src/v4l2/v4l2_camera_proxy.h b/src/v4l2/v4l2_camera_proxy.h
> > index a0c373d..2e90bfd 100644
> > --- a/src/v4l2/v4l2_camera_proxy.h
> > +++ b/src/v4l2/v4l2_camera_proxy.h
> > @@ -51,6 +51,9 @@ private:
> > int vidioc_try_fmt(int fd, struct v4l2_format *arg);
> > int vidioc_g_priority(int fd, enum v4l2_priority *arg);
> > int vidioc_s_priority(int fd, enum v4l2_priority *arg);
> > + int vidioc_enuminput(int fd, struct v4l2_input *arg);
> > + int vidioc_g_input(int fd, int *arg);
> > + int vidioc_s_input(int fd, int *arg);
>
> Looks good
> Reviewed-by: Jacopo Mondi <jacopo at jmondi.org>
Likewise,
Reviewed-by: Laurent Pinchart <laurent.pinchart at ideasonboard.com>
> > int vidioc_reqbufs(int fd, struct v4l2_requestbuffers *arg);
> > int vidioc_querybuf(int fd, struct v4l2_buffer *arg);
> > int vidioc_qbuf(int fd, struct v4l2_buffer *arg);
--
Regards,
Laurent Pinchart
More information about the libcamera-devel
mailing list