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:
Родитель
5b448065fe
Коммит
a810ed0b33
|
@ -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.
|
||||
|
|
Загрузка…
Ссылка в новой задаче