剛好這段時間在看POC
關於參數的註解:
FrameNumOffset: 幀數的偏置.定義爲當前幀爲IDR時,FNO的值爲0;當prevFrameNum > frame_num時,說明了有溢出,故FrameNumOffset = prevFrameNumOffset + MaxFrameNum.當prevFrameNum <=frame_num時FrameNumOffset = prevFrameNumOffset.
POCLsb: POC的低有效位.通過slice header傳送到解碼端.由於編碼端知道傳送的序列的順序,所以在編碼端,POC的值由以下方法確定:
(1)對於幀或者場 img->toppoc = IMG_NUMBER*img->offset_for_ref_frame[0];
(2)對於B幀 img->toppoc = (IMG_NUMBER-1)*img->offset_for_ref_frame[0] + 2* img->b_frame_to_code.
而編碼端只需要傳送POCLsb到解碼端,解碼端就可以解出POC的值.
解碼端通過IDR幀進行分段(編碼端並沒有分段),每次分段將POCLsb置0.然後計算出POC的值.
POCMsb: POC的高有效位.POCMsb的計算方法如下:
if( ( pic_order_cnt_lsb < prevPicOrderCntLsb ) &&
( ( prevPicOrderCntLsb – pic_order_cnt_lsb ) >= ( MaxPicOrderCntLsb / 2 ) ) )
PicOrderCntMsb = prevPicOrderCntMsb + MaxPicOrderCntLsb
else if( ( pic_order_cnt_lsb > prevPicOrderCntLsb ) &&
( ( pic_order_cnt_lsb – prevPicOrderCntLsb ) > ( MaxPicOrderCntLsb / 2 ) ) )
PicOrderCntMsb = prevPicOrderCntMsb – MaxPicOrderCntLsb
else
PicOrderCntMsb = prevPicOrderCntMsb
這段程序的解釋:例:log2_max_poc_lsb_minus4=0,prevPOCMsb=16,prevPOCLsb=1,POCLsb=14.
此時MaxPOCLsb=16,所以POCMsb=0
prevPOCMsb和prevPOCLsb的確定:
(1) 當前圖片爲IDR圖片時, prevPOCMsb= prevPOCLsb=0;
(2) 非IDR,但mmco=5時,而且非底場時prevPOCMsb=0, prevPOCLsb=prevTopFOC;
(3) 非IDR,mmco不等於5,爲底場時prevPOCMsb= prevPOCLsb=0;
(4) 除以上情況外Msb和Lsb都等於前一幅圖片的Msb和Lsb.
算法:
0模式:
當爲幀時
TopFieldOrderCount = POCMsb + POCLsb
POCLsb被送到每個slice header.POCMsb在POCLsb達到最大值時增加.
BottomFieldOrderCnt = TopFieldOrderCnt + delta_pic_order_cnt_bottom
因爲幀時POC=min(TopFOC,BottomFOC)
故只需要計算TopFieldOrderCount = POCMsb + POCLsb
爲場時
TopFieldOrderCount = POCMsb + POCLsb
BottomFieldOrderCnt= POCMsb + POCLsb
1模式:
TopFieldOrderCount = expected POC + delta_pic_order_cnt[0]
BottomFieldOrderCount = expected POC + delta[1] (場)
= expected POC + offset to bottom field + delta[0] (幀)
2模式:
TopFieldOrderCnt = BottomFieldOrderCount =tempPicOrderCnt
沒有用作參考時
tempPicOrderCnt = 2 * ( FrameNumOffset + frame_num ) – 1
用作參考時
tempPicOrderCnt = 2 * ( FrameNumOffset + frame_num )
輸出:
當爲幀或場對時,輸出TopFieldOrderCount和 BottomFieldOrderCnt中的小值;
當爲頂場時,輸出TopFieldOrderCount;
當爲底場時輸出BottomFieldOrderCnt.
expectedDeltaPerPicOrderCntCycle: 一個POC循環的期望delta值.等於在這個POC循環中的所有delta值之和.
deltaPOC[0]表示一個幀中頂場與expectPOC的差值.[1]表示底場與expectPOC的差值.
Offset_for_ref_pic用來計算參考圖片間的POC的差值.
Offset_for_non_ref_pic用來計算非參考圖片間的POC的差值.
Num_ref_frame_in_pic_order_cnt_cycle表示在一個POC循環中的參考圖片的個數,可以取值0-255,但是在jm75中,設爲1.