NVDEC_VideoDecoder_API_ProgGuide

从NVIDIA Fermi一代开始,英伟达GPU内置的NVDEC引擎提供全面硬件加速的视频解码能力,支持多种视频格式。NVDEC与GPU上的其他引擎独立运行,开发者可通过NVDECODE API访问其特性,实现视频帧的解码、后处理和显示。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

概述

从 NVIDIA® Fermi™ 一代开始,英伟达GPU包含一个视频解码器引擎(本文中简称NVDEC),它提供全硬件加速解码视频的能力。NVDEC能解码许多码流格式: H.264, HEVC (H.265), VP8, VP9, MPEG-1, MPEG-2, MPEG-4 and VC-1. NVDEC运行完全独立于计算/图像引擎。

英伟达提供编程NVDEC的软件API和库。这套软件API,以下称为NVDECODE API,它使开发者能访问NVDEC的解码特性,并且能让NVDEC与GPU上的其它引擎交互。

NVDEC解码压缩的视频流,然后复制解码后的YUV帧到显存,因此CUDA可以后续处理位于显存中的YUV帧。对于大多数流行的输出视频格式,NVDECODE API 也提供一些常用的CUDA优化的后处理,比如缩放、裁剪、宽高比转换、反交错和色彩空间转换。

解码后的视频帧可以传递给显示器播放,直接传给NVENC进行高性能视频转码,用于GPU加速的推理,通过CUDA或者基于CPU后续处理。

NVDECODE API 支持的解码格式如下:
‣ MPEG-1,
‣ MPEG-2,
‣ MPEG4,
‣ VC-1,
‣ H.264 (AVCHD) (8 bit),
‣ H.265 (HEVC) (8bit, 10 bit and 12 bit),
‣ VP8,
‣ VP9(8bit, 10 bit and 12 bit),
‣ Hybrid (CUDA + CPU) JPEG

视频解码能力

下表展示每种GPU架构支持的解码格式和视频解码能力。
在这里插入图片描述

[1] 只支持 GP104, Turing 和 GA100
[2] GP10x GPUs 支持 VP9 10-bit 和 12-bit 解码

视频解码管道

解码管道包含三个主要的组件:解封装器,视频解析器,视频解码器。每个组件互不依赖因此能独立使用。NVDECODE API提供英伟达视频解析器和英伟达视频解码器API。英伟达视频解析器是一个纯软件组件,用户可以用自己的插件替换(比如ffmpeg解析器)。
在这里插入图片描述
使用NVDECODE API 解码视频的步骤大致如下:

  1. 创建一个CUDA上下文。
  2. 查询硬件解码器的解码能力。
  3. 创建解码器实例。
  4. 解封装,这个可以使用第三方软件,如FFMPEG。
  5. 使用NVDECODE API 提供的解析器提取视频流,或者第三方解析器如FFMPEG。
  6. 使用NVDECODE API 开始解码。
  7. 获得解码后的YUV数据,用于后续处理。
  8. 查询解码帧的状态。
  9. 根据解码帧的状态,使用解码后的输出进行后续处理,比如:渲染,推理,后加工等。
  10. 如果应用程序需要显示解码后的输出:
    • 将解码后的YUV 转换为RGBA
    • 映射RGBA 到 DirectX or OpenGL 纹理
    • 在屏幕上绘制纹理
  11. 完成解码过程后销毁解码器实例 。
  12. 销毁CUDA上下文。

使用英伟达视频解码器

所有的 NVDECODE APIs 声明在两个头文件中: cuviddec.h 和 nvcuvid.h。这些头文件存放在Video Codec SDK中的 …\Samples\NvCodec\NvDecoder 目录下。 NVIDIA Video Codec SDK 中的示例静态加载库函数,在源文件中包含cuviddec.h 和nvcuvid.h ,SDK包中包含静态库文件。windows 动态库nvcuvid.dll 包含在windows显卡驱动中,linux 动态库libnvcuvid.so 则包含在linux显卡驱动中。

视频解析器

创建解析器

