1. 程式人生 > >HEVC之tiles、slice、slice segment、CU、PU、TU分析

HEVC之tiles、slice、slice segment、CU、PU、TU分析

(一)

(1)   編碼樹單元(CTU)和編碼樹塊(CTB)結構:

在之前的標準中,編碼層的核心是巨集塊,一個巨集塊包含一個16×16的亮度塊,以及對於常用的4:2:0取樣格式來說還包含兩個8×8的色度塊;而在HEVC中類似的結構為編碼樹單元(CTU),其尺寸由編碼器進行指定且可以比傳統的巨集塊大。一個CTU包含一個亮度CTB和兩個對應的色度CTB及句法元素。一個L×L的亮度CTBL可以設定為16,32或者64。一般來說,L越大,可以獲得越好的壓縮效能。HEVC支援使用樹結構和類四叉樹的標誌來將CTB劃分成更小的塊。

(2)   編碼單元(CU)和編碼塊(CB):

CTU的四叉樹句法指定了它所屬的亮度和色度CB

的尺寸和位置。四叉樹的根與CTU相關聯。因此,亮度CB的最大尺寸為其所屬的亮度CTB的尺寸。對於一個CTU來說,其亮度CB和色度CB的劃分標誌都是使用的同一個。一個亮度CB通常和兩個色度CB及它們相關的句法共同組成一個編碼單元(CU)。一個CTB可能只包含一個CU,也可能被劃分成多個CU,每個CU包含著與之相關聯的預測單元(PU)和變換單元(TU)。

(3)   預測單元(PU)和預測塊(PB):

決定一個影象區域是以幀間還是幀內方式進行預測是在CU層進行的。一個PU劃分結構的根在CU層。根據基本的預測型別,亮度CB和色度CB可以繼續進行劃分並利用其它的亮度PB和色度PB進行預測。HEVC支援多種PB

尺寸,最大為64×64到最小4×4

(4)   變換單元(TU)和變換塊(TB):

預測殘差以塊變換的方式進行編碼。一個變換單元樹結構的根在CU層。亮度CB殘差的尺寸可能與亮度變換塊TB的尺寸相等,也可能會被劃分成更小的亮度TB。色度CB的情況也是一樣的。定義了與離散餘弦變換(DCT)類似的整數變換的基本函式提供給尺寸為4×48×816×1632×32TB。對於尺寸為4×4且殘差由幀內預測得到的TB來說,一種以離散正弦變換(DST)為基礎的整數變換可供採用。

(二)!!!

HEVC中的影象的分塊分割方法

1、條帶與區塊

在HEVC的視訊編解碼過程中,一幀影象會被分割成條帶(slice),條帶片段(slice segment)和區塊(tiles)

進行處理。條帶和區塊都是可採取的獨立分割形式之一。而條帶則是由條帶片段組成的元素,包括獨立條帶元素和依賴性條帶元素兩類。


上圖即為一幀影象分割成條帶的示意圖。在該圖中,該幀影象被分割成兩個條帶,其中第一個條帶包含一個獨立條帶片段(包含4個樹形編碼單元CTU)和兩個依賴條帶片段;第二個條帶包含一個獨立條帶片段。

區塊是另一種區域分割方法,某個區塊必須為矩形,由整數個CTU組成。對於條帶和區塊,或者所有同一個條帶的CTU均屬於一個區塊(tiles),或者同屬於一個區塊的CTU均屬於一個條帶;類似的,或者同屬於一個條帶片段的CTU需屬於一個區塊,或者同屬於一個區塊的CTU必須屬於同一個條帶片段。下圖是某一幀分割成左右兩個區塊的示例圖,分別表示整幀影象僅包含一個條帶以及每個區塊分別包含多個條帶的情況。


2、塊與四叉樹結構

樹形編碼塊(Coding Tree Blocks, CTBs)是一幀中畫素組織的基本結構。亮度CTB的邊長、色度CTB的長和寬分別由引數CtbSizeY、CtbWidthC和CtbHeightC指定。對於每個CTB,都有一個塊分割標識,用來表示預測和變換編碼塊的大小。分割從根(CTB)開始,進行四叉樹分割,直至到達葉子節點(CB)。而CB又是預測樹(Prediction tree)和變換樹(Transform tree)的根節點,這兩個樹分別表示預測塊和變換塊的位置大小。

畫素塊和相應語法元素的封裝格式可能有如下情況:

(1)三個預測塊(亮度和色度)或者單一一個預測塊(單色影象或separate_colour_plane_flag為1,也就是三個分量當做三個獨立影象分別編碼),與相應的語法結構組成一個預測單元Prediction unit(PU);

(2)一個或三個變換快(情況與以上類似),與相應的語法結構組成一個變換單元Transform unit(TU);

(3)一個或三個編碼塊CB,與相應的語法元素組成為一個編碼單元coding unit(CU);

(4)一個或三個樹形編碼與相應的語法元素組成一個樹形編碼單元coding tree unit(CTU)

 (三)HEVC的條帶頭解析 

一個條帶由整數個coding tree units組成的編碼視訊流的結構,包含一個非依賴性條帶元素和0到多個依賴性條帶元素。若當前某個條帶元素屬於非依賴性條帶元素,或者是按照解碼順序在當前的依賴性條帶元素之前的第一個非依賴性條帶元素的slice element header被稱作當前條帶的條帶頭。另一方面,條帶元素頭中的資料應用於該條帶元素中的第一個或者所有的coding tree units。以下是我們的例項中,一些引數的取值情況和意義first_slice_sement_in_pic_flag: 當前為1,表示當前的slice element為該幀內按照解碼順序的第一個slice element;no_output_of_prior_pic_flag: 決定是否輸出非首幀IDR或BLA之後的影象資料;slice_pic_parameter_set_id : 指定該slice參考的PPS的id值,取值範圍為[0,63];當前值取0;slice_type : 指定slice的型別,可能取值為0,1,2,分別表示B,P,I條帶,當前為2,表示slice的編碼型別為I;slice_sao_luma_flag : 此處取1,表示對當前slice中的亮度分量啟用SAO;slice_sao_chroma_flag : 此處取1,表示對當前slice中的色度分量啟用SAO;slice_qp_delta : 決定了該slice中CB的初始量化引數,QP可能被coding unit層的引數修改;此處該引數為6,因此CB的初始QP為SliceQPY = 26+init_qpminus26+slice_qp_delta=26+0+6=32;slice_loop_filter_across_slices_enabled_flag : 此處取1,表示環路濾波器可以跨越slice邊界進行操作;否則只能在slice內部操作;