[PATCH] media: videobuf2-core.c: check if all buffers have the same number of planes

Laurent Pinchart laurent.pinchart at ideasonboard.com
Wed Aug 16 07:34:32 PDT 2023


Hi Hans,

Thank you for the patch.

On Wed, Aug 16, 2023 at 02:47:33PM +0200, Hans Verkuil wrote:
> Currently if VIDIOC_CREATE_BUFS is called to add new buffers, then the requested
> number of planes per buffer might be different from the already allocated buffers.
> 
> However, this does not make a lot of sense and there are no drivers that allow
> for variable number of planes in the allocated buffers.
> 
> While it is possible do this today, when such a buffer is queued it will fail
> in the buf_prepare() callback where the plane sizes are checked if those are
> large enough. If fewer planes were allocated, then the size for the missing
> planes are 0 and the check will return -EINVAL.
> 
> But it is much better to do this check in VIDIOC_CREATE_BUFS.

I don't think this is a good idea. One important use case for
VIDIOC_CREATE_BUFS is to allocate buffers for a different format than
the one currently configured for the device, to prepare for a future
capture (or output) session with a different configuration. This patch
would prevent that.

> This patch adds the check to videobuf2-core.c
> 
> Signed-off-by: Hans Verkuil <hverkuil-cisco at xs4all.nl>
> ---
> With this patch the mediatek vcodec patch would no longer be needed:
> https://patchwork.linuxtv.org/project/linux-media/patch/20230810082333.972165-1-harperchen1110@gmail.com/
> ---
> diff --git a/drivers/media/common/videobuf2/videobuf2-core.c b/drivers/media/common/videobuf2/videobuf2-core.c
> index cf6727d9c81f..b88c08319bbe 100644
> --- a/drivers/media/common/videobuf2/videobuf2-core.c
> +++ b/drivers/media/common/videobuf2/videobuf2-core.c
> @@ -938,6 +938,10 @@ int vb2_core_create_bufs(struct vb2_queue *q, enum vb2_memory memory,
>  			dprintk(q, 1, "memory model mismatch\n");
>  			return -EINVAL;
>  		}
> +		if (requested_planes != q->num_planes) {
> +			dprintk(q, 1, "num_planes mismatch\n");
> +			return -EINVAL;
> +		}
>  		if (!verify_coherency_flags(q, non_coherent_mem))
>  			return -EINVAL;
>  	}
> @@ -1002,6 +1006,8 @@ int vb2_core_create_bufs(struct vb2_queue *q, enum vb2_memory memory,
>  		mutex_unlock(&q->mmap_lock);
>  		return -ENOMEM;
>  	}
> +	if (no_previous_buffers)
> +		q->num_planes = num_planes;
>  	mutex_unlock(&q->mmap_lock);
> 
>  	/*
> diff --git a/include/media/videobuf2-core.h b/include/media/videobuf2-core.h
> index 4b6a9d2ea372..799a285447b7 100644
> --- a/include/media/videobuf2-core.h
> +++ b/include/media/videobuf2-core.h
> @@ -558,6 +558,7 @@ struct vb2_buf_ops {
>   * @dma_dir:	DMA mapping direction.
>   * @bufs:	videobuf2 buffer structures
>   * @num_buffers: number of allocated/used buffers
> + * @num_planes: number of planes in each buffer
>   * @queued_list: list of buffers currently queued from userspace
>   * @queued_count: number of buffers queued and ready for streaming.
>   * @owned_by_drv_count: number of buffers owned by the driver
> @@ -621,6 +622,7 @@ struct vb2_queue {
>  	enum dma_data_direction		dma_dir;
>  	struct vb2_buffer		*bufs[VB2_MAX_FRAME];
>  	unsigned int			num_buffers;
> +	unsigned int			num_planes;
> 
>  	struct list_head		queued_list;
>  	unsigned int			queued_count;

-- 
Regards,

Laurent Pinchart



More information about the Linux-mediatek mailing list