简介
nvjpegBackend_t
- 简述:
NVJPEG_BACKEND_DEFAULT
– 默认值NVJPEG_BACKEND_HYBRID
– 使用CPU进行霍夫曼解码NVJPEG_BACKEND_GPU_HYBRID
– 使用GPU辅助霍夫曼解码。nvjpegDecodeBatched将使用GPU对基线JPEG比特流进行解码,当批量大小大于100时进行交错扫描NVJPEG_BACKEND_HARDWARE
– 单扫描支持基线JPEG比特流。不支持410和411个子样本
- 声明:
1
2
3
4
5
6
7typedef enum
{
NVJPEG_BACKEND_DEFAULT = 0,
NVJPEG_BACKEND_HYBRID = 1,
NVJPEG_BACKEND_GPU_HYBRID = 2,
NVJPEG_BACKEND_HARDWARE = 3
} nvjpegBackend_t;
nvjpegDevAllocator_t
- 简述:内存分配器使用提到的原型,提供给nvjpegCreateEx
- 这个分配器将用于库中的所有设备内存分配
- 无论如何,库都在进行智能分配(仅在需要时重新分配内存)
- 声明:
1
2
3
4
5typedef struct
{
tDevMalloc dev_malloc;
tDevFree dev_free;
} nvjpegDevAllocator_t;
nvjpegImage_t
- 简述:输出描述符。根据输出格式,被写入平面的数据
- 声明:
1
2
3
4
5typedef struct
{
unsigned char * channel[NVJPEG_MAX_COMPONENT];
size_t pitch[NVJPEG_MAX_COMPONENT];
} nvjpegImage_t;
英伟达API
nvjpegCreateSimple()
- 简述:使用默认后端和默认内存分配器(cudaMalloc/cudaFree)初始化nvjpeg句柄
- 声明:
nvjpegStatus_t NVJPEGAPI nvjpegCreateSimple(nvjpegHandle_t *handle);
- 参数:
handle
– 编解码器实例,用于其他调用 – Input/Output
- 返回值:
- 成功 –
- 失败 –
nvjpegCreate()
- 简述:初始化nvjpeg句柄。此句柄用于所有连续调用
- 声明:
nvjpegStatus_t NVJPEGAPI nvjpegCreate(nvjpegBackend_t backend, nvjpegDevAllocator_t *dev_allocator, nvjpegHandle_t *handle);
- 参数:
backend
– 要使用的后端。目前支持默认或混合(目前相同)。 – Inputdev_allocator
– 指向nvjpegDevAllocator的指针。如果为NULL - 使用默认cuda调用(cudaMalloc/cudaFree) – Inputhandle
– 编解码器实例,用于其他调用 – Input/Output
- 返回值:
- 成功 –
- 失败 –
nvjpegDestroy()
- 简述:释放句柄和资源
- 声明:
nvjpegStatus_t NVJPEGAPI nvjpegDestroy(nvjpegHandle_t handle);
- 参数:
handle
– 要释放的实例句柄 – Input/Output
- 返回值:
- 成功 –
- 失败 –
nvjpegJpegStateCreate()
- 简述:解码状态的初始化
- 声明:
nvjpegStatus_t NVJPEGAPI nvjpegJpegStateCreate(nvjpegHandle_t handle, nvjpegJpegState_t *jpeg_handle);
- 参数:
handle
– 编解码器实例 – Inputjpeg_handle
– 解码的jpeg图像状态句柄 – Input/Output
- 返回值:
- 成功 –
- 失败 –
nvjpegJpegStateDestroy()
- 简述:释放jpeg图像句柄
- 声明:
nvjpegStatus_t NVJPEGAPI nvjpegJpegStateDestroy(nvjpegJpegState_t jpeg_handle);
- 参数:
jpeg_handle
– 解码的jpeg图像状态句柄 – Input/Output
- 返回值:
- 成功 –
- 失败 –
nvjpegGetImageInfo()
- 简述:检索图像信息,包括通道、每个图像层的宽度和高度,以及色度下采样。
- 如果编码的通道小于NVJPEG_MAX_COMPONENT,那么零将被设置为缺失通道信息
- 如果图像是三通道的,则所有三组都有效
- This function is thread safe.
- 声明:
1
2
3
4
5
6
7
8nvjpegStatus_t NVJPEGAPI nvjpegGetImageInfo(
nvjpegHandle_t handle,
const unsigned char *data,
size_t length,
int *nComponents,
nvjpegChromaSubsampling_t *subsampling,
int *widths,
int *heights); - 参数:
handle
– 编解码器实例 – Inputdata
– 指向缓冲区的指针,其中包含要解码的jpeg流数据。 – Inputlength
– jpeg图像缓冲区的长度。 – InputnComponent
– 图像的组件数(层数),目前只支持1通道(灰度)或3通道。 – Outputsubsampling
– 在这个JPEG中使用的色度下采样,参见nvjpegChromaSubsampling_t – Outputwidths
– 指向NVJPEG_MAX_COMPONENT的指针,返回每个通道的宽度。如果信道未编码,则为0 – Outputheights
– 指向NVJPEG_MAX_COMPONENT的指针,返回每个通道的高度。如果信道未编码,则为0 – Output
- 返回值:
- 成功 –
- 失败 –
nvjpegDecode()
- 简述:解码单幅图像
- API是后端不可知的。
- 它将决定在内部使用哪个实现。目标缓冲区应该足够大,能够存储指定格式的输出。
- 对于每个颜色平面,可以使用
nvjpegGetImageInfo()
检索图像大小,每个平面所需的最小内存缓冲区是nPlaneHeight*nPlanePitch
, - 其中
nPlanePitch >= nPlaneWidth
用于平面输出格式, nPlanePitch >= nPlaneWidth*nOutputComponents
用于交错输出格式
- 声明:
1
2
3
4
5
6
7
8nvjpegStatus_t NVJPEGAPI nvjpegDecode(
nvjpegHandle_t handle,
nvjpegJpegState_t jpeg_handle,
const unsigned char *data,
size_t length,
nvjpegOutputFormat_t output_format,
nvjpegImage_t *destination,
cudaStream_t stream); - 参数:
handle
– 编解码器实例 – Input/Outputjpeg_handle
– 解码的jpeg图像状态句柄 – Input/Outputdata
– 指向包含要解码的jpeg图像的缓冲区的指针。 – Inputlength
– jpeg图像缓冲区的长度。 – Inputoutput_format
– 输出数据格式。有关描述,请参阅nvjpegOutputFormat_t – Inputdestination
– 指向结构的指针,包含输出缓冲区的信息。参见nvjpegImage_t描述。 – Input/Outputstream
– CUDA流在哪里提交所有GPU工作 – Input/Output
- 返回值:
- 成功 –
- 失败 –
cudaStreamSynchronize()
- 简述:阻塞任务流,直到流完成所有操作。如果 device 设置了
cudaDeviceScheduleBlockingSync
标识,主机线程在它完成所有的任务之前,会一直阻塞 - 声明:
cudaError_t cudaStreamSynchronize(cudaStream_t stream);
- 参数:
stream
– 流标识符
- 返回值:
- 成功 – 返回
cudaSuccess
- 失败 – 返回
cudaErrorInvalidResourceHandle
- 成功 – 返回
cudaStreamCreateWithFlags()
- 简述:创建一个新的异步的流,通过参数
flags
来设置流的属性Create an asynchronous stream Creates a new asynchronous stream.
The flags argument determines the behaviors of the stream.
- 声明:
cudaError_t cudaStreamCreateWithFlags(cudaStream_t *pStream, unsigned int flags);
- 参数:
pStream
– 指向流标识符的指针flags
– 创建流的参数,有效的参数为:cudaStreamDefault
– 默认标识cudaStreamNonBlocking
– 异步流,异步于NULL流
- 返回值:
- 成功 – cudaSuccess
- 失败 – cudaErrorInvalidValue
cudaGetDeviceCount()
- 简述:获取可用算能设备的数量
- 声明:
cudaError_t cudaGetDeviceCount(int *count);
- 参数:
count
– 具有计算能力的设备数字
- 返回值:
- 成功 – cudaSuccess
cudaGetDevice()
- 简述:返回当前正在使用的设备
- 声明:
cudaError_t cudaGetDevice(int *device);
- 参数:
device
– 正在工作的主机线程所执行的设备代码
- 返回值:
- 成功 – cudaSuccess
- 失败 – cudaErrorInvalidValue
cudaSetDevice()
- 简述:设置GPU运行的设备
- 声明:
cudaError_t cudaSetDevice(int device);
- 参数:
device
– 调用这个函数的主机线程要执行设备代码的设备
- 返回值:
- 成功 – cudaSuccess
- 失败 – cudaErrorInvalidDevice | cudaErrorDeviceAlreadyInUse
- 注意:
- 随后任何设备由
cudaMalloc(), cudaMallocPitch(), cudaMallocArray()
申请的设备内存都会分配到对应device的物理设备 - 任何主机线程通过
cudaMallocHost(), cudaHostAlloc(), cudaHostRegister()
申请的主机内存都会将它们的生命周期与设备device关联起来 - 任何通过主机线程创建的流或事件都会和设备device关联起来
- 任何通过主机线程由
cudaLaunchKernel()
发生的内核调用都会在设备device上执行 - 这个调用可能在任何时间,由任何主机线程在任何设备上调用。
- 随后任何设备由
- 返回值:
- 成功 – cudaSuccess
- 失敗 – cudaErrorInvalidDevice | cudaErrorDeviceAlreadyInUse