H264---播放顺序POC(pic_order_cnt)---pic_order_cnt_type=0、1、2 + POC和framenum比较

本文详细介绍了H264编码中图像播放顺序号(POC)的概念及其重要性,包括POC的三种计算方式:pic_order_cnt_type=0、1、2。pic_order_cnt_type=0时涉及乱序播放和Lsb计算;pic_order_cnt_type=1通过POC偏差确定显示顺序;pic_order_cnt_type=2则显示顺序与解码顺序一致。此外,还探讨了POC与frame_num的关系,以及不同情况下的比较。
摘要由CSDN通过智能技术生成

在一个序列中,
  参考图像的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=602、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
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值