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_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。上述情况的一个示例可能是需要每次事务处理多个源/目标缓冲区的实例。

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 上下文

参数

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 标志。这通常对于显式设置此位的编码器是必需的。