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 方法的内存处理/内存分配器。

注意

  1. USERPTR 类型所需的 op:get_userptr、put_userptr。

  2. MMAP 类型所需的 op:alloc、put、num_users、mmap。

  3. read/write 访问类型所需的 op:alloc、put、num_users、vaddr。

  4. 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 同步,因此驱动程序可以访问/修改缓冲区内容;驱动程序可以执行用户空间访问缓冲区之前所需的任何操作;可选。缓冲区状态可以是以下之一:DONEERROR 在流式传输正在进行时发生,而 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_DONEVB2_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 内存类型/分配器特定的每平面设备

bool vb2_queue_allows_cache_hints(struct vb2_queue *q)

如果队列允许缓存和内存一致性提示,则返回 true。

参数

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。

返回给定平面的分配器特定 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 的缓冲,以将其放回队列中。

void vb2_discard_done(struct vb2_queue *q)

丢弃所有标记为 DONE 的缓冲。

参数

struct vb2_queue *q

指向具有 videobuf2 队列的 struct vb2_queue 的指针。

描述

此函数旨在与挂起/恢复操作一起使用。它会丢弃所有“完成”的缓冲,因为它们在恢复后请求时会太旧。

驱动程序必须停止硬件并与中断处理程序和/或延迟的工作同步,然后才能调用此函数,以确保驱动程序和/或硬件不会触及任何缓冲。

int vb2_wait_for_all_buffers(struct vb2_queue *q)

等待所有缓冲返回到 vb2。

参数

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

此函数

  1. 验证从用户空间传递的流参数;

  2. 设置队列;

  3. 与驱动程序协商在流传输期间使用的缓冲区和每个缓冲区的平面数量;

  4. 根据约定的参数分配内部缓冲区结构(struct vb2_buffer);

  5. 对于 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

此函数

  1. 验证参数的合理性;

  2. 调用 vb2_ops->queue_setup 队列操作;

  3. 执行任何必要的内存分配。

返回值

成功时返回零;否则返回错误代码。

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 回调(如果提供),可以在其中执行特定于驱动程序的缓冲区初始化。

返回值

成功时返回零;否则返回错误代码。

int vb2_core_remove_bufs(struct vb2_queue *q, unsigned int start, unsigned int count)

参数

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

此函数

  1. 如果 req 为非 NULL,则缓冲区将绑定到此媒体请求并返回。当请求本身排队时,缓冲区将被准备并排队到驱动程序(即接下来的两个步骤)。

  2. 如果需要,调用驱动程序中的 vb2_ops->buf_prepare 回调(如果提供),可以在其中执行特定于驱动程序的缓冲区初始化;

  3. 如果流传输开启,则通过 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

此函数

  1. 调用驱动程序中的 buf_finish 回调(如果提供),驱动程序可以在其中执行将缓冲区返回到用户空间之前可能需要的任何其他操作,例如缓存同步。

  2. 缓冲区结构成员填充了与用户空间相关的信息。

返回值

成功时返回零;否则返回错误代码。

int vb2_core_streamon(struct vb2_queue *q, unsigned int type)

实现 VB2 流 ON 逻辑

参数

struct vb2_queue *q

指向具有 videobuf2 队列的 struct vb2_queue 的指针

unsigned int type

要启动的队列的类型。对于 V4L2,这由 enum v4l2_buf_type 类型定义。

描述

Videobuf2 核心辅助函数,用于实现 VIDIOC_STREAMON() 操作。它由 VB2 内部通过 API 特定处理程序调用,例如 videobuf2-v4l2.h

返回值

成功时返回零;否则返回错误代码。

int vb2_core_streamoff(struct vb2_queue *q, unsigned int type)

实现 VB2 流 OFF 逻辑

参数

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

返回值

成功时返回零;否则返回错误代码。

int vb2_core_queue_init(struct vb2_queue *q)

初始化 videobuf2 队列

参数

struct vb2_queue *q

指向具有 videobuf2 队列的 struct vb2_queue 的指针。此结构应在驱动程序中分配

描述

vb2_queue 结构应由驱动程序分配。驱动程序负责清除其内容,并在调用此函数之前为某些必需的条目设置初始值。

注意

在调用此函数之前,应设置 q 中的以下字段:vb2_queue->opsvb2_queue->mem_opsvb2_queue->type

void vb2_core_queue_release(struct vb2_queue *q)

停止流式传输,释放队列并释放内存

参数

struct vb2_queue *q

指向具有 videobuf2 队列的 struct vb2_queue 的指针。

描述

此函数停止流式传输并执行必要的清理工作,包括释放视频缓冲区内存。驱动程序负责释放 struct vb2_queue 本身。

void vb2_queue_error(struct vb2_queue *q)

在队列上发出致命错误信号

