HM 配置文件GOP詳解

GOP in HEVC

定義了視頻序列中重複出現的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。
該文檔舉例如下圖所示:

該序列的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中不存在,解碼器便可以檢測到參考幀意外丟失發生。這時解碼器可以創建一個隱藏幀,或者通過反饋渠道向編碼端發送消息。

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