一、問題

當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。

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和畫面大小求出,下面例子展示計算過程。

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個解碼后的幀。