参数

struct vb2_queue *q

指向具有 videobuf2 队列的 struct vb2_queue 的指针。

描述

标记发生了无法恢复的致命错误,并唤醒所有等待队列的进程。轮询现在将设置 EPOLLERR,排队和出队缓冲区将返回 -EIO

当从 vb2_streamoff()vb2_queue_release() 取消队列时,将清除错误标志。因此,驱动程序不应在启动流之前调用此函数,否则错误标志将保持设置状态,直到在关闭设备节点时释放队列。

int vb2_mmap(struct vb2_queue *q, struct vm_area_struct *vma)

将视频缓冲区映射到应用程序地址空间。

参数

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)

参数

struct vb2_buffer *vb

指向结构体 vb2_buffer 的指针。

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 邮件列表。

int vb2_thread_stop(struct vb2_queue *q)

停止给定队列的线程。

参数

struct vb2_queue *q

指向具有 videobuf2 队列的 struct vb2_queue 的指针。

bool vb2_is_streaming(struct vb2_queue *q)

返回队列的流式状态。

参数

struct vb2_queue *q

指向具有 videobuf2 队列的 struct vb2_queue 的指针。

bool vb2_fileio_is_active(struct vb2_queue *q)

如果 fileio 处于活动状态,则返回 true。

参数

struct vb2_queue *q

指向具有 videobuf2 队列的 struct vb2_queue 的指针。

描述

如果使用 read() 或 write() 来流式传输数据而不是流式 I/O,则返回 true。这几乎不是一个重要的区别,除非在极少数情况下。一个这样的例子是,不允许使用 read() 或 write() 流式传输使用 V4L2_FIELD_ALTERNATE 的格式,因为没有办法将每个缓冲区的字段信息传递给/从用户空间传递。支持此字段格式的驱动程序应在 vb2_ops->queue_setup 操作中检查此项,如果此函数返回 true,则拒绝该操作。

unsigned int vb2_get_num_buffers(struct vb2_queue *q)

获取队列中缓冲区的数量

参数

struct vb2_queue *q

指向具有 videobuf2 队列的 struct vb2_queue 的指针。

bool vb2_is_busy(struct vb2_queue *q)

返回队列的繁忙状态。

参数

struct vb2_queue *q

指向具有 videobuf2 队列的 struct vb2_queue 的指针。

描述

此函数检查队列是否已分配任何缓冲区。

void *vb2_get_drv_priv(struct vb2_queue *q)

返回与队列关联的驱动程序私有数据。

参数

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

需要返回大小的平面编号。

bool vb2_start_streaming_called(struct vb2_queue *q)

返回驱动程序的流状态。

参数

struct vb2_queue *q

指向具有 videobuf2 队列的 struct vb2_queue 的指针。

void vb2_clear_last_buffer_dequeued(struct vb2_queue *q)

清除队列的最后一个出队缓冲区标志。

参数

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 处理程序中调用。

此函数

  1. 验证传递的缓冲区,

  2. 调用驱动程序中的 vb2_ops->buf_prepare 回调(如果提供),可以在其中执行特定于驱动程序的缓冲区初始化。

  3. 如果 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 处理程序中调用。

此函数

  1. 验证传递的缓冲区;

  2. 如果 b->request_fd 非零且 mdev->ops->req_queue 已设置,则将缓冲区绑定到请求。

  3. 如果需要,调用驱动程序中的 vb2_ops->buf_prepare 回调(如果提供),可以在其中执行特定于驱动程序的缓冲区初始化;

  4. 如果流传输开启,则通过 vb2_ops->buf_queue 回调将缓冲区排队到驱动程序以进行处理。

此函数的返回值旨在直接从驱动程序中的 v4l2_ioctl_ops->vidioc_qbuf 处理程序返回。

int vb2_expbuf(struct vb2_queue *q, struct v4l2_exportbuffer *eb)

将缓冲区导出为文件描述符

参数

struct vb2_queue *q

指向具有 videobuf2 队列的 struct vb2_queue 的指针。

struct v4l2_exportbuffer *eb

从用户空间传递到驱动程序中的 v4l2_ioctl_ops->vidioc_expbuf 处理程序的导出缓冲区结构。

描述

此函数的返回值旨在直接从驱动程序中的 v4l2_ioctl_ops->vidioc_expbuf 处理程序返回。

int vb2_dqbuf(struct vb2_queue *q, struct v4l2_buffer *b, bool nonblocking)

将缓冲区出队到用户空间。

参数

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 处理程序中调用。

此函数

  1. 验证传递的缓冲区;

  2. 调用驱动程序中的 vb2_ops->buf_finish 回调(如果提供),驱动程序可以在其中执行将缓冲区返回给用户空间之前可能需要的任何其他操作,例如缓存同步;

  3. 缓冲区结构成员填充了与用户空间相关的信息。

