如何定义POC?

如何定义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.