通過解碼器代碼的研究,已經對HEVC的編解碼技術有了一個初步的認識。現在我們就對照着編碼器的代碼進一步了解HEVC視訊編碼算法的各個技術細節。
編碼器在整個HM解決方案中的工程名為TAppEncoder,入口點函數位于encmain.cpp檔案中:
可以很清楚地看到,整個main函數非常簡潔清晰,主要可以分為幾大部分,分别是輸入軟體資訊、建立編碼器類的執行個體、解析配置檔案、擷取開始時間、編碼資料、計算耗費時間和銷毀編碼器類的執行個體幾大部分。我們主要關心的編碼過程僅通過調用編碼器執行個體的一個方法實作:
該函數的實作如下:
該函數中首先調用pcPicYuvOrg->create( m_iSourceWidth, m_iSourceHeight, m_uiMaxCUWidth, m_uiMaxCUHeight, m_uiMaxCUDepth )配置設定YUV資料緩存,然後再while循環中逐幀讀取YUV資料、設定目前以編碼的幀數、編碼目前幀、寫出碼流,随後做其他清理工作。核心功能實作在m_cTEncTop.encode( bEos, flush ? 0 : pcPicYuvOrg, m_cListPicYuvRec, outputAccessUnits,
iNumEncoded )函數中。在該函數中調用m_cGOPEncoder.compressGOP(m_iPOCLast, m_iNumPicRcvd, m_cListPic, rcListPicYuvRecOut, accessUnitsOut)進行編碼一個GOP的操作。這個函數奇長無比,用了接近1500行代碼,看來實作了很多很多很多的功能。這個碉堡了的函數究竟做了些啥事兒呢?這個函數中大部分内容就是在為了編碼目前slice做準備,以及編碼完成之後一些輔助操作。實際編碼過程的操作由以下函數m_pcSliceEncoder->compressSlice(
pcPic )實作。
這又是一個碉堡了的函數,占了将近400行……代碼就不貼了,會死人的……簡單看下好了。
首先還是各種編碼的配置,包括配置熵編碼器、初始化CU編碼器等。在完成了一長串的設定之後,在compressCU函數中實作對一個CU的編碼:
具體的細節,且待下文。