【HEVC簡介】Inter Prediction Tools


參考文獻:見《High Efficiency Video Coding (HEVC)》Inter-Picture Prediction in HEVC章節

《HEVC標准介紹、HEVC幀間預測論文筆記》系列博客,目錄見:http://www.cnblogs.com/DwyaneTalk/p/5711333.html

 DPB

        在HEVC的編碼端,會維護一個DPB存放解碼的圖像。對於每個CVS里的圖片,都有一個唯一的POC(不同CVS里的圖片,POC可以相同),POC的范圍是-2^31~2^31-1,POC的值(PicOrderCntVal)LSB部分在slice header里通過slice_pic_order_cnt_lsb,MSB部分通過先前圖片推斷出來。PDB里面的圖片可能是會被參考或者還沒有輸出的。解碼端需要維護同樣一個PDB,需要的PDB size是通過SPS里的sps_max_dec_pic_buffering_minus1傳輸的。
        PDB中圖像,如果不會再被參考的,則成為non-reference pictures,non-reference pictures存儲在PDB里,是因為按照output order還沒有被輸出。對於需要被參考的圖像,根據下面敘述的規則分為short-term reference pictures和long-term reference pictutres。
          There is a rule determining how long a short-term picture can stay in the DPB. It says that the POC span of the set of pictures consisting of (1) the current picture, (2) revTid0Pic, (3) the short-term reference pictures in the DPB, and (4) the pictures in the DPB that are waiting for output, must be within half of the POC span covered by POC LSB. This rule guarantees the correctness of POC MSB derivation and improves error robustness by enabling the decoder to identify lost short-term pictures.
       上述規則也確保了,對於POC的MSB部分,可以根據先前圖像的PrevTid0Pic推斷出。所以PDB的里面的圖像分為short-term reference、long-term reference和non-reference三類,圖像進入PDB后最初以short-term reference存在,最終以non-reference狀態被從PDB中丟棄。狀態變化如下圖:

圖1

        另外SPS中有sps_max_num_reorder_pics和sps_max_latency_increase_plus1兩個參數和PDB相關。相關定義如下:

        sps_max_num_reorder_pics, here denoted as NumReorderPics, indicates the maximum number of pictures that can precede
any picture in decoding order and follow it in output order. 
        sps_max_latency_increase_plus1 is used to signal MaxLatencyPictures, which indicates the maximum number of pictures that can precede any picture in output order and follow that picture in decoding order. 

        NumReorderPics表示output order在當前圖像后面但decoding order在當前圖像前面的圖像最大數目,這個參數也確定了最小的PDB存數圖像數目。
        MaxLatencyPicture表示decoding order在當前圖像后面但是output order在當前圖像前面的最大數目,這個數確定了以圖像為單位的最小的編碼延時。
RPS
        RPS:reference picture set,參考圖像集。是在每個圖像的slice header里,有一系列指示short-term reference和long-term reference的標志組成。RPS里包含的是一組POC(指示在PDB中的位置)和相應的參考類型標識(指示短期還是長期)。
        PDB中的short-term reference,如果在RPS中指示為short-term,則為短期參考幀。所以PDB中的short-term reference根據RPS可以歸為三類:RefPicSetStCurrAfter(POC大於當前圖像)、RefPicSetStCurrBefore(POC小於當前圖像)、RefPicSetStFoll。
        PDB中的short-term reference和long-term reference,如果在RPS中指示為long-term,則為長期參考幀。所以PDB中的long-term reference根據RPS可以歸為兩類:RefPicSetLtCurr、RefPicSetLtFoll。
        RPL:Reference Pictures Lists,對於P幀(單向預測)只有L0;對於B幀(雙向預測),有L0和L1。
        對於L0的構建:RefPicSetStCurrBefore中圖像按照POC降序,然后接着是RefPicSetStCurrAfter按照POC升序,最后把RefPicSetStCurrBefore加入。
        對於L0的構建:RefPicSetStCurrAfter按照POC升序,然后接着是RefPicSetStCurrBefore中圖像按照POC降序,最后把RefPicSetStCurrBefore加入。
        所以對於下圖的幀編碼結構,編碼每一幀時PDB和RPS的變化如表:

圖2和表1

        然后L0為{P1, B2, B6, P5, I0},L1為{B6, P5, P1, B2, I0},由於L0和L1中內容是一樣的(順序不同),所以對於B幀,就存在雙向預測的參考幀相同。此外,對於L0和L1的長度,在PPS中通過參數傳遞,並可以在slice header中重寫(最大長度為15)。
 
Motion Data
        幀間預測的Motion Data是針對一個幀間預測塊,通過四叉樹結構確定了CU划分結構后,對於每個CU確定幀內、幀間預測(包括特殊的Merge和Skip),然后對於Inter CU,確定PU划分模式之后。對於每個PU,需要進行ME(運動估計)和MC(運動補償),最終確定的motion data包括參考幀索引、運動矢量和運動殘差,解碼端由參考幀索引和運動矢量確定預測像素值,然后根據預測像素值和預測殘差得到解碼像素值。
Inter-Prediction Block Merge And Skip
        HEVC定義了三種幀間預測的方式:Inter、Merge和Skip。其中Merge和Skip模式中,運動矢量殘差MVD為0,所以是根據相鄰的已編碼塊直接得到運動參數。不同之處在於:
        1、Skip模式下,預測殘差也為0或者通過策略可以舍去,所以Skip模式下也不需要編碼預測殘差,只需要編碼運動矢量參考塊位置;
        2、Skip模式只針對2Nx2N的PU划分模式,所以Skip是面向CU,而Merge是面向PU,相當於將具有相同運動參數的PU塊進行合並,且保證合並后的PU不能組成2Nx2N的CU(后面解釋)。
        而Inter模式則是根據相鄰塊得到運動矢量測預測值MVP,然后得到運動矢量殘差MVD,需要編碼幀間編碼的預測方向(前向、后向或雙向)、參考幀索引值、運動矢量預測器索引值、運動矢量預測殘差MVD和像素值預測殘差。通過
