POC的含義

剛好這段時間在看POC

關於參數的註解:

 

FrameNumOffset: 幀數的偏置.定義爲當前幀爲IDR,FNO的值爲0;prevFrameNum > frame_num,說明了有溢出,FrameNumOffset = prevFrameNumOffset + MaxFrameNum.prevFrameNum <=frame_numFrameNumOffset = 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幀進行分段(編碼端並沒有分段),每次分段將POCLsb0.然後計算出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

 

 

 

 

prevPOCMsbprevPOCLsb的確定:

(1)    當前圖片爲IDR圖片時, prevPOCMsb= prevPOCLsb=0;

(2)    IDR,mmco=5,而且非底場時prevPOCMsb=0, prevPOCLsb=prevTopFOC;

(3)    IDR,mmco不等於5,爲底場時prevPOCMsb= prevPOCLsb=0;

(4)    除以上情況外MsbLsb都等於前一幅圖片的MsbLsb.

 

 

算法:

0模式:

當爲幀時

TopFieldOrderCount = POCMsb + POCLsb

 

POCLsb被送到每個slice header.POCMsbPOCLsb達到最大值時增加.

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. 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章