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 类型所需的 op:get_userptr、put_userptr。
MMAP 类型所需的 op:alloc、put、num_users、mmap。
read/write 访问类型所需的 op:alloc、put、num_users、vaddr。
DMABUF 类型所需的 op: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
具有 memtype 特定数据的联合。
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
在流式传输正在进行时发生,而PREPARED
状态发生在队列已被取消并且所有挂起的缓冲区都返回到其默认的DEQUEUED
状态时。通常,只有在状态为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 事务或等待它们完成,并通过使用
buf_queue
回调调用vb2_buffer_done()
并使用VB2_BUF_STATE_DONE
或VB2_BUF_STATE_ERROR
返回从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
当未调用 QBUF 时,在轮询时返回
EPOLLERR
。这是一个 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 *不会*修改请求的缓冲计数,并且不使用此字段。如果硬件要有效地工作,则驱动程序可以设置此值,以便必须有一定数量的缓冲可用。这允许以 1 的缓冲计数调用 VIDIOC_REQBUFS,并且它将自动调整为可工作的缓冲计数。如果设置,则 min_reqbufs_allocation 必须大于 min_queued_buffers + 1。如果此字段 > 3,则强烈建议驱动程序实现 V4L2_CID_MIN_BUFFERS_FOR_CAPTURE/OUTPUT 控制。
alloc_devs
struct device
内存类型/分配器特定的每平面设备
参数
struct vb2_queue *q
指向具有 videobuf2 队列的
struct vb2_queue
的指针
-
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
。
描述
在对缓冲区的硬件操作完成后,驱动程序应调用此函数,并且可以将该缓冲返回到用户空间。在通过 videobuf 通过 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
指向结构体
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
指向结构体
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
指向结构体
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
指向具有 videobuf2 队列的
struct vb2_queue
的指针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
指向具有 videobuf2 队列的
struct vb2_queue
的指针unsigned int type
要启动的队列的类型。对于 V4L2,这由
enum v4l2_buf_type
类型定义。
描述
Videobuf2 核心辅助函数,用于实现 VIDIOC_STREAMON() 操作。它由 VB2 内部通过 API 特定处理程序调用,例如 videobuf2-v4l2.h
。
返回值
成功时返回零;否则返回错误代码。
参数
struct vb2_queue *q
指向具有 videobuf2 队列的
struct vb2_queue
的指针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
指向结构体
vb2_buffer
的指针。unsigned int plane
要导出的平面的索引,对于单平面队列为 0
unsigned int flags
新创建的文件的文件标志,如 include/uapi/asm-generic/fcntl.h 中定义。目前,唯一使用的标志是
O_CLOEXEC
。支持此标志,有关详细信息,请参阅 open 系统调用的手册。
描述
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
内存标志。
描述
此函数在无MMU平台中使用,用于为给定的缓冲区提出地址映射。它旨在用作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 文件操作处理程序的
poll_table
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、长度、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
要查找的时间戳。
描述
返回具有给定 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_table *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。这将停止流式传输,并且这将简化取消绑定序列,因为在此调用之后,所有子设备也将停止流式传输。
-
struct vb2_vmarea_handler¶
通用 vma 引用计数跟踪处理程序。
定义:
struct vb2_vmarea_handler {
refcount_t *refcount;
void (*put)(void *arg);
void *arg;
};
成员
引用计数
指向缓冲区中
refcount_t
条目的指针。put
用于减少缓冲区引用计数的函数的回调。
参数
put 回调的参数。