此函数的返回值旨在直接从驱动程序中的 v4l2_ioctl_ops->vidioc_dqbuf 处理程序返回。

int vb2_streamon(struct vb2_queue *q, enum v4l2_buf_type type)

开始流式传输

参数

struct vb2_queue *q

指向具有 videobuf2 队列的 struct vb2_queue 的指针。

enum v4l2_buf_type type

从用户空间传递到 vidioc_streamon 处理程序的类型参数,由 enum v4l2_buf_type 定义。

描述

应该从驱动程序的 v4l2_ioctl_ops->vidioc_streamon 处理程序中调用。

此函数

  1. 验证当前状态

  2. 将任何先前排队的缓冲区传递给驱动程序并开始流式传输

此函数的返回值旨在直接从驱动程序中的 v4l2_ioctl_ops->vidioc_streamon 处理程序返回。

int vb2_streamoff(struct vb2_queue *q, enum v4l2_buf_type type)

停止流式传输

参数

struct vb2_queue *q

指向具有 videobuf2 队列的 struct vb2_queue 的指针。

enum v4l2_buf_type type

从用户空间传递到 vidioc_streamoff 处理程序的类型参数

描述

应该从驱动程序的 vidioc_streamoff 处理程序中调用。

此函数

  1. 验证当前状态,

  2. 停止流式传输并使任何排队的缓冲区出队,包括先前传递给驱动程序的缓冲区(在等待驱动程序完成之后)。

此调用可用于暂停播放。此函数的返回值旨在直接从驱动程序中的 vidioc_streamoff 处理程序返回

int vb2_queue_init(struct vb2_queue *q)

初始化 videobuf2 队列

参数

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 描述。

int vb2_queue_init_name(struct vb2_queue *q, const char *name)

使用名称初始化 videobuf2 队列

参数

struct vb2_queue *q

指向具有 videobuf2 队列的 struct vb2_queue 的指针。

const char *name

队列名称

描述

此函数初始化 vb2_queue 的方式与 vb2_queue_init() 完全相同,此外还设置了队列名称。队列名称用于日志记录,并且应在其所属设备的上下文中唯一标识该队列。这对于将内核日志消息归因于 m2m 设备或处理多个队列的其他设备的正确队列非常有用。

void vb2_queue_release(struct vb2_queue *q)

停止流式传输,释放队列并释放内存

参数

struct vb2_queue *q

指向具有 videobuf2 队列的 struct vb2_queue 的指针。

描述

此函数停止流式传输并执行必要的清理工作,包括释放视频缓冲区内存。驱动程序负责释放 vb2_queue 结构本身。

int vb2_queue_change_type(struct vb2_queue *q, unsigned int type)

更改非活动 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(),从而“锁定”缓冲区类型,直到缓冲区被释放。

__poll_t vb2_poll(struct vb2_queue *q, struct file *file, poll_table *wait)

实现轮询用户空间操作

参数

struct vb2_queue *q

指向具有 videobuf2 队列的 struct vb2_queue 的指针。

struct file *file

传递给轮询文件操作处理程序的文件参数

poll_table *wait

传递给轮询文件操作处理程序的等待参数

描述

此函数为驱动程序实现 poll 文件操作处理程序。对于 CAPTURE 队列,如果缓冲区已准备好出队,则会通知用户空间视频设备的 文件描述符可用于读取。对于 OUTPUT 队列,如果缓冲区已准备好出队,则会报告文件描述符可用于写入。

如果驱动程序使用 struct v4l2_fh,则 vb2_poll() 也会检查是否有任何挂起的事件。

此函数的返回值旨在直接从驱动程序中的 poll 处理程序返回。

bool vb2_queue_is_busy(struct vb2_queue *q, struct file *file)

检查队列是否繁忙

参数

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)

用于锁定结构体 vb2_queue 的辅助函数

参数

struct vb2_queue *vq

指向 struct vb2_queue 的指针

描述

..note:: 仅当 vq->lock 为非 NULL 时才使用。

void vb2_ops_wait_finish(struct vb2_queue *vq)

用于解锁结构体 vb2_queue 的辅助函数

参数

struct vb2_queue *vq

指向 struct vb2_queue 的指针

描述

..note:: 仅当 vq->lock 为非 NULL 时才使用。

struct vb2_vmarea_handler

通用 vma 引用计数跟踪处理程序。

定义:

struct vb2_vmarea_handler {
    refcount_t *refcount;
    void (*put)(void *arg);
    void *arg;
};

成员

引用计数

指向缓冲区中 refcount_t 条目的指针。

put

用于减少缓冲区引用计数的函数的回调。

参数

put 回调的参数。