姓名:王一帆
學號:20011110225
轉(zhuǎn)載自https://blog.csdn.net/qjh5606/article/details/82658606
【嵌牛導讀】為了在項目中能夠利用nvidia的硬件解碼和編碼能力稍味,提高單機的編解碼并行能力战虏,本文簡單介紹了nvidia硬件解碼的部分內(nèi)容衰粹。
【嵌牛正文】
https://blog.csdn.net/poweroranger/article/details/77845238
官方提供的資料比較少,只包括一頁的視頻解碼器介紹和示例代碼
nvidia提供了source, parser, decoder三個基本模塊。
source是用來解析視頻文件(例如:純h.264文件)
parser是用來解析視頻并得到一幀幀的數(shù)據(jù)
decoder就是解碼
VideoSourceData中包含了CUvideoparser和FrameQueue,通過上圖可以看出,CUvideoparser是在VideoDecoder基礎(chǔ)上實現(xiàn)了接口的封裝讥耗,而VideoSource則是通過CUvideoparser進行解碼。FrameQueue是存儲硬件解碼后圖像的隊列疹启,注意硬件解碼完的圖像是存放在GPU顯存里面了古程,而VideoDecoder中函數(shù)mapFrame,可完成從顯存到內(nèi)存的映射喊崖。
VideoParser中最重要的是三個回調(diào)函數(shù)挣磨,static int CUDAAPI HandleVideoSequence(void *pUserData, CUVIDEOFORMAT *pFormat), HandlePictureDecode(void *pUserData, CUVIDPICPARAMS *pPicParams)荤懂,HandlePictureDisplay(void *pUserData, CUVIDPARSERDISPINFO *pPicParams)茁裙,實現(xiàn)對視頻格式變換、視頻解碼节仿、解碼后顯示等處理功能晤锥。HandleVideoSequence主要負責視頻格式進行校驗,沒有實現(xiàn)其他功能廊宪,解碼函數(shù)HandlePictureDecode調(diào)用的就是VideoDecoder的解碼函數(shù)(CUDA的接口)矾瘾,顯示函數(shù)HandlePictureDisplay完成了解碼后GPU圖像進入FrameQueue。
該類是最核心的硬件解碼功能類箭启,CUVIDDECODECREATEINFO oVideoDecodeCreateInfo_是創(chuàng)建解碼信息結(jié)構(gòu)體壕翩,CUvideodecoder oDecoder_是最內(nèi)核的CUDA硬件解碼器,VideoParser的解碼功能實際上是在CUvideodecoder解碼內(nèi)核上封裝實現(xiàn)的(層層封裝導致源碼有點復雜傅寡,所以想看懂實現(xiàn)機制需要有點耐心)放妈。