在一个序列中,
参考图像的frame_num = 前一个参考图像的frame_num+1
非参考图像的frame_num = 前一个参考图像的frame_num + 1
(故会导致一个P帧后面的 多个B帧和第一个P帧的frame_num相同)
B帧的存在导致播放顺序POC和解码顺序frame_num不一致
POC(图像播放顺序号/图像顺序号pic_order_cnt)
对于每个编码帧有两个图像序列号,分别称为顶场序列号TopFieldOrderCnt和底场序列号BottomFieldOrderCnt;
对于每个编码场有一个图像序列号,对于一个编码顶场其称为TopFieldOrderCnt,对于编码底场,其称为 BottomFieldOrderCnt ;
对于每个编码场对有两个图像序列号,TopFieldOrderCnt 和BottomFieldOrderCnt 分别用于标记该场对的顶场和底场。
TopFieldOrderCnt 和BottomFieldOrderCnt 分别指明了相应的顶场/ 底场相对于前一个IDR 图像,或解码顺序中前一个包含memory_management_control_operation=5的参考图像(此值为5表示清空参考帧队列,因此有着跟IDR同样的效果),的第一个输出场的相对位置。这也意味着,只要遇到IDR图像或memory_management_control_operation=5的参考图像,相应的POC就等于零。
POC用途:
1、主要用于标识图象的播放顺序
2、在对帧间预测片解码时,标记参考图像的初始图像序号,表明下列情况下帧或场之间的图像序号差别:
(1)使用时间直接预测模式的运动矢量推算时;
(2)B片中使用固有模式加权预测时;
(3)解码器一致性检测时;
仅方式一中拆分POC=Msb+低位Lsb(按值相加,而非按位相加)
POC低位:pic_order_cnt_lsb = POC % MaxPicOrderCntLsb
所占长度:log2_max_pic_order_cnt_lsb_minus4 + 4 个比特
大小范围:[0 , MaxPicOrderCntLsb – 1]
注:MaxPicOrderCntLsb = 2^(log2_max_pic_order_cnt_lsb_minus4 + 4)
POC高位:pic_order_cnt_msb = POC - pic_order_cnt_lsb 【是MaxPicOrderCntLsb的整数倍】
PPS中:
pic_order_cnt_type
if( pic_order_cnt_type = = 0 )
log2_max_pic_order_cnt_lsb_minus4 //[0,12]
//MaxPicOrderCntLsb = 2^(log2_max_pic_order_cnt_lsb_minus4 + 4)
//这是POC高位和地位之间的?进制
else if( pic_order_cnt_type = = 1 ) {
delta_pic_order_always_zero_flag
offset_for_non_ref_pic //非参考图像的POC偏移补正
offset_for_top_to_bottom_field
num_ref_frames_in_pic_order_cnt_cycle //[0,255]
for( i = 0; i < num_ref_frames_in_pic_order_cnt_cycle; i++ ) //循环使用的相邻POC差值
offset_for_ref_frame[i]
//一个参考帧跟下一个参考帧,他们POC的差值在传输时指定,且是周期变化的,
//即每隔num_ref_frames_in_pic_order_cnt_cycle个参考帧,相邻参考帧之间POC的差值循环一次,
//而每个周期中,第i个差值即为offset_for_ref_frame[i]
}
slice_header中:
if( pic_order_cnt_type = = 0 ) {
pic_order_cnt_lsb
if( pic_order_present_flag && !field_pic_flag )
delta_pic_order_cnt_bottom //当前为帧时底场POC = 顶场POC + delta_pic_order_cnt_bottom
}
if( pic_order_cnt_type = = 1 && !delta_pic_order_always_zero_flag ) {
delta_pic_order_cnt[0]
if( pic_order_present_flag && !field_pic_flag )
delta_pic_order_cnt[1]
}
相关名词:
1、prevPicOrderCntLsb:当前帧的前一个参考帧(比如地位POC=2的p帧的prevPicOrderCntLsb=60)
2、prevPicOrderCntMsb和prevPicOrderCntLsb在IDR或者mmco=5的时候选择性复位
帧序列:
【解码顺序】 I P B B...未出现mmco==5或IDR. P B B P B B P B B
PicOrderCntLsb 0 6 2 4 60 56 58 2 62 0 6 2 4
PicOrderCntMsb 0 0 0 0 0 0 0 64 0 64 64 64 64
总计poc 0 6 2 4 60 56 58 66 62 64 70 66 68
场序列:
I P B...未出现mmco==5或IDR.. |Pt Pb Bt Bb Bt Bb| Pt Pb Bt Bb Bt Bb |
PicOrderCntLsb 0 6 2 |60 61 56 57 58 59| 2 3 62 63 0 1 |
总计poc 0 6 2 |60 56 58 66 62 64