刚好这段时间在看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.