H264的POC能是负数吗?关于IntraDelay带来的先来P帧,再来IDR的效果
关于H264,有同学问,POC号必须是>=0吗? 有同学答“不一定,我见过负数的POC号!”。
下面我们来看个码流,这个码流是用JM19.1编出来的。
注意我们编的时候设置的是 pic_order_cnt_type=0,且log2_max_pic_order_cnt_lsb_minus4=0。并且在cfg中配置了IntraDelay = 1,
最后这个IntraDelay就会将第一帧编出一个P帧,并且它的POC号是个-2。
在这个码流里,我们先设置工具显示为“显示顺序”显示,第一个截图是首帧的,有几个看点:
(1)首先它是个P帧,他的POC号是-2,而且注意,它的参考列表是List0,也就是所谓的前向参考。
虽然这个箭头是向“后”画的。如果我们把码流工具设置为解码顺序显示,将是这样的:
从这个现象来看,平时说的 “前向参考”,参考帧就是时间线上(也就是采集/显示顺序)上比当前帧要“早”。只是说的参考的List0队列而已。参考帧的显示顺序,可能是在当前帧之后的。
(2)第2个看点,就是此帧的POC是-2的时候,它的pic_order_cnt_lsb元素的值是14。因为我们设置的log2_max_pic_order_cnt_lsb_minus4为0,意味着MaxPicOrderCntLsb为16,所以POC为-2的时候,码流里将pic_order_cnt_lsb写为14非常合理。此时pic_order_cnt_lsb元素的值逢16就会折叠。具体到我们这个码流,因为是帧编码,所以该字段取值就是0,2,4,6,8,10,12,14,0,2....这些可能性。
关于pic_order_cnt_type的三种花样,想了解更多的,可以看博主其他文章哟~