GOP

原文地址:http://bbs.chinavideo.org/viewthread.php?tid=14356&extra=page%3D1

GOP 一般指兩個IDR幀之間的距離,x264中和GOP中相關的參數有兩個,其一是-keyint,控制的是GOP中最大可能距離,另一個是-min-keyint,控制的是允許最小的GOP距離

IDR 和IDR有關的參數除了上面的GOP設定的兩個基本參數之外,還有一個scenecut控制瞭如何自適應的通過判斷場景的變化加入IDR幀,用來override之前的判斷。具體做法是通過計
算本幀和前一幀之間visual difference 在根據scenecut和minkeyint的設定值形成判斷,判定此處是否存在scenechange,判斷成立的話將本幀判斷爲IDR幀,反之則有可能爲I幀(判斷依據的前半成立)或者BP.

Ref frames 首先這是一個針對sub-mb level而言的參數,而不是一個從frame角度說的參數。假定在b-pyramid關掉的前提下,ref frames控制的是p幀內每個P sub-macroblock(8x8),它可以選擇的前向一遍嗎P/I幀的最大值,已編碼幀一般放在decoded picture buffer(DPB)中,而DPB的允許大小又level控制,這也是不同分辨率下DXVA Compatible Profile中ref設置的參照標準。在編碼過程中,P Frame中每個P的8x8 sub-MB,都會在ref規定的DPB中尋找最合適(比如difference最小)的某一幀的某一位置作爲它的參考塊。在沒有weightp引入 的前提下,對每一個P Sub-MB而言,最終作爲參考總對象的只可能有一個。

Weightp,我們來看weightp下的情況()


編碼順序:
我們回到最基本的無weightp下,站在frame level的角度說下編碼的順序是怎樣的,同時假設我們處理的第一真是IDR幀,此處所有的“向後”指的是回訪順序時間增長的方向:
1.        編碼IDR幀
2.        根據scenecut 和 min-keyint的設置,向後移動 min-keyint的距離,開始判定是否爲scenechange,直到判定滿足,或者到達keyint設置值的距離時候停止。同時記錄判定條件不完全滿足時候的位置。
3.        編碼找到的爲指針,亦爲IDR幀,GOP形成。
4.        根據2步中得到的判定條件不完全滿足的位置,將對應幀按時間順序用I編碼。
5.        找到最頭上IDR和離其最近的I幀形成的Sub-GOP(嚴格意義上說此處並非GOP因爲GOP之間不能交換信息,)結合bframes的設定大小,推斷P幀出現的位置。具體而言,按時間順序走每一幀比較該幀用P編碼和B編碼時的視覺誤差和複雜度何者更大,根據某些公式推導出此處應該用何種幀類型,再向後移一幀;如果直到bframes規定的值都未出現P,則強制插入一幀P。這樣就決定了每個sub-GOP內P幀的位置。
6.        最後一步,根據I/IDR/P形成的子區間,按時間順序編碼各幀爲B幀。

例子
100-120幀這樣的一段視頻
第一步結束後編碼完成 100幀
第二步結束後可能編碼完成 120幀和110幀 (IDR幀)同時找出了104,108, 115幀應該編碼爲I
第四步結束後編碼完成104 108 115 幀爲I
第五步對 100-104  104- 108  108-110   110 – 115  115-120五個子區間,判斷P幀出現的位置並編碼有可能判斷出102  113  118 爲p幀
最後一步在編碼之間的部分爲B幀
於是解碼過程的輸出幀順序其實是 
100  110  104  108  102  101  103  105 106   109.。。。。。。。即(GOP邊界,I I PBBBBBB)


(二)關於碼流中的三種隨機接入點的解釋:

BLA、CRA、IDR是文獻中提到過的三種隨機接入點(RAP),在文獻中的解釋的確不是很容易理解。更關鍵的是,與這三個名詞相應的還有GOP,open/closed GOP, RASL,RADL等等概念,環環相扣,一個不理解,剩下的也很難弄懂,下面我們一個一個解釋,很多也是我自己剛剛想到的,不一定正確全面,歡迎批評。

