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_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。上述情况的一个示例可以是需要每个事务多个 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 上下文
-
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 标志。 对于显式设置此位的编码器,通常需要这样做。