简介

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
    7
    
      typedef 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
    5
    
      typedef struct 
      {
          tDevMalloc dev_malloc;
          tDevFree dev_free;
      } nvjpegDevAllocator_t;
    

nvjpegImage_t

  • 简述:输出描述符。根据输出格式,被写入平面的数据
  • 声明:
    1
    2
    3
    4
    5
    
      typedef 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 – 要使用的后端。目前支持默认或混合(目前相同)。 – Input
    • dev_allocator – 指向nvjpegDevAllocator的指针。如果为NULL - 使用默认cuda调用(cudaMalloc/cudaFree) – Input
    • handle – 编解码器实例,用于其他调用 – 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 – 编解码器实例 – Input
    • jpeg_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
    8
    
          nvjpegStatus_t NVJPEGAPI nvjpegGetImageInfo(
          nvjpegHandle_t handle,
          const unsigned char *data, 
          size_t length,
          int *nComponents, 
          nvjpegChromaSubsampling_t *subsampling,
          int *widths,
          int *heights);
    
  • 参数:
    • handle – 编解码器实例 – Input
    • data – 指向缓冲区的指针,其中包含要解码的jpeg流数据。 – Input
    • length – jpeg图像缓冲区的长度。 – Input
    • nComponent – 图像的组件数(层数),目前只支持1通道(灰度)或3通道。 – Output
    • subsampling – 在这个JPEG中使用的色度下采样,参见nvjpegChromaSubsampling_t – Output
    • widths – 指向NVJPEG_MAX_COMPONENT的指针,返回每个通道的宽度。如果信道未编码,则为0 – Output
    • heights – 指向NVJPEG_MAX_COMPONENT的指针,返回每个通道的高度。如果信道未编码,则为0 – Output
  • 返回值:
    • 成功 –
    • 失败 –

nvjpegDecode()

  • 简述:解码单幅图像
    • API是后端不可知的。
    • 它将决定在内部使用哪个实现。目标缓冲区应该足够大,能够存储指定格式的输出。
    • 对于每个颜色平面,可以使用nvjpegGetImageInfo()检索图像大小,每个平面所需的最小内存缓冲区是nPlaneHeight*nPlanePitch
    • 其中nPlanePitch >= nPlaneWidth用于平面输出格式,
    • nPlanePitch >= nPlaneWidth*nOutputComponents用于交错输出格式
  • 声明:
    1
    2
    3
    4
    5
    6
    7
    8
    
      nvjpegStatus_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/Output
    • jpeg_handle – 解码的jpeg图像状态句柄 – Input/Output
    • data – 指向包含要解码的jpeg图像的缓冲区的指针。 – Input
    • length – jpeg图像缓冲区的长度。 – Input
    • output_format – 输出数据格式。有关描述,请参阅nvjpegOutputFormat_t – Input
    • destination – 指向结构的指针,包含输出缓冲区的信息。参见nvjpegImage_t描述。 – Input/Output
    • stream – 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