1. 程式人生 > >HM程式碼流程及函式功能

HM程式碼流程及函式功能

來自網上的文件,但是最初來源不知道是哪,謝謝這個作者!

整個流程可以從compressGOP函式開始著手: 1、compressGOP對一整個影象組(GOP)進行編碼,主要是遍歷GOP中每一幀,對每一幀進行單獨編碼 2、每一幀又會被劃分成若干slice(HM15中,每一幀對應一個slice),因此對每一幀的處理就轉換成對每一片的處理。 3、每一個slice都會呼叫compressSlice來對其進行預測、變換、量化等操作,然後選出最優的引數,最後呼叫encodeSlice對其進行熵編碼! 4、slice的劃分。編碼slice的時候並不是對整個slice進行處理,而是會繼續把slice劃分成LCU(最大的CU),然後對每一個CU遞迴呼叫compressCU和encodeCU進行編碼。其中encodeCU會被compressSlice和encodeSlice呼叫,在compressSlice中呼叫encodeCU的目的是為了選擇最優的引數,而在encodeSlice中呼叫encodeCU的目的是對CU進行熵編碼。 5、LCU的大小是64x64,一個slice可以劃分為若干LCU,而每一個CU(或者LCU)又可以遞迴地被劃分成4個子CU。如何判斷某一個CU是否會繼續向下劃分,可以根據RD(拉格朗日率失真)來判斷! 6、compressCU的實質就是對每一個CU遞迴的呼叫xCompressCU。在xCompressCU的內部,會根據幀的型別(I幀、P幀、B幀)進行不同的處理。對於I幀,進行的是幀內預測;對於P幀和B幀則進行幀間預測。 7、幀內預測的詳解(入口函式:xCheckRDCostIntra):
7.1、對於亮度分量:
7.1.1、呼叫estIntraPredQT。主要做模式選擇的工作,負責選出對於當前PU的最優模式,如DC、planar、角度等模式。
(1)首先對N個候選模式進行粗粒度篩選。代價函式是SATD+λ*ModeBits。選出若干個可能的候選模式。下面是相關的函式。
(2)predIntraLumaAng。計算當前PU的預測值。
(3)calcHAD。計算SATD代價。
(4)xModeBitsIntra。計算當前模式所消耗的位元數。
(5)xUpdateCandList。更新模式的代價,保持前N個模式的代價最小。
(6)選出N個模式之後,這N個模式會進入xRecurIntraCodingQT函式繼續處理。
7.1.2、呼叫xRecurIntraCodingQT。根據選出的模式進行PU的分割,然後進行變換量化等工作。
(1)這個函式會被呼叫兩次,第一次呼叫直接把PU當作TU,只為算出N個模式的RD代價,從而選出一個最優的,在這個最優的模式被選出後,再次呼叫這個函式,對這個最優的模式進行PU的分割。下面的是相關的函式。
(2)xIntraCodingLumaBlk。對當前TU進行求殘差,對殘差進行變換、量化、反量化、反變換、重建等一系列工作,並求出失真。
(3)xGetIntraBitsQT。求出當前模式的所有資訊進行熵編碼會產生的位元數。
(4)calcRdCos。根據 xIntraCodingLumaBlk得到的失真和 xGetIntraBitsQT產生的位元數進行RD代價的計算,從而比較各個模式的優劣。
(5)xSetIntraResultQT。儲存最優模式的資料。
7.2、對於色度分量,過程和亮度大部分一樣。
8、幀間預測的詳解:
8.1、幀間分為兩種方式,一種是預設的inter模式(入口函式xCheckRDCostInter),另一種是merge模式(入口函式xCheckRDCostMerge2Nx2N)。 8.2、inter模式的呼叫流程:xCheckRDCostInter——>predInterSearch——>encodeResAndCalcRdInterCU 8.3、merge模式的呼叫流程:xCheckRDCostMerge2Nx2N——>motionCompensation——>encodeResAndCalcRdInterCU 8.4、predInterSearch進行的是ME(運動估計)和MC(運動補償)的過程。 8.5、motionCompensation進行的是MC的工作。因為merge進行的是MV預測,因此沒有ME(運動估計)的過程。 8.6、encodeResAndCalcRdInterCU。根據預測值,求出殘差,然後進行TU的劃分,然後進行變換、量化等操作以及RD代價的計算。流程圖如下:
8.6.1、encodeSkipFlag。對skip模式的標誌進行編碼。 8.6.2、encodeMergeIndex。對MVP的索引進行編碼。 8.6.3、xEstimateResidualQT。在非skip模式的時候,進行RQT的決定(即應該把PU分割成什麼樣的TU)。 8.6.4、xAddSymbolBitsInter。計算當前模式在進行熵編碼時產生的位元數。 8.6.5、xSetResidualQTData。儲存當前最優的殘差資訊。
9、其他函式相關函式:
9.1、幀內
initPattern :判斷周圍塊的存在性
initAdiPattern:獲取周圍畫素的值當做生成預測值的畫素,並開闢出一片快取  區儲存經過多種濾波型別的預測值
getPredictorPtr: 根據不同模式選擇經過不同型別濾波的預測集
predIntraLumaAng: 對亮度訊號進行預測,裡面會呼叫 xPredIntraPlanar,xPredIntraAng 以及 xDCPredFiltering
predIntraChromaAng : 對色度訊號進行預測,裡面會呼叫 xPredIntraPlanar 和xPredIntraAng
xPredIntraPlanar: planar 模式的預測
xPredIntraAng: 角度的方向性預測
xDCPredFiltering: 對 DC 的預測值進行濾波 
getLumaRecPixels: 獲取亮度的重建值,為進行 LM 模式的預測做準備
predLMIntraChroma:對 LM 模式進行預測,即利用亮度的相關性,對色度進行預測 
9.2、幀間
getInterMergeCandidates: 獲取 merge 的候選運動引數集
motionCompensation:進行運動補償
xMotionEstimation:進行運動估計
xEstimateMvPredAMVP:選出代價最小的 MVP
xCheckBestMVP:在知道 MV 的情況下比較各個 MVP 的優劣,並儲存最優的
xMergeEstimation:在 inter 模式時也可以使用 merge 模式的運動估計方法,這個函式用於計算這種情況時的代價 
9.3、變換
transformNxN:會呼叫 xT 和 xQuant 函式
invtransformNxN:會呼叫 xDeQuant 和 xIT 函式
xT: 對殘差訊號進行變換
xQuant:對變換系數進行量化
xDeQuant :反量化
xIT:反變換
9.4、熵編碼(在這節中主要介紹編碼端為算 RD 代價而設計的熵編碼函式,實際的熵編碼函式在後面進行介紹)
9.4.1、幀內熵編碼
xEncIntraHeader: 編碼 intra 的一些頭部資訊, 主要包括: 模式號, PU 的分割型別,PCM 標誌,如果是 B 或 P slice,還包括 skip 的標誌位和編碼模式的型別
xEncSubdivCbfQT:會編碼 Cbf 和 TU 分割的標誌位
xEncCoeffQT:編碼每個 TU 的係數
encodeCoeffNxN:呼叫 codeCoeffNxN 來編碼每個 TU 的殘差係數
encodeTransformSubdivFlag: 呼叫codeTransformSubdivFlag來編碼TU分割的標誌,是否繼續分割
encodeQtCbf:編碼 cbf 標誌位,檢查是否有非零的係數
encodePredMode:編碼所採用的編碼模式
encodePartSize:編碼 PU 的分割型別
encodeIntraDirModeLuma:編碼 PU 的亮度模式號
encodeIntraDirModeChroma:編碼 PU 的色度模式號 
9.4.2、幀間熵編碼
encodePredMode:編碼所採用的編碼模式
encodePredMode:編碼所採用的編碼模式
encodePartSize:編碼 PU 的分割型別
encodePredInfo: 編碼運動引數 
(1) merge 的標誌位來區別是否採用 merge 模式,具體函式:encodeMergeFlag然後分(2)和(3)兩種情況。
(2) merge 模式:只需傳輸運動候選集的索引,具體函式:encodeMergeIndex
(3) 正常的 inter 模式
A. encodeInterDirPU:編碼幀間的預測方向,前向,後向,或多方向
B. encodeRefFrmIdxPU: 編碼參考幀索引
C. encodeMvdPU:編碼 MV 的殘差 MVD
D. encodeMVPIdxPU: 編碼 MVP 的索引 
10、熵編碼(encodeCU)。encodeCU以LCU為單位進行熵編碼。它的內部實際是針對每一個CU遞迴呼叫xEncodeCU。流程如下:
10.1、encodeSkipFlag 編碼是否是 skip 模式  10.2、encodeMergeIndex 如果是 skip 模式會編碼選用哪套 MVP 的引數
10.3、encodePredMode 編碼 CU 的模式,是 intra 還是 inter
10.4、encodePartSize 編碼 CU 中的 PU 的型別
10.5、encodeIPCMInfo 如果選用了 PCM 模式會編碼 PCM 模式的資訊
10.6、encodePredInfo 編碼預測的資訊,如果是幀內,編碼模式號,如果是幀間,則編碼運動資訊
10.7、encodeCoeff 編碼殘差係數
10.8、encodeCoeff 中會編碼 TU 的分割標誌位,cbf 和殘差係數的資訊