2.21. V4L2 内存到内存功能和数据结构¶
-
struct v4l2_m2m_ops¶
内存到内存设备驱动程序回调
定义:
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 内存到内存队列列表
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_QUEUED
、TRANS_RUNNING
和TRANS_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。上述情况的一个示例可能是需要每次事务处理多个源/目标缓冲区的实例。
-
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 标志标记缓冲区并标记为 DONE
参数
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)¶
轮询替换,仅用于目标缓冲区
参数
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_queue 的特定于队列类型初始化的回调函数
描述
通常从驱动程序的 open()
函数调用。
-
void v4l2_m2m_ctx_release(struct v4l2_m2m_ctx *m2m_ctx)¶
释放 m2m 上下文
-
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 标志。这通常对于显式设置此位的编码器是必需的。