填充好 CUVIDPARSERPARAMS结构体后,通过调用 cuvidCreateVideoParser() 可以创建解析器对象。这个结构体应该填充好以下关于需要解码的流的信息。

  • CodecType :必须取值于 enum cudaVideoCodec,指示解码的类型,比如 H.264, HEVC, VP9

  • ulMaxNumDecodeSurfaces:这是解析器的解码图片缓存的表面数量。这个值在解析器初始化时可能不知道,在创建解析器对象时可以预先设置成1. 应用必须向驱动注册一个回调函数 pfnSequenceCallback,当解析器遇到第一个序列头或者这个序列发生了任何变化时会回调这个函数。这个回调函数通过参数CUVIDEOFORMAT::min_num_decode_surfaces报告为了正确解码,解析器的解码图片缓存需要的最小的表面数量。如果想更新CUVIDPARSERPARAMS::ulMaxNumDecodeSurfaces,这个序列回调函数可能返回这个值给解析器,如果这个值大于1,解析器可以使用这个值重新设置CUVIDPARSERPARAMS::ulMaxNumDecodeSurfaces。因此,为了内存分配优化,解码器对象创建时使用的缓存数量,应该使用: CUVIDDECODECREATEINFO::ulNumDecodeSurfaces =
    CUVIDPARSERPARAMS::ulMaxNumDecodeSurfaces.

  • ulMaxDisplayDelay:调用显示回调函数延迟。0代表没有延迟

  • pfnSequenceCallback : 应用必须注册一个回调函数序列改变的情况。当解析器初始化序列头或者视频格式改变时,触发这个回调函数。序列回调函数的返回值由驱动程序解释如下:

    • 0:失败
    • 1:成功,但是不应该重新设置CUVIDPARSERPARAMS::ulMaxNumDecodeSurfaces
    • > 1 : 成功,应该使用返回的值重新设置CUVIDPARSERPARAMS::ulMaxNumDecodeSurfaces
  • pfnDecodePicture : 当一帧的码流数据准备好时,解析器触发这个回调函数。对于奇偶场的图片,因为两个场组成一帧,每一次显示回调会有两次解码回调。这个回调函数的返回值解释如下:

    • 0 : failed
    • >= 1 :成功
  • pfnDisplayPicture : 当一帧按显示顺序准备就绪时,解析器调用这个函数。返回值同上。

提取数据包

从解封装器中提取的数据包使用cuvidParseVideoData()函数传递给解析器,与此同时,当序列发生改变或者一帧画面已准备好解码或显示时,解析器触发创建解析器对象时注册的回调函数。

解码后数据通过一个CUVIDPICPARAMS里的图片索引绑定,它由解析器提供。这个图片索引后续用于将解码帧映射到CUDA内存。

销毁解析器

用户需要调用 cuvidDestroyVideoParser()函数销毁解析器对象以及释放所有分配的资源。

视频解码器

查询解码能力

如表1所示,不同的GPU包含不同的能力. 因此,为了确保你的应用能在所有的GPU硬件上运行,很有必要查询硬件能力,然后根据所需的能力是否满足进行合适的操作。

API cuvidGetDecoderCaps() 让用户能够查询底层硬件视频的解码能力。进行调用的线程应该有一个有效的CUDA上下文与之绑定。

客户端在调用 cuvidGetDecoderCaps() 之前应该填充以下参数。

‣ eCodecType: Codec type (H.264, HEVC, VP9, JPEG etc.)
‣ eChromaFormat: 4:2:0, 4:4:4, etc.
‣ nBitDepthMinus8: 0 for 8-bit, 2 for 10-bit, 4 for 12-bit

cuvidGetDecoderCaps() 调用后,底层驱动填充CUVIDDECODECAPS的剩余字段,显示对于查询的能力的支持情况。

示例:

// set IN params for decodeCaps
decodeCaps.eCodecType = cudaVideoCodec_HEVC;//HEVC 
decodeCaps.eChromaFormat = cudaVideoChromaFormat_420;//YUV 4:2:0
decodeCaps.nBitDepthMinus8 = 2;// 10 bit
result = cuvidGetDecoderCaps(&decodeCaps);

// Check if content is supported
if (!decodecaps.bIsSupported){
   
评论 7
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值