(1)關於GOP。這是圖像組(Group of Pictures)的意思,表示編碼的視頻序列分成了一組一組的有序的幀的集合進行編碼。每個GOP一定是以一個I幀開始的,但是卻不一定指代的是兩個I幀之間的距離。因爲一個GOP內可能包含幾個I幀,只有第一個I幀(也就是第一幀)纔是關鍵幀。在程序cfg中,GOP的長度和兩個I幀的距離也是兩個不同參數指定的(如IntraPeriod和GOP Size或者類似的參數)。所以,兩個I幀的間距不可能大於GOP的長度,一般情況是更小的。

(2)關於IDR。這個詞兒的全稱是Instantaneous Decoding Refresh,是在H.264中定義的結構。在H.264中,IDR幀一定是I幀,而且一定是GOP的開始,也是H.264 GOP的關鍵幀。但是反過來卻不成立,I幀不一定是IDR幀。GOP的長度不是定死不變的,在H.264的編碼器中,如果判定場景發生變化,那麼即使不到原定GOP的末尾,也會在這個位置加入一個IDR,作爲新一個GOP的開始。此時這個GOP的長度就被縮小了。

(3)閉合GOP和開放GOP(closed GOP/open GOP),CRA。閉合GOP是H.264中GOP的格式。在H.264的GOP中,所有的GOP都是獨立解碼的,與其他GOP無關,即它們都是“封閉”的。但是在HEVC中,GOP的結構發生了變化,採用了“開放”的結構,在解碼過程過可能會參考其他GOP的數據。這時,一個GOP的起始幀命名爲CRA,clean random access,同樣採用幀內編碼,但是這個GOP內的幀間編碼幀可以越過CRA參考前一個GOP的數據,這便是GOP的open。

(4)關於BLA。個人感覺BLA只是CRA在視頻流切換情況下的一種特例。視頻流在某個RAP上要求切換到另一個視頻流繼續解碼,則直接將該CRA同另一個視頻流中的接入CRA連接,後者便是BLA。由於BLA之前解碼到緩存的視頻流與當前視頻流無關,因此其特性類似於直接從該點進行隨機存取後的CRA。

(5)RASL和RADL。這是兩種GOP間的圖像類型。如果解碼器從某個CRA隨機接入,則按照顯示順序的後面幾幀數據由於缺少參考幀而不能解碼,這些圖像將被解碼器拋棄,即skip leading。而對於沒有從當前CRA接入的數據,這些圖像可以被正常解碼顯示,因此稱爲decodable leading。由於這些數據是有可能捨棄的,因此其他圖像(trailing pictures)不能參考這些數據,否則萬一這些圖像被捨棄,將會有更多的圖像受其影響而不能正常解碼。

下面舉個例子:

假設視頻序列的顯示順序爲①,這是一個完整的GOP,解碼順序爲②

①I B B P B B P B B P

②I P B B P B B P B B

在H.264中,第一個I幀爲IDR,GOP爲閉合結構,因此兩個GOP組成視頻的結構爲

I B B P B B P B B P I B B P B B P B B P(顯示順序)

I P B B P B B P B B I P B B P B B P B B(解碼順序)

而在HEVC中,兩個I幀爲CRA,GOP爲開放結構,因此GOP的結構爲:

I B B P B B P B B P B B I B B P B B P B (顯示順序)

I P B B P B B P B B I B B P B B P B B...(解碼順序)

兩個紅色的B幀表示的是按照解碼順序在CRA之後,該GOP內參考的前一個GOP進行編碼的圖像。這樣便很容易得知,如果選擇在第二個CRA進行隨機接入,這兩個紅色的B幀將會由於沒有參考幀無法解碼而被捨棄。這兩個紅色的B幀即RASP。如果沒有選擇這個CRA進行隨機接入,這兩個紅色B幀將可以順利解碼,即成爲RADP。

