VPI - 视觉编程接口

3.2 版本

2D 图像的抽象表示。 更多...

数据结构

结构体  VPIImagePlanePitchLinear
 表示以倾斜线性布局的一个图像平面。 更多...
 
结构体  VPIImageBufferPitchLinear
 存储图像平面内容。 更多...
 
联合体  VPIImageBuffer
 表示访问图像内容的可用方法。 更多...
 
结构体  VPIImageData
 存储关于图像特性和内容的信息。 更多...
 
结构体  VPIImageWrapperParams
 用于自定义图像包装的参数。 更多...
 

#define VPI_MAX_PLANE_COUNT   (6)
 图像可以拥有的最大数据平面数。
 

类型定义

typedef struct VPIImageImpl * VPIImage
 图像的句柄。
 

枚举

枚举  VPIImageBufferType
 表示图像数据的存储方式。 更多...
 

函数

VPIStatus vpiImageCreate (int32_t width, int32_t height, VPIImageFormat fmt, uint64_t flags, VPIImage *img)
 使用指定的标志创建空的图像实例。 更多...
 
VPIStatus vpiInitImageWrapperParams (VPIImageWrapperParams *params)
 使用默认值初始化 VPIImageWrapperParams更多...
 
VPIStatus vpiImageCreateView (VPIImage imgParent, const VPIRectangleI *clipBounds, uint64_t flags, VPIImage *imgView)
 创建图像,该图像包装现有图像的轴对齐矩形子区域。 更多...
 
VPIStatus vpiImageSetView (VPIImage view, VPIImage parent, const VPIRectangleI *clipBounds)
 重新定义父图像内的图像视图位置。 更多...
 
VPIStatus vpiImageCreateWrapper (const VPIImageData *data, const VPIImageWrapperParams *params, uint64_t flags, VPIImage *img)
 通过包装现有的内存块来创建图像对象。 更多...
 
VPIStatus vpiImageSetWrapper (VPIImage img, const VPIImageData *data)
 重新定义现有 VPIImage 包装器中的包装内存。 更多...
 
void vpiImageDestroy (VPIImage img)
 销毁图像实例。 更多...
 
VPIStatus vpiImageGetSize (VPIImage img, int32_t *width, int32_t *height)
 获取图像尺寸(以像素为单位)。 更多...
 
VPIStatus vpiImageGetFormat (VPIImage img, VPIImageFormat *format)
 获取图像格式。 更多...
 
VPIStatus vpiImageGetFlags (VPIImage img, uint64_t *flags)
 获取图像标志。 更多...
 
VPIStatus vpiImageLock (VPIImage img, VPILockMode mode)
 获取图像对象的锁。 更多...
 
VPIStatus vpiImageLockData (VPIImage img, VPILockMode mode, VPIImageBufferType bufType, VPIImageData *data)
 获取图像对象的锁并返回图像内容。 更多...
 
VPIStatus vpiImageUnlock (VPIImage img)
 释放图像对象的锁。 更多...
 

详细描述

2D 图像的抽象表示。

使用 API 创建 2D 图像容器有两种方法。最基本的方法是使用 vpiImageCreate 来分配和初始化一个空的(清零的) VPIImage 对象。图像数据的内存由 VPI 分配和管理。宽度、高度和像素类型等参数是不可变的,并在构造时指定。内部内存布局也是后端特定的。更重要的是,不同硬件后端之间高效的图像数据交换可能会迫使实现将内存分配到多个内存池中(例如,dGPU 和系统 DRAM)。在某些情况下(为了优化性能和内存使用),限制内部分配策略以仅支持特定的后端集可能是有益的。

为了能够与现有的内存缓冲区互操作,用户还可以使用 vpiImageCreateWrapper 创建一个图像对象,该对象包装用户分配(和管理)的图像数据。与 vpiImageCreate 类似,传递给它的图像参数是固定的。

只要新的包装内存具有与最初包装的内存相同的容量和类型,就可以通过调用 vpiImageSetWrapper (对应于使用的图像包装器创建函数)来重新定义包装内存。 一次创建 VPIImage 包装器并在以后重用它,比一直创建和销毁它更有效。

