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 类型的必需操作:get_userptr、put_userptr。

  2. MMAP 类型的必需操作:alloc、put、num_users、mmap。

  3. 读/写访问类型的必需操作:alloc、put、num_users、vaddr。

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

bool vb2_queue_allows_cache_hints(struct vb2_queue *q)

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

参数

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。

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

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

指向 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

此函数

  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

指向 struct 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

指向 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

此函数

  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

指向 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

此函数

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

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

返回

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

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

实现 VB2 流开启逻辑

参数

struct vb2_queue *q

指向 struct vb2_queue 的指针,其中包含 videobuf2 队列

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 流关闭逻辑

参数

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

返回

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

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

内存标志。

描述

此函数用于 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)

参数

struct vb2_buffer *vb

指向 struct 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、length、bytesused、data_offset)。

描述

应包含足够的信息以覆盖 videodev2.hstruct 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 处理程序中调用。

此函数

  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)

实现 poll 用户空间操作

参数

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 处理程序返回。

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)

用于锁定 struct vb2_queue 的辅助函数

参数

struct vb2_queue *vq

指向 struct vb2_queue 的指针

描述

..note:: 仅在 vq->lock 非 NULL 时使用。

void vb2_ops_wait_finish(struct vb2_queue *vq)

用于解锁 struct vb2_queue 的辅助函数

参数

struct vb2_queue *vq

指向 struct vb2_queue 的指针

描述

..note:: 仅在 vq->lock 非 NULL 时使用。

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 回调的参数。