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

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
...@@ -939,6 +939,20 @@ void vb2_queue_release(struct vb2_queue *q) ...@@ -939,6 +939,20 @@ void vb2_queue_release(struct vb2_queue *q)
} }
EXPORT_SYMBOL_GPL(vb2_queue_release); 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) __poll_t vb2_poll(struct vb2_queue *q, struct file *file, poll_table *wait)
{ {
struct video_device *vfd = video_devdata(file); 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); ...@@ -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); 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 * vb2_poll() - implements poll userspace operation
* @q: pointer to &struct vb2_queue with videobuf2 queue. * @q: pointer to &struct vb2_queue with videobuf2 queue.
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment