2.21. V4L2 内存到内存功能和数据结构

struct v4l2_m2m_ops

mem-to-mem 设备驱动程序回调

定义:

struct v4l2_m2m_ops {
    void (*device_run)(void *priv);
    int (*job_ready)(void *priv);
    void (*job_abort)(void *priv);
};

成员

device_run

必需。在此回调函数内开始实际的作业(事务)。作业不必在此回调函数返回之前结束(通常情况也确实如此)。当作业结束时,必须调用 v4l2_m2m_job_finish()v4l2_m2m_buf_done_and_job_finish()

job_ready

可选。如果驱动程序尚未完全准备好运行的作业(即,它将无法在不休眠的情况下完成事务),则应返回 0。如果未提供,则假定驱动程序执行一个完整事务只需要一个源缓冲区和一个目标缓冲区。此方法可能不会休眠。

job_abort

可选。通知驱动程序必须尽快中止当前正在运行的事务(即,只要它可以安全地停止设备;例如,在下一个中断处理程序中),即使事务到那时还没有完成。在驱动程序执行必要的步骤后,它必须调用 v4l2_m2m_job_finish()v4l2_m2m_buf_done_and_job_finish(),就像事务正常结束一样。此函数不必(并且通常不会)等待设备进入可以停止的状态。

struct v4l2_m2m_queue_ctx

表示一个准备好被处理的缓冲区队列

定义:

struct v4l2_m2m_queue_ctx {
    struct vb2_queue        q;
    struct list_head        rdy_queue;
    spinlock_t rdy_spinlock;
    u8 num_rdy;
    bool buffered;
};

成员

q

指向 struct vb2_queue 的指针

rdy_queue

V4L2 mem-to-mem 队列列表

rdy_spinlock

自旋锁以保护结构的使用

num_rdy

准备好被处理的缓冲区数量

buffered

队列是否被缓冲?

描述

缓冲区队列准备好在此实例获得对设备的访问权限后立即处理。

struct v4l2_m2m_ctx

内存到内存上下文结构

定义:

struct v4l2_m2m_ctx {
    struct mutex                    *q_lock;
    bool new_frame;
    bool is_draining;
    struct vb2_v4l2_buffer          *last_src_buf;
    bool next_buf_last;
    bool has_stopped;
    bool ignore_cap_streaming;
    struct v4l2_m2m_dev             *m2m_dev;
    struct v4l2_m2m_queue_ctx       cap_q_ctx;
    struct v4l2_m2m_queue_ctx       out_q_ctx;
    struct list_head                queue;
    unsigned long                   job_flags;
    wait_queue_head_t finished;
    void *priv;
};

成员

q_lock

struct mutex

new_frame

在 device_run 回调中有效:如果为 true,则表示这是一个新帧的开始;如果为 false,则表示这是现有帧的新切片。除非设置了 V4L2_BUF_CAP_SUPPORTS_M2M_HOLD_CAPTURE_BUF(表示支持切片),否则始终为 true。

is_draining

表示设备处于耗尽阶段

last_src_buf

指示耗尽的最后一个源缓冲区

next_buf_last

下一个捕获队列缓冲区将被标记为最后一个

has_stopped

表示设备已停止

ignore_cap_streaming

如果为 true,即使 CAPTURE 队列未流式传输,也可以调用 job_ready。这允许固件分析在 OUTPUT 队列上到达的比特流标头。驱动程序必须正确实现 job_ready 回调,以确保满足实际解码的要求。

m2m_dev

指向处理 M2M 上下文的内部数据的不透明指针

cap_q_ctx

捕获(输出到内存)队列上下文

out_q_ctx

输出(从内存输入)队列上下文

queue

内存到内存上下文列表

job_flags

作业队列标志,由 v4l2-mem2mem.c 内部使用:TRANS_QUEUEDTRANS_RUNNINGTRANS_ABORT

finished

等待队列,用于在作业队列完成时发出信号。

priv

实例私有数据

描述

内存到内存上下文特定于文件句柄,而不是例如设备。

struct v4l2_m2m_buffer

内存到内存缓冲区

定义:

struct v4l2_m2m_buffer {
    struct vb2_v4l2_buffer  vb;
    struct list_head        list;
};

成员

vb

指向 struct vb2_v4l2_buffer 的指针

list

m2m 缓冲区列表

void *v4l2_m2m_get_curr_priv(struct v4l2_m2m_dev *m2m_dev)

返回当前正在运行的实例的驱动程序私有数据,如果没有实例正在运行,则返回 NULL

参数

struct v4l2_m2m_dev *m2m_dev

指向处理 M2M 上下文的内部数据的不透明指针

struct vb2_queue *v4l2_m2m_get_vq(struct v4l2_m2m_ctx *m2m_ctx, enum v4l2_buf_type type)

返回给定类型的 vb2_queue

参数

struct v4l2_m2m_ctx *m2m_ctx

分配给 struct v4l2_m2m_ctx 给出的实例的 m2m 上下文

enum v4l2_buf_type type

V4L2 缓冲区的类型,由 enum v4l2_buf_type 定义

void v4l2_m2m_try_schedule(struct v4l2_m2m_ctx *m2m_ctx)

检查实例是否已准备好添加到挂起的作业队列,如果已准备好,则将其添加。

参数

struct v4l2_m2m_ctx *m2m_ctx

分配给 struct v4l2_m2m_ctx 给出的实例的 m2m 上下文

描述

实例必须满足三个基本要求才能运行:1) 必须至少排队一个源缓冲区,2) 必须至少排队一个目标缓冲区,3) 必须启用流式传输。

如果队列被缓冲(例如,必须在 streamoff 之前耗尽的解码器硬件环形缓冲区),则允许在没有该队列上的 v4l2 缓冲区的情况下进行调度。

可能还会有其他自定义要求。在这种情况下,驱动程序应提供自定义回调(v4l2_m2m_ops 中的 job_ready),如果实例已准备好,则应返回 1。上述情况的一个示例可以是需要每个事务多个 src/dst 缓冲区的实例。

void v4l2_m2m_job_finish(struct v4l2_m2m_dev *m2m_dev, struct v4l2_m2m_ctx *m2m_ctx)

通知框架作业已完成并让它清理

参数

struct v4l2_m2m_dev *m2m_dev

指向处理 M2M 上下文的内部数据的不透明指针

struct v4l2_m2m_ctx *m2m_ctx

分配给 struct v4l2_m2m_ctx 给出的实例的 m2m 上下文

描述

驱动程序在完成设备后调用此函数以将设备返回。在达到允许其他实例控制设备的状态后,应尽快调用此函数。

只有在驱动程序上调用了 v4l2_m2m_ops->device_run 回调后,才能调用此函数。为了防止递归,不应直接从 v4l2_m2m_ops->device_run 回调中调用它。

void v4l2_m2m_buf_done_and_job_finish(struct v4l2_m2m_dev *m2m_dev, struct v4l2_m2m_ctx *m2m_ctx, enum vb2_buffer_state state)

返回具有状态的源/目标缓冲区,并通知框架作业已完成并让它清理

参数

struct v4l2_m2m_dev *m2m_dev

指向处理 M2M 上下文的内部数据的不透明指针

struct v4l2_m2m_ctx *m2m_ctx

分配给 struct v4l2_m2m_ctx 给出的实例的 m2m 上下文

enum vb2_buffer_state state

传递给 v4l2_m2m_buf_done() 的 vb2 缓冲区状态。

描述

设置 V4L2_BUF_CAP_SUPPORTS_M2M_HOLD_CAPTURE_BUF 的驱动程序必须使用此函数而不是 job_finish() 来考虑保存的缓冲区。 对于其他驱动程序,它是可选的。

此函数从就绪列表中删除源缓冲区,并以给定状态返回它。 对目标缓冲区执行相同的操作,除非它被标记为“已保存”。 在这种情况下,缓冲区保留在就绪列表中。

之后,作业完成(参见 job_finish())。

这允许使用多个输出缓冲区来填充单个捕获缓冲区。 这通常由无状态解码器使用,其中多个(例如 H.264)切片有助于形成单个解码帧。

void v4l2_m2m_clear_state(struct v4l2_m2m_ctx *m2m_ctx)

清除编码/解码状态

参数

struct v4l2_m2m_ctx *m2m_ctx

分配给 struct v4l2_m2m_ctx 给出的实例的 m2m 上下文