通过 vpiImageLockData / vpiImageUnlock 组合,用户可以从主机读取/写入图像数据。这些函数是非阻塞的,并且忽略流命令队列,因此用户有责任确保使用此图像作为输入或输出的所有挂起操作都已完成。此外,根据内存分配在哪个设备上,锁定/解锁操作可能非常耗时,例如,对于 dGPU,可能涉及通过 PCIe 总线复制数据。


数据结构文档

◆ VPIImagePlanePitchLinear

struct VPIImagePlanePitchLinear

表示以倾斜线性布局的一个图像平面。

定义于文件 111Image.h

+ VPIImagePlanePitchLinear 的协作图
数据字段
VPIPixelType pixelType 此平面内每个像素的类型。

如果它是 VPI_PIXEL_TYPE_INVALID,它将从 VPIImageBufferPitchLinear::format 推断。

int32_t width 此平面的宽度(以像素为单位)。
  • 必须 >= 1。
int32_t height 此平面的高度(以像素为单位)。
  • 必须 >= 1。
int32_t pitchBytes 一行开始与前一行开始之间的字节差。

这用于寻址平面中的每一行(以及最终的每个像素)。

T *pix_addr = (T *)((uint8_t *)data + pitchBytes*height)+width;
void * data
指向此平面第一行的指针。
定义: Image.h:141
int32_t height
此平面的高度(以像素为单位)。
定义: Image.h:123
int32_t width
此平面的宽度(以像素为单位)。
定义: Image.h:119
int32_t pitchBytes
一行开始与前一行开始之间的字节差。
定义: Image.h:134

其中 T 是与 pixelType 相关的 C 类型。

  • 它必须至少为 (width * \ref vpiPixelTypeGetBitsPerPixel(pixelType) + 7)/8
void * data 指向此平面第一行的指针。

这指向此平面表示的实际数据。根据平面的使用方式,指针可能指向 GPU 内存或主机内存。需要注意何时允许解引用此内存。

◆ VPIImageBufferPitchLinear

struct VPIImageBufferPitchLinear

存储图像平面内容。

定义于文件 149Image.h

+ VPIImageBufferPitchLinear 的协作图
数据字段
VPIImageFormat format 图像格式。
int32_t numPlanes 平面数量。
  • 必须 >= 1。
VPIImagePlanePitchLinear planes[VPI_MAX_PLANE_COUNT] 以倾斜线性布局的所有图像平面的数据。
  • 只有前 numPlanes 个元素必须具有有效数据。

◆ VPIImageBuffer

union VPIImageBuffer

表示访问图像内容的可用方法。

正确的方法取决于 VPIImageData::bufferType

定义于文件 203Image.h

+ VPIImageBuffer 的协作图
数据字段
VPIImageBufferPitchLinear pitch 以倾斜线性布局存储的图像。

VPIImageData::bufferType 为以下类型时使用

cudaArray_t cudaarray 存储在 cudaArray_t 中的图像。

VPIImageData::bufferType 为以下类型时使用

EGLImageKHR egl 作为 EGLImageKHR 存储的图像。

VPIImageData::bufferType 为以下类型时使用

int fd 作为 NvBuffer 文件描述符存储的图像。

VPIImageData::bufferType 为以下类型时使用

◆ VPIImageData

struct VPIImageData

存储关于图像特性和内容的信息。

定义于文件 233Image.h

+ VPIImageData 的协作图
数据字段
VPIImageBufferType bufferType 图像缓冲区类型。

它定义了必须使用 VPIImageBuffer 标记联合体的哪个成员来访问图像内容。

VPIImageBuffer buffer 存储图像内容。

◆ VPIImageWrapperParams

struct VPIImageWrapperParams

用于自定义图像包装的参数。

这些参数用于自定义图像包装的制作方式。在更新其属性之前,请务必调用 vpiInitImageWrapperParams 来初始化此结构。这保证了未来版本中添加的新属性将被分配合适的默认值。

定义于文件 293Image.h

