Commit a810ed0b authored by Tomi Valkeinen's avatar Tomi Valkeinen Committed by Mauro Carvalho Chehab
Browse files

media: videobuf2-v4l2.c: add vb2_queue_change_type() helper



On some platforms a video device can capture either video data or
metadata. The driver can implement vidioc functions for both video and
metadata, and use a single vb2_queue for the buffers. However, vb2_queue
requires choosing a single buffer type, which conflicts with the idea of
capturing either video or metadata.

The buffer type of vb2_queue can be changed, but it's not obvious how
this should be done in the drivers. To help this, add a new helper
function vb2_queue_change_type() which ensures the correct checks and
documents how it can be used.

Signed-off-by: default avatarTomi Valkeinen <tomi.valkeinen@ideasonboard.com>
Signed-off-by: default avatarHans Verkuil <hverkuil-cisco@xs4all.nl>
Signed-off-by: default avatarMauro Carvalho Chehab <mchehab+huawei@kernel.org>
parent 5b448065
Loading
Loading
Loading
Loading
+14 −0
Original line number Diff line number Diff line
@@ -939,6 +939,20 @@ void vb2_queue_release(struct vb2_queue *q)
}
EXPORT_SYMBOL_GPL(vb2_queue_release);

int vb2_queue_change_type(struct vb2_queue *q, unsigned int type)
{
	if (type == q->type)
		return 0;

	if (vb2_is_busy(q))
		return -EBUSY;

	q->type = type;

	return 0;
}
EXPORT_SYMBOL_GPL(vb2_queue_change_type);

__poll_t vb2_poll(struct vb2_queue *q, struct file *file, poll_table *wait)
{
	struct video_device *vfd = video_devdata(file);
+16 −0
Original line number Diff line number Diff line
@@ -261,6 +261,22 @@ int __must_check vb2_queue_init_name(struct vb2_queue *q, const char *name);
 */
void vb2_queue_release(struct vb2_queue *q);

/**
 * vb2_queue_change_type() - change the type of an inactive vb2_queue
 * @q:		pointer to &struct vb2_queue with videobuf2 queue.
 * @type:	the type to change to (V4L2_BUF_TYPE_VIDEO_*)
 *
 * This function changes the type of the vb2_queue. This is only possible
 * if the queue is not busy (i.e. no buffers have been allocated).
 *
 * vb2_queue_change_type() can be used to support multiple buffer types using
 * the same queue. The driver can implement v4l2_ioctl_ops.vidioc_reqbufs and
 * v4l2_ioctl_ops.vidioc_create_bufs functions and call vb2_queue_change_type()
 * before calling vb2_ioctl_reqbufs() or vb2_ioctl_create_bufs(), and thus
 * "lock" the buffer type until the buffers have been released.
 */
int vb2_queue_change_type(struct vb2_queue *q, unsigned int type);

/**
 * vb2_poll() - implements poll userspace operation
 * @q:		pointer to &struct vb2_queue with videobuf2 queue.