void v4l2_m2m_mark_stopped(struct v4l2_m2m_ctx *m2m_ctx)

将当前编码/解码状态设置为已停止

参数

struct v4l2_m2m_ctx *m2m_ctx

分配给 struct v4l2_m2m_ctx 给出的实例的 m2m 上下文

bool v4l2_m2m_dst_buf_is_last(struct v4l2_m2m_ctx *m2m_ctx)

返回下一个排队的捕获缓冲区的当前编码/解码会话耗尽管理状态

参数

struct v4l2_m2m_ctx *m2m_ctx

分配给 struct v4l2_m2m_ctx 给出的实例的 m2m 上下文

描述

此最后一个捕获缓冲区应使用 V4L2_BUF_FLAG_LAST 标记,以通知捕获会话的结束。

bool v4l2_m2m_has_stopped(struct v4l2_m2m_ctx *m2m_ctx)

返回当前编码/解码会话的停止状态

参数

struct v4l2_m2m_ctx *m2m_ctx

分配给 struct v4l2_m2m_ctx 给出的实例的 m2m 上下文

bool v4l2_m2m_is_last_draining_src_buf(struct v4l2_m2m_ctx *m2m_ctx, struct vb2_v4l2_buffer *vbuf)

返回当前编码/解码会话中的输出缓冲区排空状态

参数

struct v4l2_m2m_ctx *m2m_ctx

分配给 struct v4l2_m2m_ctx 给出的实例的 m2m 上下文

struct vb2_v4l2_buffer *vbuf

指向 v4l2_buffer 结构的指针

描述

这将标识在需要停止会话之前排队的最后一个输出缓冲区,从而导致在处理后编码/解码过程中实际的编码/解码会话停止状态。

void v4l2_m2m_last_buffer_done(struct v4l2_m2m_ctx *m2m_ctx, struct vb2_v4l2_buffer *vbuf)

用 LAST 标志标记缓冲区并完成

参数

struct v4l2_m2m_ctx *m2m_ctx

分配给 struct v4l2_m2m_ctx 给出的实例的 m2m 上下文

struct vb2_v4l2_buffer *vbuf

指向 v4l2_buffer 结构的指针

void v4l2_m2m_suspend(struct v4l2_m2m_dev *m2m_dev)

停止运行新作业并等待当前作业完成

参数

struct v4l2_m2m_dev *m2m_dev

指向处理 M2M 上下文的内部数据的不透明指针

描述

由驱动程序在挂起钩子中调用。停止运行新作业,并等待当前正在运行的作业完成。

void v4l2_m2m_resume(struct v4l2_m2m_dev *m2m_dev)

恢复作业运行并尝试运行排队的作业

参数

struct v4l2_m2m_dev *m2m_dev

指向处理 M2M 上下文的内部数据的不透明指针

描述

由驱动程序在恢复钩子中调用。这将恢复 v4l2_m2m_suspend() 的操作并允许运行作业。如果存在任何排队的作业,也尝试运行它。

int v4l2_m2m_reqbufs(struct file *file, struct v4l2_m2m_ctx *m2m_ctx, struct v4l2_requestbuffers *reqbufs)

多队列感知 REQBUFS 多路复用器

参数

struct file *file

指向 file 结构的指针

struct v4l2_m2m_ctx *m2m_ctx

分配给 struct v4l2_m2m_ctx 给出的实例的 m2m 上下文

struct v4l2_requestbuffers *reqbufs

指向 v4l2_requestbuffers 结构的指针

int v4l2_m2m_querybuf(struct file *file, struct v4l2_m2m_ctx *m2m_ctx, struct v4l2_buffer *buf)

多队列感知 QUERYBUF 多路复用器

参数

struct file *file

指向 file 结构的指针

struct v4l2_m2m_ctx *m2m_ctx

分配给 struct v4l2_m2m_ctx 给出的实例的 m2m 上下文

struct v4l2_buffer *buf

指向 v4l2_buffer 结构的指针

描述

有关详细信息,请参阅 v4l2_m2m_mmap() 文档。

int v4l2_m2m_qbuf(struct file *file, struct v4l2_m2m_ctx *m2m_ctx, struct v4l2_buffer *buf)

根据类型,将源缓冲区或目标缓冲区排队

参数

struct file *file

