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: Tomi Valkeinen <tomi.valkeinen@ideasonboard.com>
Signed-off-by: Hans Verkuil <hverkuil-cisco@xs4all.nl>
Signed-off-by: Mauro Carvalho Chehab <mchehab+huawei@kernel.org>
This commit is contained in:
Tomi Valkeinen 2021-04-12 13:02:09 +02:00 коммит произвёл Mauro Carvalho Chehab
Родитель 5b448065fe
Коммит a810ed0b33
2 изменённых файлов: 30 добавлений и 0 удалений

Просмотреть файл

@ -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);

Просмотреть файл

@ -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.