運動矢量預測器索引值、運動矢量預測殘差MVD可以得到MV,通過MV、參考幀索引、像素值預測殘差根據預測方向可以得到補償后像素值。

圖3

        標准的幀間模式決策過程如上圖,編碼時:
        首先通過cu_skip_flag標記當前CU的預測模式是否為Skip;
        若是:則編碼一個merge_index指示運動參數的參考塊(在merge candidate list中);
        若否:則編碼一個標記符表示是幀內還是幀間預測模式;
            如果是幀間編碼,編碼PU的划分划分模式part_mode,然后 對於一個PU,編碼merge_flag表示是否是Merge模式;
            若是Merge:編碼merge_index
指示運動參數的參考塊(在merge candidate list中),還要編碼參考幀索引;
            若不是Merge:編碼 預測方向(前向、后向或雙向)、參考幀索引值、運動矢量預測器索引值(AMVP中的candidate list中)、 運動矢量預測殘差MVD和像素值預測殘差。
        Merge和Skip的運動參數預測,如下圖:

圖4

        運動參數預測候選列表分為四類:空間相鄰已編碼塊、時間相鄰已編碼塊、生成的候選運動參數和0。最大的候選列表數目MaxNumMergeCand在slice header中傳輸,傳輸值是最大數目與5的插值(如0表示最大數目為5,5表示最大數目為1)。當通過空間和時間選擇的候選運動參數(去除重復和不符合要求的之后)數目小於MaxNumMergeCand,則通過生成候選運動參數(依次是雙向和非尺度變換)增加候選列表。如果數目還達不到MaxNumMergeCand,則通過補0的方式使得候選運動參數列表數目達到規定數目,這樣有利於解碼端處理。
        空域候選塊運動參數:如下圖

圖5
        對於最左邊,空間候選塊選擇順序依次是:a1,b1,b0,a0,(b2),b2只有前面4個有任意一個不可用時,才會考慮b2。對於空間候選塊確定,需要進行下面三方面的檢查:
            1、是否可用:是否編碼已完成、是否是幀間;
            2、避免不同參考塊運動數據的重復冗余,但是標准規定不需要對任意兩個臨近塊都進行檢查,選擇b0時只需要檢測b1,選擇a0時只需要檢查a1,選擇b2時只需要檢查a1和b1;
            3、避免候選PU和當前PU形成一個2Nx2N的CU,如上圖右邊,對於Nx2N和2NxN的當前PU,a1和b1則分別不可用。
       時域候選塊運動參數:如下圖

圖6
       如上圖,當前幀為Curr_pic,當前預測塊為Curr_pic。參考幀列表(RPL)中POC距離當前幀最近的幀為Col_pic,對應位置的PU為Col_PU,對於Col_PU選擇,如上左圖,首選C1,若C1不可用則選C0。Curr_PU和Col_PU的參考幀分別是Curr_ref和Col_ref,to和td表示兩個幀之間的POC距離,如圖。 通過根據to和td的比例關系,對Col_PU的運動矢量MV進行縮放,即可得到Curr_PU的運動矢量空間預測值。由於預測時,需要存儲參考幀中所有塊的MV,為了節省內存開銷,HEVC中將存儲MV的PU塊最小限制在16x16,當16x16的塊中存在多個MV不同的PU,那么則選擇第一個PU的MV存儲。
        當通過空間和時間,得到的候選運動參數達不到MaxNumMergeCand時,就要求通過生成(生成方式沒看懂,參考HM)和補0的方式填充最終歸並候選列表。
AMVP
        AMVP:Advanced Motion Vector Prediction,是一種通過競爭機制實現運動矢量預測的工具。如上面所述,幀間分為Inter、Merge個Skip三種方式,Merge和Skip得到MV的方式和Inter得到MV的方式不同,Merge和Skip的MVD為0,所以直接通過上面“
Merge和Skip的運動參數預測 所述的方法預測得到MV,編碼時只需要輸出合並候選列表的索引值,就可以得到MV(=MVP)。而對於Inter,則通過AMVP得到MVP,然后編碼時除了傳輸MV預測候選列表(運動矢量預測器)的索引值,還需要傳輸MVD。
        不同之處是,AMVP中:(細節見HEVC書P188)
            先從5個空間相鄰塊選擇:如圖5,先從{a0,a1}和{b0,b1,b2}分別按順序選擇第一個(共2個)可用的加到候選列表中;
            如果2個空間候選運動參數預測值有一個不可用,那么則需要從時域對應位置產生一個候選運動參數預測值;
            如果時域運動參數預測值也不可用,那么補0,保證最終候選數目為2。
Fractional Sample Interpolation
        
        HEVC插值濾波器如上:
        對於H.264(YUV=420的情況):
                插值亮度時:1/2像素采用6抽頭濾波器,1/4像素采用雙線性插值法,對1/2像素進行二次插值;
                插值色度時:采用1/8精度的雙線性插值。
        對於HEVC:
                插值亮度時:使用表5的7抽頭和8抽頭濾波器分別對1/4和1/2像素進行插值;
                插值色度時:使用表6的7個4抽頭濾波器對7個1/8像素進行插值。
        所以相對於H.264,HEVC的插值有如下優點:
                1、插值1/4像素時,直接進行插值,不需要根據1/2插值結果進行二次插值,去除了因1/2插值結果取整舍去導致1/4像素的插值精度下降;
                2、HEVC的插值濾波器是基於DCT的更精確的插值濾波器。

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM