定义了一个辅助类,用于在 V4L2 Element 平面上执行的操作。
这个派生类基于 V4L2 Element 的平面建模。它围绕与平面操作相关的 V4L2 IOCTL 提供了便捷的封装方法,例如 VIDIOC_G_FMT/VIDIOC_S_FMT
、VIDIOC_REQBUFS
、VIDIOC_STREAMON/VIDIOC_STREAMOFF
等。
平面缓冲区类型可以是 V4L2_BUF_TYPE_VIDEO_OUTPUT_MPLANE
(对于输出平面)或 V4L2_BUF_TYPE_VIDEO_CAPTURE_MPLANE
(对于捕获平面)。
平面具有 NvBuffer 对象指针数组,该数组在 reqbuf 调用期间分配和初始化。这些 NvBuffer
对象类似于排队/出队的 v4l2_buffer
结构体。
此类提供了另一个对多线程有用的功能。在调用 startDQThread 时,它会在内部衍生一个线程,该线程无限期运行直到收到停止信号。此线程不断尝试从平面出队一个缓冲区,并在成功出队时调用用户指定的 dqThreadCallback 方法。
定义于文件 NvV4l2ElementPlane.h 的第 104 行。
公共类型 | |
typedef bool(* | dqThreadCallback) (struct v4l2_buffer *v4l2_buf, NvBuffer *buffer, NvBuffer *shared_buffer, void *data) |
这是一个回调函数类型方法,当 DQ 线程成功地从平面出队一个缓冲区时调用。更多... | |
公共成员函数 | |
int | getFormat (struct v4l2_format &format) |
获取平面格式。更多... | |
int | setFormat (struct v4l2_format &format) |
设置平面格式。更多... | |
int | mapOutputBuffers (struct v4l2_buffer &v4l2_buf, int dmabuff_fd) |
将 NvMMBuffer 映射到 V4L2_MEMORY_DMABUF 的 NvBuffer。更多... | |
int | unmapOutputBuffers (int index, int dmabuff_fd) |
取消映射 V4L2_MEMORY_DMABUF 的 NvMMBuffer。更多... | |
int | getCrop (struct v4l2_crop &crop) |
获取平面的裁剪矩形。更多... | |
int | setSelection (uint32_t target, uint32_t flags, struct v4l2_rect &rect) |
设置平面的选择矩形。更多... | |
int | reqbufs (enum v4l2_memory mem_type, uint32_t num) |
请求平面上的缓冲区。更多... | |
int | queryBuffer (uint32_t buf_index) |
查询索引处缓冲区的状态。更多... | |
int | exportBuffer (uint32_t buf_index) |
将缓冲区导出为 DMABUF FD。更多... | |
int | setStreamStatus (bool status) |
启动或停止平面上的流式传输。更多... | |
bool | getStreamStatus () |
检查平面是否正在流式传输。更多... | |
int | setStreamParms (struct v4l2_streamparm &parm) |
设置流式传输参数。更多... | |
int | setupPlane (enum v4l2_memory mem_type, uint32_t num_buffers, bool map, bool allocate) |
辅助方法,封装了设置平面进行流式传输所需的所有方法调用。更多... | |
void | deinitPlane () |
辅助方法,封装了取消初始化平面进行流式传输所需的所有方法调用。更多... | |
enum v4l2_buf_type | getBufType () |
获取此平面的流式传输/缓冲区类型。更多... | |
NvBuffer * | getNthBuffer (uint32_t n) |
获取索引 n 处的 NvBuffer 对象。更多... | |
int | dqBuffer (struct v4l2_buffer &v4l2_buf, NvBuffer **buffer, NvBuffer **shared_buffer, uint32_t num_retries) |
从平面出队一个缓冲区。更多... | |
int | qBuffer (struct v4l2_buffer &v4l2_buf, NvBuffer *shared_buffer) |
在平面上排队一个缓冲区。更多... | |
uint32_t | getNumBuffers () |
获取在平面上分配/请求的缓冲区数量。更多... | |
uint32_t | getNumPlanes () |
获取此平面上当前设置格式的平面缓冲区数量。更多... | |
void | setBufferPlaneFormat (int n_planes, NvBuffer::NvBufferPlaneFormat *planefmts) |
设置用于此平面的缓冲区的平面格式。更多... | |
uint32_t | getNumQueuedBuffers () |
获取当前在平面上排队的缓冲区数量。更多... | |
uint32_t | getTotalDequeuedBuffers () |
获取从平面出队的缓冲区总数。更多... | |
uint32_t | getTotalQueuedBuffers () |
获取在平面上排队的缓冲区总数。更多... | |
int | waitAllBuffersQueued (uint32_t max_wait_ms) |
等待直到平面的所有缓冲区都排队。更多... | |
int | waitAllBuffersDequeued (uint32_t max_wait_ms) |
等待直到平面的所有缓冲区都出队。更多... | |
bool | setDQThreadCallback (dqThreadCallback callback) |
设置 DQ 线程回调方法。更多... | |
int | startDQThread (void *data) |
启动 DQ 线程。更多... | |
int | stopDQThread () |
如果 DQ 线程正在运行,则强制停止它。更多... | |
int | waitForDQThread (uint32_t max_wait_ms) |
等待 DQ 线程停止。更多... | |
数据字段 | |
pthread_mutex_t | plane_lock |
与 plane_cond 一起使用的互斥锁。更多... | |
pthread_cond_t | plane_cond |
平面条件,应用程序可以等待以接收来自 qBuffer/dqBuffer 的通知。更多... | |
友元 | |
class | NvV4l2Element |
typedef bool(* NvV4l2ElementPlane::dqThreadCallback) (struct v4l2_buffer *v4l2_buf, NvBuffer *buffer, NvBuffer *shared_buffer, void *data) |
这是一个回调函数类型方法,当 DQ 线程成功地从平面出队一个缓冲区时调用。
应用程序必须实现此方法,并使用 setDQThreadCallback 设置回调。
将流设置为关闭会自动停止此线程。
v4l2_buf | 指向用于出队的 v4l2_buffer 结构的指针。 |
buffer | 指向 v4l2_buf 中包含的 index 处的 NvBuffer 对象的指针。 |
shared_buffer | 如果平面与其他元素共享缓冲区,则指向 NvBuffer 对象的指针,否则为 NULL。 |
data | 指向应用程序特定数据的指针,该数据通过 startDQThread 设置。 |
定义于文件 NvV4l2ElementPlane.h 的第 422 行。
void NvV4l2ElementPlane::deinitPlane | ( | ) |
int NvV4l2ElementPlane::dqBuffer | ( | struct v4l2_buffer & | v4l2_buf, |
NvBuffer ** | buffer, | ||
NvBuffer ** | shared_buffer, | ||
uint32_t | num_retries | ||
) |
从平面出队一个缓冲区。
这是一个阻塞调用。当成功出队缓冲区或达到超时时,此调用返回。如果 buffer 不为 NULL,则返回由 VIDIOC_DQBUF
IOCTL 返回的索引处的 NvBuffer
对象。如果此平面与其他元素共享缓冲区且 shared_buffer 不为 NULL,则在 shared_buffer 中返回共享的 NvBuffer
对象。
[in] | v4l2_buf | 对要用于出队的 v4l2_buffer 结构的引用。 |
[out] | buffer | 返回指向与出队缓冲区关联的 NvBuffer 对象的指针的指针。可以为 NULL。 |
[out] | shared_buffer | 如果排队的缓冲区与其他元素共享,则返回指向共享 NvBuffer 对象的指针的指针。可以为 NULL。 |
[in] | num_retries | 在返回失败之前尝试出队缓冲区的次数。在非阻塞模式下,这等效于尝试出队缓冲区的毫秒数。 |
int NvV4l2ElementPlane::exportBuffer | ( | uint32_t | buf_index | ) |
将缓冲区导出为 DMABUF FD。
V4L2_MEMORY_MMAP
内存。内部调用 VIDIOC_EXPBUF
IOCTL。填充索引为 buf_in 的 NvBuffer
对象的所有 NvBuffer::NvBufferPlane
成员的 fd 成员。
[in] | buf_index | 指定要导出的缓冲区的索引。 |
|
inline |
int NvV4l2ElementPlane::getCrop | ( | struct v4l2_crop & | crop | ) |
获取平面的裁剪矩形。
内部调用 VIDIOC_G_CROP IOCTL
。
[in] | crop | 对要填充的 v4l2_crop 结构的引用。 |
int NvV4l2ElementPlane::getFormat | ( | struct v4l2_format & | format | ) |
获取平面格式。
内部调用 VIDIOC_G_FMT IOCTL
。
[in,out] | format | 对要填充的 v4l2_format 结构的引用。 |
NvBuffer* NvV4l2ElementPlane::getNthBuffer | ( | uint32_t | n | ) |
获取索引 n 处的 NvBuffer
对象。
NvBuffer
对象,如果 n >= 缓冲区数量,则为 NULL。
|
inline |
|
inline |
|
inline |
bool NvV4l2ElementPlane::getStreamStatus | ( | ) |
检查平面是否正在流式传输。
|
inline |
|
inline |
int NvV4l2ElementPlane::mapOutputBuffers | ( | struct v4l2_buffer & | v4l2_buf, |
int | dmabuff_fd | ||
) |
int NvV4l2ElementPlane::qBuffer | ( | struct v4l2_buffer & | v4l2_buf, |
NvBuffer * | shared_buffer | ||
) |
在平面上排队一个缓冲区。
此方法在内部调用 VIDIOC_QBUF
。如果此平面与其他元素共享缓冲区,则应用程序可以在 shared_buffer 中传递指向共享 NvBuffer 对象的指针。
[in] | v4l2_buf | 对要用于排队的 v4l2_buffer 结构的引用。 |
[in] | shared_buffer | 指向共享 NvBuffer 对象的指针。 |
int NvV4l2ElementPlane::queryBuffer | ( | uint32_t | buf_index | ) |
查询索引处缓冲区的状态。
V4L2_MEMORY_MMAP
内存。内部调用 VIDIOC_QUERYBUF
IOCTL。填充索引为 buf_index 的 NvBuffer
对象的所有 NvBuffer::NvBufferPlane 成员的 length 和 mem_offset 成员。
[in] | buf_index | 指定要查询的缓冲区的索引。 |
int NvV4l2ElementPlane::reqbufs | ( | enum v4l2_memory | mem_type, |
uint32_t | num | ||
) |
请求平面上的缓冲区。
内部调用 VIDIOC_REQBUFS
IOCTL。创建一个 NvBuffer
数组,其长度等于 IOCTL 返回的计数。
[in] | mem_type | 指定要请求的 V4L2 内存类型。 |
[in] | num | 指定要在平面上请求的缓冲区数量。 |
void NvV4l2ElementPlane::setBufferPlaneFormat | ( | int | n_planes, |
NvBuffer::NvBufferPlaneFormat * | planefmts | ||
) |
bool NvV4l2ElementPlane::setDQThreadCallback | ( | dqThreadCallback | callback | ) |
设置 DQ 线程回调方法。
回调方法在成功出队缓冲区后从 DQ 线程调用。
[in] | callback | 成功出队后要调用的方法。 |
int NvV4l2ElementPlane::setFormat | ( | struct v4l2_format & | format | ) |
设置平面格式。
内部调用 VIDIOC_S_FMT IOCTL
。
[in] | format | 对要在平面上设置的 v4l2_format 结构的引用。 |
int NvV4l2ElementPlane::setSelection | ( | uint32_t | target, |
uint32_t | flags, | ||
struct v4l2_rect & | rect | ||
) |
设置平面的选择矩形。
内部调用 VIDIOC_S_SELECTION IOCTL。
[in] | target | 指定矩形选择类型。 |
[in] | flags | 指定控制选择调整的标志。 |
[in] | rect | 对选择矩形的引用。 |
int NvV4l2ElementPlane::setStreamParms | ( | struct v4l2_streamparm & | parm | ) |
设置流式传输参数。
内部调用 VIDIOC_S_PARM
IOCTL。
[in] | parm | 对要在平面上设置的 v4l2_streamparm 结构的引用。 |
int NvV4l2ElementPlane::setStreamStatus | ( | bool | status | ) |
启动或停止平面上的流式传输。
内部调用 VIDIOC_STREAMON/VIDIOC_STREAMOFF
IOCTL。
[in] | status | 必须为 TRUE 才能启动流,为 FALSE 才能停止流。 |
int NvV4l2ElementPlane::setupPlane | ( | enum v4l2_memory | mem_type, |
uint32_t | num_buffers, | ||
bool | map, | ||
bool | allocate | ||
) |
辅助方法,封装了设置平面进行流式传输所需的所有方法调用。
内部调用 reqbuf。然后,对于每个缓冲区,调用 queryBuffer、exportBuffer 并根据内存类型映射缓冲区/分配缓冲区内存。
[in] | mem_type | 要在缓冲区上使用的 V4L2 内存。 |
[in] | num_buffers | 要在平面上请求的缓冲区数量。 |
[in] | map | 布尔值,指示缓冲区是否应映射到内存(仅适用于 V4L2_MEMORY_MMAP)。 |
[in] | allocate | 布尔值,指示是否应分配缓冲区内存(仅适用于 V4L2_MEMORY_USERPTR)。 |
int NvV4l2ElementPlane::startDQThread | ( | void * | data | ) |
启动 DQ 线程。
此方法在内部启动一个线程。在成功从平面出队缓冲区后,调用使用 setDQThreadCallback 设置的 dqThreadCallback 方法。
将流设置为关闭会自动停止线程。
[in] | data | 指向应用程序数据的指针。这在 dqThreadCallback 方法中作为参数提供。 |
int NvV4l2ElementPlane::stopDQThread | ( | ) |
int NvV4l2ElementPlane::unmapOutputBuffers | ( | int | index, |
int | dmabuff_fd | ||
) |
取消映射 V4L2_MEMORY_DMABUF 的 NvMMBuffer。
[in] | index | 对于当前缓冲区索引。 |
[in] | dmabuff_fd | 包含 NvMMBuffer 属性的字段的索引。 |
int NvV4l2ElementPlane::waitAllBuffersDequeued | ( | uint32_t | max_wait_ms | ) |
等待直到平面的所有缓冲区都出队。
这是一个阻塞调用,当所有缓冲区都出队或达到超时时返回。
[in] | max_wait_ms | 最大等待时间,以毫秒为单位 |
int NvV4l2ElementPlane::waitAllBuffersQueued | ( | uint32_t | max_wait_ms | ) |
等待直到平面的所有缓冲区都排队。
这是一个阻塞调用,当所有缓冲区都排队或达到超时时返回。
[in] | max_wait_ms | 最大等待时间,以毫秒为单位。 |
int NvV4l2ElementPlane::waitForDQThread | ( | uint32_t | max_wait_ms | ) |
等待 DQ 线程停止。
此方法等待直到 DQ 线程停止或达到超时。
[in] | max_wait_ms | 最大等待时间,以毫秒为单位。 |
|
friend |
定义于文件 NvV4l2ElementPlane.h 的第 583 行。
pthread_cond_t NvV4l2ElementPlane::plane_cond |
平面条件,应用程序可以等待以接收来自 qBuffer/dqBuffer 的通知。
定义于文件 NvV4l2ElementPlane.h 的第 475 行。
pthread_mutex_t NvV4l2ElementPlane::plane_lock |
与 plane_cond 一起使用的互斥锁。
定义于文件 NvV4l2ElementPlane.h 的第 474 行。