[libcamera-devel] [PATCH v2 06/17] v4l2: v4l2_camera_proxy: Implement VIDIOC_ENUMINPUT, VIDIOC_G/S_INPUT

Laurent Pinchart laurent.pinchart at ideasonboard.com
Sat Jun 20 03:44:31 CEST 2020


Hi Paul,

Thank you for the patch.

On Fri, Jun 19, 2020 at 02:41:12PM +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.
> 
> Signed-off-by: Paul Elder <paul.elder at ideasonboard.com>
> Reviewed-by: Jacopo Mondi <jacopo at jmondi.org>
> Reviewed-by: Laurent Pinchart <laurent.pinchart at ideasonboard.com>
> 
> ---
> Changes in v2:
> - use V4L2CameraFile instead of fd
> - remove arg == nullptr check as it has been moved away to the main
>   ioctl handler
> ---
>  src/v4l2/v4l2_camera_proxy.cpp | 48 ++++++++++++++++++++++++++++++++++
>  src/v4l2/v4l2_camera_proxy.h   |  3 +++
>  2 files changed, 51 insertions(+)
> 
> diff --git a/src/v4l2/v4l2_camera_proxy.cpp b/src/v4l2/v4l2_camera_proxy.cpp
> index 3e95645..3ac9068 100644
> --- a/src/v4l2/v4l2_camera_proxy.cpp
> +++ b/src/v4l2/v4l2_camera_proxy.cpp
> @@ -376,6 +376,42 @@ int V4L2CameraProxy::vidioc_s_priority(V4L2CameraFile *cf, enum v4l2_priority *a
>  	return 0;
>  }
>  
> +int V4L2CameraProxy::vidioc_enuminput(V4L2CameraFile *cf, struct v4l2_input *arg)

s/cf/file/ as for patch 02/17 ? I forgot to mention that in the review
of 05/17, and it's applicable to all the other patches in this series.

> +{
> +	LOG(V4L2Compat, Debug) << "Servicing vidioc_enuminput fd = " << cf->efd();
> +
> +	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(V4L2CameraFile *cf, int *arg)
> +{
> +	LOG(V4L2Compat, Debug) << "Servicing vidioc_g_input fd = " << cf->efd();
> +
> +	*arg = 0;
> +
> +	return 0;
> +}
> +
> +int V4L2CameraProxy::vidioc_s_input(V4L2CameraFile *cf, int *arg)
> +{
> +	LOG(V4L2Compat, Debug) << "Servicing vidioc_s_input fd = " << cf->efd();
> +
> +	if (*arg != 0)
> +		return -EINVAL;
> +
> +	return 0;
> +}
> +
>  int V4L2CameraProxy::freeBuffers()
>  {
>  	LOG(V4L2Compat, Debug) << "Freeing libcamera bufs";
> @@ -594,6 +630,9 @@ std::set<unsigned long> V4L2CameraProxy::supportedIoctls_ = {
>  	VIDIOC_TRY_FMT,
>  	VIDIOC_G_PRIORITY,
>  	VIDIOC_S_PRIORITY,
> +	VIDIOC_ENUMINPUT,
> +	VIDIOC_G_INPUT,
> +	VIDIOC_S_INPUT,
>  	VIDIOC_REQBUFS,
>  	VIDIOC_QUERYBUF,
>  	VIDIOC_QBUF,
> @@ -637,6 +676,15 @@ int V4L2CameraProxy::ioctl(V4L2CameraFile *cf, unsigned long request, void *arg)
>  	case VIDIOC_S_PRIORITY:
>  		ret = vidioc_s_priority(cf, static_cast<enum v4l2_priority *>(arg));
>  		break;
> +	case VIDIOC_ENUMINPUT:
> +		ret = vidioc_enuminput(cf, static_cast<struct v4l2_input *>(arg));
> +		break;
> +	case VIDIOC_G_INPUT:
> +		ret = vidioc_g_input(cf, static_cast<int *>(arg));
> +		break;
> +	case VIDIOC_S_INPUT:
> +		ret = vidioc_s_input(cf, static_cast<int *>(arg));
> +		break;
>  	case VIDIOC_REQBUFS:
>  		ret = vidioc_reqbufs(cf, static_cast<struct v4l2_requestbuffers *>(arg));
>  		break;
> diff --git a/src/v4l2/v4l2_camera_proxy.h b/src/v4l2/v4l2_camera_proxy.h
> index 3260eec..46573e7 100644
> --- a/src/v4l2/v4l2_camera_proxy.h
> +++ b/src/v4l2/v4l2_camera_proxy.h
> @@ -53,6 +53,9 @@ private:
>  	int vidioc_try_fmt(V4L2CameraFile *cf, struct v4l2_format *arg);
>  	int vidioc_g_priority(V4L2CameraFile *cf, enum v4l2_priority *arg);
>  	int vidioc_s_priority(V4L2CameraFile *cf, enum v4l2_priority *arg);
> +	int vidioc_enuminput(V4L2CameraFile *cf, struct v4l2_input *arg);
> +	int vidioc_g_input(V4L2CameraFile *cf, int *arg);
> +	int vidioc_s_input(V4L2CameraFile *cf, int *arg);
>  	int vidioc_reqbufs(V4L2CameraFile *cf, struct v4l2_requestbuffers *arg);
>  	int vidioc_querybuf(V4L2CameraFile *cf, struct v4l2_buffer *arg);
>  	int vidioc_qbuf(V4L2CameraFile *cf, struct v4l2_buffer *arg);

-- 
Regards,

Laurent Pinchart


More information about the libcamera-devel mailing list