+ VPIImageWrapperParams 的协作图
数据字段
VPIColorSpec colorSpec 颜色规范,用于覆盖由 VPIImageData 包装器定义的颜色规范。

如果设置为 VPI_COLOR_SPEC_DEFAULT,则从 VPIImageData 推断颜色规范,即不进行覆盖。

枚举类型文档

◆ 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 以获取更多信息。

注意
不再支持与使用旧版本 nvbuf_utils 创建的 NvBuffer 对象互操作。

定义于文件 165Image.h

函数文档

◆ vpiImageCreate()

VPIStatus vpiImageCreate ( int32_t  width,
int32_t  height,
VPIImageFormat  fmt,
uint64_t  flags,
VPIImage img 
)

#include <vpi/Image.h>

使用指定的标志创建空的图像实例。

图像数据已清零。

以下标志会影响已分配图像的行为

参数
[输入]width,height创建的图像的尺寸。
  • 宽度和高度必须 > 0。
[输入]fmt创建的图像的格式。
  • 必须是有效的格式。
[输入]flags位字段,指定图像所需的特性。
  • 该字段必须是零个或多个以下标志的组合
    • VPIBackend 标志。此图像可用于在这些后端中运行的算法。如果未给出后端标志,并且未设置 VPI_REQUIRE_BACKENDS,它将考虑活动 VPIContext 支持的所有后端,但禁用与给定图像参数不兼容的后端。
    • VPI_RESTRICT_MEM_USAGE 对于块线性格式,此标志将避免内部倾斜线性缓冲区分配。缺点是对于这些格式,vpiImageLockData 将失败。如果系统内存受限,并且不需要图像锁定,请传递此标志。
    • 通用对象标志.
  • 如果给定标志 VPI_REQUIRE_BACKENDS,则用户必须传递至少一个在当前上下文中启用 与给定图像参数兼容的有效后端。
[输出]img指向将接收创建的图像句柄的内存的指针。
返回值
VPI_ERROR_INVALID_ARGUMENT输出 img 句柄为 NULL。
VPI_ERROR_INVALID_ARGUMENTwidthheight 超出有效范围。
VPI_ERROR_INVALID_ARGUMENTfmt 无效或不受支持。
VPI_ERROR_INVALID_ARGUMENTflags 无效。
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操作成功执行。

◆ vpiInitImageWrapperParams()

VPIStatus vpiInitImageWrapperParams ( VPIImageWrapperParams params)

#include <vpi/Image.h>

使用默认值初始化 VPIImageWrapperParams

默认值是

参数
[输入]params要使用默认值初始化的结构。
  • 强制性,不能为空。
返回值
VPI_ERROR_INVALID_ARGUMENTparams 为 NULL。
VPI_SUCCESS操作成功执行。

◆ vpiImageCreateView()

VPIStatus vpiImageCreateView ( VPIImage  imgParent,
const VPIRectangleI clipBounds,
uint64_t  flags,
VPIImage imgView 
)

#include <vpi/Image.h>

创建图像,该图像包装现有图像的轴对齐矩形子区域。

创建图像实例,该实例是具有特定位置 (x, y)、尺寸 (width, height) 和标志的输入图像的视图。生成的图像与输入图像共享底层数据,即在创建视图时不会涉及复制。与创建围绕外部缓冲区的图像实例类似,生成的图像视图实例不拥有数据。从另一个图像视图实例创建视图是合法的。

参数
[输入]imgParent输入父图像的句柄。
  • 强制性,不能为空。
  • 在 Tegra 设备上:父图像必须是包装 CPU 或 CUDA 缓冲区,或者仅启用 CPU 或 CUDA 后端。
  • 当存在与其关联的图像视图时,不得销毁它。
[输入]clipBounds定义创建的图像视图的剪辑边界的矩形。
  • 矩形必须在输入父图像内。
[输入]flags具有创建的图像视图特性的标志。
  • 它们必须是零个或多个以下标志的组合
    • VPIBackend 标志。此图像视图将与启用这些后端的流一起工作。启用的后端必须与输入图像标志具有一些共同的后端。如果未传递后端标志,它将考虑活动 VPIContext 支持的所有后端。
