转载:http://blog.csdn.net/yu_yuan_1314/article/details/9011899
一、基本概念
1、编码顺序
H.264的码流输出顺序便是编码顺序,所以在编码B帧的时候,由于B是双向预测,需要先编码后面编码帧P/I,这时候先输出I/P,后面才有B帧,我们在解码段拿到相应的I/P帧后,不能马上丢到buffer list里面,还需要等待后面的B帧,解码B帧后再reorder。
2、frame_num
每个参考帧都有一个依次连续的frame_num 作为它们的标识,这指明了各图像的解码顺序。在非参考帧的slice header中也会出现frame_num,不过该语法元素只有在参考帧才有意义。H.264 对frame_num 的值作了如下规定: 当参数集中的句法元素gaps_in_frame_num_value_allowed_flag 不为1 时,每个图像的frame_num 值是它前一个参考帧的frame_num 值增加1。这句话包含有两层意思。
(1)当gaps_in_frame_num_value_allowed_flag 不为1,即frame_num 连续的情况下,每个图像的frame_num 由前一个参考帧图像对应的值加1,着重点是“前一个参考帧”。
(2)当gaps_in_frame_num_value_allowed_flag 等于1,这时若网络阻塞,编码器可以将编码后的若干图像丢弃,而不用另行通知解码器。在这种情况下,解码器必须有机制将缺失的frame_num 及所对应的图像填补,否则后续图像若将运动矢量指向缺失的图像将会产生解码错误。
frame_num 是循环计数的,即当它到达MaxFrameNum 后又从0 重新开始新一轮的计数。解码器必须要有机制检测这种循环,
3、POC
Picture Order Count,即图像顺序号,主要用于标识图象的播放顺序,同时还用于在对帧间预测片解码时,标记参考图像的初始图像序号,表明下列情况下帧或场之间的图像序号差别:
(1)使用时间直接预测模式的运动矢量推算时;
(2)B片中使用固有模式加权预测时;
(3)解码器一致性检测时。
POC和frame_num之间存在一定的映射关系,当pic_order_cnt的值为1或者2的时候,可以通过frame_num来获得POC。
二、简单的例子
一个简单的视频序列如表1和表2所以,表1按图像顺序,表2按编码顺序。
表1 按图像顺序的视频序列
表2 按编码顺序的视频序列
说明:
1、图像顺序和编码顺序不是对应的关系,比如图像顺序为4的P帧,是图像顺序为1和2的参考帧,虽然在这两个帧之后,但是需要在他们在前进行编码。
2、frame_num按照编码的顺序从0递增,当达到最大值3后,从0重新开始递增。每个图像的frame_num为它前一个参考图像的frame_num + 1。比如:
(1)第4个图像,虽然在第1和2个图像之后,但是它前面的参考图像是第0个图像,因此,其frame_num的值为0 + 1 = 1;
(2)第1和2个图像虽然在第4个图像之后,但是,在编码顺序上,第4个图像在他们之前且是参考帧,因此他们的frame_num的值为1 + 1 = 2。
3、POC标识图像的显示顺序,因此递增的顺序和图像顺序是一致的,不过有其自己的循环,当达到最大值时,重新开始递增。POC是针对场而言的,因此每个图像都会包括顶场顺序号和底场顺序号。表1和表2中只给出了每个图像中一个场的编号。