指向 file 结构的指针

struct v4l2_m2m_ctx *m2m_ctx

分配给 struct v4l2_m2m_ctx 给出的实例的 m2m 上下文

struct v4l2_buffer *buf

指向 v4l2_buffer 结构的指针

int v4l2_m2m_dqbuf(struct file *file, struct v4l2_m2m_ctx *m2m_ctx, struct v4l2_buffer *buf)

根据类型,将源缓冲区或目标缓冲区出队

参数

struct file *file

指向 file 结构的指针

struct v4l2_m2m_ctx *m2m_ctx

分配给 struct v4l2_m2m_ctx 给出的实例的 m2m 上下文

struct v4l2_buffer *buf

指向 v4l2_buffer 结构的指针

int v4l2_m2m_prepare_buf(struct file *file, struct v4l2_m2m_ctx *m2m_ctx, struct v4l2_buffer *buf)

根据类型,准备源缓冲区或目标缓冲区

参数

struct file *file

指向 file 结构的指针

struct v4l2_m2m_ctx *m2m_ctx

分配给 struct v4l2_m2m_ctx 给出的实例的 m2m 上下文

struct v4l2_buffer *buf

指向 v4l2_buffer 结构的指针

int v4l2_m2m_create_bufs(struct file *file, struct v4l2_m2m_ctx *m2m_ctx, struct v4l2_create_buffers *create)

根据类型,创建源缓冲区或目标缓冲区

参数

struct file *file

指向 file 结构的指针

struct v4l2_m2m_ctx *m2m_ctx

分配给 struct v4l2_m2m_ctx 给出的实例的 m2m 上下文

struct v4l2_create_buffers *create

指向 v4l2_create_buffers 结构的指针

int v4l2_m2m_expbuf(struct file *file, struct v4l2_m2m_ctx *m2m_ctx, struct v4l2_exportbuffer *eb)

根据类型,导出源缓冲区或目标缓冲区

参数

struct file *file

指向 file 结构的指针

struct v4l2_m2m_ctx *m2m_ctx

分配给 struct v4l2_m2m_ctx 给出的实例的 m2m 上下文

struct v4l2_exportbuffer *eb

指向 v4l2_exportbuffer 结构的指针

int v4l2_m2m_streamon(struct file *file, struct v4l2_m2m_ctx *m2m_ctx, enum v4l2_buf_type type)

打开视频队列的流

参数

struct file *file

指向 file 结构的指针

struct v4l2_m2m_ctx *m2m_ctx

分配给 struct v4l2_m2m_ctx 给出的实例的 m2m 上下文

enum v4l2_buf_type type

V4L2 缓冲区的类型,由 enum v4l2_buf_type 定义

int v4l2_m2m_streamoff(struct file *file, struct v4l2_m2m_ctx *m2m_ctx, enum v4l2_buf_type type)

关闭视频队列的流

参数

struct file *file

指向 file 结构的指针

struct v4l2_m2m_ctx *m2m_ctx

分配给 struct v4l2_m2m_ctx 给出的实例的 m2m 上下文

enum v4l2_buf_type type

V4L2 缓冲区的类型,由 enum v4l2_buf_type 定义

void v4l2_m2m_update_start_streaming_state(struct v4l2_m2m_ctx *m2m_ctx, struct vb2_queue *q)

当请求启动视频队列的流时,更新编码/解码会话状态

参数

struct v4l2_m2m_ctx *m2m_ctx

分配给 struct v4l2_m2m_ctx 给出的实例的 m2m 上下文

struct vb2_queue *q

queue

void v4l2_m2m_update_stop_streaming_state(struct v4l2_m2m_ctx *m2m_ctx, struct vb2_queue *q)

当请求停止视频队列的流时,更新编码/解码会话状态

参数

struct v4l2_m2m_ctx *m2m_ctx

分配给 struct v4l2_m2m_ctx 给出的实例的 m2m 上下文

struct vb2_queue *q

queue

int v4l2_m2m_encoder_cmd(struct file *file, struct v4l2_m2m_ctx *m2m_ctx, struct v4l2_encoder_cmd *ec)

执行编码器命令

参数

struct file *file

指向 file 结构的指针

struct v4l2_m2m_ctx *m2m_ctx

