Intel h264解碼緩存分析

一、問題

標準GoP參考關系

當h264流沒有b幀、幀參考關系如上圖所示時,期望輸入1幀數(shù)據(jù)給解碼器后,解碼器能立即輸出解碼幀。但事實上intel解碼器會緩存若干幀后才輸出解碼幀,引起了延遲。

二、分析結果

由于解碼器解碼1幀后,不確定后續(xù)是否b幀、且p幀也可能亂序,因此默認情況下intel解碼器會等到DPB(Decoded Picture Buffer)滿了才輸出解碼幀。為了降低緩存導致的延遲,需要改變編碼器參數(shù):

1、將sps.pic_order_cnt_type設置為2(pic_order_cnt_type=2時,顯示順序與解碼順序一致,解碼器會立即輸出解碼幀)? or

2、將MaxDpbSize設置為1,MaxDpbSize限制了DPB的大小

三、h264相關知識

1、顯示順序與解碼順序

解碼順序由frame_num決定,frame_num存在slice header中,默認情況下frame_num=上一個參考幀的frame_num+1。

顯示順序由POC決定,有3種計算方式:

type 0,POC最低有效位記錄在slice header中,最靈活,但是需要的數(shù)據(jù)量最大

type 1,在sps中指定參考幀與上一個參考幀的增量、非參考幀和上一個參考幀的增量,每個非參考幀可以指定Delta POC。POC offset(和上一個參考幀的POC的差值) = sps中指定的增量 + Delta POC。

例子中參考幀與上一個參考幀的增量=6,非參考幀和上一個參考幀的增量=-4

type 2,POC=frame_num,顯示順序和解碼順序一樣

2、如何計算MaxDpbSize

sps.vui_parameters.max_dec_frame_buffering在H.264 Annex E中定義,為可選參數(shù)。

如果max_dec_frame_buffering參數(shù)存在,那么MaxDpbSize=max_dec_frame_buffering。

如果max_dec_frame_buffering參數(shù)不存在,MaxDpbSize可以通過level和畫面大小求出,下面例子展示計算過程。

不同level的MaxDpbMbs

MaxDpbSize計算公式:

MaxDpbSize =?min(floor(MaxDpbMbs / (PicWidthInMbs * FrameHeightInMbs)), 16)?

該h264流的level=4.2,對應的MaxDpbMbs=34816

PicWidthInMbs=(pic_width_in_mbs_minus1+1)= 120

由于frame_mbs_only_flag==1,因此FrameHeightInMbs=pic_height_in_mbs_minus1+1=68

MaxDpbSize =?min(floor(34816 / (120 * 68)), 16) = 4,意味著intel解碼器會緩存4個解碼后的幀。

?著作權歸作者所有,轉載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務。

相關閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容