[输出]imgView指向将接收创建的图像视图句柄的内存的指针。
  • 强制性,不能为空。
返回值
VPI_ERROR_INVALID_OPERATION无法使用给定的 imgParent 创建 imgView
VPI_ERROR_INVALID_OPERATIONimgParentflags 中的后端不兼容。
VPI_ERROR_INVALID_ARGUMENT输入父图像 imgParent 为 NULL。
VPI_ERROR_INVALID_ARGUMENTimgParent 没有后端。
VPI_ERROR_INVALID_ARGUMENToutput 句柄为 NULL。
VPI_ERROR_INVALID_ARGUMENTclipBounds 为 NULL 或超出有效范围。
VPI_ERROR_INVALID_ARGUMENTflags 无效。
VPI_ERROR_NOT_IMPLEMENTED对于给定的输入父图像,未实现图像视图。
VPI_ERROR_INVALID_CONTEXTimgParentimgView 上下文不同。
VPI_ERROR_INVALID_CONTEXT当前上下文已销毁。
VPI_SUCCESS操作成功执行。

◆ vpiImageSetView()

VPIStatus vpiImageSetView ( VPIImage  view,
VPIImage  parent,
const VPIRectangleI clipBounds 
)

#include <vpi/Image.h>

重新定义父图像内的图像视图位置。

此操作高效且不分配内存。视图内存将可用于在视图创建期间指定的相同后端。父图像可以是视图的原始父图像或新父图像。

参数
[输入]view图像视图的句柄。
[输入]parent潜在的新输入父图像的句柄。
  • 父图像格式必须与视图的格式匹配。
  • 强制性,不能为空。
  • 在 Tegra 设备上:父图像必须是包装 CPU 或 CUDA 缓冲区,或者仅启用 CPU 或 CUDA 后端。
  • 当存在与其关联的图像视图时,不得销毁它。
[输入]clipBounds定义重新定义的图像视图的剪辑边界的矩形。
  • 矩形必须在选择的父图像内。
  • 矩形的宽度和高度必须与图像视图相同。
返回值
VPI_ERROR_INVALID_ARGUMENT输入 view 为 NULL。
VPI_ERROR_INVALID_ARGUMENT输入 parent 为 NULL。
VPI_ERROR_INVALID_ARGUMENTclipBounds 为 NULL。
VPI_ERROR_INVALID_ARGUMENTclipBounds 超出有效范围。
VPI_ERROR_INVALID_ARGUMENTclipBounds 的大小与图像视图不同。
VPI_ERROR_INVALID_ARGUMENTparent 图像格式与 view 图像格式不匹配。
VPI_ERROR_INVALID_ARGUMENTparent 没有后端。
VPI_ERROR_INVALID_OPERATIONview 不是使用 vpiImageCreateView 创建的。
VPI_ERROR_INVALID_OPERATION无法使用给定的 parent 重新定义 view
VPI_SUCCESS操作成功执行。

◆ vpiImageCreateWrapper()

VPIStatus vpiImageCreateWrapper ( const VPIImageData data,
const VPIImageWrapperParams params,
uint64_t  flags,
VPIImage img 
)

#include <vpi/Image.h>

通过包装现有的内存块来创建图像对象。

底层图像对象不拥有/声明内存块。

参数
[输入]data指向具有要包装的内存的结构的指针。
[输入]params如果不是 NULL,请使用参数修改 data 的包装方式。否则,它将使用 vpiInitImageWrapperParams 给出的默认值。
[输入]flags位字段,指定图像所需的特性。根据某些缓冲区类型,以下标志将自动添加
缓冲区类型添加的标志
VPI_IMAGE_BUFFER_HOST_PITCH_LINEAR VPI_IMAGE_BUFFER_HOST_PITCH_LINEAR
VPI_IMAGE_BUFFER_CUDA_PITCH_LINEAR VPI_IMAGE_BUFFER_CUDA_PITCH_LINEAR
  • 该字段必须是零个或多个以下标志的组合
    • VPIBackend 标志。此图像可用于在这些后端中运行的算法。如果未给出后端标志,并且未设置 VPI_REQUIRE_BACKENDS,它将考虑活动 VPIContext 支持的所有后端,但禁用与给定图像参数不兼容的后端。
    • VPI_RESTRICT_MEM_USAGE 对于块线性格式,此标志将避免内部倾斜线性缓冲区分配。缺点是对于这些格式,vpiImageLockData 将失败。如果系统内存受限,并且不需要图像锁定,请传递此标志。
    • 通用对象标志.
  • 如果给出了后端并且设置了 VPI_REQUIRE_BACKENDS,则它们都必须在当前上下文中启用。
  • 如果自动添加了后端,则它们必须在当前上下文中启用。