分配给 struct v4l2_m2m_ctx 给出的实例的 m2m 上下文

struct v4l2_encoder_cmd *ec

指向编码器命令的指针

int v4l2_m2m_decoder_cmd(struct file *file, struct v4l2_m2m_ctx *m2m_ctx, struct v4l2_decoder_cmd *dc)

执行解码器命令

参数

struct file *file

指向 file 结构的指针

struct v4l2_m2m_ctx *m2m_ctx

分配给 struct v4l2_m2m_ctx 给出的实例的 m2m 上下文

struct v4l2_decoder_cmd *dc

指向解码器命令的指针

__poll_t v4l2_m2m_poll(struct file *file, struct v4l2_m2m_ctx *m2m_ctx, struct poll_table_struct *wait)

poll 替换,仅用于目标缓冲区

参数

struct file *file

指向 file 结构的指针

struct v4l2_m2m_ctx *m2m_ctx

分配给 struct v4l2_m2m_ctx 给出的实例的 m2m 上下文

struct poll_table_struct *wait

指向 poll_table_struct 结构的指针

描述

从驱动程序的 poll() 函数调用。将轮询两个队列。如果源队列中有一个缓冲区可以通过 dqbuf 出队,则表明可以执行非阻塞写入,如果目标队列有数据,则将返回可读。

int v4l2_m2m_mmap(struct file *file, struct v4l2_m2m_ctx *m2m_ctx, struct vm_area_struct *vma)

源队列和目标队列感知的 mmap 多路复用器

参数

struct file *file

指向 file 结构的指针

struct v4l2_m2m_ctx *m2m_ctx

分配给 struct v4l2_m2m_ctx 给出的实例的 m2m 上下文

struct vm_area_struct *vma

指向 vm_area_struct 结构的指针

描述

从驱动程序的 mmap() 函数调用。将无缝处理视频缓冲区的两个队列的 mmap(),这将接收正常的每个队列偏移量和正确的 vb2 队列指针。 通过将预定义的偏移量添加到其中一个队列的缓冲区,并在将其传递回 vb2 之前减去它,可以在 vb2 之外进行区分。只有驱动程序(以及因此应用程序)才会收到修改后的偏移量。

struct v4l2_m2m_dev *v4l2_m2m_init(const struct v4l2_m2m_ops *m2m_ops)

初始化每个驱动程序的 m2m 数据

参数

const struct v4l2_m2m_ops *m2m_ops

指向 struct v4l2_m2m_ops 的指针

描述

通常从驱动程序的 probe() 函数调用。

返回值

返回指向内部数据的不透明指针,用于处理 M2M 上下文

void v4l2_m2m_release(struct v4l2_m2m_dev *m2m_dev)

清理并释放 m2m_dev 结构

参数

struct v4l2_m2m_dev *m2m_dev

指向处理 M2M 上下文的内部数据的不透明指针

描述

通常从驱动程序的 remove() 函数调用。

struct v4l2_m2m_ctx *v4l2_m2m_ctx_init(struct v4l2_m2m_dev *m2m_dev, void *drv_priv, int (*queue_init)(void *priv, struct vb2_queue *src_vq, struct vb2_queue *dst_vq))

分配并初始化 m2m 上下文

参数

struct v4l2_m2m_dev *m2m_dev

指向处理 M2M 上下文的内部数据的不透明指针

void *drv_priv

驱动程序的实例私有数据

int (*queue_init)(void *priv, struct vb2_queue *src_vq, struct vb2_queue *dst_vq)

用于初始化 vb2_queues 的队列类型特定初始化函数的回调

描述

通常从驱动程序的 open() 函数调用。

void v4l2_m2m_ctx_release(struct v4l2_m2m_ctx *m2m_ctx)

释放 m2m 上下文

参数

struct v4l2_m2m_ctx *m2m_ctx

分配给 struct v4l2_m2m_ctx 给出的实例的 m2m 上下文

描述

通常从驱动程序的 release() 函数调用。

void v4l2_m2m_buf_queue(struct v4l2_m2m_ctx *m2m_ctx, struct vb2_v4l2_buffer *vbuf)

将缓冲区添加到适当的就绪缓冲区列表。

参数

struct v4l2_m2m_ctx *m2m_ctx