對於BLA,情況也是類似的。由於出現碼流拼接,第二段碼流的CRA之後的B也會因爲沒有參考幀無法解碼而丟棄。很容易理解,此時緩存中的參考幀數據還來自上一段碼流,跟當前碼流沒關係,當然不能用作B的參考了。

之餘HEVC這麼設計的目的,我覺得應該是爲了編碼效率考慮的。因爲B幀的壓縮比相對是最高的,引入這種設計可以在不影響隨機存取性能的前提下,儘可能增大B幀的比重,提高整體壓縮編碼的性能。

以下是一些國外研究者在論壇中對這個問題的一些討論,可以拿來做一下參考:

www.linkedin.com/groups/IDR-vs-CRA-3724292.S.125836481

forum.doom9.org/archive/index.php/t-105129.html


(三)


1、由圖像幀到樹形編碼單元的分割

一幀圖像分割成樹形編碼單元(coding tree units,CTUs),CTU包含亮度和色度分量CTB,是基本的處理單元。亮度分量CTB爲邊長爲16、32或者64的矩形塊,色度CTB的邊長爲亮度的一半,CTB的實際大小由碼流中的序列參數集合指定。更大尺寸的分塊可以更好地處理高清視頻信號。

2、由CTB分割爲CB:

亮度和色度CTB可以按照四叉樹結構進一步分解爲CB。四叉樹結構可以根據視頻信號的區域特徵將CTB分割成合適大小的CB塊。分割過程可反覆迭代,知道亮度CB的大小爲可支持的最小值8×8。在圖像的邊界處,CB爲最小支持尺寸。解碼器對可能“越界”的CTB會做專門處理。

3、PB和PU

每個CU的預測模式可能爲幀內或者幀間。若預測模式爲幀內,除了最小尺寸模式外,PB的尺寸等於CB。若是最小尺寸模式,則用標誌位表示是否將CB分割成四個PB塊。這樣最小可以支持到4×4大小的幀內預測塊(此時色度分量PB也爲4×4)。

若預測模式爲幀間預測,亮度和色度CB可能分割爲1/2/4個PB。只有CB爲最小尺寸模式時才能分割爲4個PB塊。CB分割爲四個PB時,每個PB佔據CB的1/4;CB分爲兩個PB時,可選擇6種分割模式的一種,其中包含不平均分割模式(只針對16×16及以上的亮度塊)。每個幀間預測PB包含一個或者兩個運動矢量和參考幀索引。爲控制編碼效率,4×4亮度塊不允許使用幀間預測,8×4和4×8最多隻允許單向預測編碼。

(四)

GOP in MPEG-1

ISO 11172-2, p24

Group of Pictures:

圖像組是一個或多個解碼後的圖像,用於可以隨機存取。一個GOP的第一幀爲I幀,編碼碼流中的圖像順序就是解碼器輸出的順序;特別的,臨近的B幀按照顯示順序編碼;按照顯示順序排列的最後一幀需爲I或P幀。一個GOP的長度不定,至少要包含一個I幀,支持隨機接入、調速播放的應用,應該使用相對較小的GOP。在場景切換以及其他運動估計不好的地方也可以作爲GOP的起始位置。B幀的數目也是可變的。


GOP in MPEG-2

ISO 13818-2, p6

Group of Pictures headers:

在MPEG-2中,GOP的概念由Group of Pictures headers來實現(p6)。GOP頭是視頻序列中的可選結構,在序列頭(sequence header)之後。在一個序列之中,有多幀之前可能存在重複序列頭(repeat sequence header)或者(group of picture header),或者二者兼備(p16)。在編碼碼流的某些I幀前面,可能會加入一個GOP頭,以向解碼器說明在將該位置作爲隨機接入點及後續B幀能不能正常解碼(p18)。