参数
[输出]img指向将接收创建的图像句柄的内存的指针。
返回值
VPI_ERROR_INVALID_ARGUMENTimg 为 NULL。
VPI_ERROR_INVALID_ARGUMENTdata 为 NULL 或包含无效/不受支持的值。
VPI_ERROR_INVALID_ARGUMENTdata 中的缓冲区类型不受支持。
VPI_ERROR_INVALID_ARGUMENTEGLImage 句柄为 NULL 或无效(例如 EGL_NO_IMAGE)。
VPI_ERROR_INVALID_ARGUMENTNvBuffer 文件描述符无效。
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操作成功执行。
+ 此函数的调用方图

◆ vpiImageSetWrapper()

VPIStatus vpiImageSetWrapper ( VPIImage  img,
const VPIImageData data 
)

#include <vpi/Image.h>

重新定义现有 VPIImage 包装器中的包装内存。

此操作高效且不分配内存。包装的内存将可用于在包装器创建期间指定的相同后端。

包装的内存在其仍在包装时不得被释放。

参数
[输入]img图像的句柄。
[输入]data指向具有要包装的内存缓冲区的结构的指针。
  • 强制性,不能为空。
  • 现有包装图像和新图像必须具有相同的尺寸和格式。
  • 旧的和新的缓冲区类型必须匹配。
  • 包装的内存必须指向与给定缓冲区类型对应的缓冲区。
返回值
VPI_ERROR_INVALID_ARGUMENTdata 为 NULL。
VPI_ERROR_INVALID_ARGUMENT新的和旧的缓冲区类型不匹配。
VPI_ERROR_INVALID_ARGUMENTdata 尺寸和/或格式与 img 不匹配。
VPI_ERROR_INVALID_ARGUMENT包装的 EGLImage 无效(例如 EGL_NO_IMAGE)。
VPI_ERROR_INTERNAL无法检索 EGLDisplay。
VPI_ERROR_INVALID_OPERATIONimg 不是使用 vpiImageCreateWrapper 创建的。
VPI_ERROR_INVALID_OPERATIONimg 已锁定。
VPI_ERROR_INVALID_OPERATION此平台上不支持 EGL/NvBuffer 包装。
VPI_SUCCESS操作成功执行。
+ 此函数的调用方图

◆ vpiImageDestroy()

void vpiImageDestroy ( VPIImage  img)

#include <vpi/Image.h>

销毁图像实例。

此函数释放图像创建函数分配的所有资源。销毁 VPIImage 包装器时,包装的内存本身不会被释放。

参数
[输入]img要销毁的 img。允许传递 NULL,函数对此不执行任何操作。
  • 图像不得被任何流使用,否则可能会导致未定义的行为。

◆ vpiImageGetSize()

VPIStatus vpiImageGetSize ( VPIImage  img,
int32_t *  width,
int32_t *  height 
)

#include <vpi/Image.h>

获取图像尺寸(以像素为单位)。

参数
[输入]img要查询的图像。
  • 强制性,不能为空。
[输出]width,height指向将写入图像宽度和高度(分别)的缓冲区的指针。
返回值
VPI_ERROR_INVALID_ARGUMENTimg 为 NULL 或不表示 VPIImage 实例。
VPI_ERROR_INVALID_ARGUMENT输出 widthheight 指针为 NULL。
VPI_SUCCESS操作成功执行。

◆ vpiImageGetFormat()

VPIStatus vpiImageGetFormat ( VPIImage  img,
VPIImageFormat format 
)

