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. 

你可能感兴趣的:(算法,header)