MPEG-2中的Group of Pictures headers是一個結構體,包含group_start_code,time_code, closed_gop和broken_link等元素(p34)。


Syntax Element Structs in H.264/AVC

到了H.264/AVC中,語法元素的結構發生了重大變化。在H.264中圖像組GOP的概念被大大弱化了。比如,在標準文檔ISO/IEC 14496-10中,用GOP或者group of picture這類關鍵詞搜索,幾乎得不到什麼結果。同時,在JM86的代碼的配置文件中,也沒有指定如GOP長度之類的設置。

配置文件中,I幀週期IntraPeriod設置的值不包括B幀,僅僅表示I幀在I/P序列中的週期;B幀的位置和數目由跳過幀數FrameSkip和B幀數目NumberBFrames決定。

在H.264中,編碼層的語法元素分爲了五層結構:序列參數集、圖像參數集、條帶(slice)、宏塊和子塊。序列層和圖像層被取消了,並將二者的頭結構中的數據分離出來形成了參數集。在解碼過程中,圖像參數集會參考序列參數集,而條帶會參考圖像參數集,真正在編解碼中發揮具體作用的是條帶這一結構。參考同一個圖像參數集的各個條帶,並不一定屬於同一幀圖像。

H.264定義了IDR圖像,通常是一串圖像序列的第一幀。引入該概念是爲了解碼同步的因素,當解碼器解碼到一個IDR圖像時,立刻清空參考幀隊列,輸出或拋棄解碼的數據並重新查找參數集,開始一個新的序列。

(五)HEVC及其RPS

【參考文獻主要來自HM代碼自帶的software-manual.pdf和Overview of HEVC High-Level Syntax and Reference Picture Management
GOP in HEVC
software-manual.pdf in HM-10.0, p2
定義了視頻序列中重複出現的GOP幀結構。在配置文件的的Coding Structure部分,定義了I幀結構,DecodingRefreshType和GOPSize;此外還有GOP種每一幀的參數設置,列表中按照解碼順序排列。各個幀的參數設置中指定了當前以及以後用到的參考幀等數據。其中各個參數的具體含義如下:
    Type:條帶類型,爲I,B,P之一;
    POC:GOP內圖像的顯示順序,取值範圍爲1-GOPSize;
    QPOffset:量化參數偏移量,用於計算本幀的實際量化參數;
    QPFactor:用於率失真優化的權值;
    tcOffsetDiv2:環路濾波器參數的偏移量;
    betaOffsetDiv2:環路濾波器參數的偏移量;
    temporal_id:當前幀所在的時域子層的序號;
    num_ref_pics_active:參考圖像列表(reference picture lists)L0和L1的大小;表明在編碼過程中使用了多少個參考幀;
    num_ref_pics:當前幀所保有的參考幀數,包括當前幀以及未來幀所用到的參考幀;
    reference pictures:保存相對於當前幀POC的參考幀的POC,數量又num_ref_pics指定。
    predict:定義inter_ref_pic_set_prediction_flag的值。0表示編碼RPS不需要RPS預測,並忽略後面的deltaRIdx-1, deltaRPS等參數;1表示需要RPS預測,使用deltaRIdx-1, deltaRPS, num ref idcs和Reference idcs;2表示需要RPS預測,但僅使用deltaRIdx-1;
    deltaRIdx-1:當前RPS索引同預測RPS索引的差值-1;
    deltaRPS:預測RPS同當前RPS的POC之差;
    num_ref_idcs:編碼當前RPS的ref_idcs的數量;
    reference_idcs:指定RPS間預測的ref_idcs。
