H 264參考幀管理

2021-05-24 08:37:16 字數 3220 閱讀 8028

引言

h.264相對於以前的標準,採用了多參考幀的技術,提高了編碼器的效能,但也增加了實現的複雜度,在理解上也加大了難度。下面是我近來參閱一些資料的總結;

frame_num

:標誌片的解碼順序,當前影象是idr(立即重新整理影象)時,設定為0;相對於前面乙個參考幀(解碼順序),增加1;

poctype0

:topfieldordercnt=pocmsb+poclsb

poclsb

由片頭提供,即pic_order_cnt_lsb;當pic_order_cnt_lsb溢位時,pocmsb增加;delta_pic_order_cnt指示頂場和低場poc的變化,預設值為0;例:b

幀不作參考幀,則poc相對於前面的乙個參考幀增加2;

access unit

type

used for reference

frame_num

poc_lsb

toppoc

display order 1

iyes 0

0 00 2

pyes 1

4 42 3

b no

2 22 1

4 pyes 2

8 84 5

b no

3 66 3

6 pyes 3

12 12

6 7b no

4 10

10 5

8 pyes 4

16 16

8 …… …

type1

:在序列引數集中設定乙個poc預期值,若poc的值有變化,則只傳送相對變化值;序列引數集規定了poc迴圈的參考幀數目;對於一幀影象,計算poc預期值如下:1.

計算poc迴圈數(自最近的idr影象起)2.

計算當前影象在poc迴圈中的位置3.

計算當前影象poc的預期值4.

如果是非參考幀,加上offset_for_non_ref_pic

topfieldordercount=expected poc+delta_pic_order_cnt[0]

bottomfieldordercount=expected poc+delta_pic_order_cnt[1](if field_pic = 1)

= expected poc+offset to bottom field+delta_pic_order_cnt[0](otherwise)

例1:b幀不作參考幀,乙個poc迴圈中有乙個參考幀,offset_for_non_ref_pic=-2,offset to next ref frame=4

access unit

type

used for

reference

frame_num

delta_pic_order_cnt[0]

topfoc

display order 1

iyes 0

0 00 2

pyes 1

0 42 3

b no

2 02 1

4 pyes 2

0 84 5

b no

3 06 3

6 pyes 3

0 12

6 7b no

4 010 5

8 pyes 4

0 16

8 ……

例2:b幀不作參考幀,乙個poc迴圈中有乙個參考幀,offset_for_non_ref_pic=-4,offset to next ref frame=6

access unit

type

used for

reference

frame_num

delta_pic_order_cnt[0]

topfoc

display order 1

iyes 0

0 00 2

pyes 1

0 63 3

b no

2 02 1

4 pyes 2

2 42 5

b no

3 012 6

6 pyes 3

0 81 7

b no

4 210 2

8 pyes 4

0 18

9 ……

type2

:if(used for ref)

set toppoc and/or bottompoc to (2*frame_num)

else

set toppoc and/or bottompoc to (2*frame_num-1)

參考幀重排序

由於在解碼每個mb時,都要用到參考幀的索引ref_idx_l0或ref_idx_l1。可能發生這樣的情況,有個參考幀(短期參考幀或者長期參考幀)對於解碼乙個影象特別有用,但是這個參考幀在預設的佇列中並不位於索引值為0的位置,所以編碼大的索引值需要花費多的位元。參考幀的重排序可以使這個參考幀位於索引值比較小的位置,以節省編碼位元數。

下面我們以list0的重排序為例來說明

如果ref_pic_list_reordering_flag非0,則進入重排序的迴圈,直到ref_pic_list_reordering_flag為3時為止。

短期參考幀重排序(short-term):

初始化乙個指標refidxl0使其指向參考幀索引值0,abs_diff_pic_num_minus1是相對於**參考幀的偏移量,對於第一次重排序操作,**參考幀就是當前影象,對於後續的重排序操作,**影象就是最近重排序的影象;

if(reordering_of_pic_nums_idc==0)

else if(reordering_of_pic_nums_idc==1)

else if(reordering_of_pic_nums_idc==2)

else

return;

長期參考幀重排序(long-term):

與短期參考幀重排序類似,參見上面流程; 例:

p片,dpb包含5個參考幀,當前幀的frame_num=158,

list0

的預設順序是:

157,155,153,1,3

初始化predicted_pic=158,refidxl0=0

1.reordering_of_pic_nums_idc=0

,abs_diff_pic_num_minus1=5

重排序如下:

153,157,155,1,3

H 264多參考幀

h264中允許從多至15個幀裡面選擇1幀或者2幀出來作為參考進行 所以必須引入乙個列表來管理這些參考影象,對與p slice而言,對應 list0,對於 b slice 而言,還需要多乙個 list1,因為 b slice 是進行的兩次 乙個前向乙個後向 兩個前向 兩個後向 參考幀分為 long t...

H 264參考幀管理方法

h264中允許從多至15個幀裡面選擇1幀或者2幀出來作為參考進行 所以必須引入乙個列表來管理這些參考影象,對 與p slice而言,對應 list0,對於 b slice 而言,還需要多乙個 list1,因為 b slice 是進行的兩次 乙個前向乙個後向 兩個前向 兩個後向 參考幀分為 long ...

H 264參考幀管理方法

h264中允許從多至15個幀裡面選擇1幀或者2幀出來作為參考進行 所以必須引入乙個列表來管理這些參考影象,對 與p slice而言,對應 list0,對於 b slice 而言,還需要多乙個 list1,因為 b slice 是進行的兩次 乙個前向乙個後向 兩個前向 兩個後向 參考幀分為 long ...