NIVIDIA 硬解码学习1

NIVIDIA 硬解码学习1

https://blog.****.net/poweroranger/article/details/77845238

https://blog.****.net/LG1259156776/article/details/73274226

https://www.cnblogs.com/betterwgo/p/6613641.html

1. 前言

2. 例程介绍

  • nvidia提供了source, parser, decoder三个基本模块。
  • source是用来解析视频文件(例如:纯h.264文件)
  • parser是用来解析视频并得到一帧帧的数据
  • decoder就是解码

NIVIDIA 硬解码学习1

NIVIDIA 硬解码学习1

VideoSource

  • VideoSourceData中包含了CUvideoparser和FrameQueue,通过上图可以看出,CUvideoparser是在VideoDecoder基础上实现了接口的封装,而VideoSource则是通过CUvideoparser进行解码。FrameQueue是存储硬件解码后图像的队列,注意硬件解码完的图像是存放在GPU显存里面了,而VideoDecoder中函数mapFrame,可完成从显存到内存的映射。

VideoParser

  • VideoParser中最重要的是三个回调函数,static int CUDAAPI HandleVideoSequence(void *pUserData, CUVIDEOFORMAT *pFormat), HandlePictureDecode(void *pUserData, CUVIDPICPARAMS *pPicParams),HandlePictureDisplay(void *pUserData, CUVIDPARSERDISPINFO *pPicParams),实现对视频格式变换、视频解码、解码后显示等处理功能。HandleVideoSequence主要负责视频格式进行校验,没有实现其他功能,解码函数HandlePictureDecode调用的就是VideoDecoder的解码函数(CUDA的接口),显示函数HandlePictureDisplay完成了解码后GPU图像进入FrameQueue。

VideoDecoder

  • 该类是最核心的硬件解码功能类,CUVIDDECODECREATEINFO oVideoDecodeCreateInfo_是创建解码信息结构体,CUvideodecoder oDecoder_是最内核的CUDA硬件解码器,VideoParser的解码功能实际上是在CUvideodecoder解码内核上封装实现的(层层封装导致源码有点复杂,所以想看懂实现机制需要有点耐心)。