h264中允許從多至15個幀裡面選擇1幀或者2幀出來作為參考進行**,所以必須引入乙個列表來管理這些參考影象,對
與p slice而言,對應 list0,對於 b slice 而言,還需要多乙個 list1,因為 b slice 是進行的兩次**!(乙個前向乙個後向/兩個前向/兩個後向)
參考幀分為 long term / short term 兩種,即所謂的長期參考幀和短期參考幀。其中長期參考幀用 longtermpicnum
來進行索引,而短期參考幀則利用 frame_num 或者 poc 來進行索引(預設索引順序即初始化順序),再具體一點:
p slice 的短期參考利用 frame_num 來進行索引,且按照降序排列(即離當前影象最近的前向影象排在第0位)
b slice 的短期參考利用 poc 來進行索引,
對其list0而言,先按照poc降序排列處於其前向的參考幀然後再按照poc公升序排列處於其後向的參考幀;
對其list1而言,先按照poc公升序排列處於其後向的參考幀然後再按照poc降序排列處於其前向的參考幀。
對於每個mb而言,在mb_pred()中會傳輸其參考索引,以表明該mb從list0/list1中選擇哪乙個作為參考,而對於乙個
slice 而言,可能存在該 slice 內部大多數mb都選擇了某乙個索引號較大的參考幀,如設定list0中的索引從0~5,而
大多數mb都選擇了5,在用哥倫布碼進行編碼時,將會消耗較多的bit!所以在初始化排序好後,會根據當前 slice 的
具體情況,對列表進行重排序,如將此時排在索引5位置的poc與排在0位置的poc進行交換,那麼mb_pred()中傳輸參考
索引所需的bit數就大大減少了!其中參考索引重排的語法在ref_pic_list_reordering()中有詳細介紹!
那麼當一幀解完後,如何處理該幀呢?需不需要將其放入參考列表中?所以在h264的bit stream中還傳輸了
dec_ref_pic_marking(),通過mmco這個玩意告訴我們當前的一幀接完後如何處理參考列表!
tbd:剩下的乙個問題就是,為什麼要分長期參考和短期參考呢?
以下是來自網上的答案,因為short term參考幀以frame_num做為索引,而frame_num是有最大值的,達到最大值後會進行
取模,所以短期參考幀不能長期存在於參考列表中,因為一旦frame_num達到最大值後取模為0,該索引就失去意義了,而長
期參考幀則不同!
H 264參考幀管理方法
h264中允許從多至15個幀裡面選擇1幀或者2幀出來作為參考進行 所以必須引入乙個列表來管理這些參考影象,對 與p slice而言,對應 list0,對於 b slice 而言,還需要多乙個 list1,因為 b slice 是進行的兩次 乙個前向乙個後向 兩個前向 兩個後向 參考幀分為 long ...
H 264參考幀管理
引言 h 264相對於以前的標準,採用了多參考幀的技術,提高了編碼器的效能,但也增加了實現的複雜度,在理解上也加大了難度。下面是我近來參閱一些資料的總結 frame num 標誌片的解碼順序,當前影象是idr 立即重新整理影象 時,設定為0 相對於前面乙個參考幀 解碼順序 增加1 poctype0 ...
H 264多參考幀
h264中允許從多至15個幀裡面選擇1幀或者2幀出來作為參考進行 所以必須引入乙個列表來管理這些參考影象,對與p slice而言,對應 list0,對於 b slice 而言,還需要多乙個 list1,因為 b slice 是進行的兩次 乙個前向乙個後向 兩個前向 兩個後向 參考幀分為 long t...