引言
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 ...