2D 图像的抽象表示。 更多...
数据结构 | |
结构体 | VPIImagePlanePitchLinear |
表示以倾斜线性布局的一个图像平面。 更多... | |
结构体 | VPIImageBufferPitchLinear |
存储图像平面内容。 更多... | |
联合体 | VPIImageBuffer |
表示访问图像内容的可用方法。 更多... | |
结构体 | VPIImageData |
存储关于图像特性和内容的信息。 更多... | |
结构体 | VPIImageWrapperParams |
用于自定义图像包装的参数。 更多... | |
宏 | |
#define | VPI_MAX_PLANE_COUNT (6) |
图像可以拥有的最大数据平面数。 | |
类型定义 | |
typedef struct VPIImageImpl * | VPIImage |
图像的句柄。 | |
枚举 | |
枚举 | VPIImageBufferType |
表示图像数据的存储方式。 更多... | |
2D 图像的抽象表示。
使用 API 创建 2D 图像容器有两种方法。最基本的方法是使用 vpiImageCreate 来分配和初始化一个空的(清零的) VPIImage 对象。图像数据的内存由 VPI 分配和管理。宽度、高度和像素类型等参数是不可变的,并在构造时指定。内部内存布局也是后端特定的。更重要的是,不同硬件后端之间高效的图像数据交换可能会迫使实现将内存分配到多个内存池中(例如,dGPU 和系统 DRAM)。在某些情况下(为了优化性能和内存使用),限制内部分配策略以仅支持特定的后端集可能是有益的。
为了能够与现有的内存缓冲区互操作,用户还可以使用 vpiImageCreateWrapper 创建一个图像对象,该对象包装用户分配(和管理)的图像数据。与 vpiImageCreate 类似,传递给它的图像参数是固定的。
只要新的包装内存具有与最初包装的内存相同的容量和类型,就可以通过调用 vpiImageSetWrapper (对应于使用的图像包装器创建函数)来重新定义包装内存。 一次创建 VPIImage 包装器并在以后重用它,比一直创建和销毁它更有效。
通过 vpiImageLockData / vpiImageUnlock 组合,用户可以从主机读取/写入图像数据。这些函数是非阻塞的,并且忽略流命令队列,因此用户有责任确保使用此图像作为输入或输出的所有挂起操作都已完成。此外,根据内存分配在哪个设备上,锁定/解锁操作可能非常耗时,例如,对于 dGPU,可能涉及通过 PCIe 总线复制数据。
struct VPIImagePlanePitchLinear |
数据字段 | ||
---|---|---|
VPIPixelType | pixelType | 此平面内每个像素的类型。 如果它是 VPI_PIXEL_TYPE_INVALID,它将从 VPIImageBufferPitchLinear::format 推断。 |
int32_t | width | 此平面的宽度(以像素为单位)。
|
int32_t | height | 此平面的高度(以像素为单位)。
|
int32_t | pitchBytes | 一行开始与前一行开始之间的字节差。 这用于寻址平面中的每一行(以及最终的每个像素)。 其中 T 是与 pixelType 相关的 C 类型。
|
void * | data | 指向此平面第一行的指针。 这指向此平面表示的实际数据。根据平面的使用方式,指针可能指向 GPU 内存或主机内存。需要注意何时允许解引用此内存。 |
struct VPIImageBufferPitchLinear |
数据字段 | ||
---|---|---|
VPIImageFormat | format | 图像格式。 |
int32_t | numPlanes | 平面数量。
|
VPIImagePlanePitchLinear | planes[VPI_MAX_PLANE_COUNT] | 以倾斜线性布局的所有图像平面的数据。
|
union VPIImageBuffer |
数据字段 | ||
---|---|---|
VPIImageBufferPitchLinear | pitch | 以倾斜线性布局存储的图像。 当 VPIImageData::bufferType 为以下类型时使用 |
cudaArray_t | cudaarray | 存储在 cudaArray_t 中的图像。当 VPIImageData::bufferType 为以下类型时使用 |
EGLImageKHR | egl | 作为 EGLImageKHR 存储的图像。 当 VPIImageData::bufferType 为以下类型时使用 |
int | fd | 作为 NvBuffer 文件描述符存储的图像。 当 VPIImageData::bufferType 为以下类型时使用 |
struct VPIImageData |
数据字段 | ||
---|---|---|
VPIImageBufferType | bufferType | 图像缓冲区类型。 它定义了必须使用 VPIImageBuffer 标记联合体的哪个成员来访问图像内容。 |
VPIImageBuffer | buffer | 存储图像内容。 |
struct VPIImageWrapperParams |
用于自定义图像包装的参数。
这些参数用于自定义图像包装的制作方式。在更新其属性之前,请务必调用 vpiInitImageWrapperParams 来初始化此结构。这保证了未来版本中添加的新属性将被分配合适的默认值。
数据字段 | ||
---|---|---|
VPIColorSpec | colorSpec | 颜色规范,用于覆盖由 VPIImageData 包装器定义的颜色规范。 如果设置为 VPI_COLOR_SPEC_DEFAULT,则从 VPIImageData 推断颜色规范,即不进行覆盖。 |
enum VPIImageBufferType |
#include <vpi/Image.h>
表示图像数据的存储方式。
枚举器 | |
---|---|
VPI_IMAGE_BUFFER_INVALID | 无效的缓冲区类型。 这通常用于告知未选择缓冲区类型。 |
VPI_IMAGE_BUFFER_HOST_PITCH_LINEAR | 主机可访问,平面采用倾斜线性内存布局。 |
VPI_IMAGE_BUFFER_CUDA_PITCH_LINEAR | CUDA 可访问,平面采用倾斜线性内存布局。 |
VPI_IMAGE_BUFFER_CUDA_ARRAY | 缓冲区存储在 cudaArray_t 中。 请查阅 cudaArray_t 以获取更多信息。 |
VPI_IMAGE_BUFFER_EGLIMAGE | EGLImage。 请查阅 EGLImageKHR 以获取更多信息。 |
VPI_IMAGE_BUFFER_NVBUFFER | NvBuffer。 请查阅 NvBuffer 以获取更多信息。
|
VPIStatus vpiImageCreate | ( | int32_t | width, |
int32_t | height, | ||
VPIImageFormat | fmt, | ||
uint64_t | flags, | ||
VPIImage * | img | ||
) |
#include <vpi/Image.h>
使用指定的标志创建空的图像实例。
图像数据已清零。
以下标志会影响已分配图像的行为
[输入] | width,height | 创建的图像的尺寸。
|
[输入] | fmt | 创建的图像的格式。
|
[输入] | flags | 位字段,指定图像所需的特性。
|
[输出] | img | 指向将接收创建的图像句柄的内存的指针。 |
VPI_ERROR_INVALID_ARGUMENT | 输出 img 句柄为 NULL。 |
VPI_ERROR_INVALID_ARGUMENT | width 或 height 超出有效范围。 |
VPI_ERROR_INVALID_ARGUMENT | fmt 无效或不受支持。 |
VPI_ERROR_INVALID_ARGUMENT | flags 无效。 |
VPI_ERROR_INVALID_ARGUMENT | 未给出后端,并且设置了 VPI_REQUIRE_BACKENDS。 |
VPI_ERROR_OUT_OF_MEMORY | 没有足够的资源来分配图像。 |
VPI_ERROR_INVALID_CONTEXT | 当前上下文已销毁。 |
VPI_ERROR_INVALID_OPERATION | 某些请求的后端在当前上下文中未启用。 |
VPI_ERROR_INVALID_OPERATION | 某些请求的后端无法使用给定的图像参数创建。 |
VPI_SUCCESS | 操作成功执行。 |
VPIStatus vpiInitImageWrapperParams | ( | VPIImageWrapperParams * | params | ) |
#include <vpi/Image.h>
使用默认值初始化 VPIImageWrapperParams。
默认值是
[输入] | params | 要使用默认值初始化的结构。
|
VPI_ERROR_INVALID_ARGUMENT | params 为 NULL。 |
VPI_SUCCESS | 操作成功执行。 |
VPIStatus vpiImageCreateView | ( | VPIImage | imgParent, |
const VPIRectangleI * | clipBounds, | ||
uint64_t | flags, | ||
VPIImage * | imgView | ||
) |
#include <vpi/Image.h>
创建图像,该图像包装现有图像的轴对齐矩形子区域。
创建图像实例,该实例是具有特定位置 (x, y)、尺寸 (width, height) 和标志的输入图像的视图。生成的图像与输入图像共享底层数据,即在创建视图时不会涉及复制。与创建围绕外部缓冲区的图像实例类似,生成的图像视图实例不拥有数据。从另一个图像视图实例创建视图是合法的。
[输入] | imgParent | 输入父图像的句柄。
|
[输入] | clipBounds | 定义创建的图像视图的剪辑边界的矩形。
|
[输入] | flags | 具有创建的图像视图特性的标志。
|
[输出] | imgView | 指向将接收创建的图像视图句柄的内存的指针。
|
VPI_ERROR_INVALID_OPERATION | 无法使用给定的 imgParent 创建 imgView 。 |
VPI_ERROR_INVALID_OPERATION | imgParent 和 flags 中的后端不兼容。 |
VPI_ERROR_INVALID_ARGUMENT | 输入父图像 imgParent 为 NULL。 |
VPI_ERROR_INVALID_ARGUMENT | imgParent 没有后端。 |
VPI_ERROR_INVALID_ARGUMENT | output 句柄为 NULL。 |
VPI_ERROR_INVALID_ARGUMENT | clipBounds 为 NULL 或超出有效范围。 |
VPI_ERROR_INVALID_ARGUMENT | flags 无效。 |
VPI_ERROR_NOT_IMPLEMENTED | 对于给定的输入父图像,未实现图像视图。 |
VPI_ERROR_INVALID_CONTEXT | imgParent 和 imgView 上下文不同。 |
VPI_ERROR_INVALID_CONTEXT | 当前上下文已销毁。 |
VPI_SUCCESS | 操作成功执行。 |
VPIStatus vpiImageSetView | ( | VPIImage | view, |
VPIImage | parent, | ||
const VPIRectangleI * | clipBounds | ||
) |
#include <vpi/Image.h>
重新定义父图像内的图像视图位置。
此操作高效且不分配内存。视图内存将可用于在视图创建期间指定的相同后端。父图像可以是视图的原始父图像或新父图像。
[输入] | view | 图像视图的句柄。
|
[输入] | parent | 潜在的新输入父图像的句柄。
|
[输入] | clipBounds | 定义重新定义的图像视图的剪辑边界的矩形。
|
VPI_ERROR_INVALID_ARGUMENT | 输入 view 为 NULL。 |
VPI_ERROR_INVALID_ARGUMENT | 输入 parent 为 NULL。 |
VPI_ERROR_INVALID_ARGUMENT | clipBounds 为 NULL。 |
VPI_ERROR_INVALID_ARGUMENT | clipBounds 超出有效范围。 |
VPI_ERROR_INVALID_ARGUMENT | clipBounds 的大小与图像视图不同。 |
VPI_ERROR_INVALID_ARGUMENT | parent 图像格式与 view 图像格式不匹配。 |
VPI_ERROR_INVALID_ARGUMENT | parent 没有后端。 |
VPI_ERROR_INVALID_OPERATION | view 不是使用 vpiImageCreateView 创建的。 |
VPI_ERROR_INVALID_OPERATION | 无法使用给定的 parent 重新定义 view 。 |
VPI_SUCCESS | 操作成功执行。 |
VPIStatus vpiImageCreateWrapper | ( | const VPIImageData * | data, |
const VPIImageWrapperParams * | params, | ||
uint64_t | flags, | ||
VPIImage * | img | ||
) |
#include <vpi/Image.h>
通过包装现有的内存块来创建图像对象。
底层图像对象不拥有/声明内存块。
[输入] | data | 指向具有要包装的内存的结构的指针。
| ||||||
[输入] | params | 如果不是 NULL,请使用参数修改 data 的包装方式。否则,它将使用 vpiInitImageWrapperParams 给出的默认值。 | ||||||
[输入] | flags | 位字段,指定图像所需的特性。根据某些缓冲区类型,以下标志将自动添加
|
[输出] | img | 指向将接收创建的图像句柄的内存的指针。 |
VPI_ERROR_INVALID_ARGUMENT | img 为 NULL。 |
VPI_ERROR_INVALID_ARGUMENT | data 为 NULL 或包含无效/不受支持的值。 |
VPI_ERROR_INVALID_ARGUMENT | data 中的缓冲区类型不受支持。 |
VPI_ERROR_INVALID_ARGUMENT | EGLImage 句柄为 NULL 或无效(例如 EGL_NO_IMAGE)。 |
VPI_ERROR_INVALID_ARGUMENT | NvBuffer 文件描述符无效。 |
VPI_ERROR_INVALID_ARGUMENT | 未给出后端,并且设置了 VPI_REQUIRE_BACKENDS。 |
VPI_ERROR_OUT_OF_MEMORY | 没有足够的资源来创建图像。 |
VPI_ERROR_INTERNAL | 包装 EGLImage 时无法检索默认 EGLDisplay,或某些未指定的内部错误。 |
VPI_ERROR_INVALID_CONTEXT | 当前上下文已销毁。 |
VPI_ERROR_INVALID_OPERATION | 请求的后端在当前上下文中未启用。 |
VPI_ERROR_INVALID_OPERATION | 无法使用给定的图像参数创建请求的后端。 |
VPI_SUCCESS | 操作成功执行。 |
VPIStatus vpiImageSetWrapper | ( | VPIImage | img, |
const VPIImageData * | data | ||
) |
#include <vpi/Image.h>
重新定义现有 VPIImage 包装器中的包装内存。
此操作高效且不分配内存。包装的内存将可用于在包装器创建期间指定的相同后端。
包装的内存在其仍在包装时不得被释放。
[输入] | img | 图像的句柄。
|
[输入] | data | 指向具有要包装的内存缓冲区的结构的指针。
|
VPI_ERROR_INVALID_ARGUMENT | data 为 NULL。 |
VPI_ERROR_INVALID_ARGUMENT | 新的和旧的缓冲区类型不匹配。 |
VPI_ERROR_INVALID_ARGUMENT | data 尺寸和/或格式与 img 不匹配。 |
VPI_ERROR_INVALID_ARGUMENT | 包装的 EGLImage 无效(例如 EGL_NO_IMAGE)。 |
VPI_ERROR_INTERNAL | 无法检索 EGLDisplay。 |
VPI_ERROR_INVALID_OPERATION | img 不是使用 vpiImageCreateWrapper 创建的。 |
VPI_ERROR_INVALID_OPERATION | img 已锁定。 |
VPI_ERROR_INVALID_OPERATION | 此平台上不支持 EGL/NvBuffer 包装。 |
VPI_SUCCESS | 操作成功执行。 |
void vpiImageDestroy | ( | VPIImage | img | ) |
#include <vpi/Image.h>
销毁图像实例。
此函数释放图像创建函数分配的所有资源。销毁 VPIImage 包装器时,包装的内存本身不会被释放。
[输入] | img | 要销毁的 img 。允许传递 NULL,函数对此不执行任何操作。
|
#include <vpi/Image.h>
获取图像尺寸(以像素为单位)。
[输入] | img | 要查询的图像。
|
[输出] | width,height | 指向将写入图像宽度和高度(分别)的缓冲区的指针。 |
VPI_ERROR_INVALID_ARGUMENT | img 为 NULL 或不表示 VPIImage 实例。 |
VPI_ERROR_INVALID_ARGUMENT | 输出 width 或 height 指针为 NULL。 |
VPI_SUCCESS | 操作成功执行。 |
VPIStatus vpiImageGetFormat | ( | VPIImage | img, |
VPIImageFormat * | format | ||
) |
#include <vpi/Image.h>
获取图像格式。
[输入] | img | 要查询的图像。
|
[输出] | format | 指向将写入图像格式的位置的指针。
|
VPI_ERROR_INVALID_ARGUMENT | img 为 NULL 或不表示 VPIImage 实例。 |
VPI_ERROR_INVALID_ARGUMENT | format 指针为 NULL。 |
VPI_SUCCESS | 操作成功执行 |
#include <vpi/Image.h>
获取图像标志。
[输入] | img | 要查询的图像。
|
[输出] | flags | 指向将写入标志的位置的指针。
|
VPI_ERROR_INVALID_ARGUMENT | flags 指针为 NULL。 |
VPI_ERROR_INVALID_ARGUMENT | img 为 NULL 或不表示 VPIImage 实例。 |
VPI_SUCCESS | 操作成功执行。 |
VPIStatus vpiImageLock | ( | VPIImage | img, |
VPILockMode | mode | ||
) |
#include <vpi/Image.h>
获取图像对象的锁。
当图像对象包装外部可访问的缓冲区,并且这些缓冲区将在 VPI 外部访问时,需要图像锁定。只要持有锁,任何 VPI 尝试以与锁定模式不兼容的模式访问图像都将导致异步流错误,VPI_ERROR_BUFFER_LOCKED。
图像可以被多次锁定。每个锁定操作都会增加一个计数器,并且必须通过相应的 vpiImageUnlock 调用来匹配。
[输入] | img | 要锁定的图像。
|
[输入] | mode | 锁定模式,取决于是否将写入和/或读取内存。 |
VPI_ERROR_INVALID_ARGUMENT | img 为 NULL 或不表示 VPIImage 实例。 |
VPI_ERROR_BUFFER_LOCKED | 图像已被流或用户锁定。 |
VPI_SUCCESS | 操作成功执行。 |
VPIStatus vpiImageLockData | ( | VPIImage | img, |
VPILockMode | mode, | ||
VPIImageBufferType | bufType, | ||
VPIImageData * | data | ||
) |
#include <vpi/Image.h>
data
获取图像对象的锁并返回图像内容。
图像可以被多次锁定。每个锁定操作都会增加一个计数器,并且必须通过相应的 vpiImageUnlock 调用来匹配。
[输入] | img | 要锁定的图像。
| ||||||
[输入] | mode | 锁定模式,取决于是否将写入和/或读取内存。 | ||||||
[输入] | bufType | 所需的后端标志 | ||||||
[输出] | data | 在 data 中返回的缓冲区类型。它定义了调用者如何访问图像内容。有效类型为
|
VPI_ERROR_INVALID_ARGUMENT | img 为 NULL 或不表示 VPIImage 实例。 |
VPI_ERROR_INVALID_ARGUMENT | 它指向的缓冲区在图像解锁之前有效。 |
VPI_ERROR_INVALID_ARGUMENT | data 不得为 NULL。 |
VPI_ERROR_INVALID_OPERATION | 不支持 bufType 。 |
VPI_ERROR_BUFFER_LOCKED | 图像已被流或用户锁定。 |
VPI_SUCCESS | 操作成功执行。 |
img
未启用所需的后端。#include <vpi/Image.h>
VPIStatus vpiImageUnlock
释放图像对象的锁。
[输入] | img | 当内部锁计数器达到 0 时,图像实际上被解锁。
|
VPI_ERROR_INVALID_ARGUMENT | img 为 NULL 或不表示 VPIImage 实例。 |
VPI_ERROR_INVALID_OPERATION | 图像必须启用 CPU 后端。 |
VPI_SUCCESS | 操作成功执行。 |