分配给 struct v4l2_m2m_ctx 给出的实例的 m2m 上下文

struct vb2_v4l2_buffer *vbuf

指向 struct vb2_v4l2_buffer 的指针

描述

从 vb2_queue_ops->ops->buf_queue, vb2_queue_ops 回调调用。

unsigned int v4l2_m2m_num_src_bufs_ready(struct v4l2_m2m_ctx *m2m_ctx)

返回可供使用的源缓冲区的数量

参数

struct v4l2_m2m_ctx *m2m_ctx

分配给 struct v4l2_m2m_ctx 给出的实例的 m2m 上下文

unsigned int v4l2_m2m_num_dst_bufs_ready(struct v4l2_m2m_ctx *m2m_ctx)

返回可供使用的目标缓冲区的数量

参数

struct v4l2_m2m_ctx *m2m_ctx

分配给 struct v4l2_m2m_ctx 给出的实例的 m2m 上下文

struct vb2_v4l2_buffer *v4l2_m2m_next_buf(struct v4l2_m2m_queue_ctx *q_ctx)

从就绪缓冲区列表中返回下一个缓冲区

参数

struct v4l2_m2m_queue_ctx *q_ctx

指向 v4l2_m2m_queue_ctx 结构的指针

struct vb2_v4l2_buffer *v4l2_m2m_next_src_buf(struct v4l2_m2m_ctx *m2m_ctx)

从就绪缓冲区列表中返回下一个源缓冲区

参数

struct v4l2_m2m_ctx *m2m_ctx

分配给 struct v4l2_m2m_ctx 给出的实例的 m2m 上下文

struct vb2_v4l2_buffer *v4l2_m2m_next_dst_buf(struct v4l2_m2m_ctx *m2m_ctx)

从就绪缓冲区列表中返回下一个目标缓冲区

参数

struct v4l2_m2m_ctx *m2m_ctx

分配给 struct v4l2_m2m_ctx 给出的实例的 m2m 上下文

struct vb2_v4l2_buffer *v4l2_m2m_last_buf(struct v4l2_m2m_queue_ctx *q_ctx)

从就绪缓冲区列表中返回最后一个缓冲区

参数

struct v4l2_m2m_queue_ctx *q_ctx

指向 v4l2_m2m_queue_ctx 结构的指针

struct vb2_v4l2_buffer *v4l2_m2m_last_src_buf(struct v4l2_m2m_ctx *m2m_ctx)

从就绪缓冲区列表中返回最后一个源缓冲区

参数

struct v4l2_m2m_ctx *m2m_ctx

分配给 struct v4l2_m2m_ctx 给出的实例的 m2m 上下文

struct vb2_v4l2_buffer *v4l2_m2m_last_dst_buf(struct v4l2_m2m_ctx *m2m_ctx)

从就绪缓冲区列表中返回最后一个目标缓冲区

参数

struct v4l2_m2m_ctx *m2m_ctx

分配给 struct v4l2_m2m_ctx 给出的实例的 m2m 上下文

v4l2_m2m_for_each_dst_buf

v4l2_m2m_for_each_dst_buf (m2m_ctx, b)

迭代目标就绪缓冲区的列表

参数

m2m_ctx

分配给 struct v4l2_m2m_ctx 给出的实例的 m2m 上下文

b

类型为 struct v4l2_m2m_buffer 的当前缓冲区

v4l2_m2m_for_each_src_buf

v4l2_m2m_for_each_src_buf (m2m_ctx, b)

迭代源就绪缓冲区的列表

参数

m2m_ctx

分配给 struct v4l2_m2m_ctx 给出的实例的 m2m 上下文

b

类型为 struct v4l2_m2m_buffer 的当前缓冲区

v4l2_m2m_for_each_dst_buf_safe

v4l2_m2m_for_each_dst_buf_safe (m2m_ctx, b, n)

安全地迭代目标就绪缓冲区的列表

参数

m2m_ctx

分配给 struct v4l2_m2m_ctx 给出的实例的 m2m 上下文

b

类型为 struct v4l2_m2m_buffer 的当前缓冲区

n

用作临时存储

v4l2_m2m_for_each_src_buf_safe

v4l2_m2m_for_each_src_buf_safe (m2m_ctx, b, n)

安全地迭代源就绪缓冲区的列表

