一、基本概念
nalu按照解码顺序frame_num送入解码器解码
解码后的图像按照播放顺序POC(picture_order_count)进行存储和播放
(由于B帧的存在,解码顺序和显示顺序会有差异)
frame_num和POC通过slice_header传输:
某一帧图像在解码完成后,可能会被保存于解码图像缓存中,用于后续图像帧间预测的参考帧。在解码图像缓存中,用于P帧或B帧帧间编码的参考帧图像保存为一个或两个参考帧列表,列表中参考帧的顺序可以通过某个专门的过程进行重排列。
二、解码顺序计数值frame_num(当前slice在GOP中的解码顺序)
在一个GOP中,第一个slice即作为随机接入点的IDR slice,其frame_num值为0,表示当前slice是一个GOP的起点。
GOP中的其他slice按照相应距离IDR的顺序按1递增。
当另一个语法元素gaps_in_frame_num_value_allowed存在时,slice可以以大于1的值递增,此时缺失的frame_num值需要解码器用空slice数据进行填充。
三、显示顺序标志值POC(picture_order_count)
视频中IDR的第一个field作为POC的开始,其值为0。在H.264的标准中,POC的计算方法在标准文档中的8.2.1节中定义。
对于H.264的码流,有三种结构会被赋予POC的值:coded frame(编码帧), coded field(编码场)和complementary field pair(互补参考场对),每种类型的POC都由TopFieldOrderCnt和BottomFieldOrderCnt这两个值的一个或两个组成:
1、对于每一个编码帧,poc包含两个值TopFieldOrderCnt和BottomFieldOrderCnt;
2、对于每一个编码场,poc包含一个值,如果该field为顶场则为TopFieldOrderCnt,如果是底场为BottomFieldOrderCnt;
3、对于每一个互补参考场对,POC包含两个值,对顶场为TopFieldOrderCnt,对底场为BottomFieldOrderCnt;
在H.264中,TopFieldOrderCnt和BottomFieldOrderCnt共定义了3种解析方法,由sps中的值pic_order_cnt_type决定。
3.1 直传模式:pic_order_cnt_type=0
POC的值通过slice_header中的数据计算得到
1、获得中间变量prevPicOrderCntMsb和prevPicOrderCntLsb
2、计算当前帧的PicOrderCntMsb
3、计算TopFieldOrderCnt和BottomFieldOrderCnt
3.2 预测与差分方式(pic_order_cnt_type=1)
sps中:
1、获得中间变量prevFrameNum、FrameNumOffset、prevFrameNumOffset
2、计算中间变量absFrameNum、picOrderCntCycleCnt、frameNumInPicOrderCntCycle和expectedPicOrderCnt
if (sps中)num_ref_frames_in_pic_order_cnt_cycle != 0
absFrameNum = FrameNumOffset + frame_num
else
absFrameNum = 0
end
另外,若nal_ref_idc值为0且absFrameNum非0,absFrameNum需再减去1:
absFrameNum = absFrameNum − 1
当absFrameNum大于0时,picOrderCntCycleCnt和frameNumInPicOrderCntCycle分别为absFrameNum - 1除以num_ref_frames_in_pic_order_cnt_cycle的商和余数:
picOrderCntCycleCnt = ( absFrameNum − 1 ) / num_ref_frames_in_pic_order_cnt_cycle
frameNumInPicOrderCntCycle =