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 和殘差係數的信息 
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章