2.16. V4L2 videobuf2 函数和数据结构¶
-
enum vb2_memory¶
用于使缓冲区在用户空间可见的内存模型类型。
常量
VB2_MEMORY_UNKNOWN
缓冲区状态未知或尚未在用户空间中使用。
VB2_MEMORY_MMAP
缓冲区由内核分配,并通过 mmap() ioctl 进行内存映射。当用户通过 read() 或 write() 系统调用使用缓冲区时,也使用此模型。
VB2_MEMORY_USERPTR
缓冲区在用户空间中分配,并通过 mmap() ioctl 进行内存映射。
VB2_MEMORY_DMABUF
缓冲区通过 DMA 缓冲区传递到用户空间。
-
struct vb2_mem_ops¶
内存处理/内存分配器操作。
定义:
struct vb2_mem_ops {
void *(*alloc)(struct vb2_buffer *vb,struct device *dev, unsigned long size);
void (*put)(void *buf_priv);
struct dma_buf *(*get_dmabuf)(struct vb2_buffer *vb,void *buf_priv, unsigned long flags);
void *(*get_userptr)(struct vb2_buffer *vb,struct device *dev,unsigned long vaddr, unsigned long size);
void (*put_userptr)(void *buf_priv);
void (*prepare)(void *buf_priv);
void (*finish)(void *buf_priv);
void *(*attach_dmabuf)(struct vb2_buffer *vb,struct device *dev,struct dma_buf *dbuf, unsigned long size);
void (*detach_dmabuf)(void *buf_priv);
int (*map_dmabuf)(void *buf_priv);
void (*unmap_dmabuf)(void *buf_priv);
void *(*vaddr)(struct vb2_buffer *vb, void *buf_priv);
void *(*cookie)(struct vb2_buffer *vb, void *buf_priv);
unsigned int (*num_users)(void *buf_priv);
int (*mmap)(void *buf_priv, struct vm_area_struct *vma);
};
成员
alloc
分配视频内存,并可选择分配器私有数据,失败时返回
ERR_PTR()
,成功时返回指向分配器私有、每个缓冲区数据的指针;返回的私有结构随后将作为 buf_priv 参数传递给此结构中的其他操作。此函数的 size 参数应为页面对齐。put
通知分配器缓冲区将不再使用;通常会导致分配器释放缓冲区(如果不存在此缓冲区的其他用户);buf_priv 参数是先前从 alloc 回调返回的分配器私有、每个缓冲区结构。
get_dmabuf
获取用户空间内存以进行硬件操作;用于 DMABUF 内存类型。
get_userptr
获取用户空间内存以进行硬件操作;用于 USERPTR 内存类型;vaddr 是在对 USERPTR 类型的视频缓冲区进行排队时传递给 videobuf2 层的地址;成功时应返回与缓冲区关联的分配器私有、每个缓冲区结构,失败时返回
ERR_PTR()
;返回的私有结构随后将作为 buf_priv 参数传递给此结构中的其他操作。put_userptr
通知分配器 USERPTR 缓冲区将不再使用。
prepare
每次缓冲区从用户空间传递到驱动程序时调用,对于缓存同步很有用,可选。
finish
每次缓冲区从驱动程序传递回用户空间时调用,也是可选的。
attach_dmabuf
为硬件操作附加共享的
struct dma_buf
;用于 DMABUF 内存类型;dev 是分配设备,dbuf 是共享的 dma_buf;失败时返回ERR_PTR()
;成功时返回分配器私有、每个缓冲区结构;这需要用于进一步访问缓冲区。detach_dmabuf
通知缓冲区的导出器当前 DMABUF 缓冲区不再使用;buf_priv 参数是先前从 attach_dmabuf 回调返回的分配器私有、每个缓冲区结构。
map_dmabuf
请求从分配器访问 dmabuf;dmabuf 的分配器被告知此驱动程序将使用 dmabuf。
unmap_dmabuf
释放对 dmabuf 的访问控制 - 分配器被通知此驱动程序现在已完成使用 dmabuf。
vaddr
返回给定内存缓冲区的内核虚拟地址,该缓冲区与传递的私有结构相关联,如果不存在此类映射,则返回 NULL。
cookie
返回给定内存缓冲区的分配器特定 cookie,该缓冲区与传递的私有结构相关联,如果不可用,则返回 NULL。
num_users
返回内存缓冲区的当前用户数;如果 videobuf2 层(或实际使用它的驱动程序)是唯一用户,则返回 1。
mmap
在提供的虚拟内存区域下,为给定内存缓冲区设置用户空间映射。
描述
这些操作由 videobuf2 核心用于为每种支持的流式 I/O 方法实现内存处理/内存分配器。
注意
USERPTR 类型的必需操作:get_userptr、put_userptr。
MMAP 类型的必需操作:alloc、put、num_users、mmap。
读/写访问类型的必需操作:alloc、put、num_users、vaddr。
DMABUF 类型的必需操作:attach_dmabuf、detach_dmabuf、map_dmabuf、unmap_dmabuf。
-
struct vb2_plane¶
平面信息。
定义:
struct vb2_plane {
void *mem_priv;
struct dma_buf *dbuf;
unsigned int dbuf_mapped;
bool dbuf_duplicated;
unsigned int bytesused;
unsigned int length;
unsigned int min_length;
union {
unsigned int offset;
unsigned long userptr;
int fd;
} m;
unsigned int data_offset;
};
成员
mem_priv
此平面的私有数据。
dbuf
dma_buf - 共享缓冲区对象。
dbuf_mapped
标志,用于显示 dbuf 是否已映射
dbuf_duplicated
布尔值,用于显示 dbuf 是否与缓冲区的先前平面重复。
bytesused
平面中数据(有效负载)占用的字节数。
length
此平面(不是有效负载)的大小(以字节为单位)。最大有效大小为 MAX_UINT - PAGE_SIZE。
min_length
此平面(不是有效负载)的最小所需大小(以字节为单位)。length 始终大于或等于 min_length,并且与 length 一样,它限制为 MAX_UINT - PAGE_SIZE。
m
具有内存类型特定数据的联合。
m.offset
当关联的
struct vb2_buffer
中的内存为VB2_MEMORY_MMAP
时,等于此平面的设备内存的起始偏移量(或应传递给在视频节点上调用的 mmap() 的“cookie”)。m.userptr
当内存为
VB2_MEMORY_USERPTR
时,指向此平面的用户空间指针。m.fd
当内存为
VB2_MEMORY_DMABUF
时,与此平面关联的用户空间文件描述符。data_offset
平面中到数据起点的偏移量;通常为 0,除非数据前面有标头。
描述
应包含足够的信息,以便能够覆盖 videodev2.h 中 struct v4l2_plane
的所有字段。
-
enum vb2_io_modes¶
队列访问方法。
常量
VB2_MMAP
驱动程序支持带有流式 API 的 MMAP。
VB2_USERPTR
驱动程序支持带有流式 API 的 USERPTR。
VB2_READ
驱动程序支持 read() 样式访问。
VB2_WRITE
驱动程序支持 write() 样式访问。
VB2_DMABUF
驱动程序支持带有流式 API 的 DMABUF。
-
enum vb2_buffer_state¶
当前视频缓冲区状态。
常量
VB2_BUF_STATE_DEQUEUED
在用户空间控制下的缓冲区。
VB2_BUF_STATE_IN_REQUEST
缓冲区在媒体请求中排队。
VB2_BUF_STATE_PREPARING
缓冲区正在 videobuf2 中准备。
VB2_BUF_STATE_QUEUED
缓冲区在 videobuf2 中排队,但不在驱动程序中。
VB2_BUF_STATE_ACTIVE
缓冲区在驱动程序中排队,并且可能在硬件操作中使用。
VB2_BUF_STATE_DONE
缓冲区从驱动程序返回到 videobuf2,但尚未出队到用户空间。
VB2_BUF_STATE_ERROR
与上述相同,但缓冲区的操作以错误结束,该错误将在出队时报告给用户空间。
-
struct vb2_buffer¶
表示视频缓冲区。
定义:
struct vb2_buffer {
struct vb2_queue *vb2_queue;
unsigned int index;
unsigned int type;
unsigned int memory;
unsigned int num_planes;
u64 timestamp;
struct media_request *request;
struct media_request_object req_obj;
};
成员
vb2_queue
指向
struct vb2_queue
的指针,其中包含此驱动程序所属的队列。index
缓冲区的 ID 号。
type
缓冲区类型。
memory
传递实际数据的方法。
num_planes
内部驱动程序队列中缓冲区的平面数。
timestamp
帧时间戳(以纳秒为单位)。
request
此缓冲区关联的请求。
req_obj
用于将此缓冲区绑定到请求。此请求对象具有引用计数。
-
struct vb2_ops¶
驱动程序特定的回调。
定义:
struct vb2_ops {
int (*queue_setup)(struct vb2_queue *q,unsigned int *num_buffers, unsigned int *num_planes, unsigned int sizes[], struct device *alloc_devs[]);
void (*wait_prepare)(struct vb2_queue *q);
void (*wait_finish)(struct vb2_queue *q);
int (*buf_out_validate)(struct vb2_buffer *vb);
int (*buf_init)(struct vb2_buffer *vb);
int (*buf_prepare)(struct vb2_buffer *vb);
void (*buf_finish)(struct vb2_buffer *vb);
void (*buf_cleanup)(struct vb2_buffer *vb);
int (*prepare_streaming)(struct vb2_queue *q);
int (*start_streaming)(struct vb2_queue *q, unsigned int count);
void (*stop_streaming)(struct vb2_queue *q);
void (*unprepare_streaming)(struct vb2_queue *q);
void (*buf_queue)(struct vb2_buffer *vb);
void (*buf_request_complete)(struct vb2_buffer *vb);
};
成员
queue_setup
从 VIDIOC_REQBUFS() 和 VIDIOC_CREATE_BUFS() 处理程序中的内存分配之前调用。它可以被调用两次:如果原始请求缓冲区数无法分配,则它将被第二次调用,其中包含实际分配的缓冲区数,以验证是否可以。驱动程序应在 *num_buffers 中返回所需的缓冲区数,在 *num_planes 中返回每个缓冲区的所需平面数,每个平面的大小应在 sizes[] 数组中设置,可选的每个平面分配器特定的设备在 alloc_devs[] 数组中。当从 VIDIOC_REQBUFS() 调用时,*num_planes == 0,驱动程序必须使用当前配置的格式来确定平面大小,并且 *num_buffers 是正在分配的缓冲区的总数。当从 VIDIOC_CREATE_BUFS() 调用时,*num_planes != 0,并且它描述了请求的平面数,并且 sizes[] 包含请求的平面大小。在这种情况下,*num_buffers 将添加到已分配的缓冲区中。如果 *num_planes 或请求的大小无效,回调必须返回
-EINVAL
。wait_prepare
释放调用 vb2 函数时获取的任何锁;它在 ioctl 需要等待新缓冲区到达之前被调用;需要避免阻塞访问类型中的死锁。
wait_finish
重新获取在上一个回调中释放的所有锁;需要在休眠等待新缓冲区到达后继续操作。
buf_out_validate
当输出缓冲区准备好或排队到请求时调用;驱动程序可以使用它来验证用户空间提供的信息;这仅对 OUTPUT 队列是必需的。
buf_init
在分配缓冲区(在 MMAP 情况下)或获取新的 USERPTR 缓冲区之后调用一次;驱动程序可以执行其他与缓冲区相关的初始化;初始化失败(返回值 != 0)将阻止队列设置成功完成;可选。
buf_prepare
每次缓冲区从用户空间和 VIDIOC_PREPARE_BUF() ioctl 排队时调用;驱动程序可以在此回调中执行每个硬件操作所需的任何初始化;驱动程序可以在此处访问/修改缓冲区,因为它仍然与 CPU 同步;支持 VIDIOC_CREATE_BUFS() 的驱动程序还必须验证缓冲区大小;如果返回错误,缓冲区将不会在驱动程序中排队;可选。
buf_finish
在每次将缓冲区出队返回到用户空间之前调用;缓冲区已与 CPU 同步,因此驱动程序可以访问/修改缓冲区内容;驱动程序可以执行用户空间访问缓冲区之前所需的任何操作;可选。缓冲区状态可以是以下之一:
DONE
和ERROR
在流式传输正在进行时发生,并且当队列已取消并且所有挂起的缓冲区都返回到其默认DEQUEUED
状态时,会发生PREPARED
状态。通常,您只需要在状态为VB2_BUF_STATE_DONE
时执行某些操作,因为在所有其他情况下,缓冲区内容都将被忽略。buf_cleanup
在缓冲区被释放之前调用一次;驱动程序可以执行任何其他清理;可选。
prepare_streaming
调用一次以准备“流式传输”状态;这是可以进行验证以验证一切是否正常以及可以声明流式传输资源的地方。当调用 VIDIOC_STREAMON ioctl 时调用。实际的流式传输在调用 start_streaming 时开始。可选。
start_streaming
调用一次以进入“流式传输”状态;驱动程序可以在调用 start_streaming 之前通过 buf_queue 回调接收缓冲区;驱动程序在 count 参数中获取已排队的缓冲区数;如果硬件失败,驱动程序可以返回错误,在这种情况下,已由 buf_queue 回调给出的所有缓冲区都将通过调用
vb2_buffer_done()
与VB2_BUF_STATE_QUEUED
返回。如果您在可以开始流式传输之前需要最少数量的缓冲区,则设置vb2_queue->min_queued_buffers
。如果它不是零,则在用户空间至少排队那么多缓冲区之前,不会调用 start_streaming。stop_streaming
当必须禁用“流式传输”状态时调用;驱动程序应停止任何 DMA 事务或等待它们完成,并通过使用
VB2_BUF_STATE_DONE
或VB2_BUF_STATE_ERROR
调用vb2_buffer_done()
来返回从buf_queue
回调中获取的所有缓冲区;可以使用vb2_wait_for_all_buffers()
函数unprepare_streaming
作为 prepare_streaming 的对应方调用;可以在此处释放任何声明的流式传输资源。当调用 VIDIOC_STREAMOFF ioctl 时或当流式传输文件句柄关闭时调用。可选。
buf_queue
将缓冲区 vb 传递给驱动程序;驱动程序可以对此缓冲区启动硬件操作;驱动程序应通过调用
vb2_buffer_done()
函数来返回缓冲区;它始终在调用 VIDIOC_STREAMON() ioctl 之后调用;如果在调用 VIDIOC_STREAMON() 之前用户预先排队了缓冲区,则可以在 start_streaming 回调之前调用。buf_request_complete
从未排队到驱动程序但与排队的请求关联的缓冲区已取消。驱动程序将必须将请求中的关联对象标记为已完成;如果支持请求,则需要。
描述
这些操作不是从中断上下文中调用的,除非特别提及。
-
struct vb2_buf_ops¶
驱动程序特定的回调。
定义:
struct vb2_buf_ops {
int (*verify_planes_array)(struct vb2_buffer *vb, const void *pb);
void (*init_buffer)(struct vb2_buffer *vb);
void (*fill_user_buffer)(struct vb2_buffer *vb, void *pb);
int (*fill_vb2_buffer)(struct vb2_buffer *vb, struct vb2_plane *planes);
void (*copy_timestamp)(struct vb2_buffer *vb, const void *pb);
};
成员
verify_planes_array
验证给定的用户空间结构是否包含足够的缓冲区平面。这是为每个出队的缓冲区调用的。
init_buffer
给定一个
vb2_buffer
,在struct vb2_buffer
之后初始化额外数据。对于 V4L2,这是一个struct vb2_v4l2_buffer
。fill_user_buffer
给定一个
vb2_buffer
,填充用户空间结构。对于 V4L2,这是一个struct v4l2_buffer
。fill_vb2_buffer
给定一个用户空间结构,填充
vb2_buffer
。如果用户空间结构无效,则此操作将返回错误。copy_timestamp
将时间戳从用户空间结构复制到
struct vb2_buffer
。
-
struct vb2_queue¶
一个 videobuf2 队列。
定义:
struct vb2_queue {
unsigned int type;
unsigned int io_modes;
struct device *dev;
unsigned long dma_attrs;
unsigned int bidirectional:1;
unsigned int fileio_read_once:1;
unsigned int fileio_write_immediately:1;
unsigned int allow_zero_bytesused:1;
unsigned int quirk_poll_must_check_waiting_for_buffers:1;
unsigned int supports_requests:1;
unsigned int requires_requests:1;
unsigned int uses_qbuf:1;
unsigned int uses_requests:1;
unsigned int allow_cache_hints:1;
unsigned int non_coherent_mem:1;
struct mutex *lock;
void *owner;
const struct vb2_ops *ops;
const struct vb2_mem_ops *mem_ops;
const struct vb2_buf_ops *buf_ops;
void *drv_priv;
u32 subsystem_flags;
unsigned int buf_struct_size;
u32 timestamp_flags;
gfp_t gfp_flags;
u32 min_queued_buffers;
u32 min_reqbufs_allocation;
struct device *alloc_devs[VB2_MAX_PLANES];
};
成员
type
私有缓冲区类型,其内容由 vb2-core 调用方定义。例如,对于 V4L2,它应与
enum v4l2_buf_type
上定义的类型匹配。io_modes
支持的 io 方法(请参阅
enum vb2_io_modes
)。dev
如果驱动程序未填充 alloc_devs 数组,则用于默认分配上下文的设备。
dma_attrs
用于 DMA 的 DMA 属性。
bidirectional
设置此标志后,此队列的缓冲区的 DMA 方向将被
DMA_BIDIRECTIONAL
方向覆盖。这在硬件(固件)写入映射为读取的缓冲区 (DMA_TO_DEVICE
) 或从映射为写入的缓冲区 (DMA_FROM_DEVICE
) 读取的情况下非常有用,以满足某些内部硬件限制或添加处理算法所需的填充。如果 DMA 映射不是双向的,但硬件(固件)尝试访问缓冲区(在相反方向),这可能会导致 IOMMU 保护错误。fileio_read_once
在读取第一个缓冲区后报告 EOF
fileio_write_immediately
在每次 write() 调用后对缓冲区进行排队
allow_zero_bytesused
允许将 bytesused == 0 传递给驱动程序
quirk_poll_must_check_waiting_for_buffers
在 poll 处返回
EPOLLERR
,前提是尚未调用 QBUF。这是 vb1 习语,vb2 也采用了它。supports_requests
此队列支持 Request API。
requires_requests
此队列需要 Request API。如果此项设置为 1,则也必须将 supports_requests 设置为 1。
uses_qbuf
qbuf 直接用于此队列。第一次调用时设置为 1。取消队列时设置为 0。如果此项为 1,则无法从请求中对缓冲区进行排队。
uses_requests
请求用于此队列。第一次对请求进行排队时设置为 1。取消队列时设置为 0。如果此项为 1,则无法直接对缓冲区进行排队。
allow_cache_hints
设置后,用户空间可以传递缓存管理提示,以便跳过 ->prepare() 或/和 ->finish() 上的缓存刷新/失效。
non_coherent_mem
设置后,队列将尝试使用非相干内存分配缓冲区。
lock
指向保护
struct vb2_queue
的互斥锁的指针。驱动程序可以将此设置为互斥锁,以使 v4l2 核心序列化排队 ioctl。如果驱动程序想要自己处理锁定,则应将其设置为 NULL。videobuf2 核心 API 不使用此锁。owner
“拥有”缓冲区的文件句柄,即调用 reqbufs、create_buffers 或启动 fileio 的文件句柄。videobuf2 核心 API 不使用此字段,但它允许驱动程序轻松地将所有者文件句柄与队列关联。
ops
驱动程序特定的回调
mem_ops
内存分配器特定的回调
buf_ops
回调以在用户空间和内核空间之间传递缓冲区信息。
drv_priv
驱动程序私有数据。
subsystem_flags
特定于子系统(V4L2/DVB/等)的标志。vb2 核心不使用。
buf_struct_size
驱动程序特定缓冲区结构的大小;“0”表示驱动程序不想使用自定义缓冲区结构类型。在这种情况下,将使用子系统特定的结构(在 V4L2 的情况下,它是
sizeof(struct vb2_v4l2_buffer)
)。驱动程序特定缓冲结构的第一个字段必须是子系统特定的结构(V4L2 的情况下为 vb2_v4l2_buffer)。timestamp_flags
时间戳标志;
V4L2_BUF_FLAG_TIMESTAMP_*
和V4L2_BUF_FLAG_TSTAMP_SRC_*
gfp_flags
分配缓冲区时使用的其他 gfp 标志。通常这是 0,但也可能是例如
GFP_DMA
或__GFP_DMA32
以强制缓冲区分配到特定内存区域。min_queued_buffers
在可以调用 start_streaming 之前需要的最小排队缓冲区数。当 DMA 引擎无法启动,除非至少有此数量的缓冲区已排队到驱动程序中时使用。VIDIOC_REQBUFS 将确保至少分配 min_queued_buffers + 1 个缓冲区。请注意,VIDIOC_CREATE_BUFS 不会修改请求的缓冲区计数。
min_reqbufs_allocation
调用 VIDIOC_REQBUFS 时要分配的最小缓冲区数。请注意,VIDIOC_CREATE_BUFS 不会修改请求的缓冲区计数,也不会使用此字段。如果必须有一定数量的缓冲区可用于硬件才能有效地工作,则驱动程序可以设置此值。这允许调用 VIDIOC_REQBUFS,缓冲区计数为 1,并且它将自动调整为可工作的缓冲区计数。如果设置,则 min_reqbufs_allocation 必须大于 min_queued_buffers + 1。如果此字段 > 3,则强烈建议驱动程序实现 V4L2_CID_MIN_BUFFERS_FOR_CAPTURE/OUTPUT 控件。
alloc_devs
struct device
内存类型/分配器特定的每个平面设备
参数
struct vb2_queue *q
指向
struct vb2_queue
的指针,其中包含 videobuf2 队列
-
void *vb2_plane_vaddr(struct vb2_buffer *vb, unsigned int plane_no)¶
返回给定平面的内核虚拟地址。
参数
struct vb2_buffer *vb
指向
struct vb2_buffer
的指针,该平面属于该指针。unsigned int plane_no
要返回地址的平面号。
描述
如果存在此类映射,此函数将返回给定平面的内核虚拟地址,否则返回 NULL。
-
void *vb2_plane_cookie(struct vb2_buffer *vb, unsigned int plane_no)¶
返回给定平面的分配器特定 cookie。
参数
struct vb2_buffer *vb
指向
struct vb2_buffer
的指针,该平面属于该指针。unsigned int plane_no
要返回 cookie 的平面号。
描述
如果可用,此函数会为给定的平面返回分配器特定的 Cookie,否则返回 NULL。分配器应提供一些简单的静态内联函数,这些函数可以将此 Cookie 转换为分配器特定的类型,驱动程序可以直接使用该类型来访问缓冲区。例如,可以是物理地址、散列表指针或 IOMMU 映射。
-
void vb2_buffer_done(struct vb2_buffer *vb, enum vb2_buffer_state state)¶
通知 videobuf2 缓冲区上的操作已完成。
参数
struct vb2_buffer *vb
要使用的
struct vb2_buffer
的指针。enum vb2_buffer_state state
缓冲区的状态,由
enum vb2_buffer_state
定义。如果操作成功完成,则为VB2_BUF_STATE_DONE
;如果操作完成时出错,则为VB2_BUF_STATE_ERROR
;或者VB2_BUF_STATE_QUEUED
。
描述
驱动程序应在缓冲区上的硬件操作完成后调用此函数,并且可以将缓冲区返回给用户空间。在通过 vb2_ops->buf_queue
回调将其放回队列之前,驱动程序不能再使用此缓冲区。只有先前通过 vb2_ops->buf_queue
排队到驱动程序的缓冲区才能传递给此函数。
在流式传输期间,缓冲区只能以 DONE 或 ERROR 状态返回。如果由于某种原因无法启动 DMA 引擎,vb2_ops->start_streaming
操作也可以返回它们。在这种情况下,应以 QUEUED 状态返回缓冲区,以将其放回队列中。
参数
struct vb2_queue *q
指向带有 videobuf2 队列的
struct vb2_queue
的指针。
描述
此函数旨在与挂起/恢复操作一起使用。它会丢弃所有“完成”的缓冲区,因为它们在恢复后请求时会太旧。
驱动程序必须停止硬件并与中断处理程序和/或延迟工作同步,然后才能调用此函数,以确保驱动程序和/或硬件不会触摸任何缓冲区。
参数
struct vb2_queue *q
指向带有 videobuf2 队列的
struct vb2_queue
的指针。
描述
此函数将等待直到通过 vb2_ops->buf_queue
给驱动程序的所有缓冲区都通过 vb2_buffer_done()
返回到 vb2。它不调用 vb2_ops->wait_prepare
/vb2_ops->wait_finish
对。它旨在在获取所有锁的情况下调用,例如从 vb2_ops->stop_streaming
回调中调用。
-
void vb2_core_querybuf(struct vb2_queue *q, struct vb2_buffer *vb, void *pb)¶
查询视频缓冲区信息。
参数
struct vb2_queue *q
指向带有 videobuf2 队列的
struct vb2_queue
的指针。struct vb2_buffer *vb
指向 struct
vb2_buffer
的指针。void *pb
从用户空间传递的缓冲区结构。
描述
Videobuf2 核心帮助程序来实现 VIDIOC_QUERYBUF() 操作。它由 VB2 通过特定于 API 的处理程序在内部调用,例如 videobuf2-v4l2.h
。
传递的缓冲区应已验证。
此函数填充用户空间的相关信息。
返回
成功时返回零;否则返回错误代码。
-
int vb2_core_reqbufs(struct vb2_queue *q, enum vb2_memory memory, unsigned int flags, unsigned int *count)¶
启动流式传输。
参数
struct vb2_queue *q
指向带有 videobuf2 队列的
struct vb2_queue
的指针。enum vb2_memory memory
内存类型,由
enum vb2_memory
定义。unsigned int flags
辅助队列/缓冲区管理标志。目前,唯一使用的标志是
V4L2_MEMORY_FLAG_NON_COHERENT
。unsigned int *count
请求的缓冲区计数。
描述
Videobuf2 核心帮助程序来实现 VIDIOC_REQBUF() 操作。它由 VB2 通过特定于 API 的处理程序在内部调用,例如 videobuf2-v4l2.h
。
此函数
验证从用户空间传递的流式传输参数;
设置队列;
与驱动程序协商在流式传输期间要使用的缓冲区数和每个缓冲区的平面数;
根据商定的参数,分配内部缓冲区结构(
struct vb2_buffer
);对于 MMAP 内存类型,使用队列初始化期间提供的内存处理/分配例程分配实际的视频内存。
如果 req->count 为 0,则将释放所有内存。
如果队列先前已通过先前的 vb2_core_reqbufs()
调用分配,并且队列不忙,则将重新分配内存。
返回
成功时返回零;否则返回错误代码。
-
int vb2_core_create_bufs(struct vb2_queue *q, enum vb2_memory memory, unsigned int flags, unsigned int *count, unsigned int requested_planes, const unsigned int requested_sizes[], unsigned int *first_index)¶
分配缓冲区和任何所需的辅助结构
参数
struct vb2_queue *q
指向带有 videobuf2 队列的
struct vb2_queue
的指针。enum vb2_memory memory
内存类型,由
enum vb2_memory
定义。unsigned int flags
辅助队列/缓冲区管理标志。
unsigned int *count
请求的缓冲区计数。
unsigned int requested_planes
请求的平面数。
const unsigned int requested_sizes[]
包含平面大小的数组。
unsigned int *first_index
第一个创建的缓冲区的索引,所有分配的缓冲区在范围 [first_index..first_index+count-1] 中都有索引
描述
Videobuf2 核心帮助程序来实现 VIDIOC_CREATE_BUFS() 操作。它由 VB2 通过特定于 API 的处理程序在内部调用,例如 videobuf2-v4l2.h
。
此函数
验证参数的合理性;
调用
vb2_ops->queue_setup
队列操作;执行任何必要的内存分配。
返回
成功时返回零;否则返回错误代码。
-
int vb2_core_prepare_buf(struct vb2_queue *q, struct vb2_buffer *vb, void *pb)¶
将缓冲区的所有权从用户空间传递到内核。
参数
struct vb2_queue *q
指向带有 videobuf2 队列的
struct vb2_queue
的指针。struct vb2_buffer *vb
指向 struct
vb2_buffer
的指针。void *pb
从用户空间传递到驱动程序中的
v4l2_ioctl_ops->vidioc_prepare_buf
处理程序的缓冲区结构。
描述
Videobuf2 核心帮助程序来实现 VIDIOC_PREPARE_BUF() 操作。它由 VB2 通过特定于 API 的处理程序在内部调用,例如 videobuf2-v4l2.h
。
传递的缓冲区应已验证。
此函数在驱动程序中调用 vb2_ops->buf_prepare 回调(如果提供),可以在其中执行特定于驱动程序的缓冲区初始化。
返回
成功时返回零;否则返回错误代码。
参数
struct vb2_queue *q
指向带有 videobuf2 队列的
struct vb2_queue
的指针。unsigned int start
要删除的缓冲区范围的第一个索引。
unsigned int count
要删除的缓冲区数。
返回
成功时返回零;否则返回错误代码。
-
int vb2_core_qbuf(struct vb2_queue *q, struct vb2_buffer *vb, void *pb, struct media_request *req)¶
从用户空间对缓冲区进行排队
参数
struct vb2_queue *q
指向带有 videobuf2 队列的
struct vb2_queue
的指针。struct vb2_buffer *vb
指向 struct
vb2_buffer
的指针。void *pb
从用户空间传递到驱动程序中的 v4l2_ioctl_ops->vidioc_qbuf 处理程序的缓冲区结构
struct media_request *req
指向
struct media_request
的指针,可以为 NULL。
描述
Videobuf2 核心帮助程序来实现 VIDIOC_QBUF() 操作。它由 VB2 通过特定于 API 的处理程序在内部调用,例如 videobuf2-v4l2.h
。
此函数
如果 req 为非 NULL,则缓冲区将绑定到此媒体请求并返回。当请求本身排队时,将准备缓冲区并将其排队到驱动程序(即接下来的两个步骤)。
如有必要,在驱动程序中调用
vb2_ops->buf_prepare
回调(如果提供),可以在其中执行特定于驱动程序的缓冲区初始化;如果流式传输已打开,则通过
vb2_ops->buf_queue
回调将缓冲区排队到驱动程序中进行处理。
返回
成功时返回零;否则返回错误代码。
-
int vb2_core_dqbuf(struct vb2_queue *q, unsigned int *pindex, void *pb, bool nonblocking)¶
将缓冲区出队到用户空间
参数
struct vb2_queue *q
指向
struct vb2_queue
的指针,其中包含 videobuf2 队列unsigned int *pindex
指向缓冲区索引的指针。可以为 NULL
void *pb
从用户空间传递到驱动程序中的 v4l2_ioctl_ops->vidioc_dqbuf 处理程序的缓冲区结构。
bool nonblocking
如果为 true,则如果不存在可用于出队的缓冲区,则此调用将不会休眠等待缓冲区。通常,驱动程序会在此处传递 (file->f_flags & O_NONBLOCK)。
描述
Videobuf2 核心帮助程序来实现 VIDIOC_DQBUF() 操作。它由 VB2 通过特定于 API 的处理程序在内部调用,例如 videobuf2-v4l2.h
。
此函数
在驱动程序中调用 buf_finish 回调(如果提供),驱动程序可以在其中执行在将缓冲区返回给用户空间之前可能需要的任何其他操作,例如缓存同步,
缓冲区结构成员填充了用户空间的相关信息。
返回
成功时返回零;否则返回错误代码。
参数
struct vb2_queue *q
指向
struct vb2_queue
的指针,其中包含 videobuf2 队列unsigned int type
要启动的队列的类型。对于 V4L2,这由
enum v4l2_buf_type
类型定义。
描述
Videobuf2 核心帮助程序来实现 VIDIOC_STREAMON() 操作。它由 VB2 通过特定于 API 的处理程序在内部调用,例如 videobuf2-v4l2.h
。
返回
成功时返回零;否则返回错误代码。
参数
struct vb2_queue *q
指向
struct vb2_queue
的指针,其中包含 videobuf2 队列unsigned int type
要启动的队列的类型。对于 V4L2,这由
enum v4l2_buf_type
类型定义。
描述
Videobuf2 核心帮助程序来实现 VIDIOC_STREAMOFF() 操作。它由 VB2 通过特定于 API 的处理程序在内部调用,例如 videobuf2-v4l2.h
。
返回
成功时返回零;否则返回错误代码。
-
int vb2_core_expbuf(struct vb2_queue *q, int *fd, unsigned int type, struct vb2_buffer *vb, unsigned int plane, unsigned int flags)¶
将缓冲区导出为文件描述符。
参数
struct vb2_queue *q
指向带有 videobuf2 队列的
struct vb2_queue
的指针。int *fd
指向与 DMABUF 关联的文件描述符的指针(由驱动程序设置)。
unsigned int type
缓冲区类型。
struct vb2_buffer *vb
指向 struct
vb2_buffer
的指针。unsigned int plane
要导出的平面的索引,对于单平面队列为 0
unsigned int flags
新创建文件的文件标志,如 include/uapi/asm-generic/fcntl.h 中定义。目前,唯一使用的标志是
O_CLOEXEC
。支持 is,有关更多详细信息,请参阅 open syscall 的手册。
描述
Videobuf2 核心帮助程序来实现 VIDIOC_EXPBUF() 操作。它由 VB2 通过特定于 API 的处理程序在内部调用,例如 videobuf2-v4l2.h
。
返回
成功时返回零;否则返回错误代码。
参数
struct vb2_queue *q
指向带有 videobuf2 队列的
struct vb2_queue
的指针。此结构应在驱动程序中分配
描述
vb2_queue
结构应由驱动程序分配。驱动程序负责清除其内容并在调用此函数之前为某些必需条目设置初始值。
注意
在调用此函数之前,应设置 q 中的以下字段:vb2_queue->ops
、vb2_queue->mem_ops
、vb2_queue->type
。
参数
struct vb2_queue *q
指向带有 videobuf2 队列的
struct vb2_queue
的指针。
描述
此函数停止流式传输并执行必要的清理,包括释放视频缓冲区内存。驱动程序负责释放 struct vb2_queue
本身。
参数
struct vb2_queue *q
指向带有 videobuf2 队列的
struct vb2_queue
的指针。
描述
标记发生了无法恢复的致命错误,并唤醒所有在队列上等待的进程。轮询现在将设置 EPOLLERR
,排队和出队缓冲区将返回 -EIO
。
取消队列时,将清除错误标志,无论是在 vb2_streamoff()
还是 vb2_queue_release()
中。因此,驱动程序不应在启动流之前调用此函数,否则错误标志将保持设置状态,直到关闭设备节点时释放队列。
参数
struct vb2_queue *q
指向带有 videobuf2 队列的
struct vb2_queue
的指针。struct vm_area_struct *vma
指向
struct vm_area_struct
的指针,该指针带有传递给驱动程序中 mmap 文件操作处理程序的 vma。
描述
应从驱动程序的 mmap 文件操作处理程序中调用。此函数将可用视频缓冲区之一的一个平面映射到用户空间。要映射在 reqbufs 上分配的整个视频内存,必须为先前分配的每个缓冲区的每个平面调用一次此函数。
当用户空间应用程序调用 mmap 时,它会将先前通过 v4l2_ioctl_ops->vidioc_querybuf
处理程序返回给它的偏移量传递给它。该偏移量充当“Cookie”,然后用于标识要映射的平面。
此函数查找具有匹配偏移量的平面,并通过提供的内存操作执行映射。
此函数的返回值旨在直接从驱动程序中的 mmap 处理程序返回。
-
unsigned long vb2_get_unmapped_area(struct vb2_queue *q, unsigned long addr, unsigned long len, unsigned long pgoff, unsigned long flags)¶
将视频缓冲区映射到应用程序地址空间中。
参数
struct vb2_queue *q
指向带有 videobuf2 队列的
struct vb2_queue
的指针。unsigned long addr
内存地址。
unsigned long len
缓冲区大小。
unsigned long pgoff
页面偏移量。
unsigned long flags
内存标志。
描述
此函数用于 noMMU 平台中,以建议给定缓冲区的地址映射。它旨在用作 file_operations->get_unmapped_area
操作的处理程序。
当 !CONFIG_MMU
时,mmap() 系统调用例程将调用此函数以获取建议的映射地址。
-
__poll_t vb2_core_poll(struct vb2_queue *q, struct file *file, poll_table *wait)¶
实现 poll syscall() 逻辑。
参数
struct vb2_queue *q
指向带有 videobuf2 队列的
struct vb2_queue
的指针。struct file *file
传递给 poll 文件操作处理程序的
struct file
参数。poll_table *wait
poll_table
传递给 poll 文件操作处理程序的 wait 参数。
描述
此函数为驱动程序实现 poll 文件操作处理程序。对于 CAPTURE 队列,如果缓冲区准备好出队,则会通知用户空间视频设备的文件描述符可用于读取。对于 OUTPUT 队列,如果缓冲区准备好出队,则文件描述符将报告为可用于写入。
此函数的返回值旨在直接从驱动程序中的 poll 处理程序返回。
-
size_t vb2_read(struct vb2_queue *q, char __user *data, size_t count, loff_t *ppos, int nonblock)¶
实现 read() 系统调用逻辑。
参数
struct vb2_queue *q
指向带有 videobuf2 队列的
struct vb2_queue
的指针。char __user *data
指向目标用户空间缓冲区
size_t count
要读取的字节数
loff_t *ppos
文件句柄位置跟踪指针
int nonblock
模式选择器(1 表示阻塞调用,0 表示非阻塞)
-
size_t vb2_write(struct vb2_queue *q, const char __user *data, size_t count, loff_t *ppos, int nonblock)¶
实现 write() 系统调用逻辑。
参数
struct vb2_queue *q
指向带有 videobuf2 队列的
struct vb2_queue
的指针。const char __user *data
指向目标用户空间缓冲区
size_t count
要写入的字节数
loff_t *ppos
文件句柄位置跟踪指针
int nonblock
模式选择器(1 表示阻塞调用,0 表示非阻塞)
-
vb2_thread_fnc¶
Typedef: 用于 vb2_thread 的回调函数。
语法
int vb2_thread_fnc (struct vb2_buffer *vb, void *priv)
-
int vb2_thread_start(struct vb2_queue *q, vb2_thread_fnc fnc, void *priv, const char *thread_name)¶
为给定队列启动线程。
参数
struct vb2_queue *q
指向带有 videobuf2 队列的
struct vb2_queue
的指针。vb2_thread_fnc fnc
vb2_thread_fnc
回调函数。void *priv
传递给回调函数的 priv 指针。
const char *thread_name
线程的名称。此名称将以 “vb2-” 为前缀。
描述
这将启动一个线程,该线程将排队和出队,直到发生错误或调用 vb2_thread_stop()
。
注意
此函数不应用于 videobuf2-dvb 支持以外的任何用途。如果您认为对此有其他好的用例,请首先联系 linux-media 邮件列表。
参数
struct vb2_queue *q
指向带有 videobuf2 队列的
struct vb2_queue
的指针。
参数
struct vb2_queue *q
指向带有 videobuf2 队列的
struct vb2_queue
的指针。
参数
struct vb2_queue *q
指向带有 videobuf2 队列的
struct vb2_queue
的指针。
描述
如果使用 read() 或 write() 来流式传输数据而不是流 I/O,则此函数返回 true。除了极少数情况外,这几乎不是一个重要的区别。其中一种情况是,不允许使用 read() 或 write() 流式传输使用 V4L2_FIELD_ALTERNATE
的格式,因为无法将每个缓冲区的字段信息传递到用户空间/从用户空间传递。支持此字段格式的驱动程序应在 vb2_ops->queue_setup
操作中检查此情况,如果此函数返回 true,则拒绝它。
参数
struct vb2_queue *q
指向带有 videobuf2 队列的
struct vb2_queue
的指针。
参数
struct vb2_queue *q
指向带有 videobuf2 队列的
struct vb2_queue
的指针。
-
void vb2_set_plane_payload(struct vb2_buffer *vb, unsigned int plane_no, unsigned long size)¶
设置平面 plane_no 的 bytesused。
参数
struct vb2_buffer *vb
指向
struct vb2_buffer
的指针,该平面属于该指针。unsigned int plane_no
应为其设置有效负载的平面号。
unsigned long size
有效负载(以字节为单位)。
-
unsigned long vb2_get_plane_payload(struct vb2_buffer *vb, unsigned int plane_no)¶
获取平面 plane_no 的 bytesused
参数
struct vb2_buffer *vb
指向
struct vb2_buffer
的指针,该平面属于该指针。unsigned int plane_no
应为其设置有效负载的平面号。
-
unsigned long vb2_plane_size(struct vb2_buffer *vb, unsigned int plane_no)¶
返回平面大小(以字节为单位)。
参数
struct vb2_buffer *vb
指向
struct vb2_buffer
的指针,该平面属于该指针。unsigned int plane_no
应返回其大小的平面号。
参数
struct vb2_queue *q
指向带有 videobuf2 队列的
struct vb2_queue
的指针。
参数
struct vb2_queue *q
指向带有 videobuf2 队列的
struct vb2_queue
的指针。
-
struct vb2_buffer *vb2_get_buffer(struct vb2_queue *q, unsigned int index)¶
从队列中获取缓冲区
参数
struct vb2_queue *q
指向带有 videobuf2 队列的
struct vb2_queue
的指针。unsigned int index
缓冲区索引
描述
此函数按索引从队列中获取缓冲区。请记住,此操作不涉及引用计数,因此应考虑缓冲区的生命周期。
-
bool vb2_buffer_in_use(struct vb2_queue *q, struct vb2_buffer *vb)¶
如果缓冲区正在使用中并且无法通过 VIDIOC_REQBUFS(0) 调用释放队列,则返回 true。
参数
struct vb2_queue *q
指向带有 videobuf2 队列的
struct vb2_queue
的指针。struct vb2_buffer *vb
应返回其平面大小的缓冲区。
-
int vb2_verify_memory_type(struct vb2_queue *q, enum vb2_memory memory, unsigned int type)¶
检查传递给缓冲区操作的内存类型和缓冲区类型是否与队列兼容。
参数
struct vb2_queue *q
指向带有 videobuf2 队列的
struct vb2_queue
的指针。enum vb2_memory memory
内存模型,如枚举
vb2_memory
所定义。unsigned int type
私有缓冲区类型,其内容由 vb2-core 调用方定义。例如,对于 V4L2,它应与枚举
v4l2_buf_type
中定义的类型匹配。
-
bool vb2_request_object_is_buffer(struct media_request_object *obj)¶
如果对象是缓冲区,则返回 true
参数
struct media_request_object *obj
请求对象。
-
unsigned int vb2_request_buffer_cnt(struct media_request *req)¶
返回请求中的缓冲区数
参数
struct media_request *req
请求。
-
struct vb2_v4l2_buffer¶
v4l2 的视频缓冲区信息。
定义:
struct vb2_v4l2_buffer {
struct vb2_buffer vb2_buf;
__u32 flags;
__u32 field;
struct v4l2_timecode timecode;
__u32 sequence;
__s32 request_fd;
bool is_held;
struct vb2_plane planes[VB2_MAX_PLANES];
};
成员
vb2_buf
嵌入式结构
vb2_buffer
。flags
缓冲区信息标志。
field
缓冲区中图像的字段顺序,如
enum v4l2_field
所定义。timecode
帧时间码。
sequence
此帧的序列计数。
request_fd
与此缓冲区关联的 request_fd
is_held
如果为 true,则保留此捕获缓冲区
planes
平面信息(userptr/fd、length、bytesused、data_offset)。
描述
应包含足够的信息以覆盖 videodev2.h
中 struct v4l2_buffer
的所有字段。
-
struct vb2_buffer *vb2_find_buffer(struct vb2_queue *q, u64 timestamp)¶
查找具有给定时间戳的缓冲区
参数
struct vb2_queue *q
指向带有 videobuf2 队列的
struct vb2_queue
的指针。u64 timestamp
要查找的时间戳。
描述
返回具有给定 时间戳 的缓冲区,如果未找到,则返回 NULL。
-
int vb2_reqbufs(struct vb2_queue *q, struct v4l2_requestbuffers *req)¶
vb2_core_reqbufs()
的包装器,该包装器还会验证内存和类型值。
参数
struct vb2_queue *q
指向带有 videobuf2 队列的
struct vb2_queue
的指针。struct v4l2_requestbuffers *req
从用户空间传递给驱动程序中
v4l2_ioctl_ops->vidioc_reqbufs
处理程序的struct v4l2_requestbuffers
。
-
int vb2_create_bufs(struct vb2_queue *q, struct v4l2_create_buffers *create)¶
vb2_core_create_bufs()
的包装器,该包装器还会验证内存和类型值。
参数
struct vb2_queue *q
指向带有 videobuf2 队列的
struct vb2_queue
的指针。struct v4l2_create_buffers *create
创建参数,从用户空间传递到驱动程序中的
v4l2_ioctl_ops->vidioc_create_bufs
处理程序
-
int vb2_prepare_buf(struct vb2_queue *q, struct media_device *mdev, struct v4l2_buffer *b)¶
将缓冲区的所有权从用户空间传递到内核
参数
struct vb2_queue *q
指向带有 videobuf2 队列的
struct vb2_queue
的指针。struct media_device *mdev
指向
struct media_device
的指针,可以为 NULL。struct v4l2_buffer *b
从用户空间传递给驱动程序中
v4l2_ioctl_ops->vidioc_prepare_buf
处理程序的缓冲区结构
描述
应从驱动程序的 v4l2_ioctl_ops->vidioc_prepare_buf
ioctl 处理程序中调用。
此函数
验证传递的缓冲区,
调用驱动程序中的
vb2_ops->buf_prepare
回调(如果已提供),可以在其中执行特定于驱动程序的缓冲区初始化。如果 b->request_fd 非零且 mdev->ops->req_queue 已设置,则将准备好的缓冲区绑定到请求。
此函数的返回值旨在直接从驱动程序中的 v4l2_ioctl_ops->vidioc_prepare_buf
处理程序返回。
-
int vb2_qbuf(struct vb2_queue *q, struct media_device *mdev, struct v4l2_buffer *b)¶
从用户空间对缓冲区进行排队
参数
struct vb2_queue *q
指向带有 videobuf2 队列的
struct vb2_queue
的指针。struct media_device *mdev
指向
struct media_device
的指针,可以为 NULL。struct v4l2_buffer *b
从用户空间传递给驱动程序中
v4l2_ioctl_ops->vidioc_qbuf
处理程序的缓冲区结构
描述
应从驱动程序的 v4l2_ioctl_ops->vidioc_qbuf
处理程序中调用。
此函数
验证传递的缓冲区;
如果 b->request_fd 非零且 mdev->ops->req_queue 已设置,则将缓冲区绑定到请求。
如有必要,在驱动程序中调用
vb2_ops->buf_prepare
回调(如果提供),可以在其中执行特定于驱动程序的缓冲区初始化;如果流式传输已打开,则通过
vb2_ops->buf_queue
回调将缓冲区排队到驱动程序中进行处理。
此函数的返回值旨在直接从驱动程序中的 v4l2_ioctl_ops->vidioc_qbuf
处理程序返回。
参数
struct vb2_queue *q
指向带有 videobuf2 队列的
struct vb2_queue
的指针。struct v4l2_exportbuffer *eb
从用户空间传递到驱动程序中
v4l2_ioctl_ops->vidioc_expbuf
处理程序的导出缓冲区结构
描述
此函数的返回值旨在直接从驱动程序中的 v4l2_ioctl_ops->vidioc_expbuf
处理程序返回。
参数
struct vb2_queue *q
指向带有 videobuf2 队列的
struct vb2_queue
的指针。struct v4l2_buffer *b
从用户空间传递到驱动程序中
v4l2_ioctl_ops->vidioc_dqbuf
处理程序的缓冲区结构bool nonblocking
如果为 true,则如果不存在准备好出队的缓冲区,则此调用不会休眠等待缓冲区。通常,驱动程序会在此处传递 (
file->f_flags
&O_NONBLOCK
)
描述
应从驱动程序的 v4l2_ioctl_ops->vidioc_dqbuf
ioctl 处理程序中调用。
此函数
验证传递的缓冲区;
调用驱动程序中的
vb2_ops->buf_finish
回调(如果已提供),驱动程序可以在其中执行将缓冲区返回到用户空间之前可能需要的任何其他操作,例如缓存同步;缓冲区结构成员填充了用户空间的相关信息。
此函数的返回值旨在直接从驱动程序中的 v4l2_ioctl_ops->vidioc_dqbuf
处理程序返回。
参数
struct vb2_queue *q
指向带有 videobuf2 队列的
struct vb2_queue
的指针。enum v4l2_buf_type type
从用户空间传递给 vidioc_streamon 处理程序的类型参数,如
enum v4l2_buf_type
所定义。
描述
应从驱动程序的 v4l2_ioctl_ops->vidioc_streamon
处理程序中调用。
此函数
验证当前状态
将任何先前排队的缓冲区传递给驱动程序并开始流式传输
此函数的返回值旨在直接从驱动程序中的 v4l2_ioctl_ops->vidioc_streamon
处理程序返回。
参数
struct vb2_queue *q
指向带有 videobuf2 队列的
struct vb2_queue
的指针。enum v4l2_buf_type type
从用户空间传递到 vidioc_streamoff 处理程序的类型参数
描述
应该从驱动程序的 vidioc_streamoff 处理程序中调用。
此函数
验证当前状态,
停止流传输并取消队列所有已排队的缓冲区,包括之前传递给驱动程序的缓冲区(在等待驱动程序完成后)。
此调用可用于暂停播放。 此函数的返回值旨在直接从驱动程序中的 vidioc_streamoff 处理程序返回
参数
struct vb2_queue *q
指向带有 videobuf2 队列的
struct vb2_queue
的指针。
描述
vb2_queue 结构应由驱动程序分配。 驱动程序负责清除其内容并在调用此函数之前为某些必需的条目设置初始值。 q->ops、q->mem_ops、q->type 和 q->io_modes 是强制性的。 有关更多信息,请参阅 include/media/videobuf2-core.h 中的 struct vb2_queue
描述。
参数
struct vb2_queue *q
指向带有 videobuf2 队列的
struct vb2_queue
的指针。const char *name
队列名称
描述
此函数初始化 vb2_queue,与 vb2_queue_init()
完全相同,此外还设置队列名称。 队列名称用于日志记录目的,并且应在其所属设备的上下文中唯一地标识该队列。 这对于将内核日志消息归因于 m2m 设备或处理多个队列的其他设备的正确队列非常有用。
参数
struct vb2_queue *q
指向带有 videobuf2 队列的
struct vb2_queue
的指针。
描述
此函数停止流传输并执行必要的清理,包括释放视频缓冲区内存。 驱动程序负责释放 vb2_queue 结构本身。
参数
struct vb2_queue *q
指向带有 videobuf2 队列的
struct vb2_queue
的指针。unsigned int type
要更改的类型 (V4L2_BUF_TYPE_VIDEO_*)
描述
此函数更改 vb2_queue 的类型。 只有当队列不忙时(即未分配缓冲区)才有可能。
vb2_queue_change_type()
可用于支持使用同一队列的多种缓冲区类型。 驱动程序可以实现 v4l2_ioctl_ops.vidioc_reqbufs 和 v4l2_ioctl_ops.vidioc_create_bufs 函数,并在调用 vb2_ioctl_reqbufs() 或 vb2_ioctl_create_bufs() 之前调用 vb2_queue_change_type()
,从而“锁定”缓冲区类型,直到缓冲区被释放。
参数
struct vb2_queue *q
指向带有 videobuf2 队列的
struct vb2_queue
的指针。struct file *file
传递给 poll 文件操作处理程序的文件参数
poll_table *wait
传递给 poll 文件操作处理程序的 wait 参数
描述
此函数为驱动程序实现 poll 文件操作处理程序。对于 CAPTURE 队列,如果缓冲区准备好出队,则会通知用户空间视频设备的文件描述符可用于读取。对于 OUTPUT 队列,如果缓冲区准备好出队,则文件描述符将报告为可用于写入。
如果驱动程序使用 struct v4l2_fh
,则 vb2_poll()
还会检查任何挂起的事件。
此函数的返回值旨在直接从驱动程序中的 poll 处理程序返回。
参数
struct vb2_queue *q
指向带有 videobuf2 队列的
struct vb2_queue
的指针。struct file *file
执行 vb2 队列访问的文件
描述
如果队列有所有者且所有者不是 file,则认为队列繁忙。
队列所有权由下面的一些 v4l2_ioctl_ops 帮助程序获取和检查。 驱动程序也可以直接使用此函数,当他们需要打开代码 ioctl 处理程序时,例如在队列所有权测试和对相应 vb2 操作的调用之间添加额外的检查。
-
void vb2_video_unregister_device(struct video_device *vdev)¶
取消注册视频设备并释放队列
参数
struct video_device *vdev
指向
struct video_device
的指针
描述
如果驱动程序使用 vb2_fop_release()/_vb2_fop_release(),则应使用 vb2_video_unregister_device()
而不是 video_unregister_device()
。
此函数将调用 video_unregister_device()
,然后在流传输正在进行时释放 vb2_queue。 这将停止流传输,并且将简化取消绑定序列,因为在此调用之后,所有子设备也将停止流传输。
-
void vb2_ops_wait_prepare(struct vb2_queue *vq)¶
用于锁定
struct vb2_queue
的辅助函数
-
void vb2_ops_wait_finish(struct vb2_queue *vq)¶
用于解锁
struct vb2_queue
的辅助函数
-
struct vb2_vmarea_handler¶
常见的 vma refcount 跟踪处理程序。
定义:
struct vb2_vmarea_handler {
refcount_t *refcount;
void (*put)(void *arg);
void *arg;
};
成员
refcount
指向缓冲区中
refcount_t
条目的指针。put
回调以执行减少缓冲区 refcount 的函数。
arg
put 回调的参数。