該文檔舉例如下圖所示:
【HEVC學習與研究】22、回顧:讓人崩潰的GOP(下)——HEVC及其RPS
該序列的GOPSize=4,Frame 1對應POC=4,參考POC=0,因此-4爲參考幀;Frame 2對應POC=2,參考POC=0、4,因此參考幀爲2,-2;Frame 3對應POC=1,參考POC=0、2,也要參考POC=0、4,因此參考幀爲-1,1,3;Frame 4對應POC=3,參考幀爲-1,1;
Frame 2-4 支持RPS間預測,因此predict參數設置爲1;Frame 2 使用Frame1作爲predictor,因此deltaRIdx-1設置爲0,同理可得Frame 3、4的deltaRIdx-1值;deltaRPS爲參數predict減去當前POC的值;
這兩個值的含義區別:根據標準文檔的說明,deltaRIdx-1表示選定的短線RPS元素同stRpsIdx(該值可認爲等於當前活動SPS中num_short_term_ref_pic_sets的值,即短線RPS的個數),即在predictor中選定一個參考幀【此處尚存疑問......】;deltaRPS的作用是根據當前POC和deltaRPS尋找predictor。
最後,reference_idcs有一串0/1/2數字組成,共有num_ref_idcs個。其中最後一個代表該幀的predictor,其餘表示predictor的RPS。取0/1/2分別對應該幀爲當前幀的參考、後續幀的參考以及不用做參考。

RPS

A. 引言
描述了DPB中解碼圖像如何管理以用作參考。HEVC的RPS同前期標準的參考幀管理方法完全不同,每一個slice均需標明DPB狀態("短期參考/長期參考/非參考")。其目的在於增強容錯魯棒性。

B. 背景

C.RPS概念
HEVC提出來一種全新的參考幀管理方法,對當前和後續圖像的每一個slice,均使用一個完整的參考圖像集合,所以需要保存DPB中完整圖像的集合供當前和後續圖像參考。與此不同的是H.264/AVC中只標識了DPB中相關的變化。藉助RPS,不再需要之前解碼圖像的信息來維護DPB中參考幀的狀態。

D. RPS舉例
根據上圖,每一幀的RPS列在下表。
B4的RPS中不包含I0,因此對B4,I0被標記爲“不用作參考”,因此I0不能被用作B4以及按解碼順序在B4之後的幀的參考幀。

E. 圖像解碼和DPB操作的順序
在H.264/AVC中,當前幀解碼完成後,進行參考幀標記和DPB操作(從緩存中輸出和移出圖像);在HEVC中,首先從當前幀的slice頭中解碼出RPS,並在解碼當前幀之前進行參考幀標記和DPB操作。

F. RPS數據傳遞
HEVC中每一個slice header都要包含當前幀的RPS數據(IDR條帶除外,其RPS隱含爲空);除此之外,即使是I幀的slice可能也包含RPS數據,因爲按照解碼順序在它後面的幀可能會參考它之前的數據;RPS中圖像的數量不能超過DPB的大小。
RPS使用POC標識參考幀,除了所在當前幀的POC之外,每一個slice header都直接包含(或者繼承自SPS)RPS中每一幀圖像的POC。
每個圖像的RPS包含5個不同的參考圖像表:
    RefPicSetStCurrBefore:解碼和輸出順序均在當前幀之前的短線參考幀,可用於當前幀的幀間預測;
    RefPicSetStCurrAfter:解碼順序在當前幀之前,輸出順序在當前幀之後的短線參考幀,可用於當前幀的幀間預測;
    RefPicSetStFoll:按解碼順序在當前幀之後的圖像可用的短線參考幀,不能用於當前幀的幀間預測;
    RefPicSetLtCurr:可用於當前幀的幀間預測的長線參考幀;
    RefPicSetLtFoll:按解碼順序在當前幀之後的圖像可用的長線參考幀,不能用於當前幀的幀間預測;