#include <vpi/Image.h>

获取图像格式。

参数
[输入]img要查询的图像。
  • 强制性,不能为空。
[输出]format指向将写入图像格式的位置的指针。
  • 强制性,不能为空。
返回值
VPI_ERROR_INVALID_ARGUMENTimg 为 NULL 或不表示 VPIImage 实例。
VPI_ERROR_INVALID_ARGUMENTformat 指针为 NULL。
VPI_SUCCESS操作成功执行
+ 此函数的调用方图

◆ vpiImageGetFlags()

VPIStatus vpiImageGetFlags ( VPIImage  img,
uint64_t *  flags 
)

#include <vpi/Image.h>

获取图像标志。

参数
[输入]img要查询的图像。
  • 强制性,不能为空。
[输出]flags指向将写入标志的位置的指针。
  • 强制性,不能为空。
返回值
VPI_ERROR_INVALID_ARGUMENTflags 指针为 NULL。
VPI_ERROR_INVALID_ARGUMENTimg 为 NULL 或不表示 VPIImage 实例。
VPI_SUCCESS操作成功执行。

◆ vpiImageLock()

VPIStatus vpiImageLock ( VPIImage  img,
VPILockMode  mode 
)

#include <vpi/Image.h>

获取图像对象的锁。

当图像对象包装外部可访问的缓冲区,并且这些缓冲区将在 VPI 外部访问时,需要图像锁定。只要持有锁,任何 VPI 尝试以与锁定模式不兼容的模式访问图像都将导致异步流错误,VPI_ERROR_BUFFER_LOCKED

图像可以被多次锁定。每个锁定操作都会增加一个计数器,并且必须通过相应的 vpiImageUnlock 调用来匹配。

参数
[输入]img要锁定的图像。
  • 强制性,不能为空。
  • 图像不得以与给定 mode 不兼容的模式锁定。
[输入]mode锁定模式,取决于是否将写入和/或读取内存。
返回值
VPI_ERROR_INVALID_ARGUMENTimg 为 NULL 或不表示 VPIImage 实例。
VPI_ERROR_BUFFER_LOCKED图像已被流或用户锁定。
VPI_SUCCESS操作成功执行。

◆ vpiImageLockData()

VPIStatus vpiImageLockData ( VPIImage  img,
VPILockMode  mode,
VPIImageBufferType  bufType,
VPIImageData data 
)

#include <vpi/Image.h>

data

获取图像对象的锁并返回图像内容。

图像可以被多次锁定。每个锁定操作都会增加一个计数器,并且必须通过相应的 vpiImageUnlock 调用来匹配。

参数
[输入]img要锁定的图像。
[输入]mode锁定模式,取决于是否将写入和/或读取内存。
[输入]bufType所需的后端标志
[输出]datadata 中返回的缓冲区类型。它定义了调用者如何访问图像内容。有效类型为
  • 指向结构的指针,该结构将填充图像内存内容信息。
  • 不得为 NULL。
返回值
VPI_ERROR_INVALID_ARGUMENTimg 为 NULL 或不表示 VPIImage 实例。
VPI_ERROR_INVALID_ARGUMENT它指向的缓冲区在图像解锁之前有效。
VPI_ERROR_INVALID_ARGUMENTdata 不得为 NULL。
VPI_ERROR_INVALID_OPERATION不支持 bufType
VPI_ERROR_BUFFER_LOCKED图像已被流或用户锁定。
VPI_SUCCESS操作成功执行。

img 未启用所需的后端。

◆ vpiImageUnlock() ( VPIImage  img)

#include <vpi/Image.h>

VPIStatus vpiImageUnlock

释放图像对象的锁。

参数
[输入]img当内部锁计数器达到 0 时,图像实际上被解锁。
  • 强制性,不能为空。
  • 要解锁的图像。
返回值
VPI_ERROR_INVALID_ARGUMENTimg 为 NULL 或不表示 VPIImage 实例。
VPI_ERROR_INVALID_OPERATION图像必须启用 CPU 后端。
VPI_SUCCESS操作成功执行。