[libcamera-devel] [PATCH v4] v4l2: V4L2CameraProxy: Add EXPBUF as one of the supported ioctl

Laurent Pinchart laurent.pinchart at ideasonboard.com
Wed Dec 29 23:36:24 CET 2021


Hi Vedant,

Thank you for the patch.

On Wed, Dec 29, 2021 at 12:20:14AM +0530, Vedant Paranjape wrote:
> To support DMABUF as one of the memory buffer, we need to implement
> EXPBUF in the v4l2 compat layer.
> 
> This patch implements vidioc_expbuf as one of the supported ioctls.
> 
> Bug: https://bugs.libcamera.org/show_bug.cgi?id=89
> 
> Signed-off-by: Vedant Paranjape <vedantparanjape160201 at gmail.com>

This looks fine. As soon as you can test it with v4l2-ctl and capture
images, I think it can be merged.

I've sent a patch for v4l2-ctl (which has been merged in the master
branch already) that should help with testing.

> ---
>  src/v4l2/v4l2_camera_proxy.cpp | 30 ++++++++++++++++++++++++++++++
>  src/v4l2/v4l2_camera_proxy.h   |  1 +
>  2 files changed, 31 insertions(+)
> 
> diff --git a/src/v4l2/v4l2_camera_proxy.cpp b/src/v4l2/v4l2_camera_proxy.cpp
> index c1375777c185..4d529bc29a4d 100644
> --- a/src/v4l2/v4l2_camera_proxy.cpp
> +++ b/src/v4l2/v4l2_camera_proxy.cpp
> @@ -624,6 +624,32 @@ int V4L2CameraProxy::vidioc_dqbuf(V4L2CameraFile *file, struct v4l2_buffer *arg,
>  	return 0;
>  }
>  
> +int V4L2CameraProxy::vidioc_expbuf(V4L2CameraFile *file, struct v4l2_exportbuffer *arg)
> +{
> +	LOG(V4L2Compat, Debug) << "Servicing vidioc_expbuf fd = " << file->efd();
> +
> +	if (!hasOwnership(file))
> +		return -EBUSY;
> +
> +	/* \todo Verify that the memory type is MMAP when adding DMABUF support */
> +	if (!validateBufferType(arg->type))
> +		return -EINVAL;
> +
> +	if (arg->index >= bufferCount_)
> +		return -EINVAL;
> +
> +	if (arg->flags & ~(O_CLOEXEC | O_ACCMODE))
> +		return -EINVAL;
> +
> +	memset(arg->reserved, 0, sizeof(arg->reserved));
> +
> +	/* \todo honor the O_ACCMODE flags passed to this function */
> +	arg->fd = fcntl(vcam_->getBufferFd(arg->index),
> +			arg->flags & O_CLOEXEC ? F_DUPFD_CLOEXEC : F_DUPFD, 0);
> +
> +	return 0;
> +}
> +
>  int V4L2CameraProxy::vidioc_streamon(V4L2CameraFile *file, int *arg)
>  {
>  	LOG(V4L2Compat, Debug) << "Servicing vidioc_streamon fd = " << file->efd();
> @@ -685,6 +711,7 @@ const std::set<unsigned long> V4L2CameraProxy::supportedIoctls_ = {
>  	VIDIOC_QUERYBUF,
>  	VIDIOC_QBUF,
>  	VIDIOC_DQBUF,
> +	VIDIOC_EXPBUF,
>  	VIDIOC_STREAMON,
>  	VIDIOC_STREAMOFF,
>  };
> @@ -755,6 +782,9 @@ int V4L2CameraProxy::ioctl(V4L2CameraFile *file, unsigned long request, void *ar
>  	case VIDIOC_DQBUF:
>  		ret = vidioc_dqbuf(file, static_cast<struct v4l2_buffer *>(arg), &proxyMutex_);
>  		break;
> +	case VIDIOC_EXPBUF:
> +		ret = vidioc_expbuf(file, static_cast<struct v4l2_exportbuffer *>(arg));
> +		break;
>  	case VIDIOC_STREAMON:
>  		ret = vidioc_streamon(file, static_cast<int *>(arg));
>  		break;
> diff --git a/src/v4l2/v4l2_camera_proxy.h b/src/v4l2/v4l2_camera_proxy.h
> index fa0a49e0439b..14e027c3e7d1 100644
> --- a/src/v4l2/v4l2_camera_proxy.h
> +++ b/src/v4l2/v4l2_camera_proxy.h
> @@ -60,6 +60,7 @@ private:
>  	int vidioc_qbuf(V4L2CameraFile *file, struct v4l2_buffer *arg);
>  	int vidioc_dqbuf(V4L2CameraFile *file, struct v4l2_buffer *arg,
>  			 libcamera::Mutex *lock) LIBCAMERA_TSA_REQUIRES(*lock);
> +	int vidioc_expbuf(V4L2CameraFile *file, struct v4l2_exportbuffer *arg);
>  	int vidioc_streamon(V4L2CameraFile *file, int *arg);
>  	int vidioc_streamoff(V4L2CameraFile *file, int *arg);
>  

-- 
Regards,

Laurent Pinchart


More information about the libcamera-devel mailing list