参数

m2m_ctx

分配给 struct v4l2_m2m_ctx 给出的实例的 m2m 上下文

b

类型为 struct v4l2_m2m_buffer 的当前缓冲区

n

用作临时存储

struct vb2_queue *v4l2_m2m_get_src_vq(struct v4l2_m2m_ctx *m2m_ctx)

返回源缓冲区的 vb2_queue

参数

struct v4l2_m2m_ctx *m2m_ctx

分配给 struct v4l2_m2m_ctx 给出的实例的 m2m 上下文

struct vb2_queue *v4l2_m2m_get_dst_vq(struct v4l2_m2m_ctx *m2m_ctx)

返回目标缓冲区的 vb2_queue

参数

struct v4l2_m2m_ctx *m2m_ctx

分配给 struct v4l2_m2m_ctx 给出的实例的 m2m 上下文

struct vb2_v4l2_buffer *v4l2_m2m_buf_remove(struct v4l2_m2m_queue_ctx *q_ctx)

从就绪缓冲区列表中取出一个缓冲区并返回它

参数

struct v4l2_m2m_queue_ctx *q_ctx

指向 v4l2_m2m_queue_ctx 结构的指针

struct vb2_v4l2_buffer *v4l2_m2m_src_buf_remove(struct v4l2_m2m_ctx *m2m_ctx)

从就绪缓冲区列表中取出一个源缓冲区并返回它

参数

struct v4l2_m2m_ctx *m2m_ctx

分配给 struct v4l2_m2m_ctx 给出的实例的 m2m 上下文

struct vb2_v4l2_buffer *v4l2_m2m_dst_buf_remove(struct v4l2_m2m_ctx *m2m_ctx)

从就绪缓冲区列表中移除一个目标缓冲区并返回它

参数

struct v4l2_m2m_ctx *m2m_ctx

分配给 struct v4l2_m2m_ctx 给出的实例的 m2m 上下文

void v4l2_m2m_buf_remove_by_buf(struct v4l2_m2m_queue_ctx *q_ctx, struct vb2_v4l2_buffer *vbuf)

从就绪缓冲区列表中移除指定的缓冲区

参数

struct v4l2_m2m_queue_ctx *q_ctx

指向 v4l2_m2m_queue_ctx 结构的指针

struct vb2_v4l2_buffer *vbuf

要移除的缓冲区

void v4l2_m2m_src_buf_remove_by_buf(struct v4l2_m2m_ctx *m2m_ctx, struct vb2_v4l2_buffer *vbuf)

从就绪缓冲区列表中移除指定的源缓冲区

参数

struct v4l2_m2m_ctx *m2m_ctx

分配给 struct v4l2_m2m_ctx 给出的实例的 m2m 上下文

struct vb2_v4l2_buffer *vbuf

要移除的缓冲区

void v4l2_m2m_dst_buf_remove_by_buf(struct v4l2_m2m_ctx *m2m_ctx, struct vb2_v4l2_buffer *vbuf)

从就绪缓冲区列表中移除指定的目标缓冲区

参数

struct v4l2_m2m_ctx *m2m_ctx

分配给 struct v4l2_m2m_ctx 给出的实例的 m2m 上下文

struct vb2_v4l2_buffer *vbuf

要移除的缓冲区

void v4l2_m2m_buf_copy_metadata(const struct vb2_v4l2_buffer *out_vb, struct vb2_v4l2_buffer *cap_vb, bool copy_frame_flags)

将缓冲区元数据从输出缓冲区复制到捕获缓冲区

参数

const struct vb2_v4l2_buffer *out_vb

作为元数据来源的输出缓冲区。

struct vb2_v4l2_buffer *cap_vb

将接收元数据的捕获缓冲区。

bool copy_frame_flags

同时复制 KEY/B/PFRAME 标志。

描述

此辅助函数将时间戳、时间码(如果设置了 TIMECODE 缓冲区标志)、场以及 TIMECODE、KEYFRAME、BFRAME、PFRAME 和 TSTAMP_SRC_MASK 标志从 out_vb 复制到 cap_vb

如果 copy_frame_flags 为 false,则不复制 KEYFRAME、BFRAME 和 PFRAME 标志。 对于显式设置此位的编码器,通常需要这样做。