RPS根據參考圖像類型的不同,分別使用三個循環迭代來傳遞數據:POC比當前幀更低的短線參考幀、POC比當前幀更高的短線參考幀、長線參考幀;除此之外,還將爲每一幀傳遞一個標識used−by−curr−pic−X−flag來說明是否用作了當前幀的參考幀;
下圖爲一組圖像的例子:
在上圖中,B14這一幀包含了上述5個不同的RPS子集的元素:
    P8:屬於RefPicSetStCurrBefore——該幀在B14之前,且用作B14的參考幀;
    P12:屬於RefPicSetStCurrAfter——該幀在B14解碼順序之後,且用作B14的參考幀;
    P13:屬於RefPicSetStFoll——短線參考幀,不用於當前幀的參考,可用於後續圖像(B15)的參考;
    P4:屬於RefPicSetLtCurr——長線參考幀,用於B14的參考;
    I0:屬於RefPicSetLtFoll——長線參考幀,不能用於B14的參考,可用於後續圖像(B15)的參考;
    【疑問:長線和短線具體是怎麼區分的?】
1). 傳輸RPS中的短線參考幀:
RPS的短線參考幀可以直接包含在slice頭中。另外slice頭可以只包含一個表示索引值的語法元素指向活動SPS中傳輸的RPS預定義的表。RPS的短線參考幀可使用Intra RPS或者Inter RPS(下一節詳述)方式傳遞。使用Intra RPS時,傳遞num−negative−pics和num−positive−pics兩個參數表示兩個參考幀列表的長度,分別包含POC相對當前幀爲正和爲負的參考幀。表中的每個元素採用定長編碼,表示與列表中前一個元素的POC差值-1;
2). 採用Inter RPS傳輸PRS中的短線參考幀:
所謂Inter RPS,表示編碼SPS中的循環RPSs時,可以通過參考SPS中已經編碼的其他RPS的方式實現。採用這樣的設計源於當前圖像的RPS可以從先前解碼的圖像RPS中預測,因爲當前幀的參考幀必須是前幀的參考幀或者前幀自身,只需標記那些幀是參考幀,可用於當前幀的預測。Inter RPS語法由以下組成:指向用作predictor的RPS的索引,predictor PRS和當前PRS的差值,指示那些圖像是參考幀及是否用於當前和後續圖像預測的標識。
3). 傳輸PRS中的長線參考幀:
採用長線參考幀必須將SPS中的long−term−ref−pics−present−flag標誌位設爲1。slice頭中的定長編碼字段poc−lsb−lt表示每一個長線參考幀POC的least significant bits,該值是爲某特定長線參考幀傳輸的碼字pic−order−cnt−lsb的拷貝。除此之外也可以在SPS將一系列長線參考幀表示爲POC LSB的列表,並在slice頭中設定POC LSB作爲該表的索引。語法元素delta−poc−msb−cycle−lt−minus1可用於計算長線參考幀同當前幀的完整POC距離,需要爲RPS中與其他參考幀的POC LSB相同的幀指定delta−poc−msb−cycle−lt−minus1值。

G. 圖像標記
在解析slice頭時,圖像標記過程在解碼slice數據之前進行,DPB中被標記爲“used for reference”但未被包含在RPS中的圖像被標記爲“unused for reference"。如果圖像的used−by−curr−pic−X−flag爲0,且被包含在RPS中但是DPB中不存在,則該幀被忽略,但是若used−by−curr−pic−X−flag爲1,則意味着該幀本應該用於參考但是發生了丟失,這種情況由解碼器處理。
當前幀解碼完成後,該幀被標記爲“用於短線參考”。

H. POC, FrameNum和不存在的幀
HEVC不傳輸FrameNum或者產生和處理不存在的幀。由於RPS中包含了DPB中各個參考幀的狀態因此不再需要產生和處理不存在的幀。在RPS中參考幀以POC識別,這樣即使圖像從碼流中移除或者出現丟幀的情況下也能確定輸出順序。

I. RPS的差錯恢復
只要used−by−curr−pic−X−flag設置爲1但DPB中不存在,解碼器便可以檢測到參考幀意外丟失發生。這時解碼器可以創建一個隱藏幀,或者通過反饋渠道向編碼端發送消息。


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章