在開始研究這部分代碼之前,重新回顧一下理論部分。
衆所周知,H.264及其之前的編碼标準中,VCL層的核心結構稱作“宏塊”(MacroBlock, MB),大小為16×16像素。一個宏塊裡面包含着一個16×16分辨率的亮度采樣矩陣和兩個8×8分辨率的色度采樣矩陣。相應的,在HEVC中,編碼所采用的塊結構為樹形編碼單元(Coding Tree Unit, CTU),每個CTU的大小由編碼器決定,并且通常要大于宏塊的16×16大小。比CTU更小的機關稱為樹形編碼塊(Coding
Tree Block, CTB),一個CTU由一個亮度信号CTB及其相應的色度CTB,以及其他一些文法元素構成。一個正方形的亮度CTB的邊長(以像素為機關)可能取16、32或者64個像素,CTB越大則壓縮效率越高。HEVC标準支援将一個CTB按照四叉樹的方法分割為多個更小的塊結構。
采用了四叉樹分割的方法後,這個樹結構儲存了亮度和色度編碼單元(Coding Unit, CU)的位置和大小。這個四叉樹結構的根與目前的這個CTU對應,也就是說,一個亮度CU最大可能的大小就是亮度CTB的大小。通常,一個CU的組成包括一個亮度編碼塊(Coding Block, CB),一個色度CB以及其他相應的文法元素。一個CTB可能包含一個CU,也可能被分割成多個CU,每一個CU進一步分割成預測單元(Prediction
Unit, PU)和樹結構的變換單元(Transform Unit, TU)。
判斷采用幀内預測還是幀間預測在CU層完成。PU的分割結構就以CU為根,根據基本的預測模式判定,亮度和色度CB被進一步分割,由亮度和色度預測塊(Prediction Block, PB)中擷取預測值。每一個PB的大小可能由64×64到4×4不等。預測的殘差信号由TU進行編碼。同PU類似,TU樹形結構的根節點也是CU,一個亮度CB的殘差信号可能由一個完整的變換塊(Transform Block,
TB)表示,也可能樹形分割成多個子TB。對4×4、8×8、16×16和32×32的正方形TB塊,HEVC依然采用整數變換;當TB大小為4×4,且采用幀内編碼的殘差信号則采用了一種類離散正弦變換的方法。
标準文檔的7.3.8.4節給出了Coding quadtree的文法結構:

該結構中的第一個文法元素split_cu_flag[x0][y0]表明這個Coding quadtree是否繼續四等分,下标x0和y0表示目前拟作為cu的像素塊左上角像素相對于該幀左上角的坐标。從該結構的定義來看,Coding
quadtree采用了遞歸的結構,隻要split_cu_flag[x0][y0]為1,則這個Coding quadtree就會繼續分割下去,直到split_cu_flag[x0][y0]為0時,這個Coding
quadtree進一步處理為一個coding unit。
回到代碼中。實作解析Coding
quadtree的函數由Void TDecCu::xDecodeCU( TComDataCU* pcCU, UInt uiAbsPartIdx, UInt uiDepth, UInt& ruiIsLast)實作:
TDecEntropy::decodeSplitFlag ( TComDataCU* pcCU, UInt uiAbsPartIdx, UInt uiDepth )函數調用m_pcEntropyDecoderIf->parseSplitFlag( pcCU, uiAbsPartIdx, uiDepth )來解析split_cu_flag[x0][y0]的值。在這個過程中,由于規定了最大的CUDepth為4,是以隻進行了4次分割便傳回